2#include <winpr/crypto.h>
3#include <freerdp/locale/keyboard.h>
5static BOOL test_scancode_name(
void)
7 const DWORD scancodes[] = { RDP_SCANCODE_ESCAPE,
18 RDP_SCANCODE_OEM_MINUS,
19 RDP_SCANCODE_OEM_PLUS,
20 RDP_SCANCODE_BACKSPACE,
35 RDP_SCANCODE_LCONTROL,
57 RDP_SCANCODE_OEM_COMMA,
58 RDP_SCANCODE_OEM_PERIOD,
61 RDP_SCANCODE_MULTIPLY,
64 RDP_SCANCODE_CAPSLOCK,
76 RDP_SCANCODE_SCROLLLOCK,
80 RDP_SCANCODE_SUBTRACT,
109 RDP_SCANCODE_HIRAGANA,
110 RDP_SCANCODE_HANJA_KANJI,
111 RDP_SCANCODE_KANA_HANGUL,
112 RDP_SCANCODE_ABNT_C1,
114 RDP_SCANCODE_CONVERT_JP,
115 RDP_SCANCODE_NONCONVERT_JP,
117 RDP_SCANCODE_BACKSLASH_JP,
118 RDP_SCANCODE_ABNT_C2,
121 RDP_SCANCODE_RETURN_KP,
122 RDP_SCANCODE_RCONTROL,
124 RDP_SCANCODE_PRINTSCREEN,
142 RDP_SCANCODE_POWER_JP,
143 RDP_SCANCODE_SLEEP_JP,
144 RDP_SCANCODE_NUMLOCK_EXTENDED,
145 RDP_SCANCODE_RSHIFT_EXTENDED,
146 RDP_SCANCODE_VOLUME_MUTE,
147 RDP_SCANCODE_VOLUME_DOWN,
148 RDP_SCANCODE_VOLUME_UP,
149 RDP_SCANCODE_MEDIA_NEXT_TRACK,
150 RDP_SCANCODE_MEDIA_PREV_TRACK,
151 RDP_SCANCODE_MEDIA_STOP,
152 RDP_SCANCODE_MEDIA_PLAY_PAUSE,
153 RDP_SCANCODE_BROWSER_BACK,
154 RDP_SCANCODE_BROWSER_FORWARD,
155 RDP_SCANCODE_BROWSER_REFRESH,
156 RDP_SCANCODE_BROWSER_STOP,
157 RDP_SCANCODE_BROWSER_SEARCH,
158 RDP_SCANCODE_BROWSER_FAVORITES,
159 RDP_SCANCODE_BROWSER_HOME,
160 RDP_SCANCODE_LAUNCH_MAIL,
161 RDP_SCANCODE_LAUNCH_MEDIA_SELECT,
162 RDP_SCANCODE_LAUNCH_APP1,
163 RDP_SCANCODE_LAUNCH_APP2 };
164 for (
size_t x = 0; x < ARRAYSIZE(scancodes); x++)
166 const DWORD code = scancodes[x];
167 const char* sc = freerdp_keyboard_scancode_name(code);
170 (void)fprintf(stderr,
"Failed to run freerdp_keyboard_scancode_name(%" PRIu32
")\n",
179static BOOL test_layouts(DWORD types)
184 if (!layouts || (count == 0))
186 (void)fprintf(stderr,
187 "freerdp_keyboard_get_layouts(type: %" PRIu32
") -> %" PRIuz
188 " elements, layouts: %p:\n",
189 types, count, layouts);
193 for (
size_t x = 0; x < count; x++)
196 if ((cur->code == 0) || (!cur->name) || (strnlen(cur->name, 2) == 0))
198 (void)fprintf(stderr,
199 "freerdp_keyboard_get_layouts(type: %" PRIu32
") -> %" PRIuz
200 " elements, failed:\n",
202 (void)fprintf(stderr,
"[%" PRIuz
"]: code= %" PRIu32
", name = %s\n", x, cur->code,
207 const char* name = freerdp_keyboard_get_layout_name_from_id(cur->code);
210 (void)fprintf(stderr,
211 "freerdp_keyboard_get_layouts(type: %" PRIu32
") -> %" PRIuz
212 " elements, failed:\n",
214 (void)fprintf(stderr,
215 "[%" PRIuz
"]: freerdp_keyboard_get_layouts(%" PRIu32
") -> NULL\n", x,
220 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);
242static DWORD get_random(DWORD offset)
245 winpr_RAND(&x,
sizeof(x));
246 x = x % UINT32_MAX - offset;
251#if !defined(WITHOUT_FREERDP_3x_DEPRECATED)
252static BOOL test_scancode_cnv(
void)
254 for (DWORD x = 0; x < UINT8_MAX; x++)
256 const DWORD sc = freerdp_keyboard_get_rdp_scancode_from_x11_keycode(x);
257 const BOOL ex = RDP_SCANCODE_EXTENDED(sc);
258 const DWORD kk = freerdp_keyboard_get_x11_keycode_from_rdp_scancode(sc, ex);
261 (void)fprintf(stderr,
262 "[%" PRIu32
"]: keycode->scancode->keycode failed: %" PRIu32
263 " -> %" PRIu32
" -> %" PRIu32
"\n",
269 for (DWORD x = 0; x < 23; x++)
271 DWORD x = get_random(UINT8_MAX);
273 const DWORD sc = freerdp_keyboard_get_rdp_scancode_from_x11_keycode(x);
274 const DWORD kk = freerdp_keyboard_get_x11_keycode_from_rdp_scancode(sc, FALSE);
275 const DWORD kkex = freerdp_keyboard_get_x11_keycode_from_rdp_scancode(sc, TRUE);
276 if ((sc != 0) || (kk != 0) || (kkex != 0))
278 (void)fprintf(stderr,
279 "[%" PRIu32
"]: invalid scancode %" PRIu32
", keycode %" PRIu32
280 " or keycode extended %" PRIu32
" has a value != 0\n",
289static BOOL test_codepages(
void)
292 for (DWORD column = 0; column < 4; column++)
295 RDP_CODEPAGE* cp = freerdp_keyboard_get_matching_codepages(column, NULL, &count);
296 if (!cp || (count == 0))
298 (void)fprintf(stderr,
299 "freerdp_keyboard_get_matching_codepages(%" PRIu32
", NULL) failed!\n",
303 freerdp_codepages_free(cp);
306 for (DWORD x = 0; x < 23; x++)
308 DWORD column = get_random(4);
310 RDP_CODEPAGE* cp = freerdp_keyboard_get_matching_codepages(column, NULL, &count);
311 freerdp_codepages_free(cp);
312 if (cp || (count != 0))
314 (void)fprintf(stderr,
315 "freerdp_keyboard_get_matching_codepages(%" PRIu32
316 ", NULL) returned not NULL!\n",
328static BOOL test_init(
void)
330#if !defined(WITHOUT_FREERDP_3x_DEPRECATED)
331 const DWORD kbd = freerdp_keyboard_init(0);
334 (void)fprintf(stderr,
"freerdp_keyboard_init(0) returned invalid layout 0\n");
338 const DWORD kbdex = freerdp_keyboard_init_ex(0, NULL);
341 (void)fprintf(stderr,
"freerdp_keyboard_init_ex(0, NULL) returned invalid layout 0\n");
349 "freerdp_keyboard_init(0) != freerdp_keyboard_init_ex(0, NULL): returned %" PRIu32
362int TestLocaleKeyboard(
int argc,
char* argv[])
367 if (!test_scancode_name())
370 if (!test_layouts(RDP_KEYBOARD_LAYOUT_TYPE_STANDARD))
372 if (!test_layouts(RDP_KEYBOARD_LAYOUT_TYPE_VARIANT))
374 if (!test_layouts(RDP_KEYBOARD_LAYOUT_TYPE_IME))
376 if (!test_layouts(RDP_KEYBOARD_LAYOUT_TYPE_STANDARD | RDP_KEYBOARD_LAYOUT_TYPE_VARIANT))
378 if (!test_layouts(RDP_KEYBOARD_LAYOUT_TYPE_STANDARD | RDP_KEYBOARD_LAYOUT_TYPE_IME))
380 if (!test_layouts(RDP_KEYBOARD_LAYOUT_TYPE_VARIANT | RDP_KEYBOARD_LAYOUT_TYPE_IME))
382 if (!test_layouts(RDP_KEYBOARD_LAYOUT_TYPE_STANDARD | RDP_KEYBOARD_LAYOUT_TYPE_VARIANT |
383 RDP_KEYBOARD_LAYOUT_TYPE_IME))
385 if (test_layouts(UINT32_MAX &
386 ~(RDP_KEYBOARD_LAYOUT_TYPE_STANDARD | RDP_KEYBOARD_LAYOUT_TYPE_VARIANT |
387 RDP_KEYBOARD_LAYOUT_TYPE_IME)))
389#if !defined(WITHOUT_FREERDP_3x_DEPRECATED)
390 if (!test_scancode_cnv())
393 if (!test_codepages())