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);