]> source.dussan.org Git - tigervnc.git/commitdiff
Add support for lock LED state to Xvnc/libvnc.so
authorPierre Ossman <ossman@cendio.se>
Mon, 12 Dec 2016 14:39:54 +0000 (15:39 +0100)
committerPierre Ossman <ossman@cendio.se>
Thu, 24 Aug 2017 10:33:08 +0000 (12:33 +0200)
unix/xserver/hw/vnc/Input.c
unix/xserver/hw/vnc/XserverDesktop.cc
unix/xserver/hw/vnc/XserverDesktop.h
unix/xserver/hw/vnc/vncExtInit.cc
unix/xserver/hw/vnc/vncExtInit.h

index 1d7183b90092f112eb17e797a54dadfaf637872c..998121b4bc72af17013b5f1ff25dc12824756dae 100644 (file)
@@ -273,6 +273,11 @@ static void vncKeyboardBell(int percent, DeviceIntPtr device,
                vncBell();
 }
 
+static void vncKeyboardCtrl(DeviceIntPtr pDevice, KeybdCtrl *ctrl)
+{
+       vncSetLEDState(ctrl->leds);
+}
+
 static int vncKeyboardProc(DeviceIntPtr pDevice, int onoff)
 {
        DevicePtr pDev = (DevicePtr)pDevice;
@@ -280,7 +285,7 @@ static int vncKeyboardProc(DeviceIntPtr pDevice, int onoff)
        switch (onoff) {
        case DEVICE_INIT:
                InitKeyboardDeviceStruct(pDevice, NULL, vncKeyboardBell,
-                                        (KbdCtrlProcPtr)NoopDDA);
+                                        vncKeyboardCtrl);
                break;
        case DEVICE_ON:
                pDev->on = TRUE;
index 4836782ac93c3c538d82031e30b72bbb32c3dbc7..1c74bc66c5c22736dcba010dcc48ef55fb0b8f94 100644 (file)
@@ -322,6 +322,11 @@ void XserverDesktop::bell()
   server->bell();
 }
 
+void XserverDesktop::setLEDState(unsigned int state)
+{
+  server->setLEDState(state);
+}
+
 void XserverDesktop::serverCutText(const char* str, int len)
 {
   try {
index c766c26729d06e78d62dd96d865ec68bf3634e27..cd85e4b0742d122bb7f7b64e6233b8a83be3975d 100644 (file)
@@ -63,6 +63,7 @@ public:
   void setFramebuffer(int w, int h, void* fbptr, int stride);
   void refreshScreenLayout();
   void bell();
+  void setLEDState(unsigned int state);
   void serverCutText(const char* str, int len);
   void setDesktopName(const char* name);
   void setCursor(int width, int height, int hotX, int hotY,
index 57bf6d8d27ddd86d990036d8da75715ca72d95b8..13248f91c3739c8cf5363191bad2450e65a7ba7a 100644 (file)
@@ -32,6 +32,7 @@
 #include <rfb/LogWriter.h>
 #include <rfb/Hostname.h>
 #include <rfb/Region.h>
+#include <rfb/ledStates.h>
 #include <network/TcpSocket.h>
 
 #include "XserverDesktop.h"
@@ -358,6 +359,25 @@ void vncBell()
   }
 }
 
+void vncSetLEDState(unsigned long leds)
+{
+  unsigned int state;
+
+  state = 0;
+  if (leds & (1 << 0))
+    state |= ledCapsLock;
+  if (leds & (1 << 1))
+    state |= ledNumLock;
+  if (leds & (1 << 2))
+    state |= ledScrollLock;
+
+  for (int scr = 0; scr < vncGetScreenCount(); scr++) {
+    if (desktop[scr] == NULL)
+      continue;
+    desktop[scr]->setLEDState(state);
+  }
+}
+
 void vncAddChanged(int scrIdx, const struct UpdateRect *extents,
                    int nRects, const struct UpdateRect *rects)
 {
index 9f8d9e76f2364e542a403c41235eb280298e48e4..99fee27eedf8f14e481f9906608f26803582629d 100644 (file)
@@ -70,6 +70,8 @@ void vncApproveConnection(uint32_t opaqueId, int approve);
 
 void vncBell(void);
 
+void vncSetLEDState(unsigned long leds);
+
 // Must match rfb::ShortRect in common/rfb/Region.h, and BoxRec in the
 // Xorg source.
 struct UpdateRect {