2#include <winpr/crypto.h>
3#include <freerdp/config.h>
4#include <freerdp/locale/keyboard.h>
6static BOOL test_scancode_name(
void)
8 const DWORD scancodes[] = { RDP_SCANCODE_ESCAPE,
19 RDP_SCANCODE_OEM_MINUS,
20 RDP_SCANCODE_OEM_PLUS,
21 RDP_SCANCODE_BACKSPACE,
36 RDP_SCANCODE_LCONTROL,
58 RDP_SCANCODE_OEM_COMMA,
59 RDP_SCANCODE_OEM_PERIOD,
62 RDP_SCANCODE_MULTIPLY,
65 RDP_SCANCODE_CAPSLOCK,
77 RDP_SCANCODE_SCROLLLOCK,
81 RDP_SCANCODE_SUBTRACT,
110 RDP_SCANCODE_HIRAGANA,
111 RDP_SCANCODE_HANJA_KANJI,
112 RDP_SCANCODE_KANA_HANGUL,
113 RDP_SCANCODE_ABNT_C1,
115 RDP_SCANCODE_CONVERT_JP,
116 RDP_SCANCODE_NONCONVERT_JP,
118 RDP_SCANCODE_BACKSLASH_JP,
119 RDP_SCANCODE_ABNT_C2,
122 RDP_SCANCODE_RETURN_KP,
123 RDP_SCANCODE_RCONTROL,
125 RDP_SCANCODE_PRINTSCREEN,
143 RDP_SCANCODE_POWER_JP,
144 RDP_SCANCODE_SLEEP_JP,
145 RDP_SCANCODE_NUMLOCK_EXTENDED,
146 RDP_SCANCODE_RSHIFT_EXTENDED,
147 RDP_SCANCODE_VOLUME_MUTE,
148 RDP_SCANCODE_VOLUME_DOWN,
149 RDP_SCANCODE_VOLUME_UP,
150 RDP_SCANCODE_MEDIA_NEXT_TRACK,
151 RDP_SCANCODE_MEDIA_PREV_TRACK,
152 RDP_SCANCODE_MEDIA_STOP,
153 RDP_SCANCODE_MEDIA_PLAY_PAUSE,
154 RDP_SCANCODE_BROWSER_BACK,
155 RDP_SCANCODE_BROWSER_FORWARD,
156 RDP_SCANCODE_BROWSER_REFRESH,
157 RDP_SCANCODE_BROWSER_STOP,
158 RDP_SCANCODE_BROWSER_SEARCH,
159 RDP_SCANCODE_BROWSER_FAVORITES,
160 RDP_SCANCODE_BROWSER_HOME,
161 RDP_SCANCODE_LAUNCH_MAIL,
162 RDP_SCANCODE_LAUNCH_MEDIA_SELECT,
163 RDP_SCANCODE_LAUNCH_APP1,
164 RDP_SCANCODE_LAUNCH_APP2 };
165 for (
size_t x = 0; x < ARRAYSIZE(scancodes); x++)
167 const DWORD code = scancodes[x];
168 const char* sc = freerdp_keyboard_scancode_name(code);
171 (void)fprintf(stderr,
"Failed to run freerdp_keyboard_scancode_name(%" PRIu32
")\n",
180static BOOL test_layouts(DWORD types)
185 if (!layouts || (count == 0))
187 (void)fprintf(stderr,
188 "freerdp_keyboard_get_layouts(type: %" PRIu32
") -> %" PRIuz
189 " elements, layouts: %p:\n",
190 types, count, layouts);
194 for (
size_t x = 0; x < count; x++)
197 if ((cur->code == 0) || (!cur->name) || (strnlen(cur->name, 2) == 0))
199 (void)fprintf(stderr,
200 "freerdp_keyboard_get_layouts(type: %" PRIu32
") -> %" PRIuz
201 " elements, failed:\n",
203 (void)fprintf(stderr,
"[%" PRIuz
"]: code= %" PRIu32
", name = %s\n", x, cur->code,
208 const char* name = freerdp_keyboard_get_layout_name_from_id(cur->code);
211 (void)fprintf(stderr,
212 "freerdp_keyboard_get_layouts(type: %" PRIu32
") -> %" PRIuz
213 " elements, failed:\n",
215 (void)fprintf(stderr,
216 "[%" PRIuz
"]: freerdp_keyboard_get_layouts(%" PRIu32
") -> nullptr\n", x,
221 const DWORD
id = freerdp_keyboard_get_layout_id_from_name(cur->name);
224 (void)fprintf(stderr,
225 "freerdp_keyboard_get_layouts(type: %" PRIu32
") -> %" PRIuz
226 " elements, failed:\n",
228 (void)fprintf(stderr,
229 "[%" PRIuz
"]: freerdp_keyboard_get_layout_id_from_name(%s) -> %" PRIu32
231 x, cur->name,
id, cur->code);
238 freerdp_keyboard_layouts_free(layouts, count);
243static BOOL test_layout_ids(
void)
249 } layouts[] = { {
"Persian", 0x00000429 }, {
"Central Kurdish", 0x00000492 },
250 {
"Latvian", 0x00000426 }, {
"Latvian (Standard)", 0x00020426 },
251 {
"Greek (220)", 0x00010408 }, {
"Uyghur", 0x00010480 } };
253 for (
size_t x = 0; x < ARRAYSIZE(layouts); x++)
255 const DWORD
id = freerdp_keyboard_get_layout_id_from_name(layouts[x].name);
256 if (
id != layouts[x].code)
258 (void)fprintf(stderr,
259 "freerdp_keyboard_get_layout_id_from_name(%s) -> 0x%08" PRIx32
260 " != 0x%08" PRIx32
"\n",
261 layouts[x].name,
id, layouts[x].code);
268static DWORD get_random(DWORD offset)
271 if (winpr_RAND(&x,
sizeof(x)) < 0)
273 (void)fprintf(stderr,
"winpr_RAND failed, retry...\n");
277 x = x % UINT32_MAX - offset;
282#if !defined(WITHOUT_FREERDP_3x_DEPRECATED)
283static BOOL test_scancode_cnv(
void)
285 for (DWORD x = 0; x < UINT8_MAX; x++)
287 const DWORD sc = freerdp_keyboard_get_rdp_scancode_from_x11_keycode(x);
288 const BOOL ex = RDP_SCANCODE_EXTENDED(sc);
289 const DWORD kk = freerdp_keyboard_get_x11_keycode_from_rdp_scancode(sc, ex);
292 (void)fprintf(stderr,
293 "[%" PRIu32
"]: keycode->scancode->keycode failed: %" PRIu32
294 " -> %" PRIu32
" -> %" PRIu32
"\n",
300 for (DWORD x = 0; x < 23; x++)
302 DWORD x = get_random(UINT8_MAX);
304 const DWORD sc = freerdp_keyboard_get_rdp_scancode_from_x11_keycode(x);
305 const DWORD kk = freerdp_keyboard_get_x11_keycode_from_rdp_scancode(sc, FALSE);
306 const DWORD kkex = freerdp_keyboard_get_x11_keycode_from_rdp_scancode(sc, TRUE);
307 if ((sc != 0) || (kk != 0) || (kkex != 0))
309 (void)fprintf(stderr,
310 "[%" PRIu32
"]: invalid scancode %" PRIu32
", keycode %" PRIu32
311 " or keycode extended %" PRIu32
" has a value != 0\n",
320static BOOL test_codepages(
void)
323 for (DWORD column = 0; column < 4; column++)
326 RDP_CODEPAGE* cp = freerdp_keyboard_get_matching_codepages(column,
nullptr, &count);
327 if (!cp || (count == 0))
329 (void)fprintf(stderr,
330 "freerdp_keyboard_get_matching_codepages(%" PRIu32
", nullptr) failed!\n",
334 freerdp_codepages_free(cp);
337 for (DWORD x = 0; x < 23; x++)
339 DWORD column = get_random(4);
341 RDP_CODEPAGE* cp = freerdp_keyboard_get_matching_codepages(column,
nullptr, &count);
342 freerdp_codepages_free(cp);
343 if (cp || (count != 0))
345 (void)fprintf(stderr,
346 "freerdp_keyboard_get_matching_codepages(%" PRIu32
347 ", nullptr) returned not nullptr!\n",
359static BOOL test_init(
void)
361#if !defined(WITHOUT_FREERDP_3x_DEPRECATED)
362 const DWORD kbd = freerdp_keyboard_init(0);
365 (void)fprintf(stderr,
"freerdp_keyboard_init(0) returned invalid layout 0\n");
369 const DWORD kbdex = freerdp_keyboard_init_ex(0,
nullptr);
372 (void)fprintf(stderr,
"freerdp_keyboard_init_ex(0, nullptr) returned invalid layout 0\n");
380 "freerdp_keyboard_init(0) != freerdp_keyboard_init_ex(0, nullptr): returned %" PRIu32
393int TestLocaleKeyboard(
int argc,
char* argv[])
398 if (!test_scancode_name())
401 if (!test_layouts(RDP_KEYBOARD_LAYOUT_TYPE_STANDARD))
403 if (!test_layouts(RDP_KEYBOARD_LAYOUT_TYPE_VARIANT))
405 if (!test_layouts(RDP_KEYBOARD_LAYOUT_TYPE_IME))
407 if (!test_layouts(RDP_KEYBOARD_LAYOUT_TYPE_STANDARD | RDP_KEYBOARD_LAYOUT_TYPE_VARIANT))
409 if (!test_layouts(RDP_KEYBOARD_LAYOUT_TYPE_STANDARD | RDP_KEYBOARD_LAYOUT_TYPE_IME))
411 if (!test_layouts(RDP_KEYBOARD_LAYOUT_TYPE_VARIANT | RDP_KEYBOARD_LAYOUT_TYPE_IME))
413 if (!test_layouts(RDP_KEYBOARD_LAYOUT_TYPE_STANDARD | RDP_KEYBOARD_LAYOUT_TYPE_VARIANT |
414 RDP_KEYBOARD_LAYOUT_TYPE_IME))
416 if (!test_layout_ids())
418 if (test_layouts(UINT32_MAX &
419 ~(RDP_KEYBOARD_LAYOUT_TYPE_STANDARD | RDP_KEYBOARD_LAYOUT_TYPE_VARIANT |
420 RDP_KEYBOARD_LAYOUT_TYPE_IME)))
422#if !defined(WITHOUT_FREERDP_3x_DEPRECATED)
423 if (!test_scancode_cnv())
426 if (!test_codepages())