-/* Input event support for Emacs under Win32 API.
+/* 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 w32fns.c */
extern Lisp_Object Vw32_alt_is_meta;
+/* from w32term */
+extern Lisp_Object Vw32_capslock_is_shiftlock;
+extern Lisp_Object Vw32_recognize_altgr;
+
/* 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
-w32_kbd_mods_to_emacs (DWORD mods)
+w32_kbd_mods_to_emacs (DWORD mods, WORD key)
{
int retval = 0;
- /* If AltGr has been pressed, remove it. */
- if ((mods & (RIGHT_ALT_PRESSED | LEFT_CTRL_PRESSED))
+ /* If we recognize right-alt and left-ctrl as AltGr, and it has been
+ pressed, remove the modifiers. */
+ if (!NILP (Vw32_recognize_altgr)
+ && (mods & (RIGHT_ALT_PRESSED | LEFT_CTRL_PRESSED))
== (RIGHT_ALT_PRESSED | LEFT_CTRL_PRESSED))
mods &= ~ (RIGHT_ALT_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) &&
+#if 1
+ ( (key == VK_BACK) ||
+ (key == VK_TAB) ||
+ (key == VK_CLEAR) ||
+ (key == VK_RETURN) ||
+ (key == VK_ESCAPE) ||
+ ( (key >= VK_SPACE) && (key <= VK_HELP)) ||
+ ( (key >= VK_NUMPAD0) && (key <= VK_F24))
+ )
+#else
+ /* Perhaps easier to say which keys we *do* always want affected
+ by capslock. Not sure how this affects "alphabetic" keyboard
+ input in non-English languages though - what virtual key codes
+ are returned for accented letters, for instance? */
+ !( (key >= '0' && key <= '9') || (key >= 'A' && key <= 'Z') )
+#endif
+ )
+ {
+ 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;
}
keystate[VK_SHIFT] = 0x80;
if (mods & CAPSLOCK_ON)
keystate[VK_CAPITAL] = 1;
- if ((mods & LEFT_CTRL_PRESSED) && (mods & RIGHT_ALT_PRESSED))
+ /* If we recognize right-alt and left-ctrl as AltGr, set the key
+ states accordingly before invoking ToAscii. */
+ if (!NILP (Vw32_recognize_altgr)
+ && (mods & LEFT_CTRL_PRESSED) && (mods & RIGHT_ALT_PRESSED))
{
keystate[VK_CONTROL] = 0x80;
keystate[VK_LCONTROL] = 0x80;
-2, /* . */
-2, /* / */
-2, /* ` */
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 0xcf */
+ -2, /* 0xc1: on Brazilian keyboards, this is the /(?) key. */
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 0xcf */
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 0xda */
-2, -2, -2, -2, -2, /* 0xdf */
-2, -2, -2, -2, -2,
/* 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)
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 = 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;
/* Mouse position hook. */
void
-w32_mouse_position (FRAME_PTR *f,
+w32_console_mouse_position (FRAME_PTR *f,
#ifndef MULE
- int insist,
+ int insist,
#endif
- Lisp_Object *bar_window,
- enum scroll_bar_part *part,
- Lisp_Object *x,
- Lisp_Object *y,
- unsigned long *time)
+ Lisp_Object *bar_window,
+ enum scroll_bar_part *part,
+ Lisp_Object *x,
+ Lisp_Object *y,
+ unsigned long *time)
{
BLOCK_INPUT;
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);
int
w32_console_read_socket (int sd, struct input_event *bufp, int numchars,
- int waitp, int expected)
+ int expected)
{
BOOL no_events = TRUE;
int nev, ret = 0, add;
-
+ int isdead;
+
if (interrupt_input_blocked)
{
interrupt_input_pending = 1;
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--;