1#include <winpr/input.h>
3static bool testKeyboardType(
enum WINPR_KBD_TYPE type, DWORD flag)
5 for (DWORD x = 0; x < 0x100; x++)
7 const DWORD vk = GetVirtualKeyCodeFromVirtualScanCode(x | flag, type);
16 const DWORD sc = GetVirtualScanCodeFromVirtualKeyCode(vk | flag, type);
19 if ((sc != 0) && (vk != VK_NONE))
21 DWORD buffer[256] = WINPR_C_ARRAY_INIT;
22 const DWORD count = GetVirtualScanCodesFromVirtualKeyCode(vk | flag, type, buffer,
26 for (DWORD i = 0; i < count; i++)
28 const DWORD cur = buffer[i];
37 printf(
"[%" PRIu32
"]: got %" PRIu32
", expected %" PRIu32, type, sc, x);
41 else if ((sc == 0) && (vk == VK_NONE))
46 printf(
"[%" PRIu32
"]: got %" PRIu32
", expected %" PRIu32, type, sc, x);
54static bool testKeyboardTypes(
enum WINPR_KBD_TYPE type)
56 if (!testKeyboardType(type, 0))
58 if (!testKeyboardType(type, KBDMULTIVK))
60 return testKeyboardType(type, KBDEXT);
65static bool testAppleModifiers(
void)
71 } modifiers[] = { { 0x36, VK_RWIN | KBDEXT }, { 0x37, VK_LWIN | KBDEXT },
72 { 0x38, VK_LSHIFT }, { 0x3A, VK_LMENU },
73 { 0x3B, VK_LCONTROL }, { 0x3C, VK_RSHIFT },
74 { 0x3D, VK_RMENU | KBDEXT }, { 0x3E, VK_RCONTROL | KBDEXT } };
76 for (
size_t x = 0; x < ARRAYSIZE(modifiers); x++)
78 const DWORD keycode = modifiers[x].keycode;
79 const DWORD vkcode = modifiers[x].vkcode;
80 const DWORD vk = GetVirtualKeyCodeFromKeycode(keycode, WINPR_KEYCODE_TYPE_APPLE);
81 const DWORD kc = GetKeycodeFromVirtualKeyCode(vkcode, WINPR_KEYCODE_TYPE_APPLE);
82 if ((vk != vkcode) || (kc != keycode))
84 printf(
"Apple keycode 0x%02" PRIx32
": got VK 0x%04" PRIx32
" and keycode 0x%02" PRIx32
85 ", expected VK 0x%04" PRIx32
"\n",
86 keycode, vk, kc, vkcode);
93static bool testVKToKeycode(WINPR_KEYCODE_TYPE type)
96 for (DWORD x = 0; x <= 0x100; x++)
98 const DWORD vkc = GetVirtualKeyCodeFromKeycode(x, type);
99 const DWORD kc = GetKeycodeFromVirtualKeyCode(vkc, type);
102 if (!((kc == 0) && (vkc == VK_NONE)))
104 DWORD keycodes[0x100] = WINPR_C_ARRAY_INIT;
106 GetKeycodesFromVirtualKeyCode(vkc, type, keycodes, ARRAYSIZE(keycodes));
108 for (DWORD y = 0; y < count; y++)
110 if (keycodes[y] == x)
121static bool testVKToKeycodes(
void)
123 const WINPR_KEYCODE_TYPE types[] = { WINPR_KEYCODE_TYPE_NONE, WINPR_KEYCODE_TYPE_APPLE,
124 WINPR_KEYCODE_TYPE_EVDEV, WINPR_KEYCODE_TYPE_XKB };
126 for (
size_t x = 0; x < ARRAYSIZE(types); x++)
128 const WINPR_KEYCODE_TYPE type = types[x];
129 if (!testVKToKeycode(type))
135int TestScancode(WINPR_ATTR_UNUSED
int argc, WINPR_ATTR_UNUSED
char* argv[])
137 if (!testVKToKeycodes())
140 if (!testAppleModifiers())
143 const enum WINPR_KBD_TYPE types[] = { WINPR_KBD_TYPE_IBM_PC_XT, WINPR_KBD_TYPE_OLIVETTI_ICO,
144 WINPR_KBD_TYPE_IBM_PC_AT, WINPR_KBD_TYPE_IBM_ENHANCED,
145 WINPR_KBD_TYPE_NOKIA_1050, WINPR_KBD_TYPE_NOKIA_9140,
146 WINPR_KBD_TYPE_JAPANESE, WINPR_KBD_TYPE_KOREAN };
149 for (
size_t x = 0; x < ARRAYSIZE(types); x++)
151 const enum WINPR_KBD_TYPE type = types[x];
152 if (!testKeyboardTypes(type))