]> source.dussan.org Git - tigervnc.git/commitdiff
Properly sync LED state on connect
authorPierre Ossman <ossman@cendio.se>
Thu, 7 Jun 2018 07:16:02 +0000 (09:16 +0200)
committerPierre Ossman <ossman@cendio.se>
Thu, 7 Jun 2018 07:16:02 +0000 (09:16 +0200)
We should start by getting the remote end in sync with the actual
keyboard state. This would work randomly before depending on if we
got the first LED state message before or after we got focus.

vncviewer/Viewport.cxx
vncviewer/Viewport.h

index 4a44f40104cf5b9c7cfb1b7ede10f873df4fcb44..4e23dc8c4beb2b48797049977059d1f7fbc29727 100644 (file)
@@ -118,6 +118,7 @@ Viewport::Viewport(int w, int h, const rfb::PixelFormat& serverPF, CConn* cc_)
 #ifdef WIN32
     altGrArmed(false),
 #endif
+    firstLEDState(true),
     pendingServerCutText(NULL), pendingClientCutText(NULL),
     menuCtrlKey(false), menuAltKey(false), cursor(NULL)
 {
@@ -321,6 +322,15 @@ void Viewport::setLEDState(unsigned int state)
 {
   vlog.debug("Got server LED state: 0x%08x", state);
 
+  // The first message is just considered to be the server announcing
+  // support for this extension, so start by pushing our state to the
+  // remote end to get things in sync
+  if (firstLEDState) {
+    firstLEDState = false;
+    pushLEDState();
+    return;
+  }
+
   if (!hasFocus())
     return;
 
index d9d73a8ef7a693353354689f0f2330e20d22e431..be2192b8751c55419fd48f31145470957b340822 100644 (file)
@@ -112,6 +112,8 @@ private:
   unsigned int altGrCtrlTime;
 #endif
 
+  bool firstLEDState;
+
   const char* pendingServerCutText;
   const char* pendingClientCutText;