-/* Input event support for Windows NT port of GNU Emacs.
+/* Input event support for Emacs on the Microsoft W32 API.
Copyright (C) 1992, 1993, 1995 Free Software Foundation, Inc.
This file is part of GNU Emacs.
/* from dispnew.c */
extern int change_frame_size (FRAME_PTR, int, int, int, int);
+/* from w32fns.c */
+extern Lisp_Object Vw32_alt_is_meta;
+
+/* from w32term */
+extern Lisp_Object Vw32_capslock_is_shiftlock;
+
/* Event queue */
#define EVENT_QUEUE_SIZE 50
static INPUT_RECORD event_queue[EVENT_QUEUE_SIZE];
/* Translate console modifiers to emacs modifiers.
German keyboard support (Kai Morgan Zeise 2/18/95). */
int
-win32_kbd_mods_to_emacs (DWORD mods)
+w32_kbd_mods_to_emacs (DWORD mods, WORD key)
{
int retval = 0;
mods &= ~ (RIGHT_ALT_PRESSED | LEFT_CTRL_PRESSED);
if (mods & (RIGHT_ALT_PRESSED | LEFT_ALT_PRESSED))
- retval = meta_modifier;
+ retval = ((NILP (Vw32_alt_is_meta)) ? alt_modifier : meta_modifier);
if (mods & (RIGHT_CTRL_PRESSED | LEFT_CTRL_PRESSED))
{
retval |= meta_modifier;
}
+ /* Just in case someone wanted the original behaviour, make it
+ optional by setting w32-capslock-is-shiftlock to t. */
+ if (NILP (Vw32_capslock_is_shiftlock)
+ && ((key == VK_INSERT)
+ || (key == VK_DELETE)
+ || ((key >= VK_F1) && (key <= VK_F24))
+ || ((key >= VK_PRIOR) && (key <= VK_DOWN))))
+ {
+ if ( (mods & SHIFT_PRESSED) == SHIFT_PRESSED)
+ retval |= shift_modifier;
+ }
+ else
+ {
if (((mods & (SHIFT_PRESSED | CAPSLOCK_ON)) == SHIFT_PRESSED)
|| ((mods & (SHIFT_PRESSED | CAPSLOCK_ON)) == CAPSLOCK_ON))
retval |= shift_modifier;
+ }
return retval;
}
/* The return code indicates key code size. */
int
-win32_kbd_patch_key (KEY_EVENT_RECORD *event)
+w32_kbd_patch_key (KEY_EVENT_RECORD *event)
{
unsigned int key_code = event->wVirtualKeyCode;
unsigned int mods = event->dwControlKeyState;
/* return code -1 means that event_queue_ptr won't be incremented.
In other word, this event makes two key codes. (by himi) */
int
-key_event (KEY_EVENT_RECORD *event, struct input_event *emacs_ev)
+key_event (KEY_EVENT_RECORD *event, struct input_event *emacs_ev, int *isdead)
{
int map;
int key_flag = 0;
static BOOL map_virt_key_init_done;
+
+ *isdead = 0;
/* Skip key-up events. */
if (!event->bKeyDown)
{
/* ASCII */
emacs_ev->kind = ascii_keystroke;
- key_flag = win32_kbd_patch_key (event); /* 95.7.25 by himi */
+ key_flag = w32_kbd_patch_key (event); /* 95.7.25 by himi */
if (key_flag == 0)
return 0;
+ if (key_flag < 0)
+ *isdead = 1;
XSETINT (emacs_ev->code, event->uChar.AsciiChar);
}
#ifdef MULE
#else
XSETFRAME (emacs_ev->frame_or_window, get_frame ());
#endif
- emacs_ev->modifiers = win32_kbd_mods_to_emacs (event->dwControlKeyState);
+ emacs_ev->modifiers = w32_kbd_mods_to_emacs (event->dwControlKeyState,
+ event->wVirtualKeyCode);
emacs_ev->timestamp = GetTickCount ();
if (key_flag == 2) return -1; /* 95.7.25 by himi */
return 1;
/* Mouse position hook. */
void
-win32_mouse_position (FRAME_PTR *f,
+w32_mouse_position (FRAME_PTR *f,
#ifndef MULE
int insist,
#endif
button_state = event->dwButtonState;
emacs_ev->timestamp = GetTickCount ();
- emacs_ev->modifiers = win32_kbd_mods_to_emacs (event->dwControlKeyState) |
+ emacs_ev->modifiers = w32_kbd_mods_to_emacs (event->dwControlKeyState, 0) |
((event->dwButtonState & mask) ? down_modifier : up_modifier);
XSETFASTINT (emacs_ev->x, event->dwMousePosition.X);
}
int
-win32_read_socket (int sd, struct input_event *bufp, int numchars,
- int waitp, int expected)
+w32_console_read_socket (int sd, struct input_event *bufp, int numchars,
+ int waitp, int expected)
{
BOOL no_events = TRUE;
int nev, ret = 0, add;
-
+ int isdead;
+
if (interrupt_input_blocked)
{
interrupt_input_pending = 1;
for (;;)
{
- nev = fill_queue (waitp != 0);
+ nev = fill_queue (0);
if (nev <= 0)
{
/* If nev == -1, there was some kind of error
switch (queue_ptr->EventType)
{
case KEY_EVENT:
- add = key_event (&queue_ptr->Event.KeyEvent, bufp);
+ add = key_event (&queue_ptr->Event.KeyEvent, bufp, &isdead);
if (add == -1) /* 95.7.25 by himi */
{
queue_ptr--;