]> source.dussan.org Git - tigervnc.git/commitdiff
Make InputDevice into a singleton
authorPierre Ossman <ossman@cendio.se>
Mon, 14 Jul 2014 11:41:36 +0000 (13:41 +0200)
committerPierre Ossman <ossman@cendio.se>
Mon, 14 Jul 2014 11:41:36 +0000 (13:41 +0200)
Xorg input devices are global so it doesn't make sense that we
have one InputDevice object per XserverDesktop.

unix/xserver/hw/vnc/Input.cc
unix/xserver/hw/vnc/Input.h
unix/xserver/hw/vnc/XserverDesktop.cc
unix/xserver/hw/vnc/XserverDesktop.h

index 5497d97e1aa956e754426977eee8258b609f624c..1d8757469c0afddd2213ae9737a92ef93fb39a86 100644 (file)
@@ -68,6 +68,9 @@ rfb::BoolParameter avoidShiftNumLock("AvoidShiftNumLock", "Avoid fake Shift pres
 
 #define BUTTONS 7
 
+class InputDevice *vncInputDevice;
+InputDevice InputDevice::singleton;
+
 /* Event queue is shared between all devices. */
 #if XORG == 15
 static xEvent *eventq = NULL;
@@ -117,10 +120,12 @@ static void enqueueEvents(DeviceIntPtr dev, int n)
 #endif /* XORG < 111 */
 
 InputDevice::InputDevice()
-       : initialized(false), oldButtonMask(0)
+       : oldButtonMask(0)
 {
        int i;
 
+       vncInputDevice = this;
+
 #if XORG < 111
        initEventq();
 #endif
index 8a3dd4f210f610ead1fd49ede997c8b6390a7fda..029b80d13bcbf90dec04165dae4de4e66bc28345 100644 (file)
@@ -40,12 +40,16 @@ extern "C" {
 
 #include "xorg-version.h"
 
-/* Represents input device (keyboard + pointer) */
+/*
+ * Represents input device (keyboard + pointer)
+ *
+ * Is a singleton as input devices are global in the X server so
+ * we do not have one per desktop (i.e. per screen).
+ */
+extern class InputDevice *vncInputDevice;
+
 class InputDevice {
 public:
-       /* Create new InputDevice instance */
-       InputDevice();
-
        /*
         * Press or release buttons. Relationship between buttonMask and
         * buttons is specified in RFB protocol.
@@ -63,17 +67,20 @@ public:
        void KeyboardRelease(rdr::U32 keysym) { keyEvent(keysym, false); }
 
        /*
-        * Init input device. This cannot be done in the constructor
-        * because constructor is called during X server extensions
-        * initialization. Devices must be initialized after core
-        * pointer/keyboard initialization which is actually after extesions
-        * initialization. Check InitExtensions(), InitCoreDevices() and
-        * InitInput() calls in dix/main.c. Instead it is called from
-        * XserverDesktop at an appropriate time.
+        * Init input device.
+        * This has to be called after core pointer/keyboard
+        * initialization which unfortunately is after extesions
+        * initialization (which means we cannot call it in
+        * vncExtensionInit(). Check InitExtensions(),
+        * InitCoreDevices() and InitInput() calls in dix/main.c.
+        * Instead we call it from XserverDesktop at an appropriate
+        * time.
         */
        void InitInputDevice(void);
 
 private:
+       InputDevice();
+
        void keyEvent(rdr::U32 keysym, bool down);
 
        /* Backend dependent functions below here */
@@ -117,6 +124,9 @@ private:
        rfb::Point cursorPos;
 
        KeySym pressedKeys[256];
+
+private:
+       static InputDevice singleton;
 };
 
 #endif
index cd76d0684510289d9ff171a86643ef56e94a03ad..8f426cce37ed106e6e2468177994bd9ee43f998e 100644 (file)
@@ -158,15 +158,12 @@ XserverDesktop::XserverDesktop(ScreenPtr pScreen_,
 
   if (httpListener)
     httpServer = new FileHTTPServer(this);
-
-  inputDevice = new InputDevice(server);
 }
 
 XserverDesktop::~XserverDesktop()
 {
   if (!directFbptr)
     delete [] data;
-  delete inputDevice;
   delete httpServer;
   delete server;
 }
@@ -581,7 +578,7 @@ void XserverDesktop::blockHandler(fd_set* fds, OSTimePtr timeout)
   // so we abuse the fact that this routine will be called first thing
   // once the dix is done initialising.
   // [1] Technically Xvnc has InitInput(), but libvnc.so has nothing.
-  inputDevice->InitInputDevice();
+  vncInputDevice->InitInputDevice();
 
   try {
     int nextTimeout;
@@ -690,8 +687,8 @@ void XserverDesktop::wakeupHandler(fd_set* fds, int nfds)
       }
 
       // We are responsible for propagating mouse movement between clients
-      if (!oldCursorPos.equals(inputDevice->getPointerPos())) {
-        oldCursorPos = inputDevice->getPointerPos();
+      if (!oldCursorPos.equals(vncInputDevice->getPointerPos())) {
+        oldCursorPos = vncInputDevice->getPointerPos();
         server->setCursorPos(oldCursorPos);
       }
     }
@@ -820,8 +817,8 @@ void XserverDesktop::approveConnection(void* opaqueId, bool accept,
 
 void XserverDesktop::pointerEvent(const Point& pos, int buttonMask)
 {
-  inputDevice->PointerMove(pos);
-  inputDevice->PointerButtonAction(buttonMask);
+  vncInputDevice->PointerMove(pos);
+  vncInputDevice->PointerButtonAction(buttonMask);
 }
 
 void XserverDesktop::clientCutText(const char* str, int len)
@@ -1138,7 +1135,7 @@ void XserverDesktop::lookup(int index, int* r, int* g, int* b)
 void XserverDesktop::keyEvent(rdr::U32 keysym, bool down)
 {
        if (down)
-               inputDevice->KeyboardPress(keysym);
+               vncInputDevice->KeyboardPress(keysym);
        else
-               inputDevice->KeyboardRelease(keysym);
+               vncInputDevice->KeyboardRelease(keysym);
 }
index ca6e8af9d1735c995053bf842691d45140ad3f3e..20c89dc5e98fd2c49acda0a76ffe2bb2da6e1310 100644 (file)
@@ -133,7 +133,6 @@ private:
 #endif
 
   ScreenPtr pScreen;
-  InputDevice *inputDevice;
   rfb::VNCServerST* server;
   rfb::HTTPServer* httpServer;
   network::TcpListener* listener;