mirror of
https://github.com/morgan9e/FreeRDP
synced 2026-04-15 00:44:19 +09:00
libwinpr-input: map most evdev keycodes
This commit is contained in:
@@ -28,6 +28,7 @@
|
||||
#include <string.h>
|
||||
|
||||
#include <winpr/crt.h>
|
||||
#include <winpr/input.h>
|
||||
|
||||
#include <freerdp/locale/keyboard.h>
|
||||
|
||||
@@ -202,6 +203,30 @@ UINT32 freerdp_keyboard_init_xkbfile(UINT32 keyboardLayoutId, RDP_SCANCODE x11_k
|
||||
|
||||
freerdp_keyboard_load_map_from_xkbfile(display, x11_keycode_to_rdp_scancode);
|
||||
|
||||
#if 1
|
||||
//ZeroMemory(x11_keycode_to_rdp_scancode, sizeof(RDP_SCANCODE) * 256);
|
||||
|
||||
{
|
||||
DWORD keycode;
|
||||
DWORD vkcode;
|
||||
DWORD scancode;
|
||||
|
||||
for (keycode = 0; keycode < 256; keycode++)
|
||||
{
|
||||
vkcode = GetVirtualKeyCodeFromKeycode(keycode, KEYCODE_TYPE_EVDEV);
|
||||
scancode = GetVirtualScanCodeFromVirtualKeyCode(vkcode, 4);
|
||||
|
||||
if (x11_keycode_to_rdp_scancode[keycode] != scancode)
|
||||
{
|
||||
printf("mismatch keycode 0x%04X (%d) -> vkcode 0x%04X (%s) -> scancode 0x%04X, expected: 0x%04X\n",
|
||||
keycode, keycode, vkcode, GetVirtualKeyName(vkcode & 0xFF), scancode, x11_keycode_to_rdp_scancode[keycode]);
|
||||
}
|
||||
|
||||
x11_keycode_to_rdp_scancode[keycode] = scancode;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
XCloseDisplay(display);
|
||||
|
||||
return keyboardLayoutId;
|
||||
|
||||
@@ -420,19 +420,19 @@
|
||||
#define KBD4_T44 VK_F10
|
||||
#define KBD4_T45 VK_NUMLOCK
|
||||
#define KBD4_T46 VK_SCROLL
|
||||
#define KBD4_T47 VK_HOME
|
||||
#define KBD4_T48 VK_UP
|
||||
#define KBD4_T49 VK_PRIOR
|
||||
#define KBD4_T47 VK_NUMPAD7 /* VK_HOME */
|
||||
#define KBD4_T48 VK_NUMPAD8 /* VK_UP */
|
||||
#define KBD4_T49 VK_NUMPAD9 /* VK_PRIOR */
|
||||
#define KBD4_T4A VK_SUBTRACT
|
||||
#define KBD4_T4B VK_LEFT
|
||||
#define KBD4_T4C VK_CLEAR
|
||||
#define KBD4_T4D VK_RIGHT
|
||||
#define KBD4_T4B VK_NUMPAD4 /* VK_LEFT */
|
||||
#define KBD4_T4C VK_NUMPAD5 /* VK_CLEAR */
|
||||
#define KBD4_T4D VK_NUMPAD6 /* VK_RIGHT */
|
||||
#define KBD4_T4E VK_ADD
|
||||
#define KBD4_T4F VK_END
|
||||
#define KBD4_T50 VK_DOWN
|
||||
#define KBD4_T51 VK_NEXT
|
||||
#define KBD4_T52 VK_INSERT
|
||||
#define KBD4_T53 VK_DELETE
|
||||
#define KBD4_T4F VK_NUMPAD1 /* VK_END */
|
||||
#define KBD4_T50 VK_NUMPAD2 /* VK_DOWN */
|
||||
#define KBD4_T51 VK_NUMPAD3 /* VK_NEXT */
|
||||
#define KBD4_T52 VK_NUMPAD0 /* VK_INSERT */
|
||||
#define KBD4_T53 VK_DECIMAL /* VK_DELETE */
|
||||
#define KBD4_T54 VK_SNAPSHOT
|
||||
#define KBD4_T55 VK_NONE
|
||||
#define KBD4_T56 VK_OEM_102 /* NE */
|
||||
@@ -492,7 +492,7 @@
|
||||
#define KBD4_X35 VK_DIVIDE
|
||||
#define KBD4_X37 VK_SNAPSHOT
|
||||
#define KBD4_X38 VK_RMENU
|
||||
#define KBD4_X46 VK_CANCEL
|
||||
#define KBD4_X46 VK_PAUSE /* VK_CANCEL */
|
||||
#define KBD4_X47 VK_HOME
|
||||
#define KBD4_X48 VK_UP
|
||||
#define KBD4_X49 VK_PRIOR
|
||||
@@ -848,6 +848,7 @@ WINPR_API DWORD GetVirtualKeyCodeFromVirtualScanCode(DWORD scancode, DWORD dwKey
|
||||
WINPR_API DWORD GetVirtualScanCodeFromVirtualKeyCode(DWORD vkcode, DWORD dwKeyboardType);
|
||||
|
||||
#define KEYCODE_TYPE_APPLE 0x00000001
|
||||
#define KEYCODE_TYPE_EVDEV 0x00000002
|
||||
|
||||
WINPR_API DWORD GetVirtualKeyCodeFromKeycode(DWORD keycode, DWORD dwFlags);
|
||||
|
||||
|
||||
@@ -300,6 +300,8 @@ DWORD KEYCODE_TO_VKCODE_APPLE[256] =
|
||||
* http://www.freedesktop.org/wiki/Software/XKeyboardConfig
|
||||
*/
|
||||
|
||||
/* TODO: Finish Japanese Keyboard */
|
||||
|
||||
DWORD KEYCODE_TO_VKCODE_EVDEV[256] =
|
||||
{
|
||||
0, /* 0 */
|
||||
@@ -311,117 +313,117 @@ DWORD KEYCODE_TO_VKCODE_EVDEV[256] =
|
||||
0, /* 6 */
|
||||
0, /* 7 */
|
||||
0, /* 8 */
|
||||
0, /* <ESC> 9 */
|
||||
0, /* <AE01> 10 */
|
||||
0, /* <AE02> 11 */
|
||||
0, /* <AE03> 12 */
|
||||
0, /* <AE04> 13 */
|
||||
0, /* <AE05> 14 */
|
||||
0, /* <AE06> 15 */
|
||||
0, /* <AE07> 16 */
|
||||
0, /* <AE08> 17 */
|
||||
0, /* <AE09> 18 */
|
||||
0, /* <AE10> 19 */
|
||||
0, /* <AE11> 20 */
|
||||
0, /* <AE12> 21 */
|
||||
0, /* <BKSP> 22 */
|
||||
0, /* <TAB> 23 */
|
||||
0, /* <AD01> 24 */
|
||||
0, /* <AD02> 25 */
|
||||
0, /* <AD03> 26 */
|
||||
0, /* <AD04> 27 */
|
||||
0, /* <AD05> 28 */
|
||||
0, /* <AD06> 29 */
|
||||
0, /* <AD07> 30 */
|
||||
0, /* <AD08> 31 */
|
||||
0, /* <AD09> 32 */
|
||||
0, /* <AD10> 33 */
|
||||
0, /* <AD11> 34 */
|
||||
0, /* <AD12> 35 */
|
||||
0, /* <RTRN> 36 */
|
||||
0, /* <LCTL> 37 */
|
||||
0, /* <AC01> 38 */
|
||||
0, /* <AC02> 39 */
|
||||
0, /* <AC03> 40 */
|
||||
0, /* <AC04> 41 */
|
||||
0, /* <AC05> 42 */
|
||||
0, /* <AC06> 43 */
|
||||
0, /* <AC07> 44 */
|
||||
0, /* <AC08> 45 */
|
||||
0, /* <AC09> 46 */
|
||||
0, /* <AC10> 47 */
|
||||
0, /* <AC11> 48 */
|
||||
0, /* <TLDE> 49 */
|
||||
0, /* <LFSH> 50 */
|
||||
0, /* <BKSL> <AC12> 51 */
|
||||
0, /* <AB01> 52 */
|
||||
0, /* <AB02> 53 */
|
||||
0, /* <AB03> 54 */
|
||||
0, /* <AB04> 55 */
|
||||
0, /* <AB05> 56 */
|
||||
0, /* <AB06> 57 */
|
||||
0, /* <AB07> 58 */
|
||||
0, /* <AB08> 59 */
|
||||
0, /* <AB09> 60 */
|
||||
0, /* <AB10> 61 */
|
||||
0, /* <RTSH> 62 */
|
||||
0, /* <KPMU> 63 */
|
||||
0, /* <LALT> 64 */
|
||||
0, /* <SPCE> 65 */
|
||||
0, /* <CAPS> 66 */
|
||||
0, /* <FK01> 67 */
|
||||
0, /* <FK02> 68 */
|
||||
0, /* <FK03> 69 */
|
||||
0, /* <FK04> 70 */
|
||||
0, /* <FK05> 71 */
|
||||
0, /* <FK06> 72 */
|
||||
0, /* <FK07> 73 */
|
||||
0, /* <FK08> 74 */
|
||||
0, /* <FK09> 75 */
|
||||
0, /* <FK10> 76 */
|
||||
0, /* <NMLK> 77 */
|
||||
0, /* <SCLK> 78 */
|
||||
0, /* <KP7> 79 */
|
||||
0, /* <KP8> 80 */
|
||||
0, /* <KP9> 81 */
|
||||
0, /* <KPSU> 82 */
|
||||
0, /* <KP4> 83 */
|
||||
0, /* <KP5> 84 */
|
||||
0, /* <KP6> 85 */
|
||||
0, /* <KPAD> 86 */
|
||||
0, /* <KP1> 87 */
|
||||
0, /* <KP2> 88 */
|
||||
0, /* <KP3> 89 */
|
||||
0, /* <KP0> 90 */
|
||||
0, /* <KPDL> 91 */
|
||||
VK_ESCAPE, /* <ESC> 9 */
|
||||
VK_KEY_1, /* <AE01> 10 */
|
||||
VK_KEY_2, /* <AE02> 11 */
|
||||
VK_KEY_3, /* <AE03> 12 */
|
||||
VK_KEY_4, /* <AE04> 13 */
|
||||
VK_KEY_5, /* <AE05> 14 */
|
||||
VK_KEY_6, /* <AE06> 15 */
|
||||
VK_KEY_7, /* <AE07> 16 */
|
||||
VK_KEY_8, /* <AE08> 17 */
|
||||
VK_KEY_9, /* <AE09> 18 */
|
||||
VK_KEY_0, /* <AE10> 19 */
|
||||
VK_OEM_MINUS, /* <AE11> 20 */
|
||||
VK_OEM_PLUS, /* <AE12> 21 */
|
||||
VK_BACK, /* <BKSP> 22 */
|
||||
VK_TAB, /* <TAB> 23 */
|
||||
VK_KEY_Q, /* <AD01> 24 */
|
||||
VK_KEY_W, /* <AD02> 25 */
|
||||
VK_KEY_E, /* <AD03> 26 */
|
||||
VK_KEY_R, /* <AD04> 27 */
|
||||
VK_KEY_T, /* <AD05> 28 */
|
||||
VK_KEY_Y, /* <AD06> 29 */
|
||||
VK_KEY_U, /* <AD07> 30 */
|
||||
VK_KEY_I, /* <AD08> 31 */
|
||||
VK_KEY_O, /* <AD09> 32 */
|
||||
VK_KEY_P, /* <AD10> 33 */
|
||||
VK_OEM_4, /* <AD11> 34 */
|
||||
VK_OEM_6, /* <AD12> 35 */
|
||||
VK_RETURN, /* <RTRN> 36 */
|
||||
VK_LCONTROL, /* <LCTL> 37 */
|
||||
VK_KEY_A, /* <AC01> 38 */
|
||||
VK_KEY_S, /* <AC02> 39 */
|
||||
VK_KEY_D, /* <AC03> 40 */
|
||||
VK_KEY_F, /* <AC04> 41 */
|
||||
VK_KEY_G, /* <AC05> 42 */
|
||||
VK_KEY_H, /* <AC06> 43 */
|
||||
VK_KEY_J, /* <AC07> 44 */
|
||||
VK_KEY_K, /* <AC08> 45 */
|
||||
VK_KEY_L, /* <AC09> 46 */
|
||||
VK_OEM_1, /* <AC10> 47 */
|
||||
VK_OEM_7, /* <AC11> 48 */
|
||||
VK_OEM_3, /* <TLDE> 49 */
|
||||
VK_LSHIFT, /* <LFSH> 50 */
|
||||
VK_OEM_5, /* <BKSL> <AC12> 51 */
|
||||
VK_KEY_Z, /* <AB01> 52 */
|
||||
VK_KEY_X, /* <AB02> 53 */
|
||||
VK_KEY_C, /* <AB03> 54 */
|
||||
VK_KEY_V, /* <AB04> 55 */
|
||||
VK_KEY_B, /* <AB05> 56 */
|
||||
VK_KEY_N, /* <AB06> 57 */
|
||||
VK_KEY_M, /* <AB07> 58 */
|
||||
VK_OEM_COMMA, /* <AB08> 59 */
|
||||
VK_OEM_PERIOD, /* <AB09> 60 */
|
||||
VK_OEM_2, /* <AB10> 61 */
|
||||
VK_RSHIFT, /* <RTSH> 62 */
|
||||
VK_MULTIPLY, /* <KPMU> 63 */
|
||||
VK_LMENU, /* <LALT> 64 */
|
||||
VK_SPACE, /* <SPCE> 65 */
|
||||
VK_CAPITAL, /* <CAPS> 66 */
|
||||
VK_F1, /* <FK01> 67 */
|
||||
VK_F2, /* <FK02> 68 */
|
||||
VK_F3, /* <FK03> 69 */
|
||||
VK_F4, /* <FK04> 70 */
|
||||
VK_F5, /* <FK05> 71 */
|
||||
VK_F6, /* <FK06> 72 */
|
||||
VK_F7, /* <FK07> 73 */
|
||||
VK_F8, /* <FK08> 74 */
|
||||
VK_F9, /* <FK09> 75 */
|
||||
VK_F10, /* <FK10> 76 */
|
||||
VK_NUMLOCK, /* <NMLK> 77 */
|
||||
VK_SCROLL, /* <SCLK> 78 */
|
||||
VK_NUMPAD7, /* <KP7> 79 */
|
||||
VK_NUMPAD8, /* <KP8> 80 */
|
||||
VK_NUMPAD9, /* <KP9> 81 */
|
||||
VK_SUBTRACT, /* <KPSU> 82 */
|
||||
VK_NUMPAD4, /* <KP4> 83 */
|
||||
VK_NUMPAD5, /* <KP5> 84 */
|
||||
VK_NUMPAD6, /* <KP6> 85 */
|
||||
VK_ADD, /* <KPAD> 86 */
|
||||
VK_NUMPAD1, /* <KP1> 87 */
|
||||
VK_NUMPAD2, /* <KP2> 88 */
|
||||
VK_NUMPAD3, /* <KP3> 89 */
|
||||
VK_NUMPAD0, /* <KP0> 90 */
|
||||
VK_DECIMAL, /* <KPDL> 91 */
|
||||
0, /* <LVL3> 92 */
|
||||
0, /* 93 */
|
||||
0, /* <LSGT> 94 */
|
||||
0, /* <FK11> 95 */
|
||||
0, /* <FK12> 96 */
|
||||
0, /* <AB11> 97 */
|
||||
VK_OEM_102, /* <LSGT> 94 */
|
||||
VK_F11, /* <FK11> 95 */
|
||||
VK_F12, /* <FK12> 96 */
|
||||
VK_ABNT_C1, /* <AB11> 97 */
|
||||
0, /* <KATA> 98 */
|
||||
0, /* <HIRA> 99 */
|
||||
0, /* <HENK> 100 */
|
||||
0, /* <HKTG> 101 */
|
||||
0, /* <MUHE> 102 */
|
||||
0, /* <JPCM> 103 */
|
||||
0, /* <KPEN> 104 */
|
||||
0, /* <RCTL> 105 */
|
||||
0, /* <KPDV> 106 */
|
||||
0, /* <PRSC> 107 */
|
||||
0, /* <RALT> <ALGR> 108 */
|
||||
VK_RETURN | KBDEXT, /* <KPEN> 104 */
|
||||
VK_RCONTROL | KBDEXT, /* <RCTL> 105 */
|
||||
VK_DIVIDE | KBDEXT, /* <KPDV> 106 */
|
||||
VK_SNAPSHOT | KBDEXT, /* <PRSC> 107 */
|
||||
VK_RMENU | KBDEXT, /* <RALT> <ALGR> 108 */
|
||||
0, /* <LNFD> KEY_LINEFEED 109 */
|
||||
0, /* <HOME> 110 */
|
||||
0, /* <UP> 111 */
|
||||
0, /* <PGUP> 112 */
|
||||
0, /* <LEFT> 113 */
|
||||
0, /* <RGHT> 114 */
|
||||
0, /* <END> 115 */
|
||||
0, /* <DOWN> 116 */
|
||||
0, /* <PGDN> 117 */
|
||||
0, /* <INS> 118 */
|
||||
0, /* <DELE> 119 */
|
||||
VK_HOME | KBDEXT, /* <HOME> 110 */
|
||||
VK_UP | KBDEXT, /* <UP> 111 */
|
||||
VK_PRIOR | KBDEXT, /* <PGUP> 112 */
|
||||
VK_LEFT | KBDEXT, /* <LEFT> 113 */
|
||||
VK_RIGHT | KBDEXT, /* <RGHT> 114 */
|
||||
VK_END | KBDEXT, /* <END> 115 */
|
||||
VK_DOWN | KBDEXT, /* <DOWN> 116 */
|
||||
VK_NEXT | KBDEXT, /* <PGDN> 117 */
|
||||
VK_INSERT | KBDEXT, /* <INS> 118 */
|
||||
VK_DELETE | KBDEXT, /* <DELE> 119 */
|
||||
0, /* <I120> KEY_MACRO 120 */
|
||||
0, /* <MUTE> 121 */
|
||||
0, /* <VOL-> 122 */
|
||||
@@ -429,15 +431,15 @@ DWORD KEYCODE_TO_VKCODE_EVDEV[256] =
|
||||
0, /* <POWR> 124 */
|
||||
0, /* <KPEQ> 125 */
|
||||
0, /* <I126> KEY_KPPLUSMINUS 126 */
|
||||
0, /* <PAUS> 127 */
|
||||
VK_PAUSE | KBDEXT, /* <PAUS> 127 */
|
||||
0, /* <I128> KEY_SCALE 128 */
|
||||
0, /* <I129> <KPPT> KEY_KPCOMMA 129 */
|
||||
VK_ABNT_C2, /* <I129> <KPPT> KEY_KPCOMMA 129 */
|
||||
0, /* <HNGL> 130 */
|
||||
0, /* <HJCV> 131 */
|
||||
0, /* <AE13> 132 */
|
||||
0, /* <LWIN> <LMTA> 133 */
|
||||
0, /* <RWIN> <RMTA> 134 */
|
||||
0, /* <COMP> <MENU> 135 */
|
||||
VK_LWIN | KBDEXT, /* <LWIN> <LMTA> 133 */
|
||||
VK_RWIN | KBDEXT, /* <RWIN> <RMTA> 134 */
|
||||
VK_APPS | KBDEXT, /* <COMP> <MENU> 135 */
|
||||
0, /* <STOP> 136 */
|
||||
0, /* <AGAI> 137 */
|
||||
0, /* <PROP> 138 */
|
||||
@@ -571,6 +573,11 @@ DWORD GetVirtualKeyCodeFromKeycode(DWORD keycode, DWORD dwFlags)
|
||||
if (keycode < 0xFF)
|
||||
vkcode = KEYCODE_TO_VKCODE_APPLE[keycode & 0xFF];
|
||||
}
|
||||
else if (dwFlags & KEYCODE_TYPE_EVDEV)
|
||||
{
|
||||
if (keycode < 0xFF)
|
||||
vkcode = KEYCODE_TO_VKCODE_EVDEV[keycode & 0xFF];
|
||||
}
|
||||
|
||||
if (!vkcode)
|
||||
vkcode = VK_NONE;
|
||||
|
||||
@@ -294,7 +294,7 @@ DWORD KBD4X[128] =
|
||||
VK_NONE,
|
||||
VK_NONE,
|
||||
VK_NONE,
|
||||
VK_NONE
|
||||
VK_NONE,
|
||||
};
|
||||
|
||||
/**
|
||||
@@ -576,19 +576,18 @@ DWORD GetVirtualKeyCodeFromVirtualScanCode(DWORD scancode, DWORD dwKeyboardType)
|
||||
|
||||
if (dwKeyboardType == 4)
|
||||
{
|
||||
if (scancode & KBDEXT)
|
||||
vkcode = KBD4X[scancode & 0x7F];
|
||||
else
|
||||
vkcode = KBD4T[scancode & 0x7F];
|
||||
if (vkcode < 128)
|
||||
vkcode = (scancode & KBDEXT) ? KBD4X[scancode] : KBD4T[scancode];
|
||||
}
|
||||
else if (dwKeyboardType == 7)
|
||||
{
|
||||
if (scancode & KBDEXT)
|
||||
vkcode = KBD7X[scancode & 0x7F];
|
||||
else
|
||||
vkcode = KBD7T[scancode & 0x7F];
|
||||
if (vkcode < 128)
|
||||
vkcode = (scancode & KBDEXT) ? KBD7X[scancode] : KBD7T[scancode];
|
||||
}
|
||||
|
||||
if (!vkcode)
|
||||
vkcode = VK_NONE;
|
||||
|
||||
return vkcode;
|
||||
}
|
||||
|
||||
@@ -604,20 +603,22 @@ DWORD GetVirtualScanCodeFromVirtualKeyCode(DWORD vkcode, DWORD dwKeyboardType)
|
||||
|
||||
if (dwKeyboardType == 4)
|
||||
{
|
||||
for (i = 0; i < 128; i++)
|
||||
{
|
||||
if (KBD4T[i] == vkcode)
|
||||
{
|
||||
scancode = i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (!scancode)
|
||||
if (vkcode & KBDEXT)
|
||||
{
|
||||
for (i = 0; i < 128; i++)
|
||||
{
|
||||
if (KBD4X[i] == vkcode)
|
||||
if (KBD4X[i] == (vkcode & 0xFF))
|
||||
{
|
||||
scancode = (i | KBDEXT);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
for (i = 0; i < 128; i++)
|
||||
{
|
||||
if (KBD4T[i] == (vkcode & 0xFF))
|
||||
{
|
||||
scancode = i;
|
||||
break;
|
||||
@@ -627,20 +628,22 @@ DWORD GetVirtualScanCodeFromVirtualKeyCode(DWORD vkcode, DWORD dwKeyboardType)
|
||||
}
|
||||
else if (dwKeyboardType == 7)
|
||||
{
|
||||
for (i = 0; i < 128; i++)
|
||||
{
|
||||
if (KBD7T[i] == vkcode)
|
||||
{
|
||||
scancode = i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (!scancode)
|
||||
if (vkcode & KBDEXT)
|
||||
{
|
||||
for (i = 0; i < 128; i++)
|
||||
{
|
||||
if (KBD7X[i] == vkcode)
|
||||
if (KBD7X[i] == (vkcode & 0xFF))
|
||||
{
|
||||
scancode = (i | KBDEXT);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
for (i = 0; i < 128; i++)
|
||||
{
|
||||
if (KBD7T[i] == (vkcode & 0xFF))
|
||||
{
|
||||
scancode = i;
|
||||
break;
|
||||
|
||||
Reference in New Issue
Block a user