sharkcz / rpms / tigervnc

Forked from rpms/tigervnc 4 years ago
Clone
dc90bee
diff -up tigervnc-1.3.0/unix/xserver/hw/vnc/Input.cc.inputreset tigervnc-1.3.0/unix/xserver/hw/vnc/Input.cc
dc90bee
--- tigervnc-1.3.0/unix/xserver/hw/vnc/Input.cc.inputreset	2013-07-01 13:41:24.000000000 +0100
dc90bee
+++ tigervnc-1.3.0/unix/xserver/hw/vnc/Input.cc	2014-07-14 13:08:01.482660946 +0100
dc90bee
@@ -68,6 +68,9 @@ rfb::BoolParameter avoidShiftNumLock("Av
dc90bee
 
dc90bee
 #define BUTTONS 7
dc90bee
 
dc90bee
+class InputDevice *vncInputDevice;
dc90bee
+InputDevice InputDevice::singleton;
dc90bee
+
dc90bee
 /* Event queue is shared between all devices. */
dc90bee
 #if XORG == 15
dc90bee
 static xEvent *eventq = NULL;
dc90bee
@@ -116,11 +119,13 @@ static void enqueueEvents(DeviceIntPtr d
dc90bee
 }
dc90bee
 #endif /* XORG < 111 */
dc90bee
 
dc90bee
-InputDevice::InputDevice(rfb::VNCServerST *_server)
dc90bee
-	: server(_server), initialized(false), oldButtonMask(0)
dc90bee
+InputDevice::InputDevice()
dc90bee
+	: oldButtonMask(0)
dc90bee
 {
dc90bee
 	int i;
dc90bee
 
dc90bee
+	vncInputDevice = this;
dc90bee
+
dc90bee
 #if XORG < 111
dc90bee
 	initEventq();
dc90bee
 #endif
dc90bee
@@ -195,16 +200,12 @@ void InputDevice::PointerMove(const rfb:
dc90bee
 	cursorPos = pos;
dc90bee
 }
dc90bee
 
dc90bee
-void InputDevice::PointerSync(void)
dc90bee
+const rfb::Point &InputDevice::getPointerPos(void)
dc90bee
 {
dc90bee
-	if (cursorPos.equals(oldCursorPos))
dc90bee
-		return;
dc90bee
-
dc90bee
-	oldCursorPos = cursorPos;
dc90bee
-	server->setCursorPos(cursorPos);
dc90bee
+	return cursorPos;
dc90bee
 }
dc90bee
 
dc90bee
-static int pointerProc(DeviceIntPtr pDevice, int onoff)
dc90bee
+int InputDevice::pointerProc(DeviceIntPtr pDevice, int onoff)
dc90bee
 {
dc90bee
 	BYTE map[BUTTONS + 1];
dc90bee
 	DevicePtr pDev = (DevicePtr)pDevice;
dc90bee
@@ -229,6 +230,8 @@ static int pointerProc(DeviceIntPtr pDev
dc90bee
 		btn_labels[2] = XIGetKnownProperty(BTN_LABEL_PROP_BTN_RIGHT);
dc90bee
 		btn_labels[3] = XIGetKnownProperty(BTN_LABEL_PROP_BTN_WHEEL_UP);
dc90bee
 		btn_labels[4] = XIGetKnownProperty(BTN_LABEL_PROP_BTN_WHEEL_DOWN);
dc90bee
+		btn_labels[5] = XIGetKnownProperty(BTN_LABEL_PROP_BTN_HWHEEL_LEFT);
dc90bee
+		btn_labels[6] = XIGetKnownProperty(BTN_LABEL_PROP_BTN_HWHEEL_RIGHT);
dc90bee
 
dc90bee
 		axes_labels[0] = XIGetKnownProperty(AXIS_LABEL_PROP_REL_X);
dc90bee
 		axes_labels[1] = XIGetKnownProperty(AXIS_LABEL_PROP_REL_Y);
dc90bee
@@ -253,10 +256,9 @@ static int pointerProc(DeviceIntPtr pDev
dc90bee
 	case DEVICE_OFF:
dc90bee
 		pDev->on = FALSE;
dc90bee
 		break;
dc90bee
-#if 0
dc90bee
 	case DEVICE_CLOSE:
dc90bee
+		singleton.pointerDev = NULL;
dc90bee
 		break;
dc90bee
-#endif
dc90bee
 	}
dc90bee
 
dc90bee
 	return Success;
dc90bee
@@ -269,9 +271,7 @@ static void keyboardBell(int percent, De
dc90bee
 		vncBell();
dc90bee
 }
dc90bee
 
dc90bee
-extern void GetInitKeyboardMap(KeySymsPtr keysyms, CARD8 *modmap);
dc90bee
-
dc90bee
-static int keyboardProc(DeviceIntPtr pDevice, int onoff)
dc90bee
+int InputDevice::keyboardProc(DeviceIntPtr pDevice, int onoff)
dc90bee
 {
dc90bee
 #if XORG < 17
dc90bee
 	KeySymsRec keySyms;
dc90bee
@@ -298,6 +298,9 @@ static int keyboardProc(DeviceIntPtr pDe
dc90bee
 	case DEVICE_OFF:
dc90bee
 		pDev->on = FALSE;
dc90bee
 		break;
dc90bee
+	case DEVICE_CLOSE:
dc90bee
+		singleton.keyboardDev = NULL;
dc90bee
+		break;
dc90bee
 	}
dc90bee
 
dc90bee
 	return Success;
dc90bee
@@ -305,11 +308,9 @@ static int keyboardProc(DeviceIntPtr pDe
dc90bee
 
dc90bee
 void InputDevice::InitInputDevice(void)
dc90bee
 {
dc90bee
-	if (initialized)
dc90bee
+	if ((pointerDev != NULL) || (keyboardDev != NULL))
dc90bee
 		return;
dc90bee
 
dc90bee
-	initialized = true;
dc90bee
-
dc90bee
 #if XORG < 17
dc90bee
 	pointerDev = AddInputDevice(
dc90bee
 #if XORG >= 16
dc90bee
diff -up tigervnc-1.3.0/unix/xserver/hw/vnc/InputCore.cc.inputreset tigervnc-1.3.0/unix/xserver/hw/vnc/InputCore.cc
dc90bee
--- tigervnc-1.3.0/unix/xserver/hw/vnc/InputCore.cc.inputreset	2013-07-01 13:41:24.000000000 +0100
dc90bee
+++ tigervnc-1.3.0/unix/xserver/hw/vnc/InputCore.cc	2014-07-14 13:08:01.483660952 +0100
dc90bee
@@ -174,7 +174,7 @@ KeySym keyboardMap[MAP_LEN * KEYSYMS_PER
dc90bee
 	XK_Menu, NoSymbol,
dc90bee
 };
dc90bee
 
dc90bee
-void GetInitKeyboardMap(KeySymsPtr keysyms, CARD8 *modmap)
dc90bee
+void InputDevice::GetInitKeyboardMap(KeySymsPtr keysyms, CARD8 *modmap)
dc90bee
 {
dc90bee
 	int i;
dc90bee
 
dc90bee
diff -up tigervnc-1.3.0/unix/xserver/hw/vnc/Input.h.inputreset tigervnc-1.3.0/unix/xserver/hw/vnc/Input.h
dc90bee
--- tigervnc-1.3.0/unix/xserver/hw/vnc/Input.h.inputreset	2013-07-01 13:41:24.000000000 +0100
dc90bee
+++ tigervnc-1.3.0/unix/xserver/hw/vnc/Input.h	2014-07-14 13:08:01.483660952 +0100
dc90bee
@@ -29,20 +29,27 @@
dc90bee
 
dc90bee
 #include <list>
dc90bee
 
dc90bee
-#include <rfb/VNCServerST.h>
dc90bee
+#include <rdr/types.h>
dc90bee
+#include <rfb/Rect.h>
dc90bee
 
dc90bee
 extern "C" {
dc90bee
 #include "input.h"
dc90bee
+/* The Xorg headers define macros that wreak havoc with STL */
dc90bee
+#undef max
dc90bee
 };
dc90bee
 
dc90bee
 #include "xorg-version.h"
dc90bee
 
dc90bee
-/* Represents input device (keyboard + pointer) */
dc90bee
+/*
dc90bee
+ * Represents input device (keyboard + pointer)
dc90bee
+ *
dc90bee
+ * Is a singleton as input devices are global in the X server so
dc90bee
+ * we do not have one per desktop (i.e. per screen).
dc90bee
+ */
dc90bee
+extern class InputDevice *vncInputDevice;
dc90bee
+
dc90bee
 class InputDevice {
dc90bee
 public:
dc90bee
-	/* Create new InputDevice instance */
dc90bee
-	InputDevice(rfb::VNCServerST *_server);
dc90bee
-
dc90bee
 	/*
dc90bee
 	 * Press or release buttons. Relationship between buttonMask and
dc90bee
 	 * buttons is specified in RFB protocol.
dc90bee
@@ -52,27 +59,28 @@ public:
dc90bee
 	/* Move pointer to target location (point coords are absolute). */
dc90bee
 	void PointerMove(const rfb::Point &point);
dc90bee
 
dc90bee
-	/*
dc90bee
-	 * Send pointer position to clients. If not called then Move() calls
dc90bee
-	 * won't be visible to VNC clients.
dc90bee
-	 */
dc90bee
-	void PointerSync(void);
dc90bee
+	/* Get current known location of the pointer */
dc90bee
+	const rfb::Point &getPointerPos(void);
dc90bee
 
dc90bee
+	/* Press or release one or more keys to get the given symbol */
dc90bee
 	void KeyboardPress(rdr::U32 keysym) { keyEvent(keysym, true); }
dc90bee
 	void KeyboardRelease(rdr::U32 keysym) { keyEvent(keysym, false); }
dc90bee
 
dc90bee
 	/*
dc90bee
-	 * Init input device. This cannot be done in the constructor
dc90bee
-	 * because constructor is called during X server extensions
dc90bee
-	 * initialization. Devices must be initialized after core
dc90bee
-	 * pointer/keyboard initialization which is actually after extesions
dc90bee
-	 * initialization. Check InitExtensions(), InitCoreDevices() and
dc90bee
-	 * InitInput() calls in dix/main.c. Instead it is called from
dc90bee
-	 * XserverDesktop at an appropriate time.
dc90bee
+	 * Init input device.
dc90bee
+	 * This has to be called after core pointer/keyboard
dc90bee
+	 * initialization which unfortunately is after extesions
dc90bee
+	 * initialization (which means we cannot call it in
dc90bee
+	 * vncExtensionInit(). Check InitExtensions(),
dc90bee
+	 * InitCoreDevices() and InitInput() calls in dix/main.c.
dc90bee
+	 * Instead we call it from XserverDesktop at an appropriate
dc90bee
+	 * time.
dc90bee
 	 */
dc90bee
 	void InitInputDevice(void);
dc90bee
 
dc90bee
 private:
dc90bee
+	InputDevice();
dc90bee
+
dc90bee
 	void keyEvent(rdr::U32 keysym, bool down);
dc90bee
 
dc90bee
 	/* Backend dependent functions below here */
dc90bee
@@ -96,22 +104,28 @@ private:
dc90bee
 	KeyCode addKeysym(KeySym keysym, unsigned state);
dc90bee
 
dc90bee
 private:
dc90bee
+	static int pointerProc(DeviceIntPtr pDevice, int onoff);
dc90bee
+	static int keyboardProc(DeviceIntPtr pDevice, int onoff);
dc90bee
+
dc90bee
 #if XORG >= 17
dc90bee
 	static void vncXkbProcessDeviceEvent(int screenNum,
dc90bee
 	                                     InternalEvent *event,
dc90bee
 	                                     DeviceIntPtr dev);
dc90bee
+#else
dc90bee
+	static void GetInitKeyboardMap(KeySymsPtr keysyms, CARD8 *modmap);
dc90bee
 #endif
dc90bee
 
dc90bee
 private:
dc90bee
-	rfb::VNCServerST *server;
dc90bee
-	bool initialized;
dc90bee
 	DeviceIntPtr keyboardDev;
dc90bee
 	DeviceIntPtr pointerDev;
dc90bee
 
dc90bee
 	int oldButtonMask;
dc90bee
-	rfb::Point cursorPos, oldCursorPos;
dc90bee
+	rfb::Point cursorPos;
dc90bee
 
dc90bee
 	KeySym pressedKeys[256];
dc90bee
+
dc90bee
+private:
dc90bee
+	static InputDevice singleton;
dc90bee
 };
dc90bee
 
dc90bee
 #endif
dc90bee
diff -up tigervnc-1.3.0/unix/xserver/hw/vnc/InputXKB.cc.inputreset tigervnc-1.3.0/unix/xserver/hw/vnc/InputXKB.cc
dc90bee
--- tigervnc-1.3.0/unix/xserver/hw/vnc/InputXKB.cc.inputreset	2014-07-14 13:07:53.145619157 +0100
dc90bee
+++ tigervnc-1.3.0/unix/xserver/hw/vnc/InputXKB.cc	2014-07-14 13:08:01.484660958 +0100
dc90bee
@@ -42,18 +42,6 @@ extern "C" {
dc90bee
 #undef class
dc90bee
 }
dc90bee
 
dc90bee
-#if XORG < 19
dc90bee
-static int vncXkbScreenPrivateKeyIndex;
dc90bee
-static DevPrivateKey vncXkbScreenPrivateKey = &vncXkbScreenPrivateKeyIndex;
dc90bee
-#else
dc90bee
-static DevPrivateKeyRec vncXkbPrivateKeyRec;
dc90bee
-#define vncXkbScreenPrivateKey (&vncXkbPrivateKeyRec)
dc90bee
-#endif
dc90bee
-
dc90bee
-#define vncXkbScreenPrivate(pScreen) \
dc90bee
-	(*(InputDevice**) dixLookupPrivate(&(pScreen)->devPrivates, \
dc90bee
-	                                   vncXkbScreenPrivateKey))
dc90bee
-
dc90bee
 #ifndef KEYBOARD_OR_FLOAT
dc90bee
 #define KEYBOARD_OR_FLOAT MASTER_KEYBOARD
dc90bee
 #endif
dc90bee
@@ -209,18 +197,6 @@ static unsigned XkbKeyEffectiveGroup(Xkb
dc90bee
 
dc90bee
 void InputDevice::PrepareInputDevices(void)
dc90bee
 {
dc90bee
-#if XORG < 19
dc90bee
-	if (!dixRequestPrivate(vncXkbScreenPrivateKey, sizeof(InputDevice*)))
dc90bee
-		FatalError("Failed to register TigerVNC XKB screen key\n");
dc90bee
-#else
dc90bee
-	if (!dixRegisterPrivateKey(vncXkbScreenPrivateKey, PRIVATE_SCREEN,
dc90bee
-	                           sizeof(InputDevice*)))
dc90bee
-		FatalError("Failed to register TigerVNC XKB screen key\n");
dc90bee
-#endif
dc90bee
-
dc90bee
-	for (int scr = 0; scr < screenInfo.numScreens; scr++)
dc90bee
-		vncXkbScreenPrivate(screenInfo.screens[scr]) = this;
dc90bee
-
dc90bee
 	/*
dc90bee
 	 * Not ideal since these callbacks do not stack, but it's the only
dc90bee
 	 * decent way we can reliably catch events for both the slave and
dc90bee
@@ -633,10 +609,9 @@ void InputDevice::vncXkbProcessDeviceEve
dc90bee
                                            InternalEvent *event,
dc90bee
                                            DeviceIntPtr dev)
dc90bee
 {
dc90bee
-	InputDevice *self = vncXkbScreenPrivate(screenInfo.screens[screenNum]);
dc90bee
 	unsigned int backupctrls;
dc90bee
 
dc90bee
-	if (event->device_event.sourceid == self->keyboardDev->id) {
dc90bee
+	if (event->device_event.sourceid == singleton.keyboardDev->id) {
dc90bee
 		XkbControlsPtr ctrls;
dc90bee
 
dc90bee
 		/*
dc90bee
@@ -658,7 +633,7 @@ void InputDevice::vncXkbProcessDeviceEve
dc90bee
 
dc90bee
 	dev->c_public.processInputProc(event, dev);
dc90bee
 
dc90bee
-	if (event->device_event.sourceid == self->keyboardDev->id) {
dc90bee
+	if (event->device_event.sourceid == singleton.keyboardDev->id) {
dc90bee
 		XkbControlsPtr ctrls;
dc90bee
 
dc90bee
 		ctrls = dev->key->xkbInfo->desc->ctrls;
dc90bee
diff -up tigervnc-1.3.0/unix/xserver/hw/vnc/xf86vncModule.cc.inputreset tigervnc-1.3.0/unix/xserver/hw/vnc/xf86vncModule.cc
dc90bee
--- tigervnc-1.3.0/unix/xserver/hw/vnc/xf86vncModule.cc.inputreset	2013-07-01 13:41:24.000000000 +0100
dc90bee
+++ tigervnc-1.3.0/unix/xserver/hw/vnc/xf86vncModule.cc	2014-07-14 13:08:01.487660972 +0100
dc90bee
@@ -112,9 +112,9 @@ static void vncExtensionInitWithParams(I
dc90bee
           i.param->setParam(val);
dc90bee
       }
dc90bee
     }
dc90bee
-
dc90bee
-    vncExtensionInit();
dc90bee
   }
dc90bee
+
dc90bee
+  vncExtensionInit();
dc90bee
 }
dc90bee
 }
dc90bee
 
dc90bee
diff -up tigervnc-1.3.0/unix/xserver/hw/vnc/XserverDesktop.cc.inputreset tigervnc-1.3.0/unix/xserver/hw/vnc/XserverDesktop.cc
dc90bee
--- tigervnc-1.3.0/unix/xserver/hw/vnc/XserverDesktop.cc.inputreset	2014-07-14 13:07:53.140619132 +0100
dc90bee
+++ tigervnc-1.3.0/unix/xserver/hw/vnc/XserverDesktop.cc	2014-07-14 13:08:01.486660967 +0100
dc90bee
@@ -157,15 +157,12 @@ XserverDesktop::XserverDesktop(ScreenPtr
dc90bee
 
dc90bee
   if (httpListener)
dc90bee
     httpServer = new FileHTTPServer(this);
dc90bee
-
dc90bee
-  inputDevice = new InputDevice(server);
dc90bee
 }
dc90bee
 
dc90bee
 XserverDesktop::~XserverDesktop()
dc90bee
 {
dc90bee
   if (!directFbptr)
dc90bee
     delete [] data;
dc90bee
-  delete inputDevice;
dc90bee
   delete httpServer;
dc90bee
   delete server;
dc90bee
 }
dc90bee
@@ -583,7 +580,7 @@ void XserverDesktop::blockHandler(fd_set
dc90bee
   // so we abuse the fact that this routine will be called first thing
dc90bee
   // once the dix is done initialising.
dc90bee
   // [1] Technically Xvnc has InitInput(), but libvnc.so has nothing.
dc90bee
-  inputDevice->InitInputDevice();
dc90bee
+  vncInputDevice->InitInputDevice();
dc90bee
 
dc90bee
   try {
dc90bee
     int nextTimeout;
dc90bee
@@ -691,7 +688,11 @@ void XserverDesktop::wakeupHandler(fd_se
dc90bee
         }
dc90bee
       }
dc90bee
 
dc90bee
-      inputDevice->PointerSync();
dc90bee
+      // We are responsible for propagating mouse movement between clients
dc90bee
+      if (!oldCursorPos.equals(vncInputDevice->getPointerPos())) {
dc90bee
+        oldCursorPos = vncInputDevice->getPointerPos();
dc90bee
+        server->setCursorPos(oldCursorPos);
dc90bee
+      }
dc90bee
     }
dc90bee
 
dc90bee
     // Then let the timers do some processing. Rescheduling is done in
dc90bee
@@ -818,8 +819,8 @@ void XserverDesktop::approveConnection(v
dc90bee
 
dc90bee
 void XserverDesktop::pointerEvent(const Point& pos, int buttonMask)
dc90bee
 {
dc90bee
-  inputDevice->PointerMove(pos);
dc90bee
-  inputDevice->PointerButtonAction(buttonMask);
dc90bee
+  vncInputDevice->PointerMove(pos);
dc90bee
+  vncInputDevice->PointerButtonAction(buttonMask);
dc90bee
 }
dc90bee
 
dc90bee
 void XserverDesktop::clientCutText(const char* str, int len)
dc90bee
@@ -1136,7 +1137,7 @@ void XserverDesktop::lookup(int index, i
dc90bee
 void XserverDesktop::keyEvent(rdr::U32 keysym, bool down)
dc90bee
 {
dc90bee
 	if (down)
dc90bee
-		inputDevice->KeyboardPress(keysym);
dc90bee
+		vncInputDevice->KeyboardPress(keysym);
dc90bee
 	else
dc90bee
-		inputDevice->KeyboardRelease(keysym);
dc90bee
+		vncInputDevice->KeyboardRelease(keysym);
dc90bee
 }
dc90bee
diff -up tigervnc-1.3.0/unix/xserver/hw/vnc/XserverDesktop.h.inputreset tigervnc-1.3.0/unix/xserver/hw/vnc/XserverDesktop.h
dc90bee
--- tigervnc-1.3.0/unix/xserver/hw/vnc/XserverDesktop.h.inputreset	2013-07-01 13:41:24.000000000 +0100
dc90bee
+++ tigervnc-1.3.0/unix/xserver/hw/vnc/XserverDesktop.h	2014-07-14 13:08:01.486660967 +0100
dc90bee
@@ -133,7 +133,6 @@ private:
dc90bee
 #endif
dc90bee
 
dc90bee
   ScreenPtr pScreen;
dc90bee
-  InputDevice *inputDevice;
dc90bee
   rfb::VNCServerST* server;
dc90bee
   rfb::HTTPServer* httpServer;
dc90bee
   network::TcpListener* listener;
dc90bee
@@ -153,5 +152,7 @@ private:
dc90bee
   typedef std::map<RROutputPtr, rdr::U32> OutputIdMap;
dc90bee
   OutputIdMap outputIdMap;
dc90bee
 #endif
dc90bee
+
dc90bee
+  rfb::Point oldCursorPos;
dc90bee
 };
dc90bee
 #endif