From 59131421e9a8628686201e9122d7eade410247a3 Mon Sep 17 00:00:00 2001 From: Geoff Voelker Date: Wed, 3 Sep 1997 00:52:40 +0000 Subject: [PATCH] Declare externs from other files. (w32_kbd_mods_to_emacs): New parameter KEY. Use w32-capslock-is-shiftlock for old behavior. (key_event): Pass in new parameter to w32_kbd_mods_to_emacs. (key_event): New parameter isdead. Set isdead if the key press was done using a dead key. --- src/w32inevt.c | 35 +++++++++++++++++++++++++++++------ 1 file changed, 29 insertions(+), 6 deletions(-) diff --git a/src/w32inevt.c b/src/w32inevt.c index 76f5be277be..dc3fdf301b8 100644 --- a/src/w32inevt.c +++ b/src/w32inevt.c @@ -50,6 +50,9 @@ 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]; @@ -96,7 +99,7 @@ get_frame (void) /* Translate console modifiers to emacs modifiers. German keyboard support (Kai Morgan Zeise 2/18/95). */ int -w32_kbd_mods_to_emacs (DWORD mods) +w32_kbd_mods_to_emacs (DWORD mods, WORD key) { int retval = 0; @@ -116,9 +119,23 @@ w32_kbd_mods_to_emacs (DWORD mods) 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; } @@ -288,11 +305,13 @@ static int map_virt_key[256] = /* 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) @@ -334,6 +353,8 @@ key_event (KEY_EVENT_RECORD *event, struct input_event *emacs_ev) 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 @@ -375,7 +396,8 @@ key_event (KEY_EVENT_RECORD *event, struct input_event *emacs_ev) #else XSETFRAME (emacs_ev->frame_or_window, get_frame ()); #endif - emacs_ev->modifiers = w32_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; @@ -482,7 +504,7 @@ do_mouse_event (MOUSE_EVENT_RECORD *event, button_state = event->dwButtonState; emacs_ev->timestamp = GetTickCount (); - emacs_ev->modifiers = w32_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); @@ -512,7 +534,8 @@ w32_console_read_socket (int sd, struct input_event *bufp, int numchars, { BOOL no_events = TRUE; int nev, ret = 0, add; - + int isdead; + if (interrupt_input_blocked) { interrupt_input_pending = 1; @@ -539,7 +562,7 @@ w32_console_read_socket (int sd, struct input_event *bufp, int numchars, 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--; -- 2.39.2