KasmVNC/common/rfb/ConnParams.h
lhchavez 25b8e64adb Add support for notifying clients about pointer movements
This change adds support for the VMware Mouse Position
pseudo-encoding[1], which is used to notify VNC clients when X11 clients
call `XWarpPointer()`[2]. This function is called by SDL (and other
similar libraries)  when they detect that the server does not support
native relative motion, like some RFB clients.

With this, RFB clients can choose to adjust the local cursor position
under certain circumstances to match what the server has set. For
instance, if pointer lock has been enabled on the client's machine and
the cursor is not being drawn locally, the local position of the cursor
is irrelevant, so the RFB client can use what the server sends as the
canonical absolute position of the cursor. This ultimately enables the
possibility of games (especially FPS games) to behave how users expect
(if the clients implement the corresponding change).

Part of: #619

1: https://github.com/rfbproto/rfbproto/blob/master/rfbproto.rst#vmware-cursor-position-pseudo-encoding
2: https://tronche.com/gui/x/xlib/input/XWarpPointer.html
3: https://hg.libsdl.org/SDL/file/28e3b60e2131/src/events/SDL_mouse.c#l804
2021-03-29 11:27:54 +03:00

152 lines
3.9 KiB
C++

/* Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved.
* Copyright 2014 Pierre Ossman for Cendio AB
*
* This is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This software is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this software; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
* USA.
*/
//
// ConnParams - structure containing the connection parameters.
//
#ifndef __RFB_CONNPARAMS_H__
#define __RFB_CONNPARAMS_H__
#include <set>
#include <rdr/types.h>
#include <rfb/Cursor.h>
#include <rfb/PixelFormat.h>
#include <rfb/ScreenSet.h>
namespace rdr { class InStream; }
namespace rfb {
const int subsampleUndefined = -1;
const int subsampleNone = 0;
const int subsampleGray = 1;
const int subsample2X = 2;
const int subsample4X = 3;
const int subsample8X = 4;
const int subsample16X = 5;
class SMsgHandler;
class ConnParams {
public:
ConnParams();
~ConnParams();
bool readVersion(rdr::InStream* is, bool* done);
void writeVersion(rdr::OutStream* os);
int majorVersion;
int minorVersion;
void setVersion(int major, int minor) {
majorVersion = major; minorVersion = minor;
}
bool isVersion(int major, int minor) const {
return majorVersion == major && minorVersion == minor;
}
bool beforeVersion(int major, int minor) const {
return (majorVersion < major ||
(majorVersion == major && minorVersion < minor));
}
bool afterVersion(int major, int minor) const {
return !beforeVersion(major,minor+1);
}
int width;
int height;
ScreenSet screenLayout;
const PixelFormat& pf() const { return pf_; }
void setPF(const PixelFormat& pf);
void setSHandler(SMsgHandler *s) { shandler = s; }
const char* name() const { return name_; }
void setName(const char* name);
const Cursor& cursor() const { return *cursor_; }
void setCursor(const Cursor& cursor);
const Point& cursorPos() const { return cursorPos_; }
void setCursorPos(const Point& pos);
bool supportsEncoding(rdr::S32 encoding) const;
void setEncodings(int nEncodings, const rdr::S32* encodings);
unsigned int ledState() { return ledState_; }
void setLEDState(unsigned int state);
bool useCopyRect;
bool supportsLocalCursor;
bool supportsLocalXCursor;
bool supportsLocalCursorWithAlpha;
bool supportsCursorPosition;
bool supportsDesktopResize;
bool supportsExtendedDesktopSize;
bool supportsDesktopRename;
bool supportsLastRect;
bool supportsLEDState;
bool supportsQEMUKeyEvent;
bool supportsWEBP;
bool supportsSetDesktopSize;
bool supportsFence;
bool supportsContinuousUpdates;
int compressLevel;
int qualityLevel;
int fineQualityLevel;
int subsampling;
// kasm exposed settings, skippable with -IgnoreClientSettingsKasm
enum {
KASM_JPEG_VIDEO_QUALITY,
KASM_WEBP_VIDEO_QUALITY,
KASM_TREAT_LOSSLESS,
KASM_PREFER_BANDWIDTH,
KASM_DYNAMIC_QUALITY_MIN,
KASM_DYNAMIC_QUALITY_MAX,
KASM_VIDEO_AREA,
KASM_VIDEO_TIME,
KASM_FRAME_RATE,
KASM_MAX_VIDEO_RESOLUTION,
KASM_NUM_SETTINGS
};
bool kasmPassed[KASM_NUM_SETTINGS];
private:
PixelFormat pf_;
char* name_;
Cursor* cursor_;
Point cursorPos_;
std::set<rdr::S32> encodings_;
char verStr[13];
int verStrPos;
unsigned int ledState_;
SMsgHandler *shandler;
};
}
#endif