+ {
+ emacs_ev->kind = NO_EVENT;
+ return 0;
+ }
+ else if (event->uChar.AsciiChar > 0)
+ {
+ emacs_ev->kind = ASCII_KEYSTROKE_EVENT;
+ emacs_ev->code = event->uChar.AsciiChar;
+ }
+ else if (event->uChar.UnicodeChar > 0)
+ {
+ emacs_ev->kind = MULTIBYTE_CHAR_KEYSTROKE_EVENT;
+ emacs_ev->code = event->uChar.UnicodeChar;
+ }
+ else
+ {
+ /* Fallback for non-Unicode versions of Windows. */
+ wchar_t code;
+ char dbcs[2];
+ char cp[20];
+ int cpId;
+
+ /* Get the codepage to interpret this key with. */
+ GetLocaleInfo (GetThreadLocale (),
+ LOCALE_IDEFAULTANSICODEPAGE, cp, 20);
+ cpId = atoi (cp);
+
+ dbcs[0] = dbcs_lead;
+ dbcs[1] = event->uChar.AsciiChar;
+ if (dbcs_lead)
+ {
+ dbcs_lead = 0;
+ if (!MultiByteToWideChar (cpId, 0, dbcs, 2, &code, 1))
+ {
+ /* Garbage */
+ DebPrint (("Invalid DBCS sequence: %d %d\n",
+ dbcs[0], dbcs[1]));
+ emacs_ev->kind = NO_EVENT;
+ }
+ }
+ else if (IsDBCSLeadByteEx (cpId, dbcs[1]))
+ {
+ dbcs_lead = dbcs[1];
+ emacs_ev->kind = NO_EVENT;
+ }
+ else
+ {
+ if (!MultiByteToWideChar (cpId, 0, &dbcs[1], 1, &code, 1))
+ {
+ /* Garbage */
+ DebPrint (("Invalid character: %d\n", dbcs[1]));
+ emacs_ev->kind = NO_EVENT;
+ }
+ }
+ emacs_ev->kind = MULTIBYTE_CHAR_KEYSTROKE_EVENT;
+ emacs_ev->code = code;
+ }