Mercurial > emacs
changeset 14462:599a3ae1e8ea
(convert_to_key_event, is_dead_key): New functions.
(w32_read-socket): Convert console modifiers to Emacs modifiers.
Use console input routines to unify keyboard support.
(x_make_frame_visible): Make frame foreground window.
author | Geoff Voelker <voelker@cs.washington.edu> |
---|---|
date | Fri, 02 Feb 1996 02:00:56 +0000 |
parents | 4fe9540be594 |
children | 24e5bd545f4d |
files | src/w32term.c |
diffstat | 1 files changed, 63 insertions(+), 13 deletions(-) [+] |
line wrap: on
line diff
--- a/src/w32term.c Fri Feb 02 01:58:01 1996 +0000 +++ b/src/w32term.c Fri Feb 02 02:00:56 1996 +0000 @@ -2218,6 +2218,37 @@ int temp_index; short temp_buffer[100]; +extern int key_event (KEY_EVENT_RECORD *, struct input_event *); + +/* Map a Win32 WM_CHAR message into a KEY_EVENT_RECORD so that + we can use the same routines to handle input in both console + and window modes. */ + +static void +convert_to_key_event (Win32Msg *msgp, KEY_EVENT_RECORD *eventp) +{ + eventp->bKeyDown = TRUE; + eventp->wRepeatCount = 1; + eventp->wVirtualKeyCode = msgp->msg.wParam; + eventp->wVirtualScanCode = (msgp->msg.lParam & 0xFF0000) >> 16; + eventp->uChar.AsciiChar = 0; + eventp->dwControlKeyState = msgp->dwModifiers; +} + +/* Return nonzero if the virtual key is a dead key. */ + +static int +is_dead_key (int wparam) +{ + unsigned int code = MapVirtualKey (wparam, 2); + + /* Win95 returns 0x8000, NT returns 0x80000000. */ + if ((code & 0x8000) || (code & 0x80000000)) + return 1; + else + return 0; +} + /* Read events coming from the Win32 shell. This routine is called by the SIGIO handler. We return as soon as there are no more events to be read. @@ -2319,7 +2350,7 @@ temp_buffer[temp_index++] = msg.msg.wParam; bufp->kind = non_ascii_keystroke; bufp->code = msg.msg.wParam; - bufp->modifiers = msg.dwModifiers; + bufp->modifiers = win32_kbd_mods_to_emacs (msg.dwModifiers); XSETFRAME (bufp->frame_or_window, f); bufp->timestamp = msg.msg.time; bufp++; @@ -2335,17 +2366,33 @@ { if (numchars > 1) { + int add; + KEY_EVENT_RECORD key, *keyp = &key; + if (temp_index == sizeof temp_buffer / sizeof (short)) temp_index = 0; - temp_buffer[temp_index++] = msg.msg.wParam; - bufp->kind = ascii_keystroke; - bufp->code = msg.msg.wParam; - XSETFRAME (bufp->frame_or_window, f); - bufp->modifiers = msg.dwModifiers; - bufp->timestamp = msg.msg.time; - bufp++; - numchars--; - count++; + + convert_to_key_event (&msg, keyp); + add = key_event (keyp, bufp); + if (add == -1) + { + /* The key pressed generated two characters, most likely + an accent character and a key that could not be + combined with it. Prepend the message on the queue + again to process the second character (which is + being held internally in key_event), and process + the first character now. */ + prepend_msg (&msg); + add = 1; + } + + /* Throw dead keys away. */ + if (is_dead_key (msg.msg.wParam)) + break; + + bufp += add; + numchars -= add; + count += add; } else { @@ -3283,11 +3330,14 @@ if we get to x_make_frame_visible a second time before the window gets really visible. */ if (! FRAME_ICONIFIED_P (f) - && ! f->output_data.win32->asked_for_visible) - x_set_offset (f, f->output_data.win32->left_pos, f->output_data.win32->top_pos, 0); + && ! f->output_data.win32->asked_for_visible) + { + x_set_offset (f, f->output_data.win32->left_pos, + f->output_data.win32->top_pos, 0); + SetForegroundWindow (FRAME_WIN32_WINDOW (f)); + } f->output_data.win32->asked_for_visible = 1; - ShowWindow (FRAME_WIN32_WINDOW (f), SW_SHOW); }