Handle Windows scan code exceptions
Windows mostly follows the AT set 1 scan codes that we want, but
there are a few exceptions.
diff --git a/vncviewer/Viewport.cxx b/vncviewer/Viewport.cxx
index 31d09a1..960a085 100644
--- a/vncviewer/Viewport.cxx
+++ b/vncviewer/Viewport.cxx
@@ -894,10 +894,24 @@
if (isExtended)
keyCode |= 0x80;
- // VK_SNAPSHOT sends different scan codes depending on the state of
- // Alt. This means that we can get different scan codes on press and
- // release. Force it to be something standard.
- if (vKey == VK_SNAPSHOT)
+
+ // Fortunately RFB and Windows use the same scan code set (mostly),
+ // so there is no conversion needed
+ // (as long as we encode the extended keys with the high bit)
+
+ // However Pause sends a code that conflicts with NumLock, so use
+ // the code most RFB implementations use (part of the sequence for
+ // Ctrl+Pause, i.e. Break)
+ if (keyCode == 0x45)
+ keyCode = 0xc6;
+
+ // And NumLock incorrectly has the extended bit set
+ if (keyCode == 0xc5)
+ keyCode = 0x45;
+
+ // And Alt+PrintScreen (i.e. SysRq) sends a different code than
+ // PrintScreen
+ if (keyCode == 0xb7)
keyCode = 0x54;
keySym = win32_vkey_to_keysym(vKey, isExtended);
@@ -908,10 +922,6 @@
vlog.error(_("No symbol for virtual key 0x%02x"), (int)vKey);
}
- // Fortunately RFB and Windows use the same scan code set,
- // so there is no conversion needed
- // (as long as we encode the extended keys with the high bit)
-
self->handleKeyPress(keyCode, keySym);
return 1;
@@ -934,7 +944,11 @@
keyCode = MapVirtualKey(vKey, MAPVK_VK_TO_VSC);
if (isExtended)
keyCode |= 0x80;
- if (vKey == VK_SNAPSHOT)
+ if (keyCode == 0x45)
+ keyCode = 0xc6;
+ if (keyCode == 0xc5)
+ keyCode = 0x45;
+ if (keyCode == 0xb7)
keyCode = 0x54;
self->handleKeyRelease(keyCode);