KasmVNC/common/rfb/encodings.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

95 lines
3.6 KiB
C++

/* Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved.
* Copyeight (C) 2011 D. R. Commander. All Rights Reserved.
*
* 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.
*/
#ifndef __RFB_ENCODINGS_H__
#define __RFB_ENCODINGS_H__
namespace rfb {
const int encodingRaw = 0;
const int encodingCopyRect = 1;
const int encodingRRE = 2;
const int encodingCoRRE = 4;
const int encodingHextile = 5;
const int encodingTight = 7;
const int encodingZRLE = 16;
const int encodingMax = 255;
const int pseudoEncodingXCursor = -240;
const int pseudoEncodingCursor = -239;
const int pseudoEncodingDesktopSize = -223;
const int pseudoEncodingLEDState = -261;
const int pseudoEncodingExtendedDesktopSize = -308;
const int pseudoEncodingDesktopName = -307;
const int pseudoEncodingFence = -312;
const int pseudoEncodingContinuousUpdates = -313;
const int pseudoEncodingCursorWithAlpha = -314;
const int pseudoEncodingQEMUKeyEvent = -258;
// TightVNC-specific
const int pseudoEncodingLastRect = -224;
const int pseudoEncodingQualityLevel0 = -32;
const int pseudoEncodingQualityLevel9 = -23;
const int pseudoEncodingCompressLevel0 = -256;
const int pseudoEncodingCompressLevel9 = -247;
// TurboVNC-specific
const int pseudoEncodingFineQualityLevel0 = -512;
const int pseudoEncodingFineQualityLevel100 = -412;
const int pseudoEncodingSubsamp1X = -768;
const int pseudoEncodingSubsamp4X = -767;
const int pseudoEncodingSubsamp2X = -766;
const int pseudoEncodingSubsampGray = -765;
const int pseudoEncodingSubsamp8X = -764;
const int pseudoEncodingSubsamp16X = -763;
// Kasm-specific
const int pseudoEncodingWEBP = -1024;
const int pseudoEncodingJpegVideoQualityLevel0 = -1023;
const int pseudoEncodingJpegVideoQualityLevel9 = -1014;
const int pseudoEncodingWebpVideoQualityLevel0 = -1013;
const int pseudoEncodingWebpVideoQualityLevel9 = -1004;
const int pseudoEncodingTreatLosslessLevel0 = -1003;
const int pseudoEncodingTreatLosslessLevel10 = -993;
const int pseudoEncodingPreferBandwidth = -992;
const int pseudoEncodingDynamicQualityMinLevel0 = -991;
const int pseudoEncodingDynamicQualityMinLevel9 = -982;
const int pseudoEncodingDynamicQualityMaxLevel0 = -981;
const int pseudoEncodingDynamicQualityMaxLevel9 = -972;
const int pseudoEncodingVideoAreaLevel1 = -971;
const int pseudoEncodingVideoAreaLevel100 = -871;
const int pseudoEncodingVideoTimeLevel0 = -870;
const int pseudoEncodingVideoTimeLevel100 = -770;
const int pseudoEncodingFrameRateLevel10 = -2048;
const int pseudoEncodingFrameRateLevel60 = -1998;
const int pseudoEncodingMaxVideoResolution = -1997;
const int pseudoEncodingVideoScalingLevel0 = -1996;
const int pseudoEncodingVideoScalingLevel9 = -1987;
const int pseudoEncodingVideoOutTimeLevel1 = -1986;
const int pseudoEncodingVideoOutTimeLevel100 = -1887;
// VMware-specific
const int pseudoEncodingVMwareCursorPosition = 0x574d5666;
int encodingNum(const char* name);
const char* encodingName(int num);
}
#endif