- char c = (unsigned char)wParam;
- term_seen_key_event(term);
- if (ldisc)
- lpage_send(ldisc, CP_ACP, &c, 1, 1);
+ static wchar_t pending_surrogate = 0;
+ wchar_t c = wParam;
+
+ if (IS_HIGH_SURROGATE(c)) {
+ pending_surrogate = c;
+ } else if (IS_SURROGATE_PAIR(pending_surrogate, c)) {
+ wchar_t pair[2];
+ pair[0] = pending_surrogate;
+ pair[1] = c;
+ term_seen_key_event(term);
+ luni_send(ldisc, pair, 2, 1);
+ } else if (!IS_SURROGATE(c)) {
+ term_seen_key_event(term);
+ luni_send(ldisc, &c, 1, 1);
+ }