+ case VK_LWIN:
+ if (NILP (Vw32_pass_lwindow_to_system))
+ {
+ /* Prevent system from acting on keyup (which opens the Start
+ menu if no other key was pressed) by simulating a press of
+ Space which we will ignore. */
+ if ((mod_key_state & LEFT_WIN_PRESSED) == 0)
+ {
+ if (NUMBERP (Vw32_phantom_key_code))
+ faked_key = XUINT (Vw32_phantom_key_code) & 255;
+ else
+ faked_key = VK_SPACE;
+ keybd_event (faked_key, (BYTE) MapVirtualKey (faked_key, 0), 0, 0);
+ }
+ }
+ mod_key_state |= LEFT_WIN_PRESSED;
+ if (!NILP (Vw32_lwindow_modifier))
+ return 0;
+ break;
+ case VK_RWIN:
+ if (NILP (Vw32_pass_rwindow_to_system))
+ {
+ if ((mod_key_state & RIGHT_WIN_PRESSED) == 0)
+ {
+ if (NUMBERP (Vw32_phantom_key_code))
+ faked_key = XUINT (Vw32_phantom_key_code) & 255;
+ else
+ faked_key = VK_SPACE;
+ keybd_event (faked_key, (BYTE) MapVirtualKey (faked_key, 0), 0, 0);
+ }
+ }
+ mod_key_state |= RIGHT_WIN_PRESSED;
+ if (!NILP (Vw32_rwindow_modifier))
+ return 0;
+ break;
+ case VK_APPS:
+ mod_key_state |= APPS_PRESSED;
+ if (!NILP (Vw32_apps_modifier))
+ return 0;
+ break;
+ case VK_CAPITAL:
+ /* Decide whether to treat as modifier or function key. */
+ if (NILP (Vw32_enable_caps_lock))
+ goto disable_lock_key;
+ return 0;
+ case VK_NUMLOCK:
+ /* Decide whether to treat as modifier or function key. */
+ if (NILP (Vw32_enable_num_lock))
+ goto disable_lock_key;
+ return 0;
+ case VK_SCROLL:
+ /* Decide whether to treat as modifier or function key. */
+ if (NILP (Vw32_scroll_lock_modifier))
+ goto disable_lock_key;
+ return 0;
+ disable_lock_key:
+ /* Ensure the appropriate lock key state is off (and the
+ indicator light as well). */
+ wParam = event->wVirtualKeyCode;
+ if (GetAsyncKeyState (wParam) & 0x8000)
+ {
+ /* Fake another press of the relevant key. Apparently, this
+ really is the only way to turn off the indicator. */
+ faked_key = wParam;
+ keybd_event ((BYTE) wParam, (BYTE) MapVirtualKey (wParam, 0),
+ KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, 0);
+ keybd_event ((BYTE) wParam, (BYTE) MapVirtualKey (wParam, 0),
+ KEYEVENTF_EXTENDEDKEY | 0, 0);
+ keybd_event ((BYTE) wParam, (BYTE) MapVirtualKey (wParam, 0),
+ KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, 0);
+ }
+ break;
+ case VK_MENU:
+ case VK_CONTROL:
+ case VK_SHIFT:
+ return 0;
+ case VK_CANCEL:
+ /* Windows maps Ctrl-Pause (aka Ctrl-Break) into VK_CANCEL,
+ which is confusing for purposes of key binding; convert
+ VK_CANCEL events into VK_PAUSE events. */
+ event->wVirtualKeyCode = VK_PAUSE;
+ break;
+ case VK_PAUSE:
+ /* Windows maps Ctrl-NumLock into VK_PAUSE, which is confusing
+ for purposes of key binding; convert these back into
+ VK_NUMLOCK events, at least when we want to see NumLock key
+ presses. (Note that there is never any possibility that
+ VK_PAUSE with Ctrl really is C-Pause as per above.) */
+ if (NILP (Vw32_enable_num_lock)
+ && (event->dwControlKeyState
+ & (LEFT_CTRL_PRESSED | RIGHT_CTRL_PRESSED)) != 0)
+ event->wVirtualKeyCode = VK_NUMLOCK;
+ break;
+ }
+
+ /* Recognize state of Windows and Apps keys. */
+ event->dwControlKeyState |= mod_key_state;
+
+ /* Distinguish numeric keypad keys from extended keys. */
+ event->wVirtualKeyCode =
+ map_keypad_keys (event->wVirtualKeyCode,
+ (event->dwControlKeyState & ENHANCED_KEY));
+
+ if (lispy_function_keys[event->wVirtualKeyCode] == 0)
+ {
+ emacs_ev->kind = ASCII_KEYSTROKE_EVENT;
+
+ if (!NILP (Vw32_recognize_altgr)
+ && (event->dwControlKeyState & LEFT_CTRL_PRESSED)
+ && (event->dwControlKeyState & RIGHT_ALT_PRESSED))
+ {
+ /* Don't try to interpret AltGr key chords; ToAscii seems not
+ to process them correctly. */
+ }
+ /* Handle key chords including any modifiers other than shift
+ directly, in order to preserve as much modifier information as
+ possible. */
+ else if (event->dwControlKeyState
+ & ( RIGHT_CTRL_PRESSED | LEFT_CTRL_PRESSED
+ | RIGHT_ALT_PRESSED | LEFT_ALT_PRESSED
+ | (!NILP (Vw32_lwindow_modifier) ? LEFT_WIN_PRESSED : 0)
+ | (!NILP (Vw32_rwindow_modifier) ? RIGHT_WIN_PRESSED : 0)
+ | (!NILP (Vw32_apps_modifier) ? APPS_PRESSED : 0)
+ | (!NILP (Vw32_scroll_lock_modifier) ? SCROLLLOCK_ON : 0)))
+ {
+ /* Don't translate modified alphabetic keystrokes, so the user
+ doesn't need to constantly switch layout to type control or
+ meta keystrokes when the normal layout translates
+ alphabetic characters to non-ascii characters. */
+ if ('A' <= event->wVirtualKeyCode && event->wVirtualKeyCode <= 'Z')
+ {
+ event->uChar.AsciiChar = event->wVirtualKeyCode;
+ if ((event->dwControlKeyState & SHIFT_PRESSED) == 0)
+ event->uChar.AsciiChar += ('a' - 'A');
+ }
+ /* Try to handle unrecognized keystrokes by determining the
+ base character (ie. translating the base key plus shift
+ modifier). */
+ else if (event->uChar.AsciiChar == 0)
+ w32_kbd_patch_key (event);
+ }
+ if (event->uChar.AsciiChar == 0)
+ return 0;
+ XSETINT (emacs_ev->code, event->uChar.AsciiChar);