/* Input event support for Emacs on the Microsoft W32 API.
- Copyright (C) 1992, 1993, 1995 Free Software Foundation, Inc.
+ Copyright (C) 1992, 1993, 1995, 2001, 2002, 2003, 2004,
+ 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
This file is part of GNU Emacs.
GNU Emacs is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 2, or (at your option)
+the Free Software Foundation; either version 3, or (at your option)
any later version.
GNU Emacs is distributed in the hope that it will be useful,
You should have received a copy of the GNU General Public License
along with GNU Emacs; see the file COPYING. If not, write to
-the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-Boston, MA 02111-1307, USA.
+the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+Boston, MA 02110-1301, USA.
Drew Bliss 01-Oct-93
Adapted from ntkbd.c by Tim Fleehart
*/
-#include "config.h"
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
#include <stdlib.h>
#include <stdio.h>
#include <windows.h>
+#ifndef MOUSE_MOVED
+#define MOUSE_MOVED 1
+#endif
+
#include "lisp.h"
+#include "keyboard.h"
#include "frame.h"
#include "blockinput.h"
#include "termhooks.h"
static INPUT_RECORD event_queue[EVENT_QUEUE_SIZE];
static INPUT_RECORD *queue_ptr = event_queue, *queue_end = event_queue;
-static int
+static int
fill_queue (BOOL block)
{
BOOL rc;
DWORD events_waiting;
-
+
if (queue_ptr < queue_end)
return queue_end-queue_ptr;
-
+
if (!block)
{
/* Check to see if there are some events to read before we try
if (events_waiting == 0)
return 0;
}
-
+
rc = ReadConsoleInput (keyboard_handle, event_queue, EVENT_QUEUE_SIZE,
&events_waiting);
if (!rc)
and return the frame for it
Right now, there's only one frame so return it. */
-static FRAME_PTR
+static FRAME_PTR
get_frame (void)
{
return SELECTED_FRAME ();
}
-/* Translate console modifiers to emacs modifiers.
+/* Translate console modifiers to emacs modifiers.
German keyboard support (Kai Morgan Zeise 2/18/95). */
int
w32_kbd_mods_to_emacs (DWORD mods, WORD key)
/* If we recognize right-alt and left-ctrl as AltGr, and it has been
pressed, first remove those modifiers. */
- if (!NILP (Vw32_recognize_altgr)
- && (mods & (RIGHT_ALT_PRESSED | LEFT_CTRL_PRESSED))
+ 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);
if (mods & (RIGHT_ALT_PRESSED | LEFT_ALT_PRESSED))
retval = ((NILP (Vw32_alt_is_meta)) ? alt_modifier : meta_modifier);
-
+
if (mods & (RIGHT_CTRL_PRESSED | LEFT_CTRL_PRESSED))
{
retval |= ctrl_modifier;
- if ((mods & (RIGHT_CTRL_PRESSED | LEFT_CTRL_PRESSED))
+ if ((mods & (RIGHT_CTRL_PRESSED | LEFT_CTRL_PRESSED))
== (RIGHT_CTRL_PRESSED | LEFT_CTRL_PRESSED))
retval |= meta_modifier;
}
isdead = 0;
return 1;
}
- if (event->uChar.AsciiChar != 0)
+ if (event->uChar.AsciiChar != 0)
return 1;
memset (keystate, 0, sizeof (keystate));
keystate[key_code] = 0x80;
- if (mods & SHIFT_PRESSED)
+ if (mods & SHIFT_PRESSED)
keystate[VK_SHIFT] = 0x80;
- if (mods & CAPSLOCK_ON)
+ if (mods & CAPSLOCK_ON)
keystate[VK_CAPITAL] = 1;
/* If we recognize right-alt and left-ctrl as AltGr, set the key
states accordingly before invoking ToAscii. */
keystate, (LPWORD) ansi_code, 0);
}
- if (isdead == 0)
+ if (isdead == 0)
return 0;
event->uChar.AsciiChar = ansi_code[0];
return isdead;
static int faked_key = 0;
-/* return code -1 means that event_queue_ptr won't be incremented.
+/* return code -1 means that event_queue_ptr won't be incremented.
In other word, this event makes two key codes. (by himi) */
-int
+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;
+ emacs_ev->kind = ASCII_KEYSTROKE_EVENT;
if (!NILP (Vw32_recognize_altgr)
&& (event->dwControlKeyState & LEFT_CTRL_PRESSED)
}
if (event->uChar.AsciiChar == 0)
return 0;
- XSETINT (emacs_ev->code, event->uChar.AsciiChar);
+ emacs_ev->code = event->uChar.AsciiChar;
}
else
{
- emacs_ev->kind = non_ascii_keystroke;
- XSETINT (emacs_ev->code, event->wVirtualKeyCode);
+ emacs_ev->kind = NON_ASCII_KEYSTROKE_EVENT;
+ emacs_ev->code = event->wVirtualKeyCode;
}
XSETFRAME (emacs_ev->frame_or_window, get_frame ());
if (NILP (new_state)
|| (NUMBERP (new_state)
- && (XUINT (new_state)) & 1 != cur_state))
+ && ((XUINT (new_state)) & 1) != cur_state))
{
faked_key = vk_code;
}
/* Mouse position hook. */
-void
+void
w32_console_mouse_position (FRAME_PTR *f,
int insist,
Lisp_Object *bar_window,
*bar_window = Qnil;
*part = 0;
SELECTED_FRAME ()->mouse_moved = 0;
-
- *x = movement_pos.X;
- *y = movement_pos.Y;
+
+ XSETINT(*x, movement_pos.X);
+ XSETINT(*y, movement_pos.Y);
*time = movement_time;
-
+
UNBLOCK_INPUT;
}
/* Remember mouse motion and notify emacs. */
-static void
+static void
mouse_moved_to (int x, int y)
{
/* If we're in the same place, ignore it */
0, 2, 1
};
-static int
+static int
do_mouse_event (MOUSE_EVENT_RECORD *event,
struct input_event *emacs_ev)
{
static DWORD button_state = 0;
DWORD but_change, mask;
int i;
-
+
if (event->dwEventFlags == MOUSE_MOVED)
{
/* For movement events we just note that the mouse has moved
mouse_moved_to (event->dwMousePosition.X, event->dwMousePosition.Y);
return 0;
}
-
+
/* It looks like the console code sends us a mouse event with
dwButtonState == 0 when a window is activated. Ignore this case. */
if (event->dwButtonState == button_state)
return 0;
-
- emacs_ev->kind = mouse_click;
-
+
+ emacs_ev->kind = MOUSE_CLICK_EVENT;
+
/* Find out what button has changed state since the last button event. */
but_change = button_state ^ event->dwButtonState;
mask = 1;
if (but_change & mask)
{
if (i < NUM_TRANSLATED_MOUSE_BUTTONS)
- XSETINT (emacs_ev->code, emacs_button_translation[i]);
+ emacs_ev->code = emacs_button_translation[i];
else
- XSETINT (emacs_ev->code, i);
+ emacs_ev->code = i;
break;
}
emacs_ev->timestamp = GetTickCount ();
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);
XSETFASTINT (emacs_ev->y, event->dwMousePosition.Y);
/* for Mule 2.2 (Based on Emacs 19.28 */
#else
XSETFRAME (emacs_ev->frame_or_window, get_frame ());
#endif
-
+
return 1;
}
-static void
+static void
resize_event (WINDOW_BUFFER_SIZE_RECORD *event)
{
FRAME_PTR f = get_frame ();
-
+
change_frame_size (f, event->dwSize.Y, event->dwSize.X, 0, 1);
SET_FRAME_GARBAGED (f);
}
0, 0);
}
-int
-w32_console_read_socket (int sd, struct input_event *bufp, int numchars,
- int expected)
+int
+w32_console_read_socket (int sd, int expected, struct input_event *hold_quit)
{
BOOL no_events = TRUE;
int nev, ret = 0, add;
interrupt_input_pending = 1;
return -1;
}
-
+
interrupt_input_pending = 0;
BLOCK_INPUT;
-
+
for (;;)
{
nev = fill_queue (0);
return nev;
}
- while (nev > 0 && numchars > 0)
+ while (nev > 0)
{
+ struct input_event inev;
+
+ EVENT_INIT (inev);
+ inev.kind = NO_EVENT;
+ inev.arg = Qnil;
+
switch (queue_ptr->EventType)
{
case KEY_EVENT:
- add = key_event (&queue_ptr->Event.KeyEvent, bufp, &isdead);
+ add = key_event (&queue_ptr->Event.KeyEvent, &inev, &isdead);
if (add == -1) /* 95.7.25 by himi */
- {
+ {
queue_ptr--;
add = 1;
}
- bufp += add;
- ret += add;
- numchars -= add;
+ if (add)
+ kbd_buffer_store_event_hold (&inev, hold_quit);
break;
case MOUSE_EVENT:
- add = do_mouse_event (&queue_ptr->Event.MouseEvent, bufp);
- bufp += add;
- ret += add;
- numchars -= add;
+ add = do_mouse_event (&queue_ptr->Event.MouseEvent, &inev);
+ if (add)
+ kbd_buffer_store_event_hold (&inev, hold_quit);
break;
case WINDOW_BUFFER_SIZE_EVENT:
if (w32_use_full_screen_buffer)
resize_event (&queue_ptr->Event.WindowBufferSizeEvent);
break;
-
+
case MENU_EVENT:
case FOCUS_EVENT:
/* Internal event types, ignored. */
break;
}
-
+
queue_ptr++;
nev--;
}
UNBLOCK_INPUT;
return ret;
}
+
+/* arch-tag: 0bcb39b7-d085-4b85-9070-6750e8c03047
+ (do not change this comment) */