]> code.delx.au - gnu-emacs/blobdiff - src/w32inevt.c
(SETUP_SYNTAX_TABLE_FOR_OBJECT): Call bytepos_to_charpos.
[gnu-emacs] / src / w32inevt.c
index f7565affb9431fda5d26b48b6771e28415745654..dc3fdf301b830d21cd2d949e3e675ab57f3bbe36 100644 (file)
@@ -1,4 +1,4 @@
-/* Input event support for Windows NT port of GNU Emacs.
+/* 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.
@@ -47,6 +47,12 @@ extern void reinvoke_input_signal (void);
 /* from dispnew.c */
 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];
@@ -93,7 +99,7 @@ get_frame (void)
 /* Translate console modifiers to emacs modifiers.  
    German keyboard support (Kai Morgan Zeise 2/18/95).  */
 int
-win32_kbd_mods_to_emacs (DWORD mods)
+w32_kbd_mods_to_emacs (DWORD mods, WORD key)
 {
   int retval = 0;
 
@@ -103,7 +109,7 @@ win32_kbd_mods_to_emacs (DWORD mods)
     mods &= ~ (RIGHT_ALT_PRESSED | LEFT_CTRL_PRESSED);
 
   if (mods & (RIGHT_ALT_PRESSED | LEFT_ALT_PRESSED))
-    retval = meta_modifier;
+    retval = ((NILP (Vw32_alt_is_meta)) ? alt_modifier : meta_modifier);
   
   if (mods & (RIGHT_CTRL_PRESSED | LEFT_CTRL_PRESSED))
     {
@@ -113,16 +119,30 @@ win32_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;
 }
 
 /* The return code indicates key code size. */
 int
-win32_kbd_patch_key (KEY_EVENT_RECORD *event)
+w32_kbd_patch_key (KEY_EVENT_RECORD *event)
 {
   unsigned int key_code = event->wVirtualKeyCode;
   unsigned int mods = event->dwControlKeyState;
@@ -285,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)
@@ -328,9 +350,11 @@ key_event (KEY_EVENT_RECORD *event, struct input_event *emacs_ev)
     {
       /* ASCII */
       emacs_ev->kind = ascii_keystroke;
-      key_flag = win32_kbd_patch_key (event); /* 95.7.25 by himi */
+      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
@@ -372,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 = win32_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;
@@ -380,7 +405,7 @@ key_event (KEY_EVENT_RECORD *event, struct input_event *emacs_ev)
 
 /* Mouse position hook.  */
 void 
-win32_mouse_position (FRAME_PTR *f,
+w32_mouse_position (FRAME_PTR *f,
 #ifndef MULE
                      int insist,
 #endif
@@ -479,7 +504,7 @@ do_mouse_event (MOUSE_EVENT_RECORD *event,
   
   button_state = event->dwButtonState;
   emacs_ev->timestamp = GetTickCount ();
-  emacs_ev->modifiers = win32_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);
@@ -504,12 +529,13 @@ resize_event (WINDOW_BUFFER_SIZE_RECORD *event)
 }
 
 int 
-win32_read_socket (int sd, struct input_event *bufp, int numchars,
-                  int waitp, int expected)
+w32_console_read_socket (int sd, struct input_event *bufp, int numchars,
+                        int waitp, int expected)
 {
   BOOL no_events = TRUE;
   int nev, ret = 0, add;
-  
+  int isdead;
+
   if (interrupt_input_blocked)
     {
       interrupt_input_pending = 1;
@@ -521,7 +547,7 @@ win32_read_socket (int sd, struct input_event *bufp, int numchars,
   
   for (;;)
     {
-      nev = fill_queue (waitp != 0);
+      nev = fill_queue (0);
       if (nev <= 0)
         {
          /* If nev == -1, there was some kind of error
@@ -536,7 +562,7 @@ win32_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--;