[HIDPARSER]
authorRafal Harabien <rafalh@reactos.org>
Mon, 5 Mar 2012 19:07:01 +0000 (19:07 +0000)
committerRafal Harabien <rafalh@reactos.org>
Mon, 5 Mar 2012 19:07:01 +0000 (19:07 +0000)
- Fix scan-codes for PrintScreen and PauseBreak

svn path=/trunk/; revision=56046

reactos/lib/drivers/hidparser/api.c

index 454ede2..860b0f5 100644 (file)
@@ -17,7 +17,7 @@ static ULONG KeyboardScanCodes[256] =
 /* 1 */ 0x0032, 0x0031, 0x0018, 0x0019, 0x0010, 0x0013, 0x001f, 0x0014, 0x0016, 0x002f, 0x0011, 0x002d, 0x0015, 0x002c, 0x0002, 0x0003,
 /* 2 */ 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000a, 0x000b, 0x001c, 0x0001, 0x000e, 0x000f, 0x0039, 0x000c, 0x000d, 0x001a,
 /* 3 */ 0x001b, 0x002b, 0x002b, 0x0027, 0x0028, 0x0029, 0x0033, 0x0034, 0x0035, 0x003a, 0x003b, 0x003c, 0x003d, 0x003e, 0x003f, 0x0040,
-/* 4 */ 0x0041, 0x0042, 0x0043, 0x0044, 0x0057, 0x0058, 0x0063, 0x0046, 0x0077, 0xE052, 0xE047, 0xE049, 0xE053, 0xE04F, 0xE051, 0xE04D,
+/* 4 */ 0x0041, 0x0042, 0x0043, 0x0044, 0x0057, 0x0058, 0xE037, 0x0046, 0x0045, 0xE052, 0xE047, 0xE049, 0xE053, 0xE04F, 0xE051, 0xE04D,
 /* 5 */ 0xE04B, 0xE050, 0xE048, 0x0045, 0xE035, 0x0037, 0x004a, 0x004e, 0xE01C, 0x004f, 0x0050, 0x0051, 0x004b, 0x004c, 0x004d, 0x0047,
 /* 6 */ 0x0048, 0x0049, 0x0052, 0x0053, 0x0056, 0xE05D, 0xE05E, 0x0075, 0x00b7, 0x00b8, 0x00b9, 0x00ba, 0x00bb, 0x00bc, 0x00bd, 0x00be,
 /* 7 */ 0x00bf, 0x00c0, 0x00c1, 0x00c2, 0x0086, 0x008a, 0x0082, 0x0084, 0x0080, 0x0081, 0x0083, 0x0089, 0x0085, 0x0087, 0x0088, 0x0071,
@@ -723,6 +723,8 @@ HidParser_TranslateUsage(
     IN PVOID  InsertCodesContext)
 {
     ULONG ScanCode;
+    CHAR FakeShift[] = {0xE0, 0x2A, 0x00};
+    CHAR FakeCtrl[] = {0xE1, 0x1D, 0x00};
 
     //
     // get scan code
@@ -737,7 +739,7 @@ HidParser_TranslateUsage(
         return HIDPARSER_STATUS_I8042_TRANS_UNKNOWN;
     }
 
-    if ((ScanCode & 0xE000) == 0xE000)
+    if (ScanCode & 0xFF00)
     {
         //
         // swap scan code
@@ -745,11 +747,29 @@ HidParser_TranslateUsage(
         ScanCode = NTOHS(ScanCode);
     }
 
+    if (Usage == 0x46 && KeyAction == HidP_Keyboard_Make)
+    {
+        // Print Screen generates additional FakeShift
+        HidParser_DispatchKey(FakeShift, KeyAction, InsertCodesProcedure, InsertCodesContext);
+    }
+
+    if (Usage == 0x48)
+    {
+        // Pause/Break generates additional FakeCtrl. Note: it's always before key press/release.
+        HidParser_DispatchKey(FakeCtrl, KeyAction, InsertCodesProcedure, InsertCodesContext);
+    }
+
     //
     // FIXME: translate modifier states
     //
     HidParser_DispatchKey((PCHAR)&ScanCode, KeyAction, InsertCodesProcedure, InsertCodesContext);
 
+    if (Usage == 0x46 && KeyAction == HidP_Keyboard_Break)
+    {
+        // Print Screen generates additional FakeShift
+        HidParser_DispatchKey(FakeShift, KeyAction, InsertCodesProcedure, InsertCodesContext);
+    }
+
     //
     // done
     //