]> code.delx.au - gnu-emacs/blobdiff - src/w32inevt.c
(Fnext_property_change): Properly offset interval
[gnu-emacs] / src / w32inevt.c
index 2a6553196c509527333b6e360c795946e7975a62..fdd3d792b030a78ec05519a6a847b5258c62630e 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.
@@ -48,7 +48,11 @@ extern void reinvoke_input_signal (void);
 extern int change_frame_size (FRAME_PTR, int, int, int, int);
 
 /* from w32fns.c */
-extern Lisp_Object Vwin32_alt_is_meta;
+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
@@ -96,17 +100,19 @@ 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;
 
-  /* 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);
 
   if (mods & (RIGHT_ALT_PRESSED | LEFT_ALT_PRESSED))
-    retval = ((NILP (Vwin32_alt_is_meta)) ? alt_modifier : meta_modifier);
+    retval = ((NILP (Vw32_alt_is_meta)) ? alt_modifier : meta_modifier);
   
   if (mods & (RIGHT_CTRL_PRESSED | LEFT_CTRL_PRESSED))
     {
@@ -116,16 +122,43 @@ 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) &&
+#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;
 }
 
 /* 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;
@@ -147,7 +180,10 @@ win32_kbd_patch_key (KEY_EVENT_RECORD *event)
     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;
@@ -273,7 +309,8 @@ static int map_virt_key[256] =
   -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,
@@ -288,11 +325,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)
@@ -331,9 +370,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
@@ -375,7 +416,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;
@@ -383,15 +425,15 @@ key_event (KEY_EVENT_RECORD *event, struct input_event *emacs_ev)
 
 /* Mouse position hook.  */
 void 
-win32_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;
 
@@ -482,7 +524,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);
@@ -507,12 +549,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 expected)
 {
   BOOL no_events = TRUE;
   int nev, ret = 0, add;
-  
+  int isdead;
+
   if (interrupt_input_blocked)
     {
       interrupt_input_pending = 1;
@@ -539,7 +582,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--;