/* Input event support for Emacs on the Microsoft W32 API.
- Copyright (C) 1992, 1993, 1995, 2001, 2002, 2003, 2004, 2005, 2006,
- 2007, 2008, 2009, 2010 Free Software Foundation, Inc.
+ Copyright (C) 1992-1993, 1995, 2001-2011 Free Software Foundation, Inc.
This file is part of GNU Emacs.
*/
-#ifdef HAVE_CONFIG_H
#include <config.h>
-#endif
-
-#include <stdlib.h>
#include <stdio.h>
#include <windows.h>
#include <setjmp.h>
#include "w32heap.h"
#include "w32term.h"
-/* stdin, from ntterm */
+/* stdin, from w32console.c */
extern HANDLE keyboard_handle;
/* Info for last mouse motion */
static COORD movement_pos;
static DWORD movement_time;
-/* from keyboard.c */
-extern void reinvoke_input_signal (void);
-
-/* from w32console.c */
-extern int w32_use_full_screen_buffer;
-
/* from w32fns.c */
-extern Lisp_Object Vw32_alt_is_meta;
extern unsigned int map_keypad_keys (unsigned int, unsigned int);
-
-/* from w32term */
-extern Lisp_Object Vw32_capslock_is_shiftlock;
-extern Lisp_Object Vw32_enable_caps_lock;
-extern Lisp_Object Vw32_enable_num_lock;
-extern Lisp_Object Vw32_recognize_altgr;
-extern Lisp_Object Vw32_pass_lwindow_to_system;
-extern Lisp_Object Vw32_pass_rwindow_to_system;
-extern Lisp_Object Vw32_phantom_key_code;
-extern Lisp_Object Vw32_lwindow_modifier;
-extern Lisp_Object Vw32_rwindow_modifier;
-extern Lisp_Object Vw32_apps_modifier;
-extern Lisp_Object Vw32_scroll_lock_modifier;
extern unsigned int w32_key_to_modifier (int key);
/* Event queue */
static INPUT_RECORD event_queue[EVENT_QUEUE_SIZE];
static INPUT_RECORD *queue_ptr = event_queue, *queue_end = event_queue;
+/* Temporarily store lead byte of DBCS input sequences. */
+static char dbcs_lead = 0;
+
static int
fill_queue (BOOL block)
{
keystate, buf, 128, 0);
if (isdead > 0)
{
- char cp[20];
- int cpId;
+ char cp[20];
+ int cpId;
- GetLocaleInfo (GetThreadLocale (),
+ event->uChar.UnicodeChar = buf[isdead - 1];
+
+ GetLocaleInfo (GetThreadLocale (),
LOCALE_IDEFAULTANSICODEPAGE, cp, 20);
- cpId = atoi (cp);
- isdead = WideCharToMultiByte (cpId, 0, buf, isdead,
+ cpId = atoi (cp);
+ isdead = WideCharToMultiByte (cpId, 0, buf, isdead,
ansi_code, 4, NULL, NULL);
}
else
}
-extern char *lispy_function_keys[];
-
static int faked_key = 0;
/* return code -1 means that event_queue_ptr won't be incremented.
In other word, this event makes two key codes. (by himi) */
-int
+static int
key_event (KEY_EVENT_RECORD *event, struct input_event *emacs_ev, int *isdead)
{
static int mod_key_state = 0;
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))
else if (event->uChar.AsciiChar == 0)
w32_kbd_patch_key (event);
}
+
if (event->uChar.AsciiChar == 0)
- return 0;
- emacs_ev->code = event->uChar.AsciiChar;
+ {
+ emacs_ev->kind = NO_EVENT;
+ return 0;
+ }
+ else if (event->uChar.AsciiChar > 0)
+ {
+ emacs_ev->kind = ASCII_KEYSTROKE_EVENT;
+ emacs_ev->code = event->uChar.AsciiChar;
+ }
+ else if (event->uChar.UnicodeChar > 0)
+ {
+ emacs_ev->kind = MULTIBYTE_CHAR_KEYSTROKE_EVENT;
+ emacs_ev->code = event->uChar.UnicodeChar;
+ }
+ else
+ {
+ /* Fallback for non-Unicode versions of Windows. */
+ wchar_t code;
+ char dbcs[2];
+ char cp[20];
+ int cpId;
+
+ /* Get the codepage to interpret this key with. */
+ GetLocaleInfo (GetThreadLocale (),
+ LOCALE_IDEFAULTANSICODEPAGE, cp, 20);
+ cpId = atoi (cp);
+
+ dbcs[0] = dbcs_lead;
+ dbcs[1] = event->uChar.AsciiChar;
+ if (dbcs_lead)
+ {
+ dbcs_lead = 0;
+ if (!MultiByteToWideChar (cpId, 0, dbcs, 2, &code, 1))
+ {
+ /* Garbage */
+ DebPrint (("Invalid DBCS sequence: %d %d\n",
+ dbcs[0], dbcs[1]));
+ emacs_ev->kind = NO_EVENT;
+ }
+ }
+ else if (IsDBCSLeadByteEx (cpId, dbcs[1]))
+ {
+ dbcs_lead = dbcs[1];
+ emacs_ev->kind = NO_EVENT;
+ }
+ else
+ {
+ if (!MultiByteToWideChar (cpId, 0, &dbcs[1], 1, &code, 1))
+ {
+ /* Garbage */
+ DebPrint (("Invalid character: %d\n", dbcs[1]));
+ emacs_ev->kind = NO_EVENT;
+ }
+ }
+ emacs_ev->kind = MULTIBYTE_CHAR_KEYSTROKE_EVENT;
+ emacs_ev->code = code;
+ }
}
else
{
*part = 0;
SELECTED_FRAME ()->mouse_moved = 0;
- XSETINT(*x, movement_pos.X);
- XSETINT(*y, movement_pos.Y);
+ XSETINT (*x, movement_pos.X);
+ XSETINT (*y, movement_pos.Y);
*time = movement_time;
UNBLOCK_INPUT;
}
static void
-maybe_generate_resize_event ()
+maybe_generate_resize_event (void)
{
CONSOLE_SCREEN_BUFFER_INFO info;
FRAME_PTR f = get_frame ();
int expected,
struct input_event *hold_quit)
{
- BOOL no_events = TRUE;
int nev, ret = 0, add;
int isdead;
return ret;
}
-/* arch-tag: 0bcb39b7-d085-4b85-9070-6750e8c03047
- (do not change this comment) */