changeset 39578:1d808e902c17

(make_lispy_event) [HAVE_X_WINDOWS]: If we know that EVENT->code isn't a function key, use the keysym's name. Use SYMBOL_VALUE/SET_SYMBOL_VALUE macros instead of accessing symbols' value directly.
author Gerd Moellmann <gerd@gnu.org>
date Fri, 05 Oct 2001 09:48:05 +0000
parents d93909a71fa4
children e307d3530117
files src/keyboard.c
diffstat 1 files changed, 30 insertions(+), 7 deletions(-) [+]
line wrap: on
line diff
--- a/src/keyboard.c	Fri Oct 05 09:46:11 2001 +0000
+++ b/src/keyboard.c	Fri Oct 05 09:48:05 2001 +0000
@@ -4688,12 +4688,35 @@
 				     / sizeof (iso_lispy_function_keys[0])));
       else
 #endif
-	return modify_event_symbol (event->code - FUNCTION_KEY_OFFSET,
-				    event->modifiers,
-				    Qfunction_key, Qnil,
-				    lispy_function_keys, &func_key_syms,
-				    (sizeof (lispy_function_keys)
-				     / sizeof (lispy_function_keys[0])));
+
+#ifdef HAVE_X_WINDOWS
+      if (event->code - FUNCTION_KEY_OFFSET < 0
+	  || (event->code - FUNCTION_KEY_OFFSET
+	      >= sizeof lispy_function_keys / sizeof *lispy_function_keys))
+	{
+	  /* EVENT->code is an unknown keysym, for example someone
+	     assigned `ccaron' to a key in a locale where
+	     XmbLookupString doesn't return a translation for it.  */
+	  char *name;
+	  Lisp_Object symbol;
+	  
+	  BLOCK_INPUT;
+	  /* This returns a pointer to a static area.  Don't free it.  */
+	  name = XKeysymToString (event->code);
+	  symbol = name ? intern (name) : Qnil;
+	  UNBLOCK_INPUT;
+	  
+	  if (!NILP (symbol))
+	    return apply_modifiers (event->modifiers, symbol);
+	}
+#endif /* HAVE_X_WINDOWS */
+
+      return modify_event_symbol (event->code - FUNCTION_KEY_OFFSET,
+				  event->modifiers,
+				  Qfunction_key, Qnil,
+				  lispy_function_keys, &func_key_syms,
+				  (sizeof (lispy_function_keys)
+				   / sizeof (lispy_function_keys[0])));
 
 #ifdef HAVE_MOUSE
       /* A mouse click.  Figure out where it is, decide whether it's
@@ -10717,7 +10740,7 @@
     "Normal hook run when clearing the echo area.");
 #endif
   Qecho_area_clear_hook = intern ("echo-area-clear-hook");
-  XSYMBOL (Qecho_area_clear_hook)->value = Qnil;
+  SET_SYMBOL_VALUE (Qecho_area_clear_hook, Qnil);
 
   DEFVAR_LISP ("lucid-menu-bar-dirty-flag", &Vlucid_menu_bar_dirty_flag,
     "t means menu bar, specified Lucid style, needs to be recomputed.");