33 #define EUR_UTF8 "\xe2\x82\xac"
34 #define EUR_UNICODE 0x20AC
37 const char* expect_str = NULL;
42 for (
i = 0;
i <
len;
i++) {
47 static void print_err_msg(
const char* expect,
ssize_t expect_len,
49 fprintf(
stderr,
"expect ");
50 dump_str(expect, expect_len);
51 fprintf(
stderr,
", but found ");
52 dump_str(
found, found_len);
64 if (nread != expect_nread) {
65 fprintf(
stderr,
"expected nread %ld, but found %ld\n",
66 (
long)expect_nread, (
long)nread);
67 print_err_msg(expect_str, expect_nread,
buf->base, nread);
70 if (strncmp(
buf->base, expect_str, nread) != 0) {
71 print_err_msg(expect_str, expect_nread,
buf->base, nread);
80 static void make_key_event_records(WORD virt_key, DWORD ctr_key_state,
81 BOOL is_wsl, INPUT_RECORD* records) {
82 # define KEV(I) records[(I)].Event.KeyEvent
83 BYTE kb_state[256] = {0};
87 records[0].EventType = records[1].EventType = KEY_EVENT;
90 KEV(0).wVirtualKeyCode =
KEV(1).wVirtualKeyCode = virt_key;
91 KEV(0).wRepeatCount =
KEV(1).wRepeatCount = 1;
92 KEV(0).wVirtualScanCode =
KEV(1).wVirtualScanCode =
93 MapVirtualKeyW(virt_key, MAPVK_VK_TO_VSC);
94 KEV(0).dwControlKeyState =
KEV(1).dwControlKeyState = ctr_key_state;
95 if (ctr_key_state & LEFT_ALT_PRESSED) {
96 kb_state[VK_LMENU] = 0x01;
98 if (ctr_key_state & RIGHT_ALT_PRESSED) {
99 kb_state[VK_RMENU] = 0x01;
101 if (ctr_key_state & LEFT_CTRL_PRESSED) {
102 kb_state[VK_LCONTROL] = 0x01;
104 if (ctr_key_state & RIGHT_CTRL_PRESSED) {
105 kb_state[VK_RCONTROL] = 0x01;
107 if (ctr_key_state & SHIFT_PRESSED) {
108 kb_state[VK_SHIFT] = 0x01;
113 ((ctr_key_state & LEFT_ALT_PRESSED) ||
114 (ctr_key_state & RIGHT_ALT_PRESSED))) {
120 KEV(0).uChar.UnicodeChar =
buf[0];
121 KEV(1).uChar.UnicodeChar = 0;
126 KEV(0).uChar.UnicodeChar =
KEV(1).uChar.UnicodeChar =
buf[0];
129 KEV(0).uChar.UnicodeChar =
KEV(1).uChar.UnicodeChar = 0;
140 INPUT_RECORD records[2];
146 handle = CreateFileA(
"conin$",
147 GENERIC_READ | GENERIC_WRITE,
148 FILE_SHARE_READ | FILE_SHARE_WRITE,
151 FILE_ATTRIBUTE_NORMAL,
166 expect_str = ESC
"[[A";
167 expect_nread = strlen(expect_str);
177 make_key_event_records(VK_F1, 0,
TRUE, records);
187 TEST_IMPL(tty_duplicate_alt_modifier_key) {
193 INPUT_RECORD records[2];
194 INPUT_RECORD alt_records[2];
200 handle = CreateFileA(
"conin$",
201 GENERIC_READ | GENERIC_WRITE,
202 FILE_SHARE_READ | FILE_SHARE_WRITE,
205 FILE_ATTRIBUTE_NORMAL,
220 expect_str = ESC
"a"ESC
"a";
221 expect_nread = strlen(expect_str);
228 make_key_event_records(VK_MENU, 0,
TRUE, alt_records);
229 WriteConsoleInputW(
handle, &alt_records[0], 1, &written);
231 make_key_event_records(
L'A', LEFT_ALT_PRESSED,
FALSE, records);
234 WriteConsoleInputW(
handle, &alt_records[1], 1, &written);
238 make_key_event_records(VK_MENU, 0,
TRUE, alt_records);
239 WriteConsoleInputW(
handle, &alt_records[0], 1, &written);
241 make_key_event_records(
L'A', LEFT_ALT_PRESSED,
TRUE, records);
244 WriteConsoleInputW(
handle, &alt_records[1], 1, &written);
259 INPUT_RECORD records[2];
260 INPUT_RECORD alt_records[2];
266 handle = CreateFileA(
"conin$",
267 GENERIC_READ | GENERIC_WRITE,
268 FILE_SHARE_READ | FILE_SHARE_WRITE,
271 FILE_ATTRIBUTE_NORMAL,
286 expect_str = EUR_UTF8;
287 expect_nread = strlen(expect_str);
294 make_key_event_records(VK_MENU, 0,
FALSE, alt_records);
295 alt_records[1].Event.KeyEvent.uChar.UnicodeChar = EUR_UNICODE;
296 WriteConsoleInputW(
handle, &alt_records[0], 1, &written);
297 make_key_event_records(VK_NUMPAD0, LEFT_ALT_PRESSED,
FALSE, records);
300 make_key_event_records(VK_NUMPAD1, LEFT_ALT_PRESSED,
FALSE, records);
303 make_key_event_records(VK_NUMPAD2, LEFT_ALT_PRESSED,
FALSE, records);
306 make_key_event_records(VK_NUMPAD8, LEFT_ALT_PRESSED,
FALSE, records);
309 WriteConsoleInputW(
handle, &alt_records[1], 1, &written);