diff src/event-Xt.c @ 253:157b30c96d03 r20-5b25

Import from CVS: tag r20-5b25
author cvs
date Mon, 13 Aug 2007 10:20:27 +0200
parents 262b8bb4a523
children 11cf20601dec
line wrap: on
line diff
--- a/src/event-Xt.c	Mon Aug 13 10:20:01 2007 +0200
+++ b/src/event-Xt.c	Mon Aug 13 10:20:27 2007 +0200
@@ -115,6 +115,7 @@
   0
 };
 
+static Lisp_Object x_keysym_to_emacs_keysym (KeySym keysym, int simple_p);
 void emacs_Xt_mapping_action (Widget w, XEvent *event);
 void debug_process_finalization (struct Lisp_Process *p);
 void emacs_Xt_event_handler (Widget wid, XtPointer closure, XEvent *event,
@@ -193,8 +194,12 @@
     XGetKeyboardMapping (display, xd->x_keysym_map_min_code, key_code_count,
 			 &xd->x_keysym_map_keysyms_per_code);
 
-  xd->x_keysym_map_hashtable = hashtable =
-    make_lisp_hashtable (128, HASHTABLE_NONWEAK, HASHTABLE_EQUAL);
+  hashtable = xd->x_keysym_map_hashtable;
+  if (HASHTABLEP (hashtable))
+    Fclrhash (hashtable);
+  else
+    xd->x_keysym_map_hashtable = hashtable =
+      make_lisp_hashtable (128, HASHTABLE_NONWEAK, HASHTABLE_EQUAL);
 
   for (keysym = xd->x_keysym_map,
 	 keysyms_per_code = xd->x_keysym_map_keysyms_per_code,
@@ -203,25 +208,32 @@
        keysym += keysyms_per_code)
     {
       int j;
-      char *keysym_name;
 
       if (keysym[0] == NoSymbol)
 	continue;
 
-      if ((keysym_name = XKeysymToString (keysym[0])) != NULL)
-	Fputhash (build_string (keysym_name), Qsans_modifiers, hashtable);
+      {
+	char *name = XKeysymToString (keysym[0]);
+	Lisp_Object sym = x_keysym_to_emacs_keysym (keysym[0], 0);
+	if (name)
+	  {
+	    Fputhash (build_string (name), Qsans_modifiers, hashtable);
+	    Fputhash (sym, Qsans_modifiers, hashtable);
+	  }
+      }
 
       for (j = 1; j < keysyms_per_code; j++)
 	{
-	  if (keysym[j] == keysym[0] ||
-	      keysym[j] == NoSymbol)
-	    continue;
-
-	  if ((keysym_name = XKeysymToString (keysym[j])) != NULL)
+	  if (keysym[j] != keysym[0] &&
+	      keysym[j] != NoSymbol)
 	    {
-	      Lisp_Object name = build_string (keysym_name);
-	      if (NILP (Fgethash (name, hashtable, Qnil)))
-		Fputhash (name, Qt, hashtable);
+	      char *name = XKeysymToString (keysym[j]);
+	      Lisp_Object sym = x_keysym_to_emacs_keysym (keysym[j], 0);
+	      if (name && NILP (Fgethash (sym, hashtable, Qnil)))
+		{
+		  Fputhash (build_string (name), Qt, hashtable);
+		  Fputhash (sym, Qt, hashtable);
+		}
 	    }
 	}
     }