FreeRDP
Loading...
Searching...
No Matches
TestLocaleKeyboard.c
1#include <stdio.h>
2#include <winpr/crypto.h>
3#include <freerdp/locale/keyboard.h>
4
5static BOOL test_scancode_name(void)
6{
7 const DWORD scancodes[] = { RDP_SCANCODE_ESCAPE,
8 RDP_SCANCODE_KEY_1,
9 RDP_SCANCODE_KEY_2,
10 RDP_SCANCODE_KEY_3,
11 RDP_SCANCODE_KEY_4,
12 RDP_SCANCODE_KEY_5,
13 RDP_SCANCODE_KEY_6,
14 RDP_SCANCODE_KEY_7,
15 RDP_SCANCODE_KEY_8,
16 RDP_SCANCODE_KEY_9,
17 RDP_SCANCODE_KEY_0,
18 RDP_SCANCODE_OEM_MINUS,
19 RDP_SCANCODE_OEM_PLUS,
20 RDP_SCANCODE_BACKSPACE,
21 RDP_SCANCODE_TAB,
22 RDP_SCANCODE_KEY_Q,
23 RDP_SCANCODE_KEY_W,
24 RDP_SCANCODE_KEY_E,
25 RDP_SCANCODE_KEY_R,
26 RDP_SCANCODE_KEY_T,
27 RDP_SCANCODE_KEY_Y,
28 RDP_SCANCODE_KEY_U,
29 RDP_SCANCODE_KEY_I,
30 RDP_SCANCODE_KEY_O,
31 RDP_SCANCODE_KEY_P,
32 RDP_SCANCODE_OEM_4,
33 RDP_SCANCODE_OEM_6,
34 RDP_SCANCODE_RETURN,
35 RDP_SCANCODE_LCONTROL,
36 RDP_SCANCODE_KEY_A,
37 RDP_SCANCODE_KEY_S,
38 RDP_SCANCODE_KEY_D,
39 RDP_SCANCODE_KEY_F,
40 RDP_SCANCODE_KEY_G,
41 RDP_SCANCODE_KEY_H,
42 RDP_SCANCODE_KEY_J,
43 RDP_SCANCODE_KEY_K,
44 RDP_SCANCODE_KEY_L,
45 RDP_SCANCODE_OEM_1,
46 RDP_SCANCODE_OEM_7,
47 RDP_SCANCODE_OEM_3,
48 RDP_SCANCODE_LSHIFT,
49 RDP_SCANCODE_OEM_5,
50 RDP_SCANCODE_KEY_Z,
51 RDP_SCANCODE_KEY_X,
52 RDP_SCANCODE_KEY_C,
53 RDP_SCANCODE_KEY_V,
54 RDP_SCANCODE_KEY_B,
55 RDP_SCANCODE_KEY_N,
56 RDP_SCANCODE_KEY_M,
57 RDP_SCANCODE_OEM_COMMA,
58 RDP_SCANCODE_OEM_PERIOD,
59 RDP_SCANCODE_OEM_2,
60 RDP_SCANCODE_RSHIFT,
61 RDP_SCANCODE_MULTIPLY,
62 RDP_SCANCODE_LMENU,
63 RDP_SCANCODE_SPACE,
64 RDP_SCANCODE_CAPSLOCK,
65 RDP_SCANCODE_F1,
66 RDP_SCANCODE_F2,
67 RDP_SCANCODE_F3,
68 RDP_SCANCODE_F4,
69 RDP_SCANCODE_F5,
70 RDP_SCANCODE_F6,
71 RDP_SCANCODE_F7,
72 RDP_SCANCODE_F8,
73 RDP_SCANCODE_F9,
74 RDP_SCANCODE_F10,
75 RDP_SCANCODE_NUMLOCK,
76 RDP_SCANCODE_SCROLLLOCK,
77 RDP_SCANCODE_NUMPAD7,
78 RDP_SCANCODE_NUMPAD8,
79 RDP_SCANCODE_NUMPAD9,
80 RDP_SCANCODE_SUBTRACT,
81 RDP_SCANCODE_NUMPAD4,
82 RDP_SCANCODE_NUMPAD5,
83 RDP_SCANCODE_NUMPAD6,
84 RDP_SCANCODE_ADD,
85 RDP_SCANCODE_NUMPAD1,
86 RDP_SCANCODE_NUMPAD2,
87 RDP_SCANCODE_NUMPAD3,
88 RDP_SCANCODE_NUMPAD0,
89 RDP_SCANCODE_DECIMAL,
90 RDP_SCANCODE_SYSREQ,
91 RDP_SCANCODE_OEM_102,
92 RDP_SCANCODE_F11,
93 RDP_SCANCODE_F12,
94 RDP_SCANCODE_SLEEP,
95 RDP_SCANCODE_ZOOM,
96 RDP_SCANCODE_HELP,
97 RDP_SCANCODE_F13,
98 RDP_SCANCODE_F14,
99 RDP_SCANCODE_F15,
100 RDP_SCANCODE_F16,
101 RDP_SCANCODE_F17,
102 RDP_SCANCODE_F18,
103 RDP_SCANCODE_F19,
104 RDP_SCANCODE_F20,
105 RDP_SCANCODE_F21,
106 RDP_SCANCODE_F22,
107 RDP_SCANCODE_F23,
108 RDP_SCANCODE_F24,
109 RDP_SCANCODE_HIRAGANA,
110 RDP_SCANCODE_HANJA_KANJI,
111 RDP_SCANCODE_KANA_HANGUL,
112 RDP_SCANCODE_ABNT_C1,
113 RDP_SCANCODE_F24_JP,
114 RDP_SCANCODE_CONVERT_JP,
115 RDP_SCANCODE_NONCONVERT_JP,
116 RDP_SCANCODE_TAB_JP,
117 RDP_SCANCODE_BACKSLASH_JP,
118 RDP_SCANCODE_ABNT_C2,
119 RDP_SCANCODE_HANJA,
120 RDP_SCANCODE_HANGUL,
121 RDP_SCANCODE_RETURN_KP,
122 RDP_SCANCODE_RCONTROL,
123 RDP_SCANCODE_DIVIDE,
124 RDP_SCANCODE_PRINTSCREEN,
125 RDP_SCANCODE_RMENU,
126 RDP_SCANCODE_PAUSE,
127 RDP_SCANCODE_HOME,
128 RDP_SCANCODE_UP,
129 RDP_SCANCODE_PRIOR,
130 RDP_SCANCODE_LEFT,
131 RDP_SCANCODE_RIGHT,
132 RDP_SCANCODE_END,
133 RDP_SCANCODE_DOWN,
134 RDP_SCANCODE_NEXT,
135 RDP_SCANCODE_INSERT,
136 RDP_SCANCODE_DELETE,
137 RDP_SCANCODE_NULL,
138 RDP_SCANCODE_HELP2,
139 RDP_SCANCODE_LWIN,
140 RDP_SCANCODE_RWIN,
141 RDP_SCANCODE_APPS,
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++)
165 {
166 const DWORD code = scancodes[x];
167 const char* sc = freerdp_keyboard_scancode_name(code);
168 if (!sc)
169 {
170 (void)fprintf(stderr, "Failed to run freerdp_keyboard_scancode_name(%" PRIu32 ")\n",
171 code);
172 return FALSE;
173 }
174 }
175
176 return TRUE;
177}
178
179static BOOL test_layouts(DWORD types)
180{
181 BOOL rc = FALSE;
182 size_t count = 0;
183 RDP_KEYBOARD_LAYOUT* layouts = freerdp_keyboard_get_layouts(types, &count);
184 if (!layouts || (count == 0))
185 {
186 (void)fprintf(stderr,
187 "freerdp_keyboard_get_layouts(type: %" PRIu32 ") -> %" PRIuz
188 " elements, layouts: %p:\n",
189 types, count, layouts);
190 goto fail;
191 }
192
193 for (size_t x = 0; x < count; x++)
194 {
195 const RDP_KEYBOARD_LAYOUT* cur = &layouts[x];
196 if ((cur->code == 0) || (!cur->name) || (strnlen(cur->name, 2) == 0))
197 {
198 (void)fprintf(stderr,
199 "freerdp_keyboard_get_layouts(type: %" PRIu32 ") -> %" PRIuz
200 " elements, failed:\n",
201 types, count);
202 (void)fprintf(stderr, "[%" PRIuz "]: code= %" PRIu32 ", name = %s\n", x, cur->code,
203 cur->name);
204 goto fail;
205 }
206
207 const char* name = freerdp_keyboard_get_layout_name_from_id(cur->code);
208 if (!name)
209 {
210 (void)fprintf(stderr,
211 "freerdp_keyboard_get_layouts(type: %" PRIu32 ") -> %" PRIuz
212 " elements, failed:\n",
213 types, count);
214 (void)fprintf(stderr,
215 "[%" PRIuz "]: freerdp_keyboard_get_layouts(%" PRIu32 ") -> NULL\n", x,
216 cur->code);
217 goto fail;
218 }
219
220 const DWORD id = freerdp_keyboard_get_layout_id_from_name(cur->name);
221 // if (id != cur->code) {
222 if (id == 0)
223 {
224 (void)fprintf(stderr,
225 "freerdp_keyboard_get_layouts(type: %" PRIu32 ") -> %" PRIuz
226 " elements, failed:\n",
227 types, count);
228 (void)fprintf(stderr,
229 "[%" PRIuz "]: freerdp_keyboard_get_layout_id_from_name(%s) -> %" PRIu32
230 " != %" PRIu32 "\n",
231 x, cur->name, id, cur->code);
232 goto fail;
233 }
234 }
235
236 rc = TRUE;
237fail:
238 freerdp_keyboard_layouts_free(layouts, count);
239 return rc;
240}
241
242static DWORD get_random(DWORD offset)
243{
244 DWORD x = 0;
245 winpr_RAND(&x, sizeof(x));
246 x = x % UINT32_MAX - offset;
247 x += offset;
248 return x;
249}
250
251#if !defined(WITHOUT_FREERDP_3x_DEPRECATED)
252static BOOL test_scancode_cnv(void)
253{
254 for (DWORD x = 0; x < UINT8_MAX; x++)
255 {
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);
259 if (sc != kk)
260 {
261 (void)fprintf(stderr,
262 "[%" PRIu32 "]: keycode->scancode->keycode failed: %" PRIu32
263 " -> %" PRIu32 " -> %" PRIu32 "\n",
264 x, sc, ex, kk);
265 return FALSE;
266 }
267 }
268
269 for (DWORD x = 0; x < 23; x++)
270 {
271 DWORD x = get_random(UINT8_MAX);
272
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))
277 {
278 (void)fprintf(stderr,
279 "[%" PRIu32 "]: invalid scancode %" PRIu32 ", keycode %" PRIu32
280 " or keycode extended %" PRIu32 " has a value != 0\n",
281 x, sc, kk, kkex);
282 return FALSE;
283 }
284 }
285 return TRUE;
286}
287#endif
288
289static BOOL test_codepages(void)
290{
291
292 for (DWORD column = 0; column < 4; column++)
293 {
294 size_t count = 0;
295 RDP_CODEPAGE* cp = freerdp_keyboard_get_matching_codepages(column, NULL, &count);
296 if (!cp || (count == 0))
297 {
298 (void)fprintf(stderr,
299 "freerdp_keyboard_get_matching_codepages(%" PRIu32 ", NULL) failed!\n",
300 column);
301 return FALSE;
302 }
303 freerdp_codepages_free(cp);
304 }
305
306 for (DWORD x = 0; x < 23; x++)
307 {
308 DWORD column = get_random(4);
309 size_t count = 0;
310 RDP_CODEPAGE* cp = freerdp_keyboard_get_matching_codepages(column, NULL, &count);
311 freerdp_codepages_free(cp);
312 if (cp || (count != 0))
313 {
314 (void)fprintf(stderr,
315 "freerdp_keyboard_get_matching_codepages(%" PRIu32
316 ", NULL) returned not NULL!\n",
317 column);
318 return FALSE;
319 }
320 }
321
322 // TODO: Test with filters set
323 // TODO: Test with invalid filters set
324
325 return TRUE;
326}
327
328static BOOL test_init(void)
329{
330#if !defined(WITHOUT_FREERDP_3x_DEPRECATED)
331 const DWORD kbd = freerdp_keyboard_init(0);
332 if (kbd == 0)
333 {
334 (void)fprintf(stderr, "freerdp_keyboard_init(0) returned invalid layout 0\n");
335 return FALSE;
336 }
337
338 const DWORD kbdex = freerdp_keyboard_init_ex(0, NULL);
339 if (kbd == 0)
340 {
341 (void)fprintf(stderr, "freerdp_keyboard_init_ex(0, NULL) returned invalid layout 0\n");
342 return FALSE;
343 }
344
345 if (kbd != kbdex)
346 {
347 (void)fprintf(
348 stderr,
349 "freerdp_keyboard_init(0) != freerdp_keyboard_init_ex(0, NULL): returned %" PRIu32
350 " vs %" PRIu32 "\n",
351 kbd, kbdex);
352 return FALSE;
353 }
354
355 // TODO: Test with valid remap list
356 // TODO: Test with invalid remap list
357 // TODO: Test with defaults != 0
358#endif
359 return TRUE;
360}
361
362int TestLocaleKeyboard(int argc, char* argv[])
363{
364 WINPR_UNUSED(argc);
365 WINPR_UNUSED(argv);
366
367 if (!test_scancode_name())
368 return -1;
369
370 if (!test_layouts(RDP_KEYBOARD_LAYOUT_TYPE_STANDARD))
371 return -1;
372 if (!test_layouts(RDP_KEYBOARD_LAYOUT_TYPE_VARIANT))
373 return -1;
374 if (!test_layouts(RDP_KEYBOARD_LAYOUT_TYPE_IME))
375 return -1;
376 if (!test_layouts(RDP_KEYBOARD_LAYOUT_TYPE_STANDARD | RDP_KEYBOARD_LAYOUT_TYPE_VARIANT))
377 return -1;
378 if (!test_layouts(RDP_KEYBOARD_LAYOUT_TYPE_STANDARD | RDP_KEYBOARD_LAYOUT_TYPE_IME))
379 return -1;
380 if (!test_layouts(RDP_KEYBOARD_LAYOUT_TYPE_VARIANT | RDP_KEYBOARD_LAYOUT_TYPE_IME))
381 return -1;
382 if (!test_layouts(RDP_KEYBOARD_LAYOUT_TYPE_STANDARD | RDP_KEYBOARD_LAYOUT_TYPE_VARIANT |
383 RDP_KEYBOARD_LAYOUT_TYPE_IME))
384 return -1;
385 if (test_layouts(UINT32_MAX &
386 ~(RDP_KEYBOARD_LAYOUT_TYPE_STANDARD | RDP_KEYBOARD_LAYOUT_TYPE_VARIANT |
387 RDP_KEYBOARD_LAYOUT_TYPE_IME)))
388 return -1;
389#if !defined(WITHOUT_FREERDP_3x_DEPRECATED)
390 if (!test_scancode_cnv())
391 return -1;
392#endif
393 if (!test_codepages())
394 return -1;
395 if (!test_init())
396 return -1;
397
398 return 0;
399}