From 91313d8b659ec26c8b32c0b56fb878f2163a8317 Mon Sep 17 00:00:00 2001 From: Pierre Ossman Date: Mon, 14 Jul 2014 13:36:47 +0200 Subject: [PATCH] Let XserverDesktop handle syncing cursor position This makes InputDevice cleaner and just a glue layer for Xorg input devices. --- unix/xserver/hw/vnc/Input.cc | 12 ++++-------- unix/xserver/hw/vnc/Input.h | 18 +++++++++--------- unix/xserver/hw/vnc/XserverDesktop.cc | 6 +++++- unix/xserver/hw/vnc/XserverDesktop.h | 2 ++ 4 files changed, 20 insertions(+), 18 deletions(-) diff --git a/unix/xserver/hw/vnc/Input.cc b/unix/xserver/hw/vnc/Input.cc index 1474f93a..46b02fd1 100644 --- a/unix/xserver/hw/vnc/Input.cc +++ b/unix/xserver/hw/vnc/Input.cc @@ -116,8 +116,8 @@ static void enqueueEvents(DeviceIntPtr dev, int n) } #endif /* XORG < 111 */ -InputDevice::InputDevice(rfb::VNCServerST *_server) - : server(_server), initialized(false), oldButtonMask(0) +InputDevice::InputDevice() + : initialized(false), oldButtonMask(0) { int i; @@ -195,13 +195,9 @@ void InputDevice::PointerMove(const rfb::Point &pos) cursorPos = pos; } -void InputDevice::PointerSync(void) +const rfb::Point &InputDevice::getPointerPos(void) { - if (cursorPos.equals(oldCursorPos)) - return; - - oldCursorPos = cursorPos; - server->setCursorPos(cursorPos); + return cursorPos; } static int pointerProc(DeviceIntPtr pDevice, int onoff) diff --git a/unix/xserver/hw/vnc/Input.h b/unix/xserver/hw/vnc/Input.h index e893049e..c996cb0b 100644 --- a/unix/xserver/hw/vnc/Input.h +++ b/unix/xserver/hw/vnc/Input.h @@ -29,10 +29,13 @@ #include -#include +#include +#include extern "C" { #include "input.h" +/* The Xorg headers define macros that wreak havoc with STL */ +#undef max }; #include "xorg-version.h" @@ -41,7 +44,7 @@ extern "C" { class InputDevice { public: /* Create new InputDevice instance */ - InputDevice(rfb::VNCServerST *_server); + InputDevice(); /* * Press or release buttons. Relationship between buttonMask and @@ -52,12 +55,10 @@ public: /* Move pointer to target location (point coords are absolute). */ void PointerMove(const rfb::Point &point); - /* - * Send pointer position to clients. If not called then Move() calls - * won't be visible to VNC clients. - */ - void PointerSync(void); + /* Get current known location of the pointer */ + const rfb::Point &getPointerPos(void); + /* Press or release one or more keys to get the given symbol */ void KeyboardPress(rdr::U32 keysym) { keyEvent(keysym, true); } void KeyboardRelease(rdr::U32 keysym) { keyEvent(keysym, false); } @@ -103,13 +104,12 @@ private: #endif private: - rfb::VNCServerST *server; bool initialized; DeviceIntPtr keyboardDev; DeviceIntPtr pointerDev; int oldButtonMask; - rfb::Point cursorPos, oldCursorPos; + rfb::Point cursorPos; KeySym pressedKeys[256]; }; diff --git a/unix/xserver/hw/vnc/XserverDesktop.cc b/unix/xserver/hw/vnc/XserverDesktop.cc index b0d4601e..cd76d068 100644 --- a/unix/xserver/hw/vnc/XserverDesktop.cc +++ b/unix/xserver/hw/vnc/XserverDesktop.cc @@ -689,7 +689,11 @@ void XserverDesktop::wakeupHandler(fd_set* fds, int nfds) } } - inputDevice->PointerSync(); + // We are responsible for propagating mouse movement between clients + if (!oldCursorPos.equals(inputDevice->getPointerPos())) { + oldCursorPos = inputDevice->getPointerPos(); + server->setCursorPos(oldCursorPos); + } } // Then let the timers do some processing. Rescheduling is done in diff --git a/unix/xserver/hw/vnc/XserverDesktop.h b/unix/xserver/hw/vnc/XserverDesktop.h index fb247b04..ca6e8af9 100644 --- a/unix/xserver/hw/vnc/XserverDesktop.h +++ b/unix/xserver/hw/vnc/XserverDesktop.h @@ -153,5 +153,7 @@ private: typedef std::map OutputIdMap; OutputIdMap outputIdMap; #endif + + rfb::Point oldCursorPos; }; #endif -- 2.39.5