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
") -> NULL\n", x,
221 const DWORD
id = freerdp_keyboard_get_layout_id_from_name(cur->name);
225 (void)fprintf(stderr,
226 "freerdp_keyboard_get_layouts(type: %" PRIu32
") -> %" PRIuz
227 " elements, failed:\n",
229 (void)fprintf(stderr,
230 "[%" PRIuz
"]: freerdp_keyboard_get_layout_id_from_name(%s) -> %" PRIu32
232 x, cur->name,
id, cur->code);
239 freerdp_keyboard_layouts_free(layouts, count);
243static DWORD get_random(DWORD offset)
246 winpr_RAND(&x,
sizeof(x));
247 x = x % UINT32_MAX - offset;
252#if !defined(WITHOUT_FREERDP_3x_DEPRECATED)
253static BOOL test_scancode_cnv(
void)
255 for (DWORD x = 0; x < UINT8_MAX; x++)
257 const DWORD sc = freerdp_keyboard_get_rdp_scancode_from_x11_keycode(x);
258 const BOOL ex = RDP_SCANCODE_EXTENDED(sc);
259 const DWORD kk = freerdp_keyboard_get_x11_keycode_from_rdp_scancode(sc, ex);
262 (void)fprintf(stderr,
263 "[%" PRIu32
"]: keycode->scancode->keycode failed: %" PRIu32
264 " -> %" PRIu32
" -> %" PRIu32
"\n",
270 for (DWORD x = 0; x < 23; x++)
272 DWORD x = get_random(UINT8_MAX);
274 const DWORD sc = freerdp_keyboard_get_rdp_scancode_from_x11_keycode(x);
275 const DWORD kk = freerdp_keyboard_get_x11_keycode_from_rdp_scancode(sc, FALSE);
276 const DWORD kkex = freerdp_keyboard_get_x11_keycode_from_rdp_scancode(sc, TRUE);
277 if ((sc != 0) || (kk != 0) || (kkex != 0))
279 (void)fprintf(stderr,
280 "[%" PRIu32
"]: invalid scancode %" PRIu32
", keycode %" PRIu32
281 " or keycode extended %" PRIu32
" has a value != 0\n",
290static BOOL test_codepages(
void)
293 for (DWORD column = 0; column < 4; column++)
296 RDP_CODEPAGE* cp = freerdp_keyboard_get_matching_codepages(column, NULL, &count);
297 if (!cp || (count == 0))
299 (void)fprintf(stderr,
300 "freerdp_keyboard_get_matching_codepages(%" PRIu32
", NULL) failed!\n",
304 freerdp_codepages_free(cp);
307 for (DWORD x = 0; x < 23; x++)
309 DWORD column = get_random(4);
311 RDP_CODEPAGE* cp = freerdp_keyboard_get_matching_codepages(column, NULL, &count);
312 freerdp_codepages_free(cp);
313 if (cp || (count != 0))
315 (void)fprintf(stderr,
316 "freerdp_keyboard_get_matching_codepages(%" PRIu32
317 ", NULL) returned not NULL!\n",
329static BOOL test_init(
void)
331#if !defined(WITHOUT_FREERDP_3x_DEPRECATED)
332 const DWORD kbd = freerdp_keyboard_init(0);
335 (void)fprintf(stderr,
"freerdp_keyboard_init(0) returned invalid layout 0\n");
339 const DWORD kbdex = freerdp_keyboard_init_ex(0, NULL);
342 (void)fprintf(stderr,
"freerdp_keyboard_init_ex(0, NULL) returned invalid layout 0\n");
350 "freerdp_keyboard_init(0) != freerdp_keyboard_init_ex(0, NULL): returned %" PRIu32
363int TestLocaleKeyboard(
int argc,
char* argv[])
368 if (!test_scancode_name())
371 if (!test_layouts(RDP_KEYBOARD_LAYOUT_TYPE_STANDARD))
373 if (!test_layouts(RDP_KEYBOARD_LAYOUT_TYPE_VARIANT))
375 if (!test_layouts(RDP_KEYBOARD_LAYOUT_TYPE_IME))
377 if (!test_layouts(RDP_KEYBOARD_LAYOUT_TYPE_STANDARD | RDP_KEYBOARD_LAYOUT_TYPE_VARIANT))
379 if (!test_layouts(RDP_KEYBOARD_LAYOUT_TYPE_STANDARD | RDP_KEYBOARD_LAYOUT_TYPE_IME))
381 if (!test_layouts(RDP_KEYBOARD_LAYOUT_TYPE_VARIANT | RDP_KEYBOARD_LAYOUT_TYPE_IME))
383 if (!test_layouts(RDP_KEYBOARD_LAYOUT_TYPE_STANDARD | RDP_KEYBOARD_LAYOUT_TYPE_VARIANT |
384 RDP_KEYBOARD_LAYOUT_TYPE_IME))
386 if (test_layouts(UINT32_MAX &
387 ~(RDP_KEYBOARD_LAYOUT_TYPE_STANDARD | RDP_KEYBOARD_LAYOUT_TYPE_VARIANT |
388 RDP_KEYBOARD_LAYOUT_TYPE_IME)))
390#if !defined(WITHOUT_FREERDP_3x_DEPRECATED)
391 if (!test_scancode_cnv())
394 if (!test_codepages())