| /* |
| * BRLTTY - A background process providing access to the console screen (when in |
| * text mode) for a blind person using a refreshable braille display. |
| * |
| * Copyright (C) 1995-2023 by The BRLTTY Developers. |
| * |
| * BRLTTY comes with ABSOLUTELY NO WARRANTY. |
| * |
| * This is free software, placed under the terms of the |
| * GNU Lesser General Public License, as published by the Free Software |
| * Foundation; either version 2.1 of the License, or (at your option) any |
| * later version. Please see the file LICENSE-LGPL for details. |
| * |
| * Web Page: http://brltty.app/ |
| * |
| * This software is maintained by Dave Mielke <dave@mielke.cc>. |
| */ |
| |
| #include "prologue.h" |
| |
| #include <string.h> |
| |
| #include "hidkeys.h" |
| #include "kbd_keycodes.h" |
| #include "bitmask.h" |
| #include "brl_cmds.h" |
| #include "cmd_enqueue.h" |
| |
| typedef struct { |
| uint16_t xtCode; |
| uint16_t atCode; |
| uint8_t ps2Code; |
| } HidKeyEntry; |
| |
| static const HidKeyEntry hidKeyTable[] = { |
| /* aA */ |
| [HID_KEY_A] = { |
| .xtCode = XT_KEY(00, A), |
| .atCode = AT_KEY(00, A), |
| .ps2Code = PS2_KEY_A |
| }, |
| |
| /* bB */ |
| [HID_KEY_B] = { |
| .xtCode = XT_KEY(00, B), |
| .atCode = AT_KEY(00, B), |
| .ps2Code = PS2_KEY_B |
| }, |
| |
| /* cC */ |
| [HID_KEY_C] = { |
| .xtCode = XT_KEY(00, C), |
| .atCode = AT_KEY(00, C), |
| .ps2Code = PS2_KEY_C |
| }, |
| |
| /* dD */ |
| [HID_KEY_D] = { |
| .xtCode = XT_KEY(00, D), |
| .atCode = AT_KEY(00, D), |
| .ps2Code = PS2_KEY_D |
| }, |
| |
| /* eE */ |
| [HID_KEY_E] = { |
| .xtCode = XT_KEY(00, E), |
| .atCode = AT_KEY(00, E), |
| .ps2Code = PS2_KEY_E |
| }, |
| |
| /* fF */ |
| [HID_KEY_F] = { |
| .xtCode = XT_KEY(00, F), |
| .atCode = AT_KEY(00, F), |
| .ps2Code = PS2_KEY_F |
| }, |
| |
| /* gG */ |
| [HID_KEY_G] = { |
| .xtCode = XT_KEY(00, G), |
| .atCode = AT_KEY(00, G), |
| .ps2Code = PS2_KEY_G |
| }, |
| |
| /* hH */ |
| [HID_KEY_H] = { |
| .xtCode = XT_KEY(00, H), |
| .atCode = AT_KEY(00, H), |
| .ps2Code = PS2_KEY_H |
| }, |
| |
| /* iI */ |
| [HID_KEY_I] = { |
| .xtCode = XT_KEY(00, I), |
| .atCode = AT_KEY(00, I), |
| .ps2Code = PS2_KEY_I |
| }, |
| |
| /* jJ */ |
| [HID_KEY_J] = { |
| .xtCode = XT_KEY(00, J), |
| .atCode = AT_KEY(00, J), |
| .ps2Code = PS2_KEY_J |
| }, |
| |
| /* kK */ |
| [HID_KEY_K] = { |
| .xtCode = XT_KEY(00, K), |
| .atCode = AT_KEY(00, K), |
| .ps2Code = PS2_KEY_K |
| }, |
| |
| /* lL */ |
| [HID_KEY_L] = { |
| .xtCode = XT_KEY(00, L), |
| .atCode = AT_KEY(00, L), |
| .ps2Code = PS2_KEY_L |
| }, |
| |
| /* mM */ |
| [HID_KEY_M] = { |
| .xtCode = XT_KEY(00, M), |
| .atCode = AT_KEY(00, M), |
| .ps2Code = PS2_KEY_M |
| }, |
| |
| /* nN */ |
| [HID_KEY_N] = { |
| .xtCode = XT_KEY(00, N), |
| .atCode = AT_KEY(00, N), |
| .ps2Code = PS2_KEY_N |
| }, |
| |
| /* oO */ |
| [HID_KEY_O] = { |
| .xtCode = XT_KEY(00, O), |
| .atCode = AT_KEY(00, O), |
| .ps2Code = PS2_KEY_O |
| }, |
| |
| /* pP */ |
| [HID_KEY_P] = { |
| .xtCode = XT_KEY(00, P), |
| .atCode = AT_KEY(00, P), |
| .ps2Code = PS2_KEY_P |
| }, |
| |
| /* qQ */ |
| [HID_KEY_Q] = { |
| .xtCode = XT_KEY(00, Q), |
| .atCode = AT_KEY(00, Q), |
| .ps2Code = PS2_KEY_Q |
| }, |
| |
| /* rR */ |
| [HID_KEY_R] = { |
| .xtCode = XT_KEY(00, R), |
| .atCode = AT_KEY(00, R), |
| .ps2Code = PS2_KEY_R |
| }, |
| |
| /* sS */ |
| [HID_KEY_S] = { |
| .xtCode = XT_KEY(00, S), |
| .atCode = AT_KEY(00, S), |
| .ps2Code = PS2_KEY_S |
| }, |
| |
| /* tT */ |
| [HID_KEY_T] = { |
| .xtCode = XT_KEY(00, T), |
| .atCode = AT_KEY(00, T), |
| .ps2Code = PS2_KEY_T |
| }, |
| |
| /* uU */ |
| [HID_KEY_U] = { |
| .xtCode = XT_KEY(00, U), |
| .atCode = AT_KEY(00, U), |
| .ps2Code = PS2_KEY_U |
| }, |
| |
| /* vV */ |
| [HID_KEY_V] = { |
| .xtCode = XT_KEY(00, V), |
| .atCode = AT_KEY(00, V), |
| .ps2Code = PS2_KEY_V |
| }, |
| |
| /* wW */ |
| [HID_KEY_W] = { |
| .xtCode = XT_KEY(00, W), |
| .atCode = AT_KEY(00, W), |
| .ps2Code = PS2_KEY_W |
| }, |
| |
| /* xX */ |
| [HID_KEY_X] = { |
| .xtCode = XT_KEY(00, X), |
| .atCode = AT_KEY(00, X), |
| .ps2Code = PS2_KEY_X |
| }, |
| |
| /* yY */ |
| [HID_KEY_Y] = { |
| .xtCode = XT_KEY(00, Y), |
| .atCode = AT_KEY(00, Y), |
| .ps2Code = PS2_KEY_Y |
| }, |
| |
| /* zZ */ |
| [HID_KEY_Z] = { |
| .xtCode = XT_KEY(00, Z), |
| .atCode = AT_KEY(00, Z), |
| .ps2Code = PS2_KEY_Z |
| }, |
| |
| /* 1! */ |
| [HID_KEY_1] = { |
| .xtCode = XT_KEY(00, 1), |
| .atCode = AT_KEY(00, 1), |
| .ps2Code = PS2_KEY_1 |
| }, |
| |
| /* 2@ */ |
| [HID_KEY_2] = { |
| .xtCode = XT_KEY(00, 2), |
| .atCode = AT_KEY(00, 2), |
| .ps2Code = PS2_KEY_2 |
| }, |
| |
| /* 3# */ |
| [HID_KEY_3] = { |
| .xtCode = XT_KEY(00, 3), |
| .atCode = AT_KEY(00, 3), |
| .ps2Code = PS2_KEY_3 |
| }, |
| |
| /* 4$ */ |
| [HID_KEY_4] = { |
| .xtCode = XT_KEY(00, 4), |
| .atCode = AT_KEY(00, 4), |
| .ps2Code = PS2_KEY_4 |
| }, |
| |
| /* 5% */ |
| [HID_KEY_5] = { |
| .xtCode = XT_KEY(00, 5), |
| .atCode = AT_KEY(00, 5), |
| .ps2Code = PS2_KEY_5 |
| }, |
| |
| /* 6^ */ |
| [HID_KEY_6] = { |
| .xtCode = XT_KEY(00, 6), |
| .atCode = AT_KEY(00, 6), |
| .ps2Code = PS2_KEY_6 |
| }, |
| |
| /* 7& */ |
| [HID_KEY_7] = { |
| .xtCode = XT_KEY(00, 7), |
| .atCode = AT_KEY(00, 7), |
| .ps2Code = PS2_KEY_7 |
| }, |
| |
| /* 8* */ |
| [HID_KEY_8] = { |
| .xtCode = XT_KEY(00, 8), |
| .atCode = AT_KEY(00, 8), |
| .ps2Code = PS2_KEY_8 |
| }, |
| |
| /* 9( */ |
| [HID_KEY_9] = { |
| .xtCode = XT_KEY(00, 9), |
| .atCode = AT_KEY(00, 9), |
| .ps2Code = PS2_KEY_9 |
| }, |
| |
| /* 0) */ |
| [HID_KEY_0] = { |
| .xtCode = XT_KEY(00, 0), |
| .atCode = AT_KEY(00, 0), |
| .ps2Code = PS2_KEY_0 |
| }, |
| |
| /* Return */ |
| [HID_KEY_Enter] = { |
| .xtCode = XT_KEY(00, Enter), |
| .atCode = AT_KEY(00, Enter), |
| .ps2Code = PS2_KEY_Enter |
| }, |
| |
| /* Escape */ |
| [HID_KEY_Escape] = { |
| .xtCode = XT_KEY(00, Escape), |
| .atCode = AT_KEY(00, Escape), |
| .ps2Code = PS2_KEY_Escape |
| }, |
| |
| /* Backspace */ |
| [HID_KEY_Backspace] = { |
| .xtCode = XT_KEY(00, Backspace), |
| .atCode = AT_KEY(00, Backspace), |
| .ps2Code = PS2_KEY_Backspace |
| }, |
| |
| /* Tab */ |
| [HID_KEY_Tab] = { |
| .xtCode = XT_KEY(00, Tab), |
| .atCode = AT_KEY(00, Tab), |
| .ps2Code = PS2_KEY_Tab |
| }, |
| |
| /* Space */ |
| [HID_KEY_Space] = { |
| .xtCode = XT_KEY(00, Space), |
| .atCode = AT_KEY(00, Space), |
| .ps2Code = PS2_KEY_Space |
| }, |
| |
| /* -_ */ |
| [HID_KEY_Minus] = { |
| .xtCode = XT_KEY(00, Minus), |
| .atCode = AT_KEY(00, Minus), |
| .ps2Code = PS2_KEY_Minus |
| }, |
| |
| /* =+ */ |
| [HID_KEY_Equal] = { |
| .xtCode = XT_KEY(00, Equal), |
| .atCode = AT_KEY(00, Equal), |
| .ps2Code = PS2_KEY_Equal |
| }, |
| |
| /* [{ */ |
| [HID_KEY_LeftBracket] = { |
| .xtCode = XT_KEY(00, LeftBracket), |
| .atCode = AT_KEY(00, LeftBracket), |
| .ps2Code = PS2_KEY_LeftBracket |
| }, |
| |
| /* ]} */ |
| [HID_KEY_RightBracket] = { |
| .xtCode = XT_KEY(00, RightBracket), |
| .atCode = AT_KEY(00, RightBracket), |
| .ps2Code = PS2_KEY_RightBracket |
| }, |
| |
| /* \| */ |
| [HID_KEY_Backslash] = { |
| .xtCode = XT_KEY(00, Backslash), |
| .atCode = AT_KEY(00, Backslash), |
| .ps2Code = PS2_KEY_Backslash |
| }, |
| |
| /* Europe 1 (Note 2) */ |
| [HID_KEY_Europe1] = { |
| .xtCode = XT_KEY(00, Europe1), |
| .atCode = AT_KEY(00, Europe1), |
| .ps2Code = PS2_KEY_Europe1 |
| }, |
| |
| /* ;: */ |
| [HID_KEY_Semicolon] = { |
| .xtCode = XT_KEY(00, Semicolon), |
| .atCode = AT_KEY(00, Semicolon), |
| .ps2Code = PS2_KEY_Semicolon |
| }, |
| |
| /* '" */ |
| [HID_KEY_Apostrophe] = { |
| .xtCode = XT_KEY(00, Apostrophe), |
| .atCode = AT_KEY(00, Apostrophe), |
| .ps2Code = PS2_KEY_Apostrophe |
| }, |
| |
| /* `~ */ |
| [HID_KEY_Grave] = { |
| .xtCode = XT_KEY(00, Grave), |
| .atCode = AT_KEY(00, Grave), |
| .ps2Code = PS2_KEY_Grave |
| }, |
| |
| /* ,< */ |
| [HID_KEY_Comma] = { |
| .xtCode = XT_KEY(00, Comma), |
| .atCode = AT_KEY(00, Comma), |
| .ps2Code = PS2_KEY_Comma |
| }, |
| |
| /* .> */ |
| [HID_KEY_Period] = { |
| .xtCode = XT_KEY(00, Period), |
| .atCode = AT_KEY(00, Period), |
| .ps2Code = PS2_KEY_Period |
| }, |
| |
| /* /? */ |
| [HID_KEY_Slash] = { |
| .xtCode = XT_KEY(00, Slash), |
| .atCode = AT_KEY(00, Slash), |
| .ps2Code = PS2_KEY_Slash |
| }, |
| |
| /* Caps Lock */ |
| [HID_KEY_CapsLock] = { |
| .xtCode = XT_KEY(00, CapsLock), |
| .atCode = AT_KEY(00, CapsLock), |
| .ps2Code = PS2_KEY_CapsLock |
| }, |
| |
| /* F1 */ |
| [HID_KEY_F1] = { |
| .xtCode = XT_KEY(00, F1), |
| .atCode = AT_KEY(00, F1), |
| .ps2Code = PS2_KEY_F1 |
| }, |
| |
| /* F2 */ |
| [HID_KEY_F2] = { |
| .xtCode = XT_KEY(00, F2), |
| .atCode = AT_KEY(00, F2), |
| .ps2Code = PS2_KEY_F2 |
| }, |
| |
| /* F3 */ |
| [HID_KEY_F3] = { |
| .xtCode = XT_KEY(00, F3), |
| .atCode = AT_KEY(00, F3), |
| .ps2Code = PS2_KEY_F3 |
| }, |
| |
| /* F4 */ |
| [HID_KEY_F4] = { |
| .xtCode = XT_KEY(00, F4), |
| .atCode = AT_KEY(00, F4), |
| .ps2Code = PS2_KEY_F4 |
| }, |
| |
| /* F5 */ |
| [HID_KEY_F5] = { |
| .xtCode = XT_KEY(00, F5), |
| .atCode = AT_KEY(00, F5), |
| .ps2Code = PS2_KEY_F5 |
| }, |
| |
| /* F6 */ |
| [HID_KEY_F6] = { |
| .xtCode = XT_KEY(00, F6), |
| .atCode = AT_KEY(00, F6), |
| .ps2Code = PS2_KEY_F6 |
| }, |
| |
| /* F7 */ |
| [HID_KEY_F7] = { |
| .xtCode = XT_KEY(00, F7), |
| .atCode = AT_KEY(00, F7), |
| .ps2Code = PS2_KEY_F7 |
| }, |
| |
| /* F8 */ |
| [HID_KEY_F8] = { |
| .xtCode = XT_KEY(00, F8), |
| .atCode = AT_KEY(00, F8), |
| .ps2Code = PS2_KEY_F8 |
| }, |
| |
| /* F9 */ |
| [HID_KEY_F9] = { |
| .xtCode = XT_KEY(00, F9), |
| .atCode = AT_KEY(00, F9), |
| .ps2Code = PS2_KEY_F9 |
| }, |
| |
| /* F10 */ |
| [HID_KEY_F10] = { |
| .xtCode = XT_KEY(00, F10), |
| .atCode = AT_KEY(00, F10), |
| .ps2Code = PS2_KEY_F10 |
| }, |
| |
| /* F11 */ |
| [HID_KEY_F11] = { |
| .xtCode = XT_KEY(00, F11), |
| .atCode = AT_KEY(00, F11), |
| .ps2Code = PS2_KEY_F11 |
| }, |
| |
| /* F12 */ |
| [HID_KEY_F12] = { |
| .xtCode = XT_KEY(00, F12), |
| .atCode = AT_KEY(00, F12), |
| .ps2Code = PS2_KEY_F12 |
| }, |
| |
| /* Print Screen (Note 1) */ |
| [HID_KEY_PrintScreen] = { |
| .xtCode = XT_KEY(E0, PrintScreen), |
| .atCode = AT_KEY(E0, PrintScreen), |
| .ps2Code = PS2_KEY_PrintScreen |
| }, |
| |
| /* Scroll Lock */ |
| [HID_KEY_ScrollLock] = { |
| .xtCode = XT_KEY(00, ScrollLock), |
| .atCode = AT_KEY(00, ScrollLock), |
| .ps2Code = PS2_KEY_ScrollLock |
| }, |
| |
| /* Pause */ |
| [HID_KEY_Pause] = { |
| .xtCode = XT_KEY(E1, Pause), |
| .atCode = AT_KEY(E1, Pause), |
| .ps2Code = PS2_KEY_Pause |
| }, |
| |
| /* Insert (Note 1) */ |
| [HID_KEY_Insert] = { |
| .xtCode = XT_KEY(E0, Insert), |
| .atCode = AT_KEY(E0, Insert), |
| .ps2Code = PS2_KEY_Insert |
| }, |
| |
| /* Home (Note 1) */ |
| [HID_KEY_Home] = { |
| .xtCode = XT_KEY(E0, Home), |
| .atCode = AT_KEY(E0, Home), |
| .ps2Code = PS2_KEY_Home |
| }, |
| |
| /* Page Up (Note 1) */ |
| [HID_KEY_PageUp] = { |
| .xtCode = XT_KEY(E0, PageUp), |
| .atCode = AT_KEY(E0, PageUp), |
| .ps2Code = PS2_KEY_PageUp |
| }, |
| |
| /* Delete (Note 1) */ |
| [HID_KEY_Delete] = { |
| .xtCode = XT_KEY(E0, Delete), |
| .atCode = AT_KEY(E0, Delete), |
| .ps2Code = PS2_KEY_Delete |
| }, |
| |
| /* End (Note 1) */ |
| [HID_KEY_End] = { |
| .xtCode = XT_KEY(E0, End), |
| .atCode = AT_KEY(E0, End), |
| .ps2Code = PS2_KEY_End |
| }, |
| |
| /* Page Down (Note 1) */ |
| [HID_KEY_PageDown] = { |
| .xtCode = XT_KEY(E0, PageDown), |
| .atCode = AT_KEY(E0, PageDown), |
| .ps2Code = PS2_KEY_PageDown |
| }, |
| |
| /* Right Arrow (Note 1) */ |
| [HID_KEY_ArrowRight] = { |
| .xtCode = XT_KEY(E0, ArrowRight), |
| .atCode = AT_KEY(E0, ArrowRight), |
| .ps2Code = PS2_KEY_ArrowRight |
| }, |
| |
| /* Left Arrow (Note 1) */ |
| [HID_KEY_ArrowLeft] = { |
| .xtCode = XT_KEY(E0, ArrowLeft), |
| .atCode = AT_KEY(E0, ArrowLeft), |
| .ps2Code = PS2_KEY_ArrowLeft |
| }, |
| |
| /* Down Arrow (Note 1) */ |
| [HID_KEY_ArrowDown] = { |
| .xtCode = XT_KEY(E0, ArrowDown), |
| .atCode = AT_KEY(E0, ArrowDown), |
| .ps2Code = PS2_KEY_ArrowDown |
| }, |
| |
| /* Up Arrow (Note 1) */ |
| [HID_KEY_ArrowUp] = { |
| .xtCode = XT_KEY(E0, ArrowUp), |
| .atCode = AT_KEY(E0, ArrowUp), |
| .ps2Code = PS2_KEY_ArrowUp |
| }, |
| |
| /* Num Lock */ |
| [HID_KEY_NumLock] = { |
| .xtCode = XT_KEY(00, NumLock), |
| .atCode = AT_KEY(00, NumLock), |
| .ps2Code = PS2_KEY_NumLock |
| }, |
| |
| /* Keypad / (Note 1) */ |
| [HID_KEY_KPSlash] = { |
| .xtCode = XT_KEY(E0, KPSlash), |
| .atCode = AT_KEY(E0, KPSlash), |
| .ps2Code = PS2_KEY_KPSlash |
| }, |
| |
| /* Keypad * */ |
| [HID_KEY_KPAsterisk] = { |
| .xtCode = XT_KEY(00, KPAsterisk), |
| .atCode = AT_KEY(00, KPAsterisk), |
| .ps2Code = PS2_KEY_KPAsterisk |
| }, |
| |
| /* Keypad - */ |
| [HID_KEY_KPMinus] = { |
| .xtCode = XT_KEY(00, KPMinus), |
| .atCode = AT_KEY(00, KPMinus), |
| .ps2Code = PS2_KEY_KPMinus |
| }, |
| |
| /* Keypad + */ |
| [HID_KEY_KPPlus] = { |
| .xtCode = XT_KEY(00, KPPlus), |
| .atCode = AT_KEY(00, KPPlus), |
| .ps2Code = PS2_KEY_KPPlus |
| }, |
| |
| /* Keypad Enter */ |
| [HID_KEY_KPEnter] = { |
| .xtCode = XT_KEY(E0, KPEnter), |
| .atCode = AT_KEY(E0, KPEnter), |
| .ps2Code = PS2_KEY_KPEnter |
| }, |
| |
| /* Keypad 1 End */ |
| [HID_KEY_KP1] = { |
| .xtCode = XT_KEY(00, KP1), |
| .atCode = AT_KEY(00, KP1), |
| .ps2Code = PS2_KEY_KP1 |
| }, |
| |
| /* Keypad 2 Down */ |
| [HID_KEY_KP2] = { |
| .xtCode = XT_KEY(00, KP2), |
| .atCode = AT_KEY(00, KP2), |
| .ps2Code = PS2_KEY_KP2 |
| }, |
| |
| /* Keypad 3 PageDn */ |
| [HID_KEY_KP3] = { |
| .xtCode = XT_KEY(00, KP3), |
| .atCode = AT_KEY(00, KP3), |
| .ps2Code = PS2_KEY_KP3 |
| }, |
| |
| /* Keypad 4 Left */ |
| [HID_KEY_KP4] = { |
| .xtCode = XT_KEY(00, KP4), |
| .atCode = AT_KEY(00, KP4), |
| .ps2Code = PS2_KEY_KP4 |
| }, |
| |
| /* Keypad 5 */ |
| [HID_KEY_KP5] = { |
| .xtCode = XT_KEY(00, KP5), |
| .atCode = AT_KEY(00, KP5), |
| .ps2Code = PS2_KEY_KP5 |
| }, |
| |
| /* Keypad 6 Right */ |
| [HID_KEY_KP6] = { |
| .xtCode = XT_KEY(00, KP6), |
| .atCode = AT_KEY(00, KP6), |
| .ps2Code = PS2_KEY_KP6 |
| }, |
| |
| /* Keypad 7 Home */ |
| [HID_KEY_KP7] = { |
| .xtCode = XT_KEY(00, KP7), |
| .atCode = AT_KEY(00, KP7), |
| .ps2Code = PS2_KEY_KP7 |
| }, |
| |
| /* Keypad 8 Up */ |
| [HID_KEY_KP8] = { |
| .xtCode = XT_KEY(00, KP8), |
| .atCode = AT_KEY(00, KP8), |
| .ps2Code = PS2_KEY_KP8 |
| }, |
| |
| /* Keypad 9 PageUp */ |
| [HID_KEY_KP9] = { |
| .xtCode = XT_KEY(00, KP9), |
| .atCode = AT_KEY(00, KP9), |
| .ps2Code = PS2_KEY_KP9 |
| }, |
| |
| /* Keypad 0 Insert */ |
| [HID_KEY_KP0] = { |
| .xtCode = XT_KEY(00, KP0), |
| .atCode = AT_KEY(00, KP0), |
| .ps2Code = PS2_KEY_KP0 |
| }, |
| |
| /* Keypad . Delete */ |
| [HID_KEY_KPPeriod] = { |
| .xtCode = XT_KEY(00, KPPeriod), |
| .atCode = AT_KEY(00, KPPeriod), |
| .ps2Code = PS2_KEY_KPPeriod |
| }, |
| |
| /* Europe 2 (Note 2) */ |
| [HID_KEY_Europe2] = { |
| .xtCode = XT_KEY(00, Europe2), |
| .atCode = AT_KEY(00, Europe2), |
| .ps2Code = PS2_KEY_Europe2 |
| }, |
| |
| /* App */ |
| [HID_KEY_Context] = { |
| .xtCode = XT_KEY(E0, Context), |
| .atCode = AT_KEY(E0, Context), |
| .ps2Code = PS2_KEY_Context |
| }, |
| |
| /* Keyboard Power */ |
| [HID_KEY_Power] = { |
| .xtCode = XT_KEY(E0, Power), |
| .atCode = AT_KEY(E0, Power), |
| .ps2Code = 0X00 |
| }, |
| |
| /* Keypad = */ |
| [HID_KEY_KPEqual] = { |
| .xtCode = XT_KEY(00, KPEqual), |
| .atCode = AT_KEY(00, KPEqual), |
| .ps2Code = 0X00 |
| }, |
| |
| /* F13 */ |
| [HID_KEY_F13] = { |
| .xtCode = XT_KEY(00, F13), |
| .atCode = AT_KEY(00, F13), |
| .ps2Code = 0X00 |
| }, |
| |
| /* F14 */ |
| [HID_KEY_F14] = { |
| .xtCode = XT_KEY(00, F14), |
| .atCode = AT_KEY(00, F14), |
| .ps2Code = 0X00 |
| }, |
| |
| /* F15 */ |
| [HID_KEY_F15] = { |
| .xtCode = XT_KEY(00, F15), |
| .atCode = AT_KEY(00, F15), |
| .ps2Code = 0X00 |
| }, |
| |
| /* F16 */ |
| [HID_KEY_F16] = { |
| .xtCode = XT_KEY(00, F16), |
| .atCode = AT_KEY(00, F16), |
| .ps2Code = 0X00 |
| }, |
| |
| /* F17 */ |
| [HID_KEY_F17] = { |
| .xtCode = XT_KEY(00, F17), |
| .atCode = AT_KEY(00, F17), |
| .ps2Code = 0X00 |
| }, |
| |
| /* F18 */ |
| [HID_KEY_F18] = { |
| .xtCode = XT_KEY(00, F18), |
| .atCode = AT_KEY(00, F18), |
| .ps2Code = 0X00 |
| }, |
| |
| /* F19 */ |
| [HID_KEY_F19] = { |
| .xtCode = XT_KEY(00, F19), |
| .atCode = AT_KEY(00, F19), |
| .ps2Code = 0X00 |
| }, |
| |
| /* F20 */ |
| [HID_KEY_F20] = { |
| .xtCode = XT_KEY(00, F20), |
| .atCode = AT_KEY(00, F20), |
| .ps2Code = 0X00 |
| }, |
| |
| /* F21 */ |
| [HID_KEY_F21] = { |
| .xtCode = XT_KEY(00, F21), |
| .atCode = AT_KEY(00, F21), |
| .ps2Code = 0X00 |
| }, |
| |
| /* F22 */ |
| [HID_KEY_F22] = { |
| .xtCode = XT_KEY(00, F22), |
| .atCode = AT_KEY(00, F22), |
| .ps2Code = 0X00 |
| }, |
| |
| /* F23 */ |
| [HID_KEY_F23] = { |
| .xtCode = XT_KEY(00, F23), |
| .atCode = AT_KEY(00, F23), |
| .ps2Code = 0X00 |
| }, |
| |
| /* F24 */ |
| [HID_KEY_F24] = { |
| .xtCode = XT_KEY(00, F24), |
| .atCode = AT_KEY(00, F24), |
| .ps2Code = 0X00 |
| }, |
| |
| /* Keyboard Execute */ |
| [HID_KEY_Execute] = { |
| .xtCode = 0X0000, |
| .atCode = 0X0000, |
| .ps2Code = 0X00 |
| }, |
| |
| /* Keyboard Help */ |
| [HID_KEY_Help] = { |
| .xtCode = XT_KEY(E0, Help), |
| .atCode = AT_KEY(E0, Help), |
| .ps2Code = 0X00 |
| }, |
| |
| /* Keyboard Menu */ |
| [HID_KEY_Menu] = { |
| .xtCode = 0X0000, |
| .atCode = 0X0000, |
| .ps2Code = 0X00 |
| }, |
| |
| /* Keyboard Select */ |
| [HID_KEY_Select] = { |
| .xtCode = 0X0000, |
| .atCode = 0X0000, |
| .ps2Code = 0X00 |
| }, |
| |
| /* Keyboard Stop */ |
| [HID_KEY_Stop] = { |
| .xtCode = 0X0000, |
| .atCode = 0X0000, |
| .ps2Code = 0X00 |
| }, |
| |
| /* Keyboard Again */ |
| [HID_KEY_Again] = { |
| .xtCode = 0X0000, |
| .atCode = 0X0000, |
| .ps2Code = 0X00 |
| }, |
| |
| /* Keyboard Undo */ |
| [HID_KEY_Undo] = { |
| .xtCode = XT_KEY(E0, Undo), |
| .atCode = AT_KEY(E0, Undo), |
| .ps2Code = 0X00 |
| }, |
| |
| /* Keyboard Cut */ |
| [HID_KEY_Cut] = { |
| .xtCode = XT_KEY(E0, Cut), |
| .atCode = AT_KEY(E0, Cut), |
| .ps2Code = 0X00 |
| }, |
| |
| /* Keyboard Copy */ |
| [HID_KEY_Copy] = { |
| .xtCode = XT_KEY(E0, Copy), |
| .atCode = AT_KEY(E0, Copy), |
| .ps2Code = 0X00 |
| }, |
| |
| /* Keyboard Paste */ |
| [HID_KEY_Paste] = { |
| .xtCode = XT_KEY(E0, Paste), |
| .atCode = AT_KEY(E0, Paste), |
| .ps2Code = 0X00 |
| }, |
| |
| /* Keyboard Find */ |
| [HID_KEY_Find] = { |
| .xtCode = 0X0000, |
| .atCode = 0X0000, |
| .ps2Code = 0X00 |
| }, |
| |
| /* Keyboard Mute */ |
| [HID_KEY_Mute] = { |
| .xtCode = XT_KEY(E0, Mute), |
| .atCode = AT_KEY(E0, Mute), |
| .ps2Code = 0X00 |
| }, |
| |
| /* Keyboard Volume Up */ |
| [HID_KEY_VolumeUp] = { |
| .xtCode = XT_KEY(E0, VolumeUp), |
| .atCode = AT_KEY(E0, VolumeUp), |
| .ps2Code = 0X00 |
| }, |
| |
| /* Keyboard Volume Dn */ |
| [HID_KEY_VolumeDown] = { |
| .xtCode = XT_KEY(E0, VolumeDown), |
| .atCode = AT_KEY(E0, VolumeDown), |
| .ps2Code = 0X00 |
| }, |
| |
| /* Caps Lock */ |
| [HID_KEY_CapsLocking] = { |
| .xtCode = 0X0000, |
| .atCode = 0X0000, |
| .ps2Code = 0X00 |
| }, |
| |
| /* Num Lock */ |
| [HID_KEY_NumLocking] = { |
| .xtCode = 0X0000, |
| .atCode = 0X0000, |
| .ps2Code = 0X00 |
| }, |
| |
| /* Scroll Lock */ |
| [HID_KEY_ScrollLocking] = { |
| .xtCode = 0X0000, |
| .atCode = 0X0000, |
| .ps2Code = 0X00 |
| }, |
| |
| /* Keypad , (Brazilian Keypad .) */ |
| [HID_KEY_KPComma] = { |
| .xtCode = XT_KEY(00, KPComma), |
| .atCode = AT_KEY(00, KPComma), |
| .ps2Code = PS2_KEY_KPComma |
| }, |
| |
| /* Keyboard Equal Sign */ |
| [HID_KEY_Equal_X1] = { |
| .xtCode = XT_KEY(00, Equal), |
| .atCode = AT_KEY(00, Equal), |
| .ps2Code = PS2_KEY_Equal |
| }, |
| |
| /* Keyboard Int'l 1 (Ro) */ |
| [HID_KEY_International1] = { |
| .xtCode = XT_KEY(00, International1), |
| .atCode = AT_KEY(00, International1), |
| .ps2Code = PS2_KEY_International1 |
| }, |
| |
| /* Keyboard Intl'2 (Katakana/Hiragana) */ |
| [HID_KEY_International2] = { |
| .xtCode = XT_KEY(00, International2), |
| .atCode = AT_KEY(00, International2), |
| .ps2Code = PS2_KEY_International2 |
| }, |
| |
| /* Keyboard Int'l 3 (Yen) */ |
| [HID_KEY_International3] = { |
| .xtCode = XT_KEY(00, International3), |
| .atCode = AT_KEY(00, International3), |
| .ps2Code = PS2_KEY_International3 |
| }, |
| |
| /* Keyboard Int'l 4 (Henkan) */ |
| [HID_KEY_International4] = { |
| .xtCode = XT_KEY(00, International4), |
| .atCode = AT_KEY(00, International4), |
| .ps2Code = PS2_KEY_International4 |
| }, |
| |
| /* Keyboard Int'l 5 (Muhenkan) */ |
| [HID_KEY_International5] = { |
| .xtCode = XT_KEY(00, International5), |
| .atCode = AT_KEY(00, International5), |
| .ps2Code = PS2_KEY_International5 |
| }, |
| |
| /* Keyboard Int'l 6 (PC9800 Keypad ,) */ |
| [HID_KEY_International6] = { |
| .xtCode = XT_KEY(00, International6), |
| .atCode = AT_KEY(00, International6), |
| .ps2Code = 0X00 |
| }, |
| |
| /* Keyboard Int'l 7 */ |
| [HID_KEY_International7] = { |
| .xtCode = 0X0000, |
| .atCode = 0X0000, |
| .ps2Code = 0X00 |
| }, |
| |
| /* Keyboard Int'l 8 */ |
| [HID_KEY_International8] = { |
| .xtCode = 0X0000, |
| .atCode = 0X0000, |
| .ps2Code = 0X00 |
| }, |
| |
| /* Keyboard Int'l 9 */ |
| [HID_KEY_International9] = { |
| .xtCode = 0X0000, |
| .atCode = 0X0000, |
| .ps2Code = 0X00 |
| }, |
| |
| /* Keyboard Lang 1 (Hanguel/English) */ |
| [HID_KEY_Language1] = { |
| .xtCode = XT_KEY(00, Language1), |
| .atCode = AT_KEY(00, Language1), |
| .ps2Code = 0X00 |
| }, |
| |
| /* Keyboard Lang 2 (Hanja) */ |
| [HID_KEY_Language2] = { |
| .xtCode = XT_KEY(00, Language2), |
| .atCode = AT_KEY(00, Language2), |
| .ps2Code = 0X00 |
| }, |
| |
| /* Keyboard Lang 3 (Katakana) */ |
| [HID_KEY_Language3] = { |
| .xtCode = XT_KEY(00, Language3), |
| .atCode = AT_KEY(00, Language3), |
| .ps2Code = 0X00 |
| }, |
| |
| /* Keyboard Lang 4 (Hiragana) */ |
| [HID_KEY_Language4] = { |
| .xtCode = XT_KEY(00, Language4), |
| .atCode = AT_KEY(00, Language4), |
| .ps2Code = 0X00 |
| }, |
| |
| /* Keyboard Lang 5 (Hiragana) */ |
| [HID_KEY_Language5] = { |
| .xtCode = XT_KEY(00, Language5), |
| .atCode = AT_KEY(00, Language5), |
| .ps2Code = 0X00 |
| }, |
| |
| /* Keyboard Lang 6 */ |
| [HID_KEY_Language6] = { |
| .xtCode = 0X0000, |
| .atCode = 0X0000, |
| .ps2Code = 0X00 |
| }, |
| |
| /* Keyboard Lang 7 */ |
| [HID_KEY_Language7] = { |
| .xtCode = 0X0000, |
| .atCode = 0X0000, |
| .ps2Code = 0X00 |
| }, |
| |
| /* Keyboard Lang 8 */ |
| [HID_KEY_Language8] = { |
| .xtCode = 0X0000, |
| .atCode = 0X0000, |
| .ps2Code = 0X00 |
| }, |
| |
| /* Keyboard Lang 9 */ |
| [HID_KEY_Language9] = { |
| .xtCode = 0X0000, |
| .atCode = 0X0000, |
| .ps2Code = 0X00 |
| }, |
| |
| /* Keyboard Alternate Erase */ |
| [HID_KEY_AlternateErase] = { |
| .xtCode = 0X0000, |
| .atCode = 0X0000, |
| .ps2Code = 0X00 |
| }, |
| |
| /* Keyboard SysReq/Attention */ |
| [HID_KEY_SystemReequest] = { |
| .xtCode = XT_KEY(00, SystemRequest), |
| .atCode = AT_KEY(00, SystemRequest), |
| .ps2Code = 0X00 |
| }, |
| |
| /* Keyboard Cancel */ |
| [HID_KEY_Cancel] = { |
| .xtCode = 0X0000, |
| .atCode = 0X0000, |
| .ps2Code = 0X00 |
| }, |
| |
| /* Keyboard Clear */ |
| [HID_KEY_Clear] = { |
| .xtCode = 0X0000, |
| .atCode = 0X0000, |
| .ps2Code = 0X00 |
| }, |
| |
| /* Keyboard Prior */ |
| [HID_KEY_Prior] = { |
| .xtCode = 0X0000, |
| .atCode = 0X0000, |
| .ps2Code = 0X00 |
| }, |
| |
| /* Keyboard Return */ |
| [HID_KEY_Return] = { |
| .xtCode = 0X0000, |
| .atCode = 0X0000, |
| .ps2Code = 0X00 |
| }, |
| |
| /* Keyboard Separator */ |
| [HID_KEY_Separator] = { |
| .xtCode = 0X0000, |
| .atCode = 0X0000, |
| .ps2Code = 0X00 |
| }, |
| |
| /* Keyboard Out */ |
| [HID_KEY_Out] = { |
| .xtCode = 0X0000, |
| .atCode = 0X0000, |
| .ps2Code = 0X00 |
| }, |
| |
| /* Keyboard Oper */ |
| [HID_KEY_Oper] = { |
| .xtCode = 0X0000, |
| .atCode = 0X0000, |
| .ps2Code = 0X00 |
| }, |
| |
| /* Keyboard Clear/Again */ |
| [HID_KEY_ClearAgain] = { |
| .xtCode = 0X0000, |
| .atCode = 0X0000, |
| .ps2Code = 0X00 |
| }, |
| |
| /* Keyboard CrSel/Props */ |
| [HID_KEY_CrSel] = { |
| .xtCode = XT_KEY(00, CrSel), |
| .atCode = AT_KEY(00, CrSel), |
| .ps2Code = PS2_KEY_CrSel |
| }, |
| |
| /* Keyboard ExSel */ |
| [HID_KEY_ExSel] = { |
| .xtCode = XT_KEY(00, ExSel), |
| .atCode = AT_KEY(00, ExSel), |
| .ps2Code = PS2_KEY_ExSel |
| }, |
| |
| /* xxx */ |
| [HID_KEY_KP00] = { |
| .xtCode = 0X0000, |
| .atCode = 0X0000, |
| .ps2Code = 0X00 |
| }, |
| |
| /* xxx */ |
| [HID_KEY_KP000] = { |
| .xtCode = 0X0000, |
| .atCode = 0X0000, |
| .ps2Code = 0X00 |
| }, |
| |
| /* xxx */ |
| [HID_KEY_KPThousandsSeparator] = { |
| .xtCode = 0X0000, |
| .atCode = 0X0000, |
| .ps2Code = 0X00 |
| }, |
| |
| /* xxx */ |
| [HID_KEY_KPDecimalSeparator] = { |
| .xtCode = 0X0000, |
| .atCode = 0X0000, |
| .ps2Code = 0X00 |
| }, |
| |
| /* xxx */ |
| [HID_KEY_KPCurrencyUnit] = { |
| .xtCode = 0X0000, |
| .atCode = 0X0000, |
| .ps2Code = 0X00 |
| }, |
| |
| /* xxx */ |
| [HID_KEY_KPCurrencySubunit] = { |
| .xtCode = 0X0000, |
| .atCode = 0X0000, |
| .ps2Code = 0X00 |
| }, |
| |
| /* xxx */ |
| [HID_KEY_KPLeftParenthesis] = { |
| .xtCode = 0X0000, |
| .atCode = 0X0000, |
| .ps2Code = 0X00 |
| }, |
| |
| /* xxx */ |
| [HID_KEY_KPRightParenthesis] = { |
| .xtCode = 0X0000, |
| .atCode = 0X0000, |
| .ps2Code = 0X00 |
| }, |
| |
| /* xxx */ |
| [HID_KEY_KPLeftBrace] = { |
| .xtCode = 0X0000, |
| .atCode = 0X0000, |
| .ps2Code = 0X00 |
| }, |
| |
| /* xxx */ |
| [HID_KEY_KPRightBrace] = { |
| .xtCode = 0X0000, |
| .atCode = 0X0000, |
| .ps2Code = 0X00 |
| }, |
| |
| /* xxx */ |
| [HID_KEY_KPTab] = { |
| .xtCode = 0X0000, |
| .atCode = 0X0000, |
| .ps2Code = 0X00 |
| }, |
| |
| /* xxx */ |
| [HID_KEY_KPBackspace] = { |
| .xtCode = 0X0000, |
| .atCode = 0X0000, |
| .ps2Code = 0X00 |
| }, |
| |
| /* xxx */ |
| [HID_KEY_KPA] = { |
| .xtCode = 0X0000, |
| .atCode = 0X0000, |
| .ps2Code = 0X00 |
| }, |
| |
| /* xxx */ |
| [HID_KEY_KPB] = { |
| .xtCode = 0X0000, |
| .atCode = 0X0000, |
| .ps2Code = 0X00 |
| }, |
| |
| /* xxx */ |
| [HID_KEY_KPC] = { |
| .xtCode = 0X0000, |
| .atCode = 0X0000, |
| .ps2Code = 0X00 |
| }, |
| |
| /* xxx */ |
| [HID_KEY_KPD] = { |
| .xtCode = 0X0000, |
| .atCode = 0X0000, |
| .ps2Code = 0X00 |
| }, |
| |
| /* xxx */ |
| [HID_KEY_KPE] = { |
| .xtCode = 0X0000, |
| .atCode = 0X0000, |
| .ps2Code = 0X00 |
| }, |
| |
| /* xxx */ |
| [HID_KEY_KPF] = { |
| .xtCode = 0X0000, |
| .atCode = 0X0000, |
| .ps2Code = 0X00 |
| }, |
| |
| /* xxx */ |
| [HID_KEY_KPBitwiseXor] = { |
| .xtCode = 0X0000, |
| .atCode = 0X0000, |
| .ps2Code = 0X00 |
| }, |
| |
| /* xxx */ |
| [HID_KEY_KPExponentiate] = { |
| .xtCode = 0X0000, |
| .atCode = 0X0000, |
| .ps2Code = 0X00 |
| }, |
| |
| /* xxx */ |
| [HID_KEY_KPmodulo] = { |
| .xtCode = 0X0000, |
| .atCode = 0X0000, |
| .ps2Code = 0X00 |
| }, |
| |
| /* xxx */ |
| [HID_KEY_KPLess] = { |
| .xtCode = 0X0000, |
| .atCode = 0X0000, |
| .ps2Code = 0X00 |
| }, |
| |
| /* xxx */ |
| [HID_KEY_KPGreater] = { |
| .xtCode = 0X0000, |
| .atCode = 0X0000, |
| .ps2Code = 0X00 |
| }, |
| |
| /* xxx */ |
| [HID_KEY_KPBitwiseAnd] = { |
| .xtCode = 0X0000, |
| .atCode = 0X0000, |
| .ps2Code = 0X00 |
| }, |
| |
| /* xxx */ |
| [HID_KEY_KPBooleanAnd] = { |
| .xtCode = 0X0000, |
| .atCode = 0X0000, |
| .ps2Code = 0X00 |
| }, |
| |
| /* xxx */ |
| [HID_KEY_KPBitwiseOr] = { |
| .xtCode = 0X0000, |
| .atCode = 0X0000, |
| .ps2Code = 0X00 |
| }, |
| |
| /* xxx */ |
| [HID_KEY_KPBooleanOr] = { |
| .xtCode = 0X0000, |
| .atCode = 0X0000, |
| .ps2Code = 0X00 |
| }, |
| |
| /* xxx */ |
| [HID_KEY_KPColon] = { |
| .xtCode = 0X0000, |
| .atCode = 0X0000, |
| .ps2Code = 0X00 |
| }, |
| |
| /* xxx */ |
| [HID_KEY_KPNumber] = { |
| .xtCode = 0X0000, |
| .atCode = 0X0000, |
| .ps2Code = 0X00 |
| }, |
| |
| /* xxx */ |
| [HID_KEY_KPSpace] = { |
| .xtCode = 0X0000, |
| .atCode = 0X0000, |
| .ps2Code = 0X00 |
| }, |
| |
| /* xxx */ |
| [HID_KEY_KPAt] = { |
| .xtCode = 0X0000, |
| .atCode = 0X0000, |
| .ps2Code = 0X00 |
| }, |
| |
| /* xxx */ |
| [HID_KEY_KPBooleanNot] = { |
| .xtCode = 0X0000, |
| .atCode = 0X0000, |
| .ps2Code = 0X00 |
| }, |
| |
| /* xxx */ |
| [HID_KEY_KPMemoryStore] = { |
| .xtCode = 0X0000, |
| .atCode = 0X0000, |
| .ps2Code = 0X00 |
| }, |
| |
| /* xxx */ |
| [HID_KEY_KPMemoryRecall] = { |
| .xtCode = 0X0000, |
| .atCode = 0X0000, |
| .ps2Code = 0X00 |
| }, |
| |
| /* xxx */ |
| [HID_KEY_KPMemoryClear] = { |
| .xtCode = 0X0000, |
| .atCode = 0X0000, |
| .ps2Code = 0X00 |
| }, |
| |
| /* xxx */ |
| [HID_KEY_KPMemoryAdd] = { |
| .xtCode = 0X0000, |
| .atCode = 0X0000, |
| .ps2Code = 0X00 |
| }, |
| |
| /* xxx */ |
| [HID_KEY_KPMemorySubtract] = { |
| .xtCode = 0X0000, |
| .atCode = 0X0000, |
| .ps2Code = 0X00 |
| }, |
| |
| /* xxx */ |
| [HID_KEY_KPMemoryMultiply] = { |
| .xtCode = 0X0000, |
| .atCode = 0X0000, |
| .ps2Code = 0X00 |
| }, |
| |
| /* xxx */ |
| [HID_KEY_KPMemoryDivide] = { |
| .xtCode = 0X0000, |
| .atCode = 0X0000, |
| .ps2Code = 0X00 |
| }, |
| |
| /* xxx */ |
| [HID_KEY_KPPlusMinus] = { |
| .xtCode = 0X0000, |
| .atCode = 0X0000, |
| .ps2Code = 0X00 |
| }, |
| |
| /* xxx */ |
| [HID_KEY_KPClear] = { |
| .xtCode = 0X0000, |
| .atCode = 0X0000, |
| .ps2Code = 0X00 |
| }, |
| |
| /* xxx */ |
| [HID_KEY_KPClearEntry] = { |
| .xtCode = 0X0000, |
| .atCode = 0X0000, |
| .ps2Code = 0X00 |
| }, |
| |
| /* xxx */ |
| [HID_KEY_KPBinary] = { |
| .xtCode = 0X0000, |
| .atCode = 0X0000, |
| .ps2Code = 0X00 |
| }, |
| |
| /* xxx */ |
| [HID_KEY_KPOctal] = { |
| .xtCode = 0X0000, |
| .atCode = 0X0000, |
| .ps2Code = 0X00 |
| }, |
| |
| /* xxx */ |
| [HID_KEY_KPDecimal] = { |
| .xtCode = 0X0000, |
| .atCode = 0X0000, |
| .ps2Code = 0X00 |
| }, |
| |
| /* xxx */ |
| [HID_KEY_KPHexadecimal] = { |
| .xtCode = 0X0000, |
| .atCode = 0X0000, |
| .ps2Code = 0X00 |
| }, |
| |
| /* Left Control */ |
| [HID_KEY_LeftControl] = { |
| .xtCode = XT_KEY(00, LeftControl), |
| .atCode = AT_KEY(00, LeftControl), |
| .ps2Code = PS2_KEY_LeftControl |
| }, |
| |
| /* Left Shift */ |
| [HID_KEY_LeftShift] = { |
| .xtCode = XT_KEY(00, LeftShift), |
| .atCode = AT_KEY(00, LeftShift), |
| .ps2Code = PS2_KEY_LeftShift |
| }, |
| |
| /* Left Alt */ |
| [HID_KEY_LeftAlt] = { |
| .xtCode = XT_KEY(00, LeftAlt), |
| .atCode = AT_KEY(00, LeftAlt), |
| .ps2Code = PS2_KEY_LeftAlt |
| }, |
| |
| /* Left GUI */ |
| [HID_KEY_LeftGUI] = { |
| .xtCode = XT_KEY(E0, LeftGUI), |
| .atCode = AT_KEY(E0, LeftGUI), |
| .ps2Code = PS2_KEY_LeftGUI |
| }, |
| |
| /* Right Control */ |
| [HID_KEY_RightControl] = { |
| .xtCode = XT_KEY(E0, RightControl), |
| .atCode = AT_KEY(E0, RightControl), |
| .ps2Code = PS2_KEY_RightControl |
| }, |
| |
| /* Right Shift */ |
| [HID_KEY_RightShift] = { |
| .xtCode = XT_KEY(00, RightShift), |
| .atCode = AT_KEY(00, RightShift), |
| .ps2Code = PS2_KEY_RightShift |
| }, |
| |
| /* Right Alt */ |
| [HID_KEY_RightAlt] = { |
| .xtCode = XT_KEY(E0, RightAlt), |
| .atCode = AT_KEY(E0, RightAlt), |
| .ps2Code = PS2_KEY_RightAlt |
| }, |
| |
| /* Right GUI */ |
| [HID_KEY_RightGUI] = { |
| .xtCode = XT_KEY(E0, RightGUI), |
| .atCode = AT_KEY(E0, RightGUI), |
| .ps2Code = PS2_KEY_RightGUI |
| }, |
| }; |
| |
| static int |
| enqueueXtCode (uint8_t code) { |
| return enqueueCommand(BRL_CMD_BLK(PASSXT) | code); |
| } |
| |
| static int |
| enqueueHidKeyEvent (unsigned char key, int press) { |
| if (key < ARRAY_COUNT(hidKeyTable)) { |
| uint16_t code = hidKeyTable[key].xtCode; |
| |
| if (code) { |
| { |
| uint8_t escape = (code >> 8) & 0XFF; |
| |
| if (escape) |
| if (!enqueueXtCode(escape)) |
| return 0; |
| } |
| |
| code &= 0XFF; |
| |
| if (!press) { |
| if (code & 0X80) return 1; |
| code |= 0X80; |
| } |
| |
| if (!enqueueXtCode(code)) return 0; |
| } |
| } |
| |
| return 1; |
| } |
| |
| static unsigned char |
| getPressedKeys (const HidKeyboardPacket *packet, unsigned char *keys) { |
| unsigned char count = 0; |
| |
| { |
| static const unsigned char modifiers[] = { |
| HID_KEY_LeftControl, |
| HID_KEY_LeftShift, |
| HID_KEY_LeftAlt, |
| HID_KEY_LeftGUI, |
| HID_KEY_RightControl, |
| HID_KEY_RightShift, |
| HID_KEY_RightAlt, |
| HID_KEY_RightGUI, |
| }; |
| |
| const unsigned char *modifier = modifiers; |
| uint8_t bit = 0X1; |
| |
| while (bit) { |
| if (packet->modifiers & bit) keys[count++] = *modifier; |
| modifier += 1; |
| bit <<= 1; |
| } |
| } |
| |
| { |
| int index; |
| |
| for (index=0; index<6; index+=1) { |
| unsigned char key = packet->keys[index]; |
| if (!key) break; |
| keys[count++] = key; |
| } |
| } |
| |
| return count; |
| } |
| |
| void |
| initializeHidKeyboardPacket (HidKeyboardPacket *packet) { |
| memset(packet, 0, sizeof(*packet)); |
| } |
| |
| void |
| processHidKeyboardPacket ( |
| HidKeyboardPacket *oldPacket, |
| const HidKeyboardPacket *newPacket |
| ) { |
| unsigned char oldKeys[14]; |
| unsigned char oldCount = getPressedKeys(oldPacket, oldKeys); |
| |
| unsigned char newKeys[14]; |
| unsigned char newCount = getPressedKeys(newPacket, newKeys); |
| |
| BITMASK(pressedKeys, 0X100, char); |
| unsigned char index; |
| |
| BITMASK_ZERO(pressedKeys); |
| |
| for (index=0; index<newCount; index+=1) { |
| unsigned char key = newKeys[index]; |
| |
| BITMASK_SET(pressedKeys, key); |
| } |
| |
| for (index=0; index<oldCount; index+=1) { |
| unsigned char key = oldKeys[index]; |
| |
| if (BITMASK_TEST(pressedKeys, key)) { |
| BITMASK_CLEAR(pressedKeys, key); |
| } else { |
| enqueueHidKeyEvent(key, 0); |
| } |
| } |
| |
| for (index=0; index<newCount; index+=1) { |
| unsigned char key = newKeys[index]; |
| |
| if (BITMASK_TEST(pressedKeys, key)) { |
| enqueueHidKeyEvent(key, 1); |
| } |
| } |
| |
| *oldPacket = *newPacket; |
| } |