From 9050929aa96c695dfac21aa9ad4074d49d0fa8be Mon Sep 17 00:00:00 2001 From: Matt McClaskey Date: Wed, 13 May 2026 10:09:09 +0000 Subject: [PATCH 01/12] VNC-14 Update to relative mouse for better UX and app compatibility --- .gitmodules | 2 +- common/rfb/ConnParams.cxx | 6 ++++++ common/rfb/ConnParams.h | 1 + common/rfb/InputHandler.h | 5 +++++ common/rfb/SMsgHandler.cxx | 4 ++++ common/rfb/SMsgHandler.h | 3 +++ common/rfb/SMsgReader.cxx | 20 ++++++++++++++++++++ common/rfb/SMsgReader.h | 3 ++- common/rfb/SMsgWriter.cxx | 6 ++++++ common/rfb/SMsgWriter.h | 1 + common/rfb/ServerCore.cxx | 5 +++++ common/rfb/ServerCore.h | 1 + common/rfb/VNCSConnectionST.cxx | 27 ++++++++++++++++++++++++++- common/rfb/VNCSConnectionST.h | 2 ++ common/rfb/encodings.h | 1 + common/rfb/msgTypes.h | 3 +++ kasmweb | 2 +- unix/kasmvnc_defaults.yaml | 3 +++ unix/vncserver | 9 +++++++++ unix/xserver/hw/vnc/Input.c | 4 ++++ unix/xserver/hw/vnc/XserverDesktop.cc | 16 ++++++++++++++++ unix/xserver/hw/vnc/XserverDesktop.h | 1 + 22 files changed, 121 insertions(+), 4 deletions(-) diff --git a/.gitmodules b/.gitmodules index 8232a78..a83fbd4 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,7 +1,7 @@ [submodule "kasmweb"] path = kasmweb url = https://github.com/kasmtech/noVNC.git - branch = master + branch = feature/VNC-14_direct_drive_mouse [submodule "kasmvnc-functional-tests"] path = kasmvnc-functional-tests url = git@gitlab.com:kasm-technologies/internal/kasmvnc-functional-tests.git diff --git a/common/rfb/ConnParams.cxx b/common/rfb/ConnParams.cxx index 0ed8304..76da724 100644 --- a/common/rfb/ConnParams.cxx +++ b/common/rfb/ConnParams.cxx @@ -62,6 +62,7 @@ ConnParams::ConnParams() supportsSetDesktopSize(false), supportsFence(false), supportsContinuousUpdates(false), supportsExtendedClipboard(false), supportsDisconnectNotify(false), + supportsDirectMouse(false), supportsUdp(false), compressLevel(2), qualityLevel(-1), fineQualityLevel(-1), subsampling(subsampleUndefined), name_(0), cursorPos_(0, 0), verStrPos(0), @@ -151,6 +152,7 @@ void ConnParams::setEncodings(int nEncodings, const rdr::S32* encodings) supportsWEBP = false; supportsQOI = false; supportsDisconnectNotify = false; + supportsDirectMouse = false; compressLevel = -1; qualityLevel = -1; fineQualityLevel = -1; @@ -224,6 +226,10 @@ void ConnParams::setEncodings(int nEncodings, const rdr::S32* encodings) supportsDisconnectNotify = true; clientparlog("disconnectNotify", true); break; + case pseudoEncodingDirectMouse: + supportsDirectMouse = true; + clientparlog("directMouse", true); + break; case pseudoEncodingFence: supportsFence = true; clientparlog("fence", true); diff --git a/common/rfb/ConnParams.h b/common/rfb/ConnParams.h index 227b06c..7ae0d72 100644 --- a/common/rfb/ConnParams.h +++ b/common/rfb/ConnParams.h @@ -119,6 +119,7 @@ namespace rfb { bool supportsContinuousUpdates; bool supportsExtendedClipboard; bool supportsDisconnectNotify; + bool supportsDirectMouse; bool supportsUdp; diff --git a/common/rfb/InputHandler.h b/common/rfb/InputHandler.h index c804832..e39bd6b 100644 --- a/common/rfb/InputHandler.h +++ b/common/rfb/InputHandler.h @@ -44,6 +44,11 @@ namespace rfb { int scrollY) { } virtual void clientCutText(const char* __unused_attr str, int __unused_attr len) { } + virtual void directMouseEvent(int __unused_attr dx, + int __unused_attr dy, + int __unused_attr buttonMask, + int __unused_attr scrollX, + int __unused_attr scrollY) { } }; } diff --git a/common/rfb/SMsgHandler.cxx b/common/rfb/SMsgHandler.cxx index 23cd5fc..51cc547 100644 --- a/common/rfb/SMsgHandler.cxx +++ b/common/rfb/SMsgHandler.cxx @@ -68,6 +68,10 @@ void SMsgHandler::handleClipboardAnnounceBinary(const unsigned, const char mimes { } +void SMsgHandler::directMouseEvent(int, int, int, int, int) +{ +} + void SMsgHandler::clearBinaryClipboard() { } diff --git a/common/rfb/SMsgHandler.h b/common/rfb/SMsgHandler.h index 06a1e6f..f54d8b4 100644 --- a/common/rfb/SMsgHandler.h +++ b/common/rfb/SMsgHandler.h @@ -54,6 +54,9 @@ namespace rfb { virtual void enableContinuousUpdates(bool enable, int x, int y, int w, int h) = 0; + virtual void directMouseEvent(int dx, int dy, int buttonMask, + int scrollX, int scrollY); + virtual void handleClipboardAnnounceBinary(const unsigned num, const char mimes[][32]); virtual void clearBinaryClipboard(); virtual void addBinaryClipboard(const char mime[], const rdr::U8 *data, diff --git a/common/rfb/SMsgReader.cxx b/common/rfb/SMsgReader.cxx index 1bd380a..13c8df3 100644 --- a/common/rfb/SMsgReader.cxx +++ b/common/rfb/SMsgReader.cxx @@ -108,6 +108,9 @@ void SMsgReader::readMsg() case msgTypeKeepAlive: readKeepAlive(); break; + case msgTypeDirectMouseEvent: + readDirectMouseEvent(); + break; default: fprintf(stderr, "unknown message type %d\n", msgType); throw Exception("unknown message type"); @@ -422,3 +425,20 @@ void SMsgReader::readVideoEncodersRequest() const { handler->videoEncodersRequest(buf); } + +void SMsgReader::readDirectMouseEvent() +{ + // Wire format (9 bytes after the type byte): + // byte 0: button mask (bit 0=left, 1=right, 2=middle, 3=side, 4=extra) + // bytes 1-2: dx (int16 BE) + // bytes 3-4: dy (int16 BE) + // bytes 5-6: scroll dx (int16 BE) + // bytes 7-8: scroll dy (int16 BE) + int buttonMask = is->readU8(); + int dx = is->readS16(); + int dy = is->readS16(); + int scrollX = is->readS16(); + int scrollY = is->readS16(); + + handler->directMouseEvent(dx, dy, buttonMask, scrollX, scrollY); +} diff --git a/common/rfb/SMsgReader.h b/common/rfb/SMsgReader.h index 3d3480b..528112f 100644 --- a/common/rfb/SMsgReader.h +++ b/common/rfb/SMsgReader.h @@ -68,7 +68,8 @@ namespace rfb { void readSubscribeUnixRelay(); void readUnixRelay(); - void readVideoEncodersRequest() const; + void readVideoEncodersRequest() const; + void readDirectMouseEvent(); SMsgHandler* handler; rdr::InStream* is; diff --git a/common/rfb/SMsgWriter.cxx b/common/rfb/SMsgWriter.cxx index 80d324f..ee1033f 100644 --- a/common/rfb/SMsgWriter.cxx +++ b/common/rfb/SMsgWriter.cxx @@ -832,3 +832,9 @@ void SMsgWriter::writeDisconnectNotify(bool graceful, const char *reason) os->writeBytes(msg, len); endMsg(); } + +void SMsgWriter::writeForceGameMode() +{ + startMsg(msgTypeForceGameMode); + endMsg(); +} diff --git a/common/rfb/SMsgWriter.h b/common/rfb/SMsgWriter.h index 52e1715..dc7376c 100644 --- a/common/rfb/SMsgWriter.h +++ b/common/rfb/SMsgWriter.h @@ -136,6 +136,7 @@ namespace rfb { void writeUserJoinedSession(const std::string& username); void writeUserLeftSession(const std::string& username); void writeDisconnectNotify(bool graceful, const char *reason); + void writeForceGameMode(); protected: void startMsg(int type); diff --git a/common/rfb/ServerCore.cxx b/common/rfb/ServerCore.cxx index 3694d16..2af91ff 100644 --- a/common/rfb/ServerCore.cxx +++ b/common/rfb/ServerCore.cxx @@ -85,6 +85,11 @@ rfb::BoolParameter rfb::Server::acceptPointerEvents ("AcceptPointerEvents", "Accept pointer press and release events from clients.", true); +rfb::BoolParameter rfb::Server::forceGameMode +("ForceGameMode", + "Send a message to newly connected clients instructing them to enable game mode " + "(direct-drive relative mouse). Useful for game-focused workspace images.", + false); rfb::BoolParameter rfb::Server::acceptCutText ("AcceptCutText", "Accept clipboard updates from clients.", diff --git a/common/rfb/ServerCore.h b/common/rfb/ServerCore.h index 8a2c057..446a4b0 100644 --- a/common/rfb/ServerCore.h +++ b/common/rfb/ServerCore.h @@ -84,6 +84,7 @@ namespace rfb { static BoolParameter disconnectClients; static BoolParameter acceptKeyEvents; static BoolParameter acceptPointerEvents; + static BoolParameter forceGameMode; static BoolParameter acceptCutText; static BoolParameter sendCutText; static BoolParameter acceptSetDesktopSize; diff --git a/common/rfb/VNCSConnectionST.cxx b/common/rfb/VNCSConnectionST.cxx index 7f1d628..7933758 100644 --- a/common/rfb/VNCSConnectionST.cxx +++ b/common/rfb/VNCSConnectionST.cxx @@ -71,7 +71,8 @@ VNCSConnectionST::VNCSConnectionST(VNCServerST* server_, network::Socket *s, con needsPermCheck(false), pointerEventTime(0), clientHasCursor(false), accessRights(AccessDefault), startTime(time(nullptr)), frameTracking(false), - udpFramesSinceFull(0), complainedAboutNoViewRights(false), clientUsername("username_unavailable") + udpFramesSinceFull(0), complainedAboutNoViewRights(false), gameModeNotified(false), + clientUsername("username_unavailable") { setStreams(&sock->inStream(), &sock->outStream()); peerEndpoint.buf = sock->getPeerEndpoint(); @@ -848,6 +849,21 @@ void VNCSConnectionST::pointerEvent(const Point& pos, const Point& abspos, int b } } +void VNCSConnectionST::directMouseEvent(int dx, int dy, int buttonMask, + int scrollX, int scrollY) +{ + pointerEventTime = lastEventTime = time(0); + server->lastUserInputTime = lastEventTime; + if (!(accessRights & AccessPtrEvents)) + return; + if (!rfb::Server::acceptPointerEvents) + return; + + // Route through the desktop interface, which handles both uinput + // writes and X11 cursor updates. + server->desktop->directMouseEvent(dx, dy, buttonMask, scrollX, scrollY); +} + class VNCSConnectionSTShiftPresser { public: @@ -1017,6 +1033,15 @@ void VNCSConnectionST::framebufferUpdateRequest(const Rect& r,bool incremental) if (!(accessRights & AccessView)) return; + // On the first full update request the client is fully connected and has + // sent SetEncodings. If the server is configured to force game mode and the + // client supports direct mouse, send the notification exactly once. + if (!incremental && !gameModeNotified && rfb::Server::forceGameMode && + cp.supportsDirectMouse) { + writer()->writeForceGameMode(); + gameModeNotified = true; + } + SConnection::framebufferUpdateRequest(r, incremental); // Check that the client isn't sending crappy requests diff --git a/common/rfb/VNCSConnectionST.h b/common/rfb/VNCSConnectionST.h index f6ad214..6030271 100644 --- a/common/rfb/VNCSConnectionST.h +++ b/common/rfb/VNCSConnectionST.h @@ -247,6 +247,7 @@ namespace rfb { virtual void clientInit(bool shared); virtual void setPixelFormat(const PixelFormat& pf); virtual void pointerEvent(const Point& pos, const Point& abspos,int buttonMask, const bool skipClick, const bool skipRelease, int scrollX, int scrollY); + virtual void directMouseEvent(int dx, int dy, int buttonMask, int scrollX, int scrollY); virtual void keyEvent(rdr::U32 keysym, rdr::U32 keycode, bool down); virtual void framebufferUpdateRequest(const Rect& r, bool incremental); virtual void setDesktopSize(int fb_width, int fb_height, @@ -365,6 +366,7 @@ namespace rfb { char unixRelaySubscriptions[MAX_UNIX_RELAYS][MAX_UNIX_RELAY_NAME_LEN] = {}; bool complainedAboutNoViewRights; + bool gameModeNotified; std::string clientUsername; bool pendingClientRefresh{false}; }; diff --git a/common/rfb/encodings.h b/common/rfb/encodings.h index d66f82a..29ceab0 100644 --- a/common/rfb/encodings.h +++ b/common/rfb/encodings.h @@ -88,6 +88,7 @@ namespace rfb { constexpr int pseudoEncodingVideoOutTimeLevel100 = -1887; constexpr int pseudoEncodingQOI = -1886; constexpr int pseudoEncodingKasmDisconnectNotify = -1885; + constexpr int pseudoEncodingDirectMouse = -1884; constexpr int pseudoEncodingHardwareProfile0 = -1170; constexpr int pseudoEncodingHardwareProfile4 = -1166; diff --git a/common/rfb/msgTypes.h b/common/rfb/msgTypes.h index d06625d..aa321c4 100644 --- a/common/rfb/msgTypes.h +++ b/common/rfb/msgTypes.h @@ -38,6 +38,7 @@ namespace rfb { constexpr int msgTypeVideoEncoders = 184; constexpr int msgTypeKeepAlive = 185; constexpr int msgTypeServerDisconnect = 186; + constexpr int msgTypeForceGameMode = 187; constexpr int msgTypeServerFence = 248; constexpr int msgTypeUserAddedToSession = 253; @@ -67,6 +68,8 @@ namespace rfb { //constexpr int msgTypeKeepAlive = 185; //constexpr int msgTypeServerDisconnect = 186; + constexpr int msgTypeDirectMouseEvent = 188; + constexpr int msgTypeClientFence = 248; constexpr int msgTypeSetDesktopSize = 251; diff --git a/kasmweb b/kasmweb index 7fc03c8..cf75db3 160000 --- a/kasmweb +++ b/kasmweb @@ -1 +1 @@ -Subproject commit 7fc03c8afc4100f3c01ffcd94cd7b373f48300c1 +Subproject commit cf75db39658d264380e9cf893d7627fcb70047da diff --git a/unix/kasmvnc_defaults.yaml b/unix/kasmvnc_defaults.yaml index 7ea0f84..7dd23fe 100644 --- a/unix/kasmvnc_defaults.yaml +++ b/unix/kasmvnc_defaults.yaml @@ -44,6 +44,9 @@ keyboard: # Mouse, trackpad, etc. pointer: enabled: true + # Force all clients into game mode (direct-drive relative mouse) on connect. + # Useful for game-focused workspace images where pointer lock is always desired. + game_mode: false runtime_configuration: allow_client_to_override_kasm_server_settings: true diff --git a/unix/vncserver b/unix/vncserver index 19bfda9..8aaad54 100755 --- a/unix/vncserver +++ b/unix/vncserver @@ -1563,6 +1563,15 @@ sub DefineConfigToCLIConversion { }) ] }), + KasmVNC::CliOption->new({ + name => 'ForceGameMode', + configKeys => [ + KasmVNC::ConfigKey->new({ + name => "pointer.game_mode", + type => KasmVNC::ConfigKey::BOOLEAN + }) + ] + }), KasmVNC::CliOption->new({ name => 'Log', configKeys => [ diff --git a/unix/xserver/hw/vnc/Input.c b/unix/xserver/hw/vnc/Input.c index dbbfede..03f636b 100644 --- a/unix/xserver/hw/vnc/Input.c +++ b/unix/xserver/hw/vnc/Input.c @@ -28,6 +28,9 @@ #include "vncExtInit.h" #include "RFBGlue.h" +#ifdef __linux__ +#endif + #include "inputstr.h" #if XORG >= 110 #include "inpututils.h" @@ -764,6 +767,7 @@ static void vncKeysymKeyboardEvent(KeySym keysym, int down) mieqProcessInputEvents(); } + #if INPUTTHREAD /** This function is called in Xserver/os/inputthread.c when starting the input thread. */ diff --git a/unix/xserver/hw/vnc/XserverDesktop.cc b/unix/xserver/hw/vnc/XserverDesktop.cc index 2d63628..037eae7e 100644 --- a/unix/xserver/hw/vnc/XserverDesktop.cc +++ b/unix/xserver/hw/vnc/XserverDesktop.cc @@ -517,6 +517,22 @@ void XserverDesktop::pointerEvent(const Point& pos, const Point& abspos, int but } } +void XserverDesktop::directMouseEvent(int dx, int dy, int buttonMask, + int scrollX, int scrollY) +{ + // Move the X11 cursor via XTest (relative injection). + // buttonMask uses standard VNC convention (bit 0=left, 1=middle, 2=right) + // which matches X11 button numbering directly — no remapping needed. + if (scrollX == 0 && scrollY == 0) { + vncPointerMoveRelative(dx, dy, + 0 + vncGetScreenX(screenIndex), + 0 + vncGetScreenY(screenIndex)); + vncPointerButtonAction(buttonMask, false, false); + } else { + vncScroll(scrollX, scrollY); + } +} + unsigned int XserverDesktop::setScreenLayout(int fb_width, int fb_height, const rfb::ScreenSet& layout) { diff --git a/unix/xserver/hw/vnc/XserverDesktop.h b/unix/xserver/hw/vnc/XserverDesktop.h index b3d50a7..dfb0577 100644 --- a/unix/xserver/hw/vnc/XserverDesktop.h +++ b/unix/xserver/hw/vnc/XserverDesktop.h @@ -97,6 +97,7 @@ public: // rfb::SDesktop callbacks virtual void pointerEvent(const rfb::Point& pos, const rfb::Point& abspos, int buttonMask, const bool skipClick, const bool skipRelease, int scrollX = 0, int scrollY = 0); + virtual void directMouseEvent(int dx, int dy, int buttonMask, int scrollX, int scrollY); virtual void keyEvent(rdr::U32 keysym, rdr::U32 keycode, bool down); virtual unsigned int setScreenLayout(int fb_width, int fb_height, const rfb::ScreenSet& layout); From c76c3be9eedf34d1ff8c25ba6b0bed24139b8d1f Mon Sep 17 00:00:00 2001 From: Matt McClaskey Date: Wed, 13 May 2026 15:46:33 +0000 Subject: [PATCH 02/12] back out old relative cursor code --- common/rfb/InputHandler.h | 3 +- common/rfb/SMsgReader.cxx | 2 +- common/rfb/VNCSConnectionST.cxx | 43 ++------------------------- common/rfb/VNCSConnectionST.h | 2 +- unix/xserver/hw/vnc/XserverDesktop.cc | 14 +++------ unix/xserver/hw/vnc/XserverDesktop.h | 2 +- 6 files changed, 11 insertions(+), 55 deletions(-) diff --git a/common/rfb/InputHandler.h b/common/rfb/InputHandler.h index e39bd6b..02ca671 100644 --- a/common/rfb/InputHandler.h +++ b/common/rfb/InputHandler.h @@ -36,8 +36,7 @@ namespace rfb { rdr::U32 __unused_attr keycode, bool __unused_attr down) { } virtual void pointerEvent(const Point& __unused_attr pos, - const Point& __unused_attr abspos, - int __unused_attr buttonMask, + int __unused_attr buttonMask, const bool __unused_attr skipClick, const bool __unused_attr skipRelease, int scrollX, diff --git a/common/rfb/SMsgReader.cxx b/common/rfb/SMsgReader.cxx index 13c8df3..4d9997f 100644 --- a/common/rfb/SMsgReader.cxx +++ b/common/rfb/SMsgReader.cxx @@ -245,7 +245,7 @@ void SMsgReader::readPointerEvent() int scrollX = is->readS16(); int scrollY = is->readS16(); - handler->pointerEvent(Point(x, y), Point(0, 0), mask, false, false, scrollX, scrollY); + handler->pointerEvent(Point(x, y), mask, false, false, scrollX, scrollY); } diff --git a/common/rfb/VNCSConnectionST.cxx b/common/rfb/VNCSConnectionST.cxx index 7933758..cee3bc9 100644 --- a/common/rfb/VNCSConnectionST.cxx +++ b/common/rfb/VNCSConnectionST.cxx @@ -773,7 +773,7 @@ void VNCSConnectionST::setPixelFormat(const PixelFormat& pf) setCursor(); } -void VNCSConnectionST::pointerEvent(const Point& pos, const Point& abspos, int buttonMask, const bool skipClick, const bool skipRelease, int scrollX, int scrollY) +void VNCSConnectionST::pointerEvent(const Point& pos, int buttonMask, const bool skipClick, const bool skipRelease, int scrollX, int scrollY) { pointerEventTime = lastEventTime = time(nullptr); server->lastUserInputTime = lastEventTime; @@ -786,44 +786,7 @@ void VNCSConnectionST::pointerEvent(const Point& pos, const Point& abspos, int b } if (!rfb::Server::acceptPointerEvents) return; if (!server->pointerClient || server->pointerClient == this) { - Point newpos = pos; - if (pos.x & 0x4000) { - newpos.x &= ~0x4000; - newpos.y &= ~0x4000; - - if (newpos.x & 0x8000) { - newpos.x &= ~0x8000; - newpos.x = -newpos.x; - } - if (newpos.y & 0x8000) { - newpos.y &= ~0x8000; - newpos.y = -newpos.y; - } - - if (newpos.x < 0) { - if (pointerEventPos.x + newpos.x >= 0) - pointerEventPos.x += newpos.x; - else - pointerEventPos.x = 0; - } else { - pointerEventPos.x += newpos.x; - if (pointerEventPos.x >= cp.width) - pointerEventPos.x = cp.width; - } - - if (newpos.y < 0) { - if (pointerEventPos.y + newpos.y >= 0) - pointerEventPos.y += newpos.y; - else - pointerEventPos.y = 0; - } else { - pointerEventPos.y += newpos.y; - if (pointerEventPos.y >= cp.height) - pointerEventPos.y = cp.height; - } - } else { - pointerEventPos = pos; - } + pointerEventPos = pos; if (buttonMask) server->pointerClient = this; @@ -845,7 +808,7 @@ void VNCSConnectionST::pointerEvent(const Point& pos, const Point& abspos, int b } } - server->desktop->pointerEvent(newpos, pointerEventPos, buttonMask, skipclick, skiprelease, scrollX, scrollY); + server->desktop->pointerEvent(pos, buttonMask, skipclick, skiprelease, scrollX, scrollY); } } diff --git a/common/rfb/VNCSConnectionST.h b/common/rfb/VNCSConnectionST.h index 6030271..7926f97 100644 --- a/common/rfb/VNCSConnectionST.h +++ b/common/rfb/VNCSConnectionST.h @@ -246,7 +246,7 @@ namespace rfb { virtual void queryConnection(const char* userName); virtual void clientInit(bool shared); virtual void setPixelFormat(const PixelFormat& pf); - virtual void pointerEvent(const Point& pos, const Point& abspos,int buttonMask, const bool skipClick, const bool skipRelease, int scrollX, int scrollY); + virtual void pointerEvent(const Point& pos, int buttonMask, const bool skipClick, const bool skipRelease, int scrollX, int scrollY); virtual void directMouseEvent(int dx, int dy, int buttonMask, int scrollX, int scrollY); virtual void keyEvent(rdr::U32 keysym, rdr::U32 keycode, bool down); virtual void framebufferUpdateRequest(const Rect& r, bool incremental); diff --git a/unix/xserver/hw/vnc/XserverDesktop.cc b/unix/xserver/hw/vnc/XserverDesktop.cc index 037eae7e..5ecb445 100644 --- a/unix/xserver/hw/vnc/XserverDesktop.cc +++ b/unix/xserver/hw/vnc/XserverDesktop.cc @@ -500,17 +500,11 @@ void XserverDesktop::approveConnection(uint32_t opaqueId, bool accept, // // SDesktop callbacks -void XserverDesktop::pointerEvent(const Point& pos, const Point& abspos, int buttonMask, +void XserverDesktop::pointerEvent(const Point& pos, int buttonMask, const bool skipClick, const bool skipRelease, int scrollX, int scrollY) { if (scrollX == 0 && scrollY == 0) { - if (pos.equals(abspos)) { - vncPointerMove(pos.x + vncGetScreenX(screenIndex), pos.y + vncGetScreenY(screenIndex)); - } else { - vncPointerMoveRelative(pos.x, pos.y, - abspos.x + vncGetScreenX(screenIndex), - abspos.y + vncGetScreenY(screenIndex)); - } + vncPointerMove(pos.x + vncGetScreenX(screenIndex), pos.y + vncGetScreenY(screenIndex)); vncPointerButtonAction(buttonMask, skipClick, skipRelease); } else { vncScroll(scrollX, scrollY); @@ -525,8 +519,8 @@ void XserverDesktop::directMouseEvent(int dx, int dy, int buttonMask, // which matches X11 button numbering directly — no remapping needed. if (scrollX == 0 && scrollY == 0) { vncPointerMoveRelative(dx, dy, - 0 + vncGetScreenX(screenIndex), - 0 + vncGetScreenY(screenIndex)); + vncGetScreenX(screenIndex), + vncGetScreenY(screenIndex)); vncPointerButtonAction(buttonMask, false, false); } else { vncScroll(scrollX, scrollY); diff --git a/unix/xserver/hw/vnc/XserverDesktop.h b/unix/xserver/hw/vnc/XserverDesktop.h index dfb0577..beddebd 100644 --- a/unix/xserver/hw/vnc/XserverDesktop.h +++ b/unix/xserver/hw/vnc/XserverDesktop.h @@ -95,7 +95,7 @@ public: const char* rejectMsg=0); // rfb::SDesktop callbacks - virtual void pointerEvent(const rfb::Point& pos, const rfb::Point& abspos, int buttonMask, + virtual void pointerEvent(const rfb::Point& pos, int buttonMask, const bool skipClick, const bool skipRelease, int scrollX = 0, int scrollY = 0); virtual void directMouseEvent(int dx, int dy, int buttonMask, int scrollX, int scrollY); virtual void keyEvent(rdr::U32 keysym, rdr::U32 keycode, bool down); From f1a1bd5557473ce6c78db5ec339878ccfa716de7 Mon Sep 17 00:00:00 2001 From: Matt McClaskey Date: Wed, 13 May 2026 16:22:20 +0000 Subject: [PATCH 03/12] update novnc ref --- kasmweb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/kasmweb b/kasmweb index cf75db3..bc0e6da 160000 --- a/kasmweb +++ b/kasmweb @@ -1 +1 @@ -Subproject commit cf75db39658d264380e9cf893d7627fcb70047da +Subproject commit bc0e6da7f507d52532a3e082074b14a23abc9de2 From 763a6f49728126a0276f0aa38e72e4b1c77c9be6 Mon Sep 17 00:00:00 2001 From: Matt McClaskey Date: Tue, 19 May 2026 19:07:57 +0000 Subject: [PATCH 04/12] VNC-14 addressed code review comments --- common/rfb/SDesktop.h | 6 +++++ common/rfb/SMsgReader.cxx | 3 ++- common/rfb/VNCSConnectionST.cxx | 15 ++++++++--- unix/xserver/hw/vnc/Input.c | 4 --- unix/xserver/hw/vnc/XserverDesktop.cc | 39 ++++++++++++++++++++++++--- unix/xserver/hw/vnc/XserverDesktop.h | 1 + 6 files changed, 55 insertions(+), 13 deletions(-) diff --git a/common/rfb/SDesktop.h b/common/rfb/SDesktop.h index c6e267c..b05f05a 100644 --- a/common/rfb/SDesktop.h +++ b/common/rfb/SDesktop.h @@ -78,6 +78,12 @@ namespace rfb { // the relevant RFB protocol messages from clients. // See InputHandler for method signatures. + virtual Point directMouseEventWithPosition(int dx, int dy, int buttonMask, + int scrollX, int scrollY) { + directMouseEvent(dx, dy, buttonMask, scrollX, scrollY); + return Point(); + } + // handleClipboardAnnounce() is called to indicate a change in the // clipboard on a client. Call VNCServer::requestClipboard() to // access the actual data. diff --git a/common/rfb/SMsgReader.cxx b/common/rfb/SMsgReader.cxx index 4d9997f..f1a8e9f 100644 --- a/common/rfb/SMsgReader.cxx +++ b/common/rfb/SMsgReader.cxx @@ -429,7 +429,8 @@ void SMsgReader::readVideoEncodersRequest() const { void SMsgReader::readDirectMouseEvent() { // Wire format (9 bytes after the type byte): - // byte 0: button mask (bit 0=left, 1=right, 2=middle, 3=side, 4=extra) + // byte 0: VNC button mask. Button N uses bit N-1, so the common buttons + // are bit 0=left, bit 1=middle, bit 2=right. // bytes 1-2: dx (int16 BE) // bytes 3-4: dy (int16 BE) // bytes 5-6: scroll dx (int16 BE) diff --git a/common/rfb/VNCSConnectionST.cxx b/common/rfb/VNCSConnectionST.cxx index cee3bc9..b14b4b0 100644 --- a/common/rfb/VNCSConnectionST.cxx +++ b/common/rfb/VNCSConnectionST.cxx @@ -815,16 +815,23 @@ void VNCSConnectionST::pointerEvent(const Point& pos, int buttonMask, const bool void VNCSConnectionST::directMouseEvent(int dx, int dy, int buttonMask, int scrollX, int scrollY) { - pointerEventTime = lastEventTime = time(0); + pointerEventTime = lastEventTime = time(nullptr); server->lastUserInputTime = lastEventTime; if (!(accessRights & AccessPtrEvents)) return; if (!rfb::Server::acceptPointerEvents) return; + if (server->pointerClient && server->pointerClient != this) + return; - // Route through the desktop interface, which handles both uinput - // writes and X11 cursor updates. - server->desktop->directMouseEvent(dx, dy, buttonMask, scrollX, scrollY); + if (buttonMask) + server->pointerClient = this; + else + server->pointerClient = nullptr; + + pointerEventPos = + server->desktop->directMouseEventWithPosition(dx, dy, buttonMask, + scrollX, scrollY); } diff --git a/unix/xserver/hw/vnc/Input.c b/unix/xserver/hw/vnc/Input.c index 03f636b..dbbfede 100644 --- a/unix/xserver/hw/vnc/Input.c +++ b/unix/xserver/hw/vnc/Input.c @@ -28,9 +28,6 @@ #include "vncExtInit.h" #include "RFBGlue.h" -#ifdef __linux__ -#endif - #include "inputstr.h" #if XORG >= 110 #include "inpututils.h" @@ -767,7 +764,6 @@ static void vncKeysymKeyboardEvent(KeySym keysym, int down) mieqProcessInputEvents(); } - #if INPUTTHREAD /** This function is called in Xserver/os/inputthread.c when starting the input thread. */ diff --git a/unix/xserver/hw/vnc/XserverDesktop.cc b/unix/xserver/hw/vnc/XserverDesktop.cc index 5ecb445..3598a74 100644 --- a/unix/xserver/hw/vnc/XserverDesktop.cc +++ b/unix/xserver/hw/vnc/XserverDesktop.cc @@ -513,18 +513,49 @@ void XserverDesktop::pointerEvent(const Point& pos, int buttonMask, void XserverDesktop::directMouseEvent(int dx, int dy, int buttonMask, int scrollX, int scrollY) +{ + directMouseEventWithPosition(dx, dy, buttonMask, scrollX, scrollY); +} + +rfb::Point XserverDesktop::directMouseEventWithPosition(int dx, int dy, + int buttonMask, int scrollX, int scrollY) { // Move the X11 cursor via XTest (relative injection). // buttonMask uses standard VNC convention (bit 0=left, 1=middle, 2=right) - // which matches X11 button numbering directly — no remapping needed. + // which matches X11 button numbering directly, so no remapping is needed. + int cursorX, cursorY; + vncGetPointerPos(&cursorX, &cursorY); + if (scrollX == 0 && scrollY == 0) { - vncPointerMoveRelative(dx, dy, - vncGetScreenX(screenIndex), - vncGetScreenY(screenIndex)); + const int screenX = vncGetScreenX(screenIndex); + const int screenY = vncGetScreenY(screenIndex); + const int maxX = screenX + width() - 1; + const int maxY = screenY + height() - 1; + + cursorX += dx; + cursorY += dy; + + if (cursorX < screenX) + cursorX = screenX; + else if (cursorX > maxX) + cursorX = maxX; + + if (cursorY < screenY) + cursorY = screenY; + else if (cursorY > maxY) + cursorY = maxY; + + vncPointerMoveRelative(dx, dy, cursorX, cursorY); vncPointerButtonAction(buttonMask, false, false); } else { vncScroll(scrollX, scrollY); } + + rfb::Point cursorPos(cursorX - vncGetScreenX(screenIndex), + cursorY - vncGetScreenY(screenIndex)); + oldCursorPos = cursorPos; + server->setCursorPos(cursorPos, false); + return cursorPos; } unsigned int XserverDesktop::setScreenLayout(int fb_width, int fb_height, diff --git a/unix/xserver/hw/vnc/XserverDesktop.h b/unix/xserver/hw/vnc/XserverDesktop.h index beddebd..b9ceadc 100644 --- a/unix/xserver/hw/vnc/XserverDesktop.h +++ b/unix/xserver/hw/vnc/XserverDesktop.h @@ -98,6 +98,7 @@ public: virtual void pointerEvent(const rfb::Point& pos, int buttonMask, const bool skipClick, const bool skipRelease, int scrollX = 0, int scrollY = 0); virtual void directMouseEvent(int dx, int dy, int buttonMask, int scrollX, int scrollY); + virtual rfb::Point directMouseEventWithPosition(int dx, int dy, int buttonMask, int scrollX, int scrollY); virtual void keyEvent(rdr::U32 keysym, rdr::U32 keycode, bool down); virtual unsigned int setScreenLayout(int fb_width, int fb_height, const rfb::ScreenSet& layout); From 3bf44ab18677cbcc7808837d6b5bab44482b3cbb Mon Sep 17 00:00:00 2001 From: Matt McClaskey Date: Mon, 18 May 2026 11:11:03 +0000 Subject: [PATCH 05/12] VNC-371 fix kali build failure --- builder/dockerfile.kali_kali-rolling.build | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/builder/dockerfile.kali_kali-rolling.build b/builder/dockerfile.kali_kali-rolling.build index bd5bc96..447cb2b 100644 --- a/builder/dockerfile.kali_kali-rolling.build +++ b/builder/dockerfile.kali_kali-rolling.build @@ -7,7 +7,9 @@ ENV DEBIAN_FRONTEND noninteractive ENV CXXFLAGS="-Wno-stringop-overflow" ENV CFLAGS="-Wno-stringop-overflow" -RUN grep '^deb' /etc/apt/sources.list | sed 's#^deb#deb-src#' >> /etc/apt/sources.list +RUN { [ -f /etc/apt/sources.list ] && grep '^deb ' /etc/apt/sources.list 2>/dev/null; \ + find /etc/apt/sources.list.d/ -name "*.list" -exec grep -h '^deb ' {} \; 2>/dev/null; } | \ + sed 's/^deb /deb-src /' >> /etc/apt/sources.list.d/kali-deb-src.list RUN apt-get update && \ apt-get -y install sudo From d413884f865828cee48d47ce371db525b2353c5c Mon Sep 17 00:00:00 2001 From: Matt McClaskey Date: Mon, 18 May 2026 15:13:28 +0000 Subject: [PATCH 06/12] VNC-371 second attempt to fix pipeline issue. --- builder/dockerfile.kali_kali-rolling.build | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/builder/dockerfile.kali_kali-rolling.build b/builder/dockerfile.kali_kali-rolling.build index 447cb2b..1fad933 100644 --- a/builder/dockerfile.kali_kali-rolling.build +++ b/builder/dockerfile.kali_kali-rolling.build @@ -7,9 +7,10 @@ ENV DEBIAN_FRONTEND noninteractive ENV CXXFLAGS="-Wno-stringop-overflow" ENV CFLAGS="-Wno-stringop-overflow" -RUN { [ -f /etc/apt/sources.list ] && grep '^deb ' /etc/apt/sources.list 2>/dev/null; \ +RUN find /etc/apt/sources.list.d/ -name "*.sources" | xargs -r sed -i 's/^Types: deb$/Types: deb deb-src/'; \ + { [ -f /etc/apt/sources.list ] && grep '^deb ' /etc/apt/sources.list 2>/dev/null; \ find /etc/apt/sources.list.d/ -name "*.list" -exec grep -h '^deb ' {} \; 2>/dev/null; } | \ - sed 's/^deb /deb-src /' >> /etc/apt/sources.list.d/kali-deb-src.list + sed 's/^deb /deb-src /' >> /etc/apt/sources.list.d/kali-deb-src.list; true RUN apt-get update && \ apt-get -y install sudo From 0a0d0d3bb17d927576463e043deb2601c4d86879 Mon Sep 17 00:00:00 2001 From: Matt McClaskey Date: Thu, 21 May 2026 09:24:17 +0000 Subject: [PATCH 07/12] Call recheckPerms for directMouseEvent --- common/rfb/VNCSConnectionST.cxx | 4 +++- kasmweb | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/common/rfb/VNCSConnectionST.cxx b/common/rfb/VNCSConnectionST.cxx index b14b4b0..2210830 100644 --- a/common/rfb/VNCSConnectionST.cxx +++ b/common/rfb/VNCSConnectionST.cxx @@ -817,8 +817,10 @@ void VNCSConnectionST::directMouseEvent(int dx, int dy, int buttonMask, { pointerEventTime = lastEventTime = time(nullptr); server->lastUserInputTime = lastEventTime; - if (!(accessRights & AccessPtrEvents)) + if (!(accessRights & AccessPtrEvents)) { + recheckPerms(); return; + } if (!rfb::Server::acceptPointerEvents) return; if (server->pointerClient && server->pointerClient != this) diff --git a/kasmweb b/kasmweb index bc0e6da..7f7d974 160000 --- a/kasmweb +++ b/kasmweb @@ -1 +1 @@ -Subproject commit bc0e6da7f507d52532a3e082074b14a23abc9de2 +Subproject commit 7f7d974925c5f99fbc409f3b703519a29b37ba7a From 6880b03c046f41c595965556f271bb72b10fce44 Mon Sep 17 00:00:00 2001 From: Matt McClaskey Date: Thu, 21 May 2026 09:34:00 +0000 Subject: [PATCH 08/12] address DLP region clicks --- unix/xserver/hw/vnc/XserverDesktop.cc | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/unix/xserver/hw/vnc/XserverDesktop.cc b/unix/xserver/hw/vnc/XserverDesktop.cc index 3598a74..8ecfec8 100644 --- a/unix/xserver/hw/vnc/XserverDesktop.cc +++ b/unix/xserver/hw/vnc/XserverDesktop.cc @@ -546,7 +546,23 @@ rfb::Point XserverDesktop::directMouseEventWithPosition(int dx, int dy, cursorY = maxY; vncPointerMoveRelative(dx, dy, cursorX, cursorY); - vncPointerButtonAction(buttonMask, false, false); + + bool skipclick = false, skiprelease = false; + if (server->DLPRegion.enabled) { + rdr::U16 x1, y1, x2, y2; + server->translateDLPRegion(x1, y1, x2, y2); + + rfb::Point cursorPos(cursorX - screenX, cursorY - screenY); + if (cursorPos.x < x1 || cursorPos.x >= x2 || + cursorPos.y < y1 || cursorPos.y >= y2) { + if (!rfb::Server::DLP_RegionAllowClick) + skipclick = true; + if (!rfb::Server::DLP_RegionAllowRelease) + skiprelease = true; + } + } + + vncPointerButtonAction(buttonMask, skipclick, skiprelease); } else { vncScroll(scrollX, scrollY); } From a34b523b56e5bd2a74631a5a5ba09b39e9c8117a Mon Sep 17 00:00:00 2001 From: Matt McClaskey Date: Fri, 22 May 2026 11:43:12 +0000 Subject: [PATCH 09/12] fix c++ access violation --- common/rfb/VNCServerST.cxx | 21 +++++++++++++++++++++ common/rfb/VNCServerST.h | 5 +++++ unix/xserver/hw/vnc/XserverDesktop.cc | 16 +++------------- 3 files changed, 29 insertions(+), 13 deletions(-) diff --git a/common/rfb/VNCServerST.cxx b/common/rfb/VNCServerST.cxx index d657c2e..21dde7b 100644 --- a/common/rfb/VNCServerST.cxx +++ b/common/rfb/VNCServerST.cxx @@ -997,6 +997,27 @@ void VNCServerST::translateDLPRegion(rdr::U16 &x1, rdr::U16 &y1, rdr::U16 &x2, r //slog.info("DLP_Region vals %u,%u %u,%u", x1, y1, x2, y2); } +void VNCServerST::getDLPRegionSkipFlags(const Point& pos, + bool& skipclick, bool& skiprelease) const +{ + skipclick = false; + skiprelease = false; + + if (!DLPRegion.enabled) + return; + + rdr::U16 x1, y1, x2, y2; + translateDLPRegion(x1, y1, x2, y2); + + if (pos.x < x1 || pos.x >= x2 || + pos.y < y1 || pos.y >= y2) { + if (!Server::DLP_RegionAllowClick) + skipclick = true; + if (!Server::DLP_RegionAllowRelease) + skiprelease = true; + } +} + void VNCServerST::blackOut() { // Compute the region, since the resolution may have changed diff --git a/common/rfb/VNCServerST.h b/common/rfb/VNCServerST.h index 64d84f0..df2f0aa 100644 --- a/common/rfb/VNCServerST.h +++ b/common/rfb/VNCServerST.h @@ -208,6 +208,11 @@ namespace rfb { enum UserActionType {Join, Leave}; void notifyUserAction(const VNCSConnectionST* newConnection, std::string& user_name, const UserActionType action_type); + // Compute whether a pointer click/release at the given framebuffer + // position should be suppressed by the DLP region policy. + void getDLPRegionSkipFlags(const Point& pos, + bool& skipclick, bool& skiprelease) const; + protected: friend class VNCSConnectionST; diff --git a/unix/xserver/hw/vnc/XserverDesktop.cc b/unix/xserver/hw/vnc/XserverDesktop.cc index 8ecfec8..3085ec5 100644 --- a/unix/xserver/hw/vnc/XserverDesktop.cc +++ b/unix/xserver/hw/vnc/XserverDesktop.cc @@ -548,19 +548,9 @@ rfb::Point XserverDesktop::directMouseEventWithPosition(int dx, int dy, vncPointerMoveRelative(dx, dy, cursorX, cursorY); bool skipclick = false, skiprelease = false; - if (server->DLPRegion.enabled) { - rdr::U16 x1, y1, x2, y2; - server->translateDLPRegion(x1, y1, x2, y2); - - rfb::Point cursorPos(cursorX - screenX, cursorY - screenY); - if (cursorPos.x < x1 || cursorPos.x >= x2 || - cursorPos.y < y1 || cursorPos.y >= y2) { - if (!rfb::Server::DLP_RegionAllowClick) - skipclick = true; - if (!rfb::Server::DLP_RegionAllowRelease) - skiprelease = true; - } - } + server->getDLPRegionSkipFlags(rfb::Point(cursorX - screenX, + cursorY - screenY), + skipclick, skiprelease); vncPointerButtonAction(buttonMask, skipclick, skiprelease); } else { From e147dad5c8b561ab60576cba7c539f9eebe478a7 Mon Sep 17 00:00:00 2001 From: Matt McClaskey Date: Mon, 25 May 2026 10:46:44 +0000 Subject: [PATCH 10/12] VNC-374 prep for 1.5.0 release --- alpine/kasmvncserver/APKBUILD | 2 +- debian/changelog | 64 +++++++++++++++++++++++++++++++++++ fedora/kasmvncserver.spec | 50 ++++++++++++++++++++++++++- opensuse/kasmvncserver.spec | 50 ++++++++++++++++++++++++++- opensuse/kasmvncserver16.spec | 50 ++++++++++++++++++++++++++- oracle/kasmvncserver.spec | 50 ++++++++++++++++++++++++++- oracle/kasmvncserver9.spec | 50 ++++++++++++++++++++++++++- unix/xserver/hw/vnc/xvnc.c | 4 +-- 8 files changed, 312 insertions(+), 8 deletions(-) diff --git a/alpine/kasmvncserver/APKBUILD b/alpine/kasmvncserver/APKBUILD index f5fb900..01e9d97 100644 --- a/alpine/kasmvncserver/APKBUILD +++ b/alpine/kasmvncserver/APKBUILD @@ -3,7 +3,7 @@ # Contributor: # Maintainer: Kasm Technologies LLC pkgname=kasmvncserver -pkgver=1.3.4 +pkgver=1.5.0 pkgrel=0 pkgdesc="KasmVNC provides remote web-based access to a Desktop or application." url="https://github.com/kasmtech/KasmVNC" diff --git a/debian/changelog b/debian/changelog index 3cb1e97..a687fed 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,67 @@ +kasmvnc (1.5.0-1) unstable; urgency=medium + + * Added video streaming mode with hardware and software accelerated H.264, H.265, and AV1 encoders. Hardware acceleration uses VAAPI (Intel/AMD) and NVENC (NVIDIA). + * Added support for relative mouse input mode for improved UX and application compatibility (e.g. games and apps that require raw mouse deltas). + * Added support for overriding configuration settings via environment variables. + * Optional systemd auto-start integration for deb/rpm packages, with improved upgrade and uninstall handling. + * Added support for Fedora 42 and 43. + * Added support for openSUSE 16. + * Added support for Alpine 3.22 and 3.23. + * Removed support for distro versions that reached end-of-life (Fedora 40 and 41; Alpine 3.18, 3.19, and 3.20). + * FFmpeg 8 compatibility (dropped use of removed avcodec_close API). + * Fixed crash in window manager triggered by null clipboard data during UTF-8 to Latin-1 conversion. + * Fixed bug where closing a secondary monitor would close the entire client connection. + * Fixed Kali Linux image build failures. + * Updated default STUN public IP behavior to avoid undesired external lookups. + * Improved client-side multi-monitor handling with a dedicated reference to the visible canvas. + * Bumped rollup to address security vulnerabilities. + * Updated French translations. + + -- Kasm Technologies LLC Mon, 25 May 2026 00:00:00 +0000 + +kasmvnc (1.4.2-1) unstable; urgency=medium + + * Fixed bug with server-side enforced idle-timeout. + + -- Kasm Technologies LLC Fri, 24 Apr 2026 00:00:00 +0000 + +kasmvnc (1.4.1-1) unstable; urgency=medium + + * Fixed bug with enforcement of server-side idle-disconnect. + * Added support for graceful disconnect, allowing the client to auto-reconnect on a non-graceful disconnect and not when the server gracefully disconnects. + * Fixed display manager UI to work on touch screens. + + -- Kasm Technologies LLC Mon, 01 Dec 2025 10:42:46 +0000 + +kasmvnc (1.4.0-1) unstable; urgency=medium + + * Added new API call for retrieving active sessions. + * Added message propagation to clients other users connect or disconnect from the same session. + * Enhanced detection of physical cores vs virtual cores for better tuning of thread counts on multi-threaded processes. + * Significant enhancements of multi-threading performance. + * Upgraded libwebp library to 1.5.0. + * Updated to C++ 20 standard. + * Added network.udp.payload_size to kasm yaml configuration. + * Added build for Debian Trixie. + * Refactor of code to decrease memory usage on client browsers. + * Added support for the Keyboard API for Chromium browsers. + * Added multi-threaded asynchronous decoding of image rects, increasing client side performance. + * Fixed bug with watermark not getting displayed in certain scenarios. + * Fixed bug with case sensitivity of HTTP headers + * Fixed bug with the downloads API not escaping certain characters in returned json. + * Fixed bug causing a segmentation fault on the get_screenshot API handler in certain conditions. + * Bug fixes with multi-monitor, adding and removing displays + * Fix bug with secondary display still showing content after session disconnect in certain scenarios. + * Fixed bug with Ctrl key not working on foreign language keyboards with Chromium based browsers. + * Fix bug with secondary display interaction not counting toward interaction with respect to the idle disconnect setting. + * Fixed memory leak in Firefox. + * Fixed bug with Firefox displaying scrollbars at odd resolutions. + * Fixes to Korean translations. + * Multiple fixes to IME foreign language support. + * Fixed a race condition causing an error message to be displayed erroneously on the client. + + -- Kasm Technologies LLC Fri, 01 Aug 2025 10:42:46 +0000 + kasmvnc (1.3.4-1) unstable; urgency=medium * Add configuration key network.udp.payload_size. diff --git a/fedora/kasmvncserver.spec b/fedora/kasmvncserver.spec index 62c74d5..12168ac 100644 --- a/fedora/kasmvncserver.spec +++ b/fedora/kasmvncserver.spec @@ -1,5 +1,5 @@ Name: kasmvncserver -Version: 1.3.4 +Version: 1.5.0 Release: 1%{?dist} Summary: VNC server accessible from a web browser @@ -117,6 +117,54 @@ stop_vncserver_systemd_services_for_all_logged_in_users %doc /usr/share/doc/kasmvncserver/README.md %changelog +* Mon May 25 2026 KasmTech - 1.5.0-1 +- Added video streaming mode with hardware and software accelerated H.264, H.265, and AV1 encoders. Hardware acceleration uses VAAPI (Intel/AMD) and NVENC (NVIDIA). +- Added support for relative mouse input mode for improved UX and application compatibility (e.g. games and apps that require raw mouse deltas). +- Added support for overriding configuration settings via environment variables. +- Optional systemd auto-start integration for deb/rpm packages, with improved upgrade and uninstall handling. +- Added support for Fedora 42 and 43. +- Added support for openSUSE 16. +- Added support for Alpine 3.22 and 3.23. +- Removed support for distro versions that reached end-of-life (Fedora 40 and 41; Alpine 3.18, 3.19, and 3.20). +- FFmpeg 8 compatibility (dropped use of removed avcodec_close API). +- Fixed crash in window manager triggered by null clipboard data during UTF-8 to Latin-1 conversion. +- Fixed bug where closing a secondary monitor would close the entire client connection. +- Fixed Kali Linux image build failures. +- Updated default STUN public IP behavior to avoid undesired external lookups. +- Improved client-side multi-monitor handling with a dedicated reference to the visible canvas. +- Bumped rollup to address security vulnerabilities. +- Updated French translations. +* Fri Apr 24 2026 KasmTech - 1.4.2-1 +- Fixed bug with server-side enforced idle-timeout. +* Mon Dec 01 2025 KasmTech - 1.4.1-1 +- Fixed bug with enforcement of server-side idle-disconnect. +- Added support for graceful disconnect, allowing the client to auto-reconnect on a non-graceful disconnect and not when the server gracefully disconnects. +- Fixed display manager UI to work on touch screens. +* Fri Aug 01 2025 KasmTech - 1.4.0-1 +- Added new API call for retrieving active sessions. +- Added message propagation to clients other users connect or disconnect from the same session. +- Enhanced detection of physical cores vs virtual cores for better tuning of thread counts on multi-threaded processes. +- Significant enhancements of multi-threading performance. +- Upgraded libwebp library to 1.5.0. +- Updated to C++ 20 standard. +- Added network.udp.payload_size to kasm yaml configuration. +- Added build for Debian Trixie. +- Refactor of code to decrease memory usage on client browsers. +- Added support for the Keyboard API for Chromium browsers. +- Added multi-threaded asynchronous decoding of image rects, increasing client side performance. +- Fixed bug with watermark not getting displayed in certain scenarios. +- Fixed bug with case sensitivity of HTTP headers +- Fixed bug with the downloads API not escaping certain characters in returned json. +- Fixed bug causing a segmentation fault on the get_screenshot API handler in certain conditions. +- Bug fixes with multi-monitor, adding and removing displays +- Fix bug with secondary display still showing content after session disconnect in certain scenarios. +- Fixed bug with Ctrl key not working on foreign language keyboards with Chromium based browsers. +- Fix bug with secondary display interaction not counting toward interaction with respect to the idle disconnect setting. +- Fixed memory leak in Firefox. +- Fixed bug with Firefox displaying scrollbars at odd resolutions. +- Fixes to Korean translations. +- Multiple fixes to IME foreign language support. +- Fixed a race condition causing an error message to be displayed erroneously on the client. * Thu Mar 20 2025 KasmTech - 1.3.4-1 - Add configuration key network.udp.payload_size. - Remove support for distro versions that reached end-of-life. diff --git a/opensuse/kasmvncserver.spec b/opensuse/kasmvncserver.spec index 4e276b5..57fc8b4 100644 --- a/opensuse/kasmvncserver.spec +++ b/opensuse/kasmvncserver.spec @@ -1,5 +1,5 @@ Name: kasmvncserver -Version: 1.3.4 +Version: 1.5.0 Release: leap15 Summary: VNC server accessible from a web browser @@ -115,6 +115,54 @@ stop_vncserver_systemd_services_for_all_logged_in_users %doc /usr/share/doc/kasmvncserver/README.md %changelog +* Mon May 25 2026 KasmTech - 1.5.0-leap15 +- Added video streaming mode with hardware and software accelerated H.264, H.265, and AV1 encoders. Hardware acceleration uses VAAPI (Intel/AMD) and NVENC (NVIDIA). +- Added support for relative mouse input mode for improved UX and application compatibility (e.g. games and apps that require raw mouse deltas). +- Added support for overriding configuration settings via environment variables. +- Optional systemd auto-start integration for deb/rpm packages, with improved upgrade and uninstall handling. +- Added support for Fedora 42 and 43. +- Added support for openSUSE 16. +- Added support for Alpine 3.22 and 3.23. +- Removed support for distro versions that reached end-of-life (Fedora 40 and 41; Alpine 3.18, 3.19, and 3.20). +- FFmpeg 8 compatibility (dropped use of removed avcodec_close API). +- Fixed crash in window manager triggered by null clipboard data during UTF-8 to Latin-1 conversion. +- Fixed bug where closing a secondary monitor would close the entire client connection. +- Fixed Kali Linux image build failures. +- Updated default STUN public IP behavior to avoid undesired external lookups. +- Improved client-side multi-monitor handling with a dedicated reference to the visible canvas. +- Bumped rollup to address security vulnerabilities. +- Updated French translations. +* Fri Apr 24 2026 KasmTech - 1.4.2-leap15 +- Fixed bug with server-side enforced idle-timeout. +* Mon Dec 01 2025 KasmTech - 1.4.1-leap15 +- Fixed bug with enforcement of server-side idle-disconnect. +- Added support for graceful disconnect, allowing the client to auto-reconnect on a non-graceful disconnect and not when the server gracefully disconnects. +- Fixed display manager UI to work on touch screens. +* Fri Aug 01 2025 KasmTech - 1.4.0-leap15 +- Added new API call for retrieving active sessions. +- Added message propagation to clients other users connect or disconnect from the same session. +- Enhanced detection of physical cores vs virtual cores for better tuning of thread counts on multi-threaded processes. +- Significant enhancements of multi-threading performance. +- Upgraded libwebp library to 1.5.0. +- Updated to C++ 20 standard. +- Added network.udp.payload_size to kasm yaml configuration. +- Added build for Debian Trixie. +- Refactor of code to decrease memory usage on client browsers. +- Added support for the Keyboard API for Chromium browsers. +- Added multi-threaded asynchronous decoding of image rects, increasing client side performance. +- Fixed bug with watermark not getting displayed in certain scenarios. +- Fixed bug with case sensitivity of HTTP headers +- Fixed bug with the downloads API not escaping certain characters in returned json. +- Fixed bug causing a segmentation fault on the get_screenshot API handler in certain conditions. +- Bug fixes with multi-monitor, adding and removing displays +- Fix bug with secondary display still showing content after session disconnect in certain scenarios. +- Fixed bug with Ctrl key not working on foreign language keyboards with Chromium based browsers. +- Fix bug with secondary display interaction not counting toward interaction with respect to the idle disconnect setting. +- Fixed memory leak in Firefox. +- Fixed bug with Firefox displaying scrollbars at odd resolutions. +- Fixes to Korean translations. +- Multiple fixes to IME foreign language support. +- Fixed a race condition causing an error message to be displayed erroneously on the client. * Thu Mar 20 2025 KasmTech - 1.3.4-leap15 - Add configuration key network.udp.payload_size. - Remove support for distro versions that reached end-of-life. diff --git a/opensuse/kasmvncserver16.spec b/opensuse/kasmvncserver16.spec index 342d148..7900f14 100644 --- a/opensuse/kasmvncserver16.spec +++ b/opensuse/kasmvncserver16.spec @@ -1,5 +1,5 @@ Name: kasmvncserver -Version: 1.3.4 +Version: 1.5.0 Release: leap16 Summary: VNC server accessible from a web browser @@ -115,6 +115,54 @@ stop_vncserver_systemd_services_for_all_logged_in_users %doc /usr/share/doc/kasmvncserver/README.md %changelog +* Mon May 25 2026 KasmTech - 1.5.0-leap16 +- Added video streaming mode with hardware and software accelerated H.264, H.265, and AV1 encoders. Hardware acceleration uses VAAPI (Intel/AMD) and NVENC (NVIDIA). +- Added support for relative mouse input mode for improved UX and application compatibility (e.g. games and apps that require raw mouse deltas). +- Added support for overriding configuration settings via environment variables. +- Optional systemd auto-start integration for deb/rpm packages, with improved upgrade and uninstall handling. +- Added support for Fedora 42 and 43. +- Added support for openSUSE 16. +- Added support for Alpine 3.22 and 3.23. +- Removed support for distro versions that reached end-of-life (Fedora 40 and 41; Alpine 3.18, 3.19, and 3.20). +- FFmpeg 8 compatibility (dropped use of removed avcodec_close API). +- Fixed crash in window manager triggered by null clipboard data during UTF-8 to Latin-1 conversion. +- Fixed bug where closing a secondary monitor would close the entire client connection. +- Fixed Kali Linux image build failures. +- Updated default STUN public IP behavior to avoid undesired external lookups. +- Improved client-side multi-monitor handling with a dedicated reference to the visible canvas. +- Bumped rollup to address security vulnerabilities. +- Updated French translations. +* Fri Apr 24 2026 KasmTech - 1.4.2-leap15 +- Fixed bug with server-side enforced idle-timeout. +* Mon Dec 01 2025 KasmTech - 1.4.1-leap15 +- Fixed bug with enforcement of server-side idle-disconnect. +- Added support for graceful disconnect, allowing the client to auto-reconnect on a non-graceful disconnect and not when the server gracefully disconnects. +- Fixed display manager UI to work on touch screens. +* Fri Aug 01 2025 KasmTech - 1.4.0-leap15 +- Added new API call for retrieving active sessions. +- Added message propagation to clients other users connect or disconnect from the same session. +- Enhanced detection of physical cores vs virtual cores for better tuning of thread counts on multi-threaded processes. +- Significant enhancements of multi-threading performance. +- Upgraded libwebp library to 1.5.0. +- Updated to C++ 20 standard. +- Added network.udp.payload_size to kasm yaml configuration. +- Added build for Debian Trixie. +- Refactor of code to decrease memory usage on client browsers. +- Added support for the Keyboard API for Chromium browsers. +- Added multi-threaded asynchronous decoding of image rects, increasing client side performance. +- Fixed bug with watermark not getting displayed in certain scenarios. +- Fixed bug with case sensitivity of HTTP headers +- Fixed bug with the downloads API not escaping certain characters in returned json. +- Fixed bug causing a segmentation fault on the get_screenshot API handler in certain conditions. +- Bug fixes with multi-monitor, adding and removing displays +- Fix bug with secondary display still showing content after session disconnect in certain scenarios. +- Fixed bug with Ctrl key not working on foreign language keyboards with Chromium based browsers. +- Fix bug with secondary display interaction not counting toward interaction with respect to the idle disconnect setting. +- Fixed memory leak in Firefox. +- Fixed bug with Firefox displaying scrollbars at odd resolutions. +- Fixes to Korean translations. +- Multiple fixes to IME foreign language support. +- Fixed a race condition causing an error message to be displayed erroneously on the client. * Thu Mar 20 2025 KasmTech - 1.3.4-leap15 - Add configuration key network.udp.payload_size. - Remove support for distro versions that reached end-of-life. diff --git a/oracle/kasmvncserver.spec b/oracle/kasmvncserver.spec index 1048a2c..6081750 100644 --- a/oracle/kasmvncserver.spec +++ b/oracle/kasmvncserver.spec @@ -1,5 +1,5 @@ Name: kasmvncserver -Version: 1.3.4 +Version: 1.5.0 Release: 1%{?dist} Summary: VNC server accessible from a web browser @@ -83,6 +83,54 @@ cd $DST_MAN && ln -s vncpasswd.1 kasmvncpasswd.1; %doc /usr/share/doc/kasmvncserver/README.md %changelog +* Mon May 25 2026 KasmTech - 1.5.0-1 +- Added video streaming mode with hardware and software accelerated H.264, H.265, and AV1 encoders. Hardware acceleration uses VAAPI (Intel/AMD) and NVENC (NVIDIA). +- Added support for relative mouse input mode for improved UX and application compatibility (e.g. games and apps that require raw mouse deltas). +- Added support for overriding configuration settings via environment variables. +- Optional systemd auto-start integration for deb/rpm packages, with improved upgrade and uninstall handling. +- Added support for Fedora 42 and 43. +- Added support for openSUSE 16. +- Added support for Alpine 3.22 and 3.23. +- Removed support for distro versions that reached end-of-life (Fedora 40 and 41; Alpine 3.18, 3.19, and 3.20). +- FFmpeg 8 compatibility (dropped use of removed avcodec_close API). +- Fixed crash in window manager triggered by null clipboard data during UTF-8 to Latin-1 conversion. +- Fixed bug where closing a secondary monitor would close the entire client connection. +- Fixed Kali Linux image build failures. +- Updated default STUN public IP behavior to avoid undesired external lookups. +- Improved client-side multi-monitor handling with a dedicated reference to the visible canvas. +- Bumped rollup to address security vulnerabilities. +- Updated French translations. +* Fri Apr 24 2026 KasmTech - 1.4.2-1 +- Fixed bug with server-side enforced idle-timeout. +* Mon Dec 01 2025 KasmTech - 1.4.1-1 +- Fixed bug with enforcement of server-side idle-disconnect. +- Added support for graceful disconnect, allowing the client to auto-reconnect on a non-graceful disconnect and not when the server gracefully disconnects. +- Fixed display manager UI to work on touch screens. +* Fri Aug 01 2025 KasmTech - 1.4.0-1 +- Added new API call for retrieving active sessions. +- Added message propagation to clients other users connect or disconnect from the same session. +- Enhanced detection of physical cores vs virtual cores for better tuning of thread counts on multi-threaded processes. +- Significant enhancements of multi-threading performance. +- Upgraded libwebp library to 1.5.0. +- Updated to C++ 20 standard. +- Added network.udp.payload_size to kasm yaml configuration. +- Added build for Debian Trixie. +- Refactor of code to decrease memory usage on client browsers. +- Added support for the Keyboard API for Chromium browsers. +- Added multi-threaded asynchronous decoding of image rects, increasing client side performance. +- Fixed bug with watermark not getting displayed in certain scenarios. +- Fixed bug with case sensitivity of HTTP headers +- Fixed bug with the downloads API not escaping certain characters in returned json. +- Fixed bug causing a segmentation fault on the get_screenshot API handler in certain conditions. +- Bug fixes with multi-monitor, adding and removing displays +- Fix bug with secondary display still showing content after session disconnect in certain scenarios. +- Fixed bug with Ctrl key not working on foreign language keyboards with Chromium based browsers. +- Fix bug with secondary display interaction not counting toward interaction with respect to the idle disconnect setting. +- Fixed memory leak in Firefox. +- Fixed bug with Firefox displaying scrollbars at odd resolutions. +- Fixes to Korean translations. +- Multiple fixes to IME foreign language support. +- Fixed a race condition causing an error message to be displayed erroneously on the client. * Thu Mar 20 2025 KasmTech - 1.3.4-1 - Add configuration key network.udp.payload_size. - Remove support for distro versions that reached end-of-life. diff --git a/oracle/kasmvncserver9.spec b/oracle/kasmvncserver9.spec index deeed09..3eaa334 100644 --- a/oracle/kasmvncserver9.spec +++ b/oracle/kasmvncserver9.spec @@ -1,5 +1,5 @@ Name: kasmvncserver -Version: 1.3.4 +Version: 1.5.0 Release: 1%{?dist} Summary: VNC server accessible from a web browser @@ -116,6 +116,54 @@ stop_vncserver_systemd_services_for_all_logged_in_users %doc /usr/share/doc/kasmvncserver/README.md %changelog +* Mon May 25 2026 KasmTech - 1.5.0-1 +- Added video streaming mode with hardware and software accelerated H.264, H.265, and AV1 encoders. Hardware acceleration uses VAAPI (Intel/AMD) and NVENC (NVIDIA). +- Added support for relative mouse input mode for improved UX and application compatibility (e.g. games and apps that require raw mouse deltas). +- Added support for overriding configuration settings via environment variables. +- Optional systemd auto-start integration for deb/rpm packages, with improved upgrade and uninstall handling. +- Added support for Fedora 42 and 43. +- Added support for openSUSE 16. +- Added support for Alpine 3.22 and 3.23. +- Removed support for distro versions that reached end-of-life (Fedora 40 and 41; Alpine 3.18, 3.19, and 3.20). +- FFmpeg 8 compatibility (dropped use of removed avcodec_close API). +- Fixed crash in window manager triggered by null clipboard data during UTF-8 to Latin-1 conversion. +- Fixed bug where closing a secondary monitor would close the entire client connection. +- Fixed Kali Linux image build failures. +- Updated default STUN public IP behavior to avoid undesired external lookups. +- Improved client-side multi-monitor handling with a dedicated reference to the visible canvas. +- Bumped rollup to address security vulnerabilities. +- Updated French translations. +* Fri Apr 24 2026 KasmTech - 1.4.2-1 +- Fixed bug with server-side enforced idle-timeout. +* Mon Dec 01 2025 KasmTech - 1.4.1-1 +- Fixed bug with enforcement of server-side idle-disconnect. +- Added support for graceful disconnect, allowing the client to auto-reconnect on a non-graceful disconnect and not when the server gracefully disconnects. +- Fixed display manager UI to work on touch screens. +* Fri Aug 01 2025 KasmTech - 1.4.0-1 +- Added new API call for retrieving active sessions. +- Added message propagation to clients other users connect or disconnect from the same session. +- Enhanced detection of physical cores vs virtual cores for better tuning of thread counts on multi-threaded processes. +- Significant enhancements of multi-threading performance. +- Upgraded libwebp library to 1.5.0. +- Updated to C++ 20 standard. +- Added network.udp.payload_size to kasm yaml configuration. +- Added build for Debian Trixie. +- Refactor of code to decrease memory usage on client browsers. +- Added support for the Keyboard API for Chromium browsers. +- Added multi-threaded asynchronous decoding of image rects, increasing client side performance. +- Fixed bug with watermark not getting displayed in certain scenarios. +- Fixed bug with case sensitivity of HTTP headers +- Fixed bug with the downloads API not escaping certain characters in returned json. +- Fixed bug causing a segmentation fault on the get_screenshot API handler in certain conditions. +- Bug fixes with multi-monitor, adding and removing displays +- Fix bug with secondary display still showing content after session disconnect in certain scenarios. +- Fixed bug with Ctrl key not working on foreign language keyboards with Chromium based browsers. +- Fix bug with secondary display interaction not counting toward interaction with respect to the idle disconnect setting. +- Fixed memory leak in Firefox. +- Fixed bug with Firefox displaying scrollbars at odd resolutions. +- Fixes to Korean translations. +- Multiple fixes to IME foreign language support. +- Fixed a race condition causing an error message to be displayed erroneously on the client. * Thu Mar 20 2025 KasmTech - 1.3.4-1 - Add configuration key network.udp.payload_size. - Remove support for distro versions that reached end-of-life. diff --git a/unix/xserver/hw/vnc/xvnc.c b/unix/xserver/hw/vnc/xvnc.c index 7ccacfa..9f3d946 100644 --- a/unix/xserver/hw/vnc/xvnc.c +++ b/unix/xserver/hw/vnc/xvnc.c @@ -95,8 +95,8 @@ from the X Consortium. #undef VENDOR_STRING #include "version-config.h" -#define XVNCVERSION "KasmVNC 1.3.4" -#define XVNCCOPYRIGHT ("Copyright (C) 1999-2018 KasmVNC Team and many others (see README.me)\n" \ +#define XVNCVERSION "KasmVNC 1.5.0" +#define XVNCCOPYRIGHT ("Copyright (C) 1999-2026 KasmVNC Team and many others (see README.me)\n" \ "See http://kasmweb.com for information on KasmVNC.\n") #define VFB_DEFAULT_WIDTH 1024 From cb72f051f1f0e86c2d195639e6bfc3167144439d Mon Sep 17 00:00:00 2001 From: Matt McClaskey Date: Tue, 26 May 2026 10:03:38 +0000 Subject: [PATCH 11/12] VNC-14 refactor: move force-game-mode notification into SMsgHandler supports* pattern --- common/rfb/SMsgHandler.cxx | 9 ++++++++- common/rfb/SMsgHandler.h | 4 ++++ common/rfb/VNCSConnectionST.cxx | 17 +++++++---------- common/rfb/VNCSConnectionST.h | 2 +- 4 files changed, 20 insertions(+), 12 deletions(-) diff --git a/common/rfb/SMsgHandler.cxx b/common/rfb/SMsgHandler.cxx index 51cc547..712a54b 100644 --- a/common/rfb/SMsgHandler.cxx +++ b/common/rfb/SMsgHandler.cxx @@ -43,12 +43,13 @@ void SMsgHandler::setPixelFormat(const PixelFormat& pf) void SMsgHandler::setEncodings(int nEncodings, const rdr::S32* encodings) { bool firstFence, firstContinuousUpdates, firstLEDState, - firstQEMUKeyEvent; + firstQEMUKeyEvent, firstDirectMouse; firstFence = !cp.supportsFence; firstContinuousUpdates = !cp.supportsContinuousUpdates; firstLEDState = !cp.supportsLEDState; firstQEMUKeyEvent = !cp.supportsQEMUKeyEvent; + firstDirectMouse = !cp.supportsDirectMouse; cp.setEncodings(nEncodings, encodings); @@ -62,6 +63,12 @@ void SMsgHandler::setEncodings(int nEncodings, const rdr::S32* encodings) supportsLEDState(); if (cp.supportsQEMUKeyEvent && firstQEMUKeyEvent) supportsQEMUKeyEvent(); + if (cp.supportsDirectMouse && firstDirectMouse) + supportsDirectMouse(); +} + +void SMsgHandler::supportsDirectMouse() +{ } void SMsgHandler::handleClipboardAnnounceBinary(const unsigned, const char mimes[][32]) diff --git a/common/rfb/SMsgHandler.h b/common/rfb/SMsgHandler.h index f54d8b4..8834887 100644 --- a/common/rfb/SMsgHandler.h +++ b/common/rfb/SMsgHandler.h @@ -99,6 +99,10 @@ namespace rfb { // handler will send a pseudo-rect back, signalling server support. virtual void supportsQEMUKeyEvent(); + // supportsDirectMouse() is called the first time we detect that the + // client supports the direct mouse extension + virtual void supportsDirectMouse(); + virtual void udpUpgrade(const char *resp) = 0; virtual void udpDowngrade(const bool) = 0; diff --git a/common/rfb/VNCSConnectionST.cxx b/common/rfb/VNCSConnectionST.cxx index 2210830..27f2fba 100644 --- a/common/rfb/VNCSConnectionST.cxx +++ b/common/rfb/VNCSConnectionST.cxx @@ -71,7 +71,7 @@ VNCSConnectionST::VNCSConnectionST(VNCServerST* server_, network::Socket *s, con needsPermCheck(false), pointerEventTime(0), clientHasCursor(false), accessRights(AccessDefault), startTime(time(nullptr)), frameTracking(false), - udpFramesSinceFull(0), complainedAboutNoViewRights(false), gameModeNotified(false), + udpFramesSinceFull(0), complainedAboutNoViewRights(false), clientUsername("username_unavailable") { setStreams(&sock->inStream(), &sock->outStream()); @@ -1005,15 +1005,6 @@ void VNCSConnectionST::framebufferUpdateRequest(const Rect& r,bool incremental) if (!(accessRights & AccessView)) return; - // On the first full update request the client is fully connected and has - // sent SetEncodings. If the server is configured to force game mode and the - // client supports direct mouse, send the notification exactly once. - if (!incremental && !gameModeNotified && rfb::Server::forceGameMode && - cp.supportsDirectMouse) { - writer()->writeForceGameMode(); - gameModeNotified = true; - } - SConnection::framebufferUpdateRequest(r, incremental); // Check that the client isn't sending crappy requests @@ -1209,6 +1200,12 @@ void VNCSConnectionST::supportsLEDState() writer()->writeLEDState(); } +void VNCSConnectionST::supportsDirectMouse() +{ + if (rfb::Server::forceGameMode) + writer()->writeForceGameMode(); +} + bool VNCSConnectionST::handleTimeout(Timer* t) { diff --git a/common/rfb/VNCSConnectionST.h b/common/rfb/VNCSConnectionST.h index 7926f97..e8f9a10 100644 --- a/common/rfb/VNCSConnectionST.h +++ b/common/rfb/VNCSConnectionST.h @@ -265,6 +265,7 @@ namespace rfb { virtual void supportsFence(); virtual void supportsContinuousUpdates(); virtual void supportsLEDState(); + void supportsDirectMouse() override; bool canChangeKasmSettings() const override { return (accessRights & (AccessPtrEvents | AccessKeyEvents)) == @@ -366,7 +367,6 @@ namespace rfb { char unixRelaySubscriptions[MAX_UNIX_RELAYS][MAX_UNIX_RELAY_NAME_LEN] = {}; bool complainedAboutNoViewRights; - bool gameModeNotified; std::string clientUsername; bool pendingClientRefresh{false}; }; From ccffbdca3eb92ad9a808d5681de28e179eca8036 Mon Sep 17 00:00:00 2001 From: Matt McClaskey Date: Sat, 30 May 2026 09:50:49 +0000 Subject: [PATCH 12/12] Update noVNC ref --- .gitmodules | 2 +- kasmweb | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.gitmodules b/.gitmodules index a83fbd4..8232a78 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,7 +1,7 @@ [submodule "kasmweb"] path = kasmweb url = https://github.com/kasmtech/noVNC.git - branch = feature/VNC-14_direct_drive_mouse + branch = master [submodule "kasmvnc-functional-tests"] path = kasmvnc-functional-tests url = git@gitlab.com:kasm-technologies/internal/kasmvnc-functional-tests.git diff --git a/kasmweb b/kasmweb index 7f7d974..d9199c6 160000 --- a/kasmweb +++ b/kasmweb @@ -1 +1 @@ -Subproject commit 7f7d974925c5f99fbc409f3b703519a29b37ba7a +Subproject commit d9199c624d1d694617c0b7710edbdf8c3410ca56