changeset 11386:62e2ab942896

(do_mouse_event): Use XSETFASTINT. (SET_FRAME): Undefined. (select): Renamed to sys_select to correspond to routine in sysdep.c (sys_select): Support struct timeval. (key_event): Support German keyboard. Replace SET_FRAME with XSETFRAME. (nt_kbd_mods_to_emacs): Renamed to win32_kbd_mods_to_emacs. (win32_kbd_mods_to_emacs): Support AltGr on German keyboards. (win32_number_shift_map): Defined. (WIN32_KEY_SHIFTED): Defined. (win32_patch_key): Defined. (map_virt_key): Support VK_OEM_102 for German keyboards. (win32_mouse_position): Add arg insist. (do_mouse_event): Replace SET_FRAME with XSETFRAME. Use win32_kbd_mods_to_emacs.
author Karl Heuer <kwzh@gnu.org>
date Wed, 12 Apr 1995 02:23:35 +0000
parents 5eb009221225
children b2d5260a5da0
files src/w32inevt.c
diffstat 1 files changed, 106 insertions(+), 21 deletions(-) [+]
line wrap: on
line diff
--- a/src/w32inevt.c	Wed Apr 12 02:12:02 1995 +0000
+++ b/src/w32inevt.c	Wed Apr 12 02:23:35 1995 +0000
@@ -1,5 +1,5 @@
 /* Input event support for Windows NT port of GNU Emacs.
-   Copyright (C) 1992, 1993 Free Software Foundation, Inc.
+   Copyright (C) 1992, 1993, 1995 Free Software Foundation, Inc.
 
    This file is part of GNU Emacs.
 
@@ -92,22 +92,90 @@
   return selected_frame;
 }
 
-#ifdef MULTI_FRAME
-#define SET_FRAME(o, f) XSETFRAME (o, f)
-#else
-#define SET_FRAME(o, f) ((o) = Qnil)
-#endif
-
-/* Translate console modifiers to emacs modifiers.  */
+/* Translate console modifiers to emacs modifiers.  
+   German keyboard support (Kai Morgan Zeise 2/18/95).  */
 static int 
-nt_kbd_mods_to_emacs (DWORD mods)
+win32_kbd_mods_to_emacs (DWORD mods)
+{
+  int retval = 0;
+
+  /* If AltGr has been pressed, remove it.  */
+  if ((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 = meta_modifier;
+  
+  if (mods & (RIGHT_CTRL_PRESSED | LEFT_CTRL_PRESSED))
+    {
+      retval |= ctrl_modifier;
+      if ((mods & (RIGHT_CTRL_PRESSED | LEFT_CTRL_PRESSED)) 
+	  == (RIGHT_CTRL_PRESSED | LEFT_CTRL_PRESSED))
+	retval |= meta_modifier;
+    }
+
+  if (((mods & (SHIFT_PRESSED | CAPSLOCK_ON)) == SHIFT_PRESSED)
+      || ((mods & (SHIFT_PRESSED | CAPSLOCK_ON)) == CAPSLOCK_ON))
+    retval |= shift_modifier;
+
+  return retval;
+}
+
+/* Patch up NT keyboard events when info is missing that should be there,
+   assuming that map_virt_key says that the key is a valid ASCII char. */
+static char win32_number_shift_map[] = {
+  ')', '!', '@', '#', '$', '%', '^', '&', '*', '('
+};
+
+#define WIN32_KEY_SHIFTED(mods, no, yes) \
+  ((mods & (SHIFT_PRESSED | CAPSLOCK_ON)) ? yes : no)
+
+static void
+win32_kbd_patch_key (KEY_EVENT_RECORD *event)
 {
-  return ((mods & (RIGHT_ALT_PRESSED | LEFT_ALT_PRESSED)) ?
-	  meta_modifier : 0) |
-	    ((mods & (RIGHT_CTRL_PRESSED | LEFT_CTRL_PRESSED)) ?
-	     ctrl_modifier : 0) |
-	       ((mods & (SHIFT_PRESSED | CAPSLOCK_ON)) ?
-		shift_modifier : 0);
+  unsigned int key_code = event->wVirtualKeyCode;
+  unsigned int mods = event->dwControlKeyState;
+  int mapped_punct = 0;
+
+  /* map_virt_key says its a valid key, but the uChar.AsciiChar field
+     is empty.  patch up the uChar.AsciiChar field using wVirtualKeyCode.  */
+  if (event->uChar.AsciiChar == 0
+      && ((key_code >= '0' && key_code <= '9')
+	  || (key_code >= 'A' && key_code <= 'Z')
+	  || (key_code >= 0xBA && key_code <= 0xC0)
+	  || (key_code >= 0xDB && key_code <= 0xDE)
+	  )) {
+    if (key_code >= '0' && key_code <= '9') {
+      event->uChar.AsciiChar = 
+	WIN32_KEY_SHIFTED (mods, key_code,
+			win32_number_shift_map[key_code - '0']);
+      return;
+    }
+    switch (key_code) {
+    case 0xBA: mapped_punct = WIN32_KEY_SHIFTED (mods, ';', ':'); break;
+    case 0xBB: mapped_punct = WIN32_KEY_SHIFTED (mods, '=', '+'); break;
+    case 0xBC: mapped_punct = WIN32_KEY_SHIFTED (mods, ',', '<'); break;
+    case 0xBD: mapped_punct = WIN32_KEY_SHIFTED (mods, '-', '_'); break;
+    case 0xBE: mapped_punct = WIN32_KEY_SHIFTED (mods, '.', '>'); break;
+    case 0xBF: mapped_punct = WIN32_KEY_SHIFTED (mods, '/', '?'); break;
+    case 0xC0: mapped_punct = WIN32_KEY_SHIFTED (mods, '`', '~'); break;
+    case 0xDB: mapped_punct = WIN32_KEY_SHIFTED (mods, '[', '{'); break;
+    case 0xDC: mapped_punct = WIN32_KEY_SHIFTED (mods, '\\', '|'); break;
+    case 0xDD: mapped_punct = WIN32_KEY_SHIFTED (mods, ']', '}'); break;
+    case 0xDE: mapped_punct = WIN32_KEY_SHIFTED (mods, '\'', '"'); break;
+    default:
+      mapped_punct = 0;
+      break;
+    }
+    if (mapped_punct) {
+      event->uChar.AsciiChar = mapped_punct;
+      return;
+    }
+    /* otherwise, it's a letter.  */
+    event->uChar.AsciiChar = WIN32_KEY_SHIFTED (mods, key_code - 'A' + 'a',
+						key_code);
+  }
 }
 
 /* Map virtual key codes into:
@@ -223,7 +291,8 @@
   -2,                 /* ] */
   -2,                 /* ' */
   -1, /* 0xdf */
-  -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 0xef */
+  -1, -1, -2,         /* VK_OEM_102 */
+  -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 0xef */
   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 /* 0xff */
 };
 
@@ -231,6 +300,7 @@
 key_event (KEY_EVENT_RECORD *event, struct input_event *emacs_ev)
 {
   int map;
+  static BOOL map_virt_key_init_done;
   
   /* Skip key-up events.  */
   if (event->bKeyDown == FALSE)
@@ -241,6 +311,17 @@
       printf ("Unknown key code %d\n", event->wVirtualKeyCode);
       return 0;
     }
+
+  /* Patch needed for German keyboard. Ulrich Leodolter (1/11/95).  */
+  if (! map_virt_key_init_done) 
+    {
+      short vk;
+
+      if ((vk = VkKeyScan (0x3c)) >= 0 && vk < 256) map_virt_key[vk] = -2; /* less */
+      if ((vk = VkKeyScan (0x3e)) >= 0 && vk < 256) map_virt_key[vk] = -2; /* greater */
+
+      map_virt_key_init_done = TRUE;
+    }
   
   /* BUGBUG - Ignores the repeat count
      It's questionable whether we want to obey the repeat count anyway
@@ -258,6 +339,7 @@
     {
       /* ASCII */
       emacs_ev->kind = ascii_keystroke;
+      win32_kbd_patch_key (event);
       XSETINT (emacs_ev->code, event->uChar.AsciiChar);
     }
   else
@@ -271,15 +353,16 @@
       map |= 0xff00;
       XSETINT (emacs_ev->code, map);
     }
-  SET_FRAME (emacs_ev->frame_or_window, get_frame ());
-  emacs_ev->modifiers = nt_kbd_mods_to_emacs (event->dwControlKeyState);
+  XSETFRAME (emacs_ev->frame_or_window, get_frame ());
+  emacs_ev->modifiers = win32_kbd_mods_to_emacs (event->dwControlKeyState);
   emacs_ev->timestamp = GetTickCount ();
   return 1;
 }
 
 /* Mouse position hook.  */
 void 
-win32_mouse_position (FRAME_PTR *f, int insist,
+win32_mouse_position (FRAME_PTR *f,
+		      int insist,
 		      Lisp_Object *bar_window,
 		      enum scroll_bar_part *part,
 		      Lisp_Object *x,
@@ -288,6 +371,8 @@
 {
   BLOCK_INPUT;
   
+  insist = insist;
+
   *f = get_frame ();
   *bar_window = Qnil;
   *part = 0;
@@ -371,12 +456,12 @@
   
   button_state = event->dwButtonState;
   emacs_ev->timestamp = GetTickCount ();
-  emacs_ev->modifiers = nt_kbd_mods_to_emacs (event->dwControlKeyState) |
+  emacs_ev->modifiers = win32_kbd_mods_to_emacs (event->dwControlKeyState) |
     ((event->dwButtonState & mask) ? down_modifier : up_modifier);
   
   XSETFASTINT (emacs_ev->x, event->dwMousePosition.X);
   XSETFASTINT (emacs_ev->y, event->dwMousePosition.Y);
-  SET_FRAME (emacs_ev->frame_or_window, get_frame ());
+  XSETFRAME (emacs_ev->frame_or_window, get_frame ());
   
   return 1;
 }