]> code.delx.au - gnu-emacs/blobdiff - src/w32inevt.c
(Fnext_property_change): Properly offset interval
[gnu-emacs] / src / w32inevt.c
index 76f5be277be97aca8986c45cd3d9b165d1c870a5..fdd3d792b030a78ec05519a6a847b5258c62630e 100644 (file)
@@ -50,6 +50,10 @@ 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;
+extern Lisp_Object Vw32_recognize_altgr;
+
 /* Event queue */
 #define EVENT_QUEUE_SIZE 50
 static INPUT_RECORD event_queue[EVENT_QUEUE_SIZE];
@@ -96,12 +100,14 @@ get_frame (void)
 /* Translate console modifiers to emacs modifiers.  
    German keyboard support (Kai Morgan Zeise 2/18/95).  */
 int
-w32_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);
 
@@ -116,9 +122,36 @@ w32_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;
 }
@@ -147,7 +180,10 @@ w32_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)
@@ -334,6 +373,8 @@ key_event (KEY_EVENT_RECORD *event, struct input_event *emacs_ev)
       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 = w32_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 
-w32_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 = w32_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);
@@ -508,11 +550,12 @@ resize_event (WINDOW_BUFFER_SIZE_RECORD *event)
 
 int 
 w32_console_read_socket (int sd, struct input_event *bufp, int numchars,
-                        int waitp, int expected)
+                        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 @@ w32_console_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--;