]> source.dussan.org Git - tigervnc.git/commitdiff
rfb_win32: Add support for LED state notifications
authorRahul Kale <Rahul.Kale@barco.com>
Wed, 12 Jul 2017 22:36:02 +0000 (00:36 +0200)
committerPierre Ossman <ossman@cendio.se>
Mon, 28 Aug 2017 11:54:30 +0000 (13:54 +0200)
LED support added using Windows GetKeyState() API call.

The state is polled for change in CapsLock/NumLock/ScrollLock
status in the same code block where chages to Cursor shape is polled.

Signed-off-by: Rahul Kale <Rahul.Kale@barco.com>
Signed-off-by: Peter Korsgaard <peter.korsgaard@barco.com>
win/rfb_win32/SDisplay.cxx
win/rfb_win32/SDisplay.h

index ac64e3efb7a32f3bf13c65a4262eb2d6066bd145..2696f5dc7cf07b21ed953e81b443b20db59aae9b 100644 (file)
@@ -30,6 +30,7 @@
 #include <rfb_win32/SDisplayCoreWMHooks.h>
 #include <rfb/Exception.h>
 #include <rfb/LogWriter.h>
+#include <rfb/ledStates.h>
 
 
 using namespace rdr;
@@ -65,7 +66,7 @@ SDisplay::SDisplay()
   : server(0), pb(0), device(0),
     core(0), ptr(0), kbd(0), clipboard(0),
     inputs(0), monitor(0), cleanDesktop(0), cursor(0),
-    statusLocation(0)
+    statusLocation(0), ledState(0)
 {
   updateEvent.h = CreateEvent(0, TRUE, FALSE, 0);
 }
@@ -196,6 +197,10 @@ void SDisplay::startCore() {
     cleanDesktop->disableEffects();
   isWallpaperRemoved = removeWallpaper;
   areEffectsDisabled = disableEffects;
+
+  checkLedState();
+  if (server)
+    server->setLEDState(ledState);
 }
 
 void SDisplay::stopCore() {
@@ -283,6 +288,24 @@ void SDisplay::keyEvent(rdr::U32 key, bool down) {
     kbd->keyEvent(key, down);
 }
 
+bool SDisplay::checkLedState() {
+  unsigned state = 0;
+
+  if (GetKeyState(VK_SCROLL) & 0x0001)
+    state |= ledScrollLock;
+  if (GetKeyState(VK_NUMLOCK) & 0x0001)
+    state |= ledNumLock;
+  if (GetKeyState(VK_CAPITAL) & 0x0001)
+    state |= ledCapsLock;
+
+  if (ledState != state) {
+    ledState = state;
+    return true;
+  }
+
+  return false;
+}
+
 void SDisplay::clientCutText(const char* text, int len) {
   CharArray clip_sz(len+1);
   memcpy(clip_sz.buf, text, len);
@@ -384,6 +407,10 @@ SDisplay::processEvent(HANDLE event) {
 
       // Flush any changes to the server
       flushChangeTracker();
+
+      // Forward current LED state to the server
+      if (checkLedState())
+        server->setLEDState(ledState);
     }
     return;
   }
index b0217822ffaadd4f1f34ae6c6638a749a54991d1..e43e3021c6542a7c74a910955c4c63d31375c882 100644 (file)
@@ -106,6 +106,7 @@ namespace rfb {
       void restartCore();
       void recreatePixelBuffer(bool force=false);
       bool flushChangeTracker();  // true if flushed, false if empty
+      bool checkLedState();
 
       VNCServer* server;
 
@@ -151,6 +152,8 @@ namespace rfb {
 
       // -=- Where to write the active/inactive indicator to
       bool* statusLocation;
+
+      unsigned ledState;
     };
 
   }