+ HKL kbd_layout = GetKeyboardLayout(0);
+
+ static WORD keys[3];
+ static int compose_char = 0;
+ static WPARAM compose_key = 0;
+
+ r = GetKeyboardState(keystate);
+ if (!r) memset(keystate, 0, sizeof(keystate));
+ else
+ {
+#if 0
+ { /* Tell us all about key events */
+ static BYTE oldstate[256];
+ static int first = 1;
+ static int scan;
+ int ch;
+ if(first) memcpy(oldstate, keystate, sizeof(oldstate));
+ first=0;
+
+ if ((HIWORD(lParam)&(KF_UP|KF_REPEAT))==KF_REPEAT) {
+ debug(("+"));
+ } else if ((HIWORD(lParam)&KF_UP) && scan==(HIWORD(lParam) & 0xFF) ) {
+ debug((". U"));
+ } else {
+ debug((".\n"));
+ if (wParam >= VK_F1 && wParam <= VK_F20 )
+ debug(("K_F%d", wParam+1-VK_F1));
+ else switch(wParam)
+ {
+ case VK_SHIFT: debug(("SHIFT")); break;
+ case VK_CONTROL: debug(("CTRL")); break;
+ case VK_MENU: debug(("ALT")); break;
+ default: debug(("VK_%02x", wParam));
+ }
+ if(message == WM_SYSKEYDOWN || message == WM_SYSKEYUP)
+ debug(("*"));
+ debug((", S%02x", scan=(HIWORD(lParam) & 0xFF) ));
+
+ ch = MapVirtualKeyEx(wParam, 2, kbd_layout);
+ if (ch>=' ' && ch<='~') debug((", '%c'", ch));
+ else if (ch) debug((", $%02x", ch));
+
+ if (keys[0]) debug((", KB0=%02x", keys[0]));
+ if (keys[1]) debug((", KB1=%02x", keys[1]));
+ if (keys[2]) debug((", KB2=%02x", keys[2]));
+
+ if ( (keystate[VK_SHIFT]&0x80)!=0) debug((", S"));
+ if ( (keystate[VK_CONTROL]&0x80)!=0) debug((", C"));
+ if ( (HIWORD(lParam)&KF_EXTENDED) ) debug((", E"));
+ if ( (HIWORD(lParam)&KF_UP) ) debug((", U"));
+ }
+
+ if ((HIWORD(lParam)&(KF_UP|KF_REPEAT))==KF_REPEAT)
+ ;
+ else if ( (HIWORD(lParam)&KF_UP) )
+ oldstate[wParam&0xFF] ^= 0x80;
+ else
+ oldstate[wParam&0xFF] ^= 0x81;
+
+ for(ch=0; ch<256; ch++)
+ if (oldstate[ch] != keystate[ch])
+ debug((", M%02x=%02x", ch, keystate[ch]));
+
+ memcpy(oldstate, keystate, sizeof(oldstate));
+ }
+#endif
+
+ if (wParam == VK_MENU && (HIWORD(lParam)&KF_EXTENDED)) {
+ keystate[VK_RMENU] = keystate[VK_MENU];
+ }
+
+ /* Note if AltGr was pressed and if it was used as a compose key */
+ if (cfg.compose_key) {
+ if (wParam == VK_MENU && (HIWORD(lParam)&KF_EXTENDED))
+ {
+ if (!compose_state) compose_key = wParam;
+ }
+ if (wParam == VK_APPS && !compose_state)
+ compose_key = wParam;
+
+ if (wParam == compose_key)
+ {
+ if (compose_state == 0 && (HIWORD(lParam)&(KF_UP|KF_REPEAT))==0)
+ compose_state = 1;
+ else if (compose_state == 1 && (HIWORD(lParam)&KF_UP))
+ compose_state = 2;
+ else
+ compose_state = 0;
+ }
+ else if (compose_state==1 && wParam != VK_CONTROL)
+ compose_state = 0;
+ } else {
+ compose_state = 0;
+ }
+
+ /* Nastyness with NUMLock - Shift-NUMLock is left alone though */
+ if ( (cfg.funky_type == 3 ||
+ (cfg.funky_type <= 1 && app_keypad_keys && !cfg.no_applic_k))
+ && wParam==VK_NUMLOCK && !(keystate[VK_SHIFT]&0x80)) {
+
+ wParam = VK_EXECUTE;
+
+ /* UnToggle NUMLock */
+ if ((HIWORD(lParam)&(KF_UP|KF_REPEAT))==0)
+ keystate[VK_NUMLOCK] ^= 1;
+ }
+
+ /* And write back the 'adjusted' state */
+ SetKeyboardState (keystate);
+ }
+
+ /* Disable Auto repeat if required */
+ if (repeat_off && (HIWORD(lParam)&(KF_UP|KF_REPEAT))==KF_REPEAT)
+ return 0;
+
+ if ((HIWORD(lParam)&KF_ALTDOWN) && (keystate[VK_RMENU]&0x80) == 0)
+ left_alt = 1;
+
+ key_down = ((HIWORD(lParam)&KF_UP)==0);
+
+ /* Make sure Ctrl-ALT is not the same as AltGr for ToAscii */
+ if (left_alt && (keystate[VK_CONTROL]&0x80))
+ keystate[VK_MENU] = 0;
+
+ scan = (HIWORD(lParam) & (KF_UP | KF_EXTENDED | 0xFF));
+ shift_state = ((keystate[VK_SHIFT]&0x80)!=0)
+ + ((keystate[VK_CONTROL]&0x80)!=0)*2;