diff src/keymap.c @ 934:c925bacdda60

[xemacs-hg @ 2002-07-29 09:21:12 by michaels] 2002-07-17 Marcus Crestani <crestani@informatik.uni-tuebingen.de> Markus Kaltenbach <makalten@informatik.uni-tuebingen.de> Mike Sperber <mike@xemacs.org> configure flag to turn these changes on: --use-kkcc First we added a dumpable flag to lrecord_implementation. It shows, if the object is dumpable and should be processed by the dumper. * lrecord.h (struct lrecord_implementation): added dumpable flag (MAKE_LRECORD_IMPLEMENTATION): fitted the different makro definitions to the new lrecord_implementation and their calls. Then we changed mark_object, that it no longer needs a mark method for those types that have pdump descritions. * alloc.c: (mark_object): If the object has a description, the new mark algorithm is called, and the object is marked according to its description. Otherwise it uses the mark method like before. These procedures mark objects according to their descriptions. They are modeled on the corresponding pdumper procedures. (mark_with_description): (get_indirect_count): (structure_size): (mark_struct_contents): These procedures still call mark_object, this is needed while there are Lisp_Objects without descriptions left. We added pdump descriptions for many Lisp_Objects: * extents.c: extent_auxiliary_description * database.c: database_description * gui.c: gui_item_description * scrollbar.c: scrollbar_instance_description * toolbar.c: toolbar_button_description * event-stream.c: command_builder_description * mule-charset.c: charset_description * device-msw.c: devmode_description * dialog-msw.c: mswindows_dialog_id_description * eldap.c: ldap_description * postgresql.c: pgconn_description pgresult_description * tooltalk.c: tooltalk_message_description tooltalk_pattern_description * ui-gtk.c: emacs_ffi_description emacs_gtk_object_description * events.c: * events.h: * event-stream.c: * event-Xt.c: * event-gtk.c: * event-tty.c: To write a pdump description for Lisp_Event, we converted every struct in the union event to a Lisp_Object. So we created nine new Lisp_Objects: Lisp_Key_Data, Lisp_Button_Data, Lisp_Motion_Data, Lisp_Process_Data, Lisp_Timeout_Data, Lisp_Eval_Data, Lisp_Misc_User_Data, Lisp_Magic_Data, Lisp_Magic_Eval_Data. We also wrote makro selectors and mutators for the fields of the new designed Lisp_Event and added everywhere these new abstractions. We implemented XD_UNION support in (mark_with_description), so we can describe exspecially console/device specific data with XD_UNION. To describe with XD_UNION, we added a field to these objects, which holds the variant type of the object. This field is initialized in the appendant constructor. The variant is an integer, it has also to be described in an description, if XD_UNION is used. XD_UNION is used in following descriptions: * console.c: console_description (get_console_variant): returns the variant (create_console): added variant initialization * console.h (console_variant): the different console types * console-impl.h (struct console): added enum console_variant contype * device.c: device_description (Fmake_device): added variant initialization * device-impl.h (struct device): added enum console_variant devtype * objects.c: image_instance_description font_instance_description (Fmake_color_instance): added variant initialization (Fmake_font_instance): added variant initialization * objects-impl.h (struct Lisp_Color_Instance): added color_instance_type * objects-impl.h (struct Lisp_Font_Instance): added font_instance_type * process.c: process_description (make_process_internal): added variant initialization * process.h (process_variant): the different process types
author michaels
date Mon, 29 Jul 2002 09:21:25 +0000
parents 79c6ff3eef26
children 0dc7756a58c4
line wrap: on
line diff
--- a/src/keymap.c	Sat Jul 27 03:53:09 2002 +0000
+++ b/src/keymap.c	Mon Jul 29 09:21:25 2002 +0000
@@ -281,10 +281,18 @@
 };
 
 /* No need for keymap_equal #### Why not? */
+#ifdef USE_KKCC
+DEFINE_LRECORD_IMPLEMENTATION ("keymap", keymap,
+			       1, /*dumpable-flag*/
+                               mark_keymap, print_keymap, 0, 0, 0,
+			       keymap_description,
+			       Lisp_Keymap);
+#else /* not USE_KKCC */
 DEFINE_LRECORD_IMPLEMENTATION ("keymap", keymap,
                                mark_keymap, print_keymap, 0, 0, 0,
 			       keymap_description,
 			       Lisp_Keymap);
+#endif /* not USE_KKCC */
 
 /************************************************************************/
 /*                Traversing keymaps and their parents                  */
@@ -428,11 +436,17 @@
 }
 
 static Lisp_Object
+#ifdef USE_KKCC
+make_key_description (const Lisp_Key_Data *key, int prettify)
+{
+  Lisp_Object keysym = KEY_DATA_KEYSYM(key);
+  int modifiers = KEY_DATA_MODIFIERS (key);
+#else /* not USE_KKCC */
 make_key_description (const struct key_data *key, int prettify)
 {
   Lisp_Object keysym = key->keysym;
   int modifiers = key->modifiers;
-
+#endif /* not USE_KKCC */
   if (prettify && CHARP (keysym))
     {
       /* This is a little slow, but (control a) is prettier than (control 65).
@@ -456,7 +470,11 @@
 
 static Lisp_Object
 raw_lookup_key (Lisp_Object keymap,
+#ifdef USE_KKCC
+                const Lisp_Key_Data *raw_keys, int raw_keys_count,
+#else /* not USE_KKCC */
                 const struct key_data *raw_keys, int raw_keys_count,
+#endif /* not USE_KKCC */
                 int keys_so_far, int accept_default);
 
 /* Relies on caller to gc-protect args */
@@ -640,11 +658,20 @@
 
 /* Relies on caller to gc-protect keymap, keysym, value */
 static void
+#ifdef USE_KKCC
+keymap_store (Lisp_Object keymap, const Lisp_Key_Data *key,
+#else /* not USE_KKCC */
 keymap_store (Lisp_Object keymap, const struct key_data *key,
+#endif /* not USE_KKCC */
               Lisp_Object value)
 {
+#ifdef USE_KKCC
+  Lisp_Object keysym = KEY_DATA_KEYSYM (key);
+  int modifiers = KEY_DATA_MODIFIERS (key);
+#else /* not USE_KKCC */
   Lisp_Object keysym = key->keysym;
   int modifiers = key->modifiers;
+#endif /* not USE_KKCC */
   Lisp_Keymap *k = XKEYMAP (keymap);
 
   modifiers &= ~(XEMACS_MOD_BUTTON1 | XEMACS_MOD_BUTTON2 | XEMACS_MOD_BUTTON3
@@ -1054,14 +1081,28 @@
   if (!NILP (map))
     {
       Lisp_Object idx = Fcdr (object);
+#ifdef USE_KKCC
+      Lisp_Key_Data indirection;
+#else /* not USE_KKCC */
       struct key_data indirection;
+#endif /* not USE_KKCC */
       if (CHARP (idx))
 	{
+#ifdef USE_KKCC
+	  Lisp_Object event = Fmake_event (Qnil, Qnil);
+          struct gcpro gcpro1;
+          GCPRO1 (event);
+	  XSET_EVENT_TYPE (event, empty_event);
+	  character_to_event (XCHAR (idx), XEVENT (event),
+			      XCONSOLE (Vselected_console), 0, 0);
+	  indirection = *XKEY_DATA (XEVENT_DATA (event));
+#else /* not USE_KKCC */
 	  Lisp_Event event;
 	  event.event_type = empty_event;
 	  character_to_event (XCHAR (idx), &event,
 			      XCONSOLE (Vselected_console), 0, 0);
 	  indirection = event.event.key;
+#endif /* not USE_KKCC */
 	}
       else if (CONSP (idx))
 	{
@@ -1073,7 +1114,11 @@
       else if (SYMBOLP (idx))
 	{
 	  indirection.keysym = idx;
+#ifdef USE_KKCC
+	  SET_KEY_DATA_MODIFIERS (&indirection, XINT (XCDR (idx)));
+#else /* not USE_KKCC */
 	  indirection.modifiers = 0;
+#endif /* not USE_KKCC */
 	}
       else
 	{
@@ -1099,13 +1144,24 @@
 }
 
 static Lisp_Object
+#ifdef USE_KKCC
+keymap_lookup_1 (Lisp_Object keymap, const Lisp_Key_Data *key,
+#else /* not USE_KKCC */
 keymap_lookup_1 (Lisp_Object keymap, const struct key_data *key,
+#endif /* not USE_KKCC */
                  int accept_default)
 {
   /* This function can GC */
+#ifdef USE_KKCC
+  return get_keyelt (keymap_lookup_directly (keymap,
+					     KEY_DATA_KEYSYM (key), 
+                                             KEY_DATA_MODIFIERS (key)),
+		     accept_default);
+#else /* not USE_KKCC */
   return get_keyelt (keymap_lookup_directly (keymap,
 					     key->keysym, key->modifiers),
 		     accept_default);
+#endif /* not USE_KKCC */
 }
 
 
@@ -1398,30 +1454,86 @@
  */
 
 static void
+#ifdef USE_KKCC
+define_key_parser (Lisp_Object spec, Lisp_Key_Data *returned_value)
+#else /* not USE_KKCC */
 define_key_parser (Lisp_Object spec, struct key_data *returned_value)
+#endif /* not USE_KKCC */
 {
   if (CHAR_OR_CHAR_INTP (spec))
     {
+#ifdef USE_KKCC
+      Lisp_Object event = Fmake_event (Qnil, Qnil);
+      struct gcpro gcpro1;
+      GCPRO1 (event);
+      XSET_EVENT_TYPE (event, empty_event);
+      character_to_event (XCHAR_OR_CHAR_INT (spec), XEVENT (event),
+			  XCONSOLE (Vselected_console), 0, 0);
+      SET_KEY_DATA_KEYSYM (returned_value, XKEY_DATA_KEYSYM (XEVENT_DATA (event)));
+      SET_KEY_DATA_MODIFIERS (returned_value, 
+                              XKEY_DATA_MODIFIERS (XEVENT_DATA (event)));
+#else /* not USE_KKCC */
       Lisp_Event event;
       event.event_type = empty_event;
       character_to_event (XCHAR_OR_CHAR_INT (spec), &event,
 			  XCONSOLE (Vselected_console), 0, 0);
       returned_value->keysym    = event.event.key.keysym;
       returned_value->modifiers = event.event.key.modifiers;
+#endif /* not USE_KKCC */
     }
   else if (EVENTP (spec))
     {
+#ifdef USE_KKCC
+      switch (XEVENT_TYPE (spec))
+#else /* not USE_KKCC */
       switch (XEVENT (spec)->event_type)
+#endif /* not USE_KKCC */
 	{
 	case key_press_event:
           {
+#ifdef USE_KKCC
+            SET_KEY_DATA_KEYSYM (returned_value, XKEY_DATA_KEYSYM (XEVENT_DATA (spec)));
+            SET_KEY_DATA_MODIFIERS (returned_value, XKEY_DATA_MODIFIERS (XEVENT_DATA (spec)));
+#else /* not USE_KKCC */
             returned_value->keysym    = XEVENT (spec)->event.key.keysym;
             returned_value->modifiers = XEVENT (spec)->event.key.modifiers;
+#endif /* not USE_KKCC */
 	    break;
           }
 	case button_press_event:
 	case button_release_event:
 	  {
+#ifdef USE_KKCC
+	    int down = (XEVENT_TYPE (spec) == button_press_event);
+	    switch (XBUTTON_DATA_BUTTON (XEVENT_DATA (spec)))
+	      {
+	      case 1:
+		SET_KEY_DATA_KEYSYM (returned_value, (down ? Qbutton1 : Qbutton1up)); 
+		break;
+	      case 2:
+		SET_KEY_DATA_KEYSYM (returned_value, (down ? Qbutton2 : Qbutton2up)); 
+		break;
+	      case 3:
+		SET_KEY_DATA_KEYSYM (returned_value, (down ? Qbutton3 : Qbutton3up)); 
+		break;
+	      case 4:
+		SET_KEY_DATA_KEYSYM (returned_value, (down ? Qbutton4 : Qbutton4up)); 
+		break;
+	      case 5:
+		SET_KEY_DATA_KEYSYM (returned_value, (down ? Qbutton5 : Qbutton5up)); 
+		break;
+	      case 6:
+		SET_KEY_DATA_KEYSYM (returned_value, (down ? Qbutton6 : Qbutton6up)); 
+		break;
+	      case 7:
+		SET_KEY_DATA_KEYSYM (returned_value, (down ? Qbutton7 : Qbutton7up)); 
+		break;
+	      default:
+		SET_KEY_DATA_KEYSYM (returned_value, (down ? Qbutton0 : Qbutton0up)); 
+		break;
+	      }
+	    SET_KEY_DATA_MODIFIERS (returned_value, XBUTTON_DATA_MODIFIERS (XEVENT_DATA (spec)));
+#else /* not USE_KKCC */
 	    int down = (XEVENT (spec)->event_type == button_press_event);
 	    switch (XEVENT (spec)->event.button.button)
 	      {
@@ -1443,6 +1555,7 @@
 		returned_value->keysym = (down ? Qbutton0 : Qbutton0up); break;
 	      }
 	    returned_value->modifiers = XEVENT (spec)->event.button.modifiers;
+#endif /* not USE_KKCC */
 	    break;
 	  }
 	default:
@@ -1455,8 +1568,13 @@
       if (bucky_sym_to_bucky_bit (spec) != 0)
         invalid_argument ("Key is a modifier name", spec);
       define_key_check_and_coerce_keysym (spec, &spec, 0);
+#ifdef USE_KKCC
+      SET_KEY_DATA_KEYSYM (returned_value, spec);
+      SET_KEY_DATA_MODIFIERS (returned_value, 0);
+#else /* not USE_KKCC */
       returned_value->keysym = spec;
       returned_value->modifiers = 0;
+#endif /* not USE_KKCC */
     }
   else if (CONSP (spec))
     {
@@ -1491,8 +1609,13 @@
 			   "List must be nil-terminated", spec);
 
       define_key_check_and_coerce_keysym (spec, &keysym, modifiers);
+#ifdef USE_KKCC
+      SET_KEY_DATA_KEYSYM(returned_value, keysym);
+      SET_KEY_DATA_MODIFIERS (returned_value, modifiers);
+#else /* not USE_KKCC */
       returned_value->keysym = keysym;
       returned_value->modifiers = modifiers;
+#endif /* not USE_KKCC */
     }
   else
     {
@@ -1506,7 +1629,11 @@
 key_desc_list_to_event (Lisp_Object list, Lisp_Object event,
                         int allow_menu_events)
 {
+#ifdef USE_KKCC
+  Lisp_Key_Data raw_key;
+#else /* not USE_KKCC */
   struct key_data raw_key;
+#endif /* not USE_KKCC */
 
   if (allow_menu_events &&
       CONSP (list) &&
@@ -1521,10 +1648,17 @@
 	fn = Qcall_interactively;
       else
 	fn = Qeval;
+#ifdef USE_KKCC
+      XSET_EVENT_TYPE (event, misc_user_event);
+      XSET_EVENT_CHANNEL (event, wrap_frame (selected_frame));
+      XSET_MISC_USER_DATA_FUNCTION (XEVENT_DATA (event), fn);
+      XSET_MISC_USER_DATA_OBJECT (XEVENT_DATA (event), arg);
+#else /* not USE_KKCC */
       XEVENT (event)->channel = wrap_frame (selected_frame ());
       XEVENT (event)->event_type = misc_user_event;
       XEVENT (event)->event.eval.function = fn;
       XEVENT (event)->event.eval.object = arg;
+#endif /* not USE_KKCC */
       return;
     }
 
@@ -1541,10 +1675,17 @@
     invalid_operation ("Mouse-clicks can't appear in saved keyboard macros",
 		       Qunbound);
 
+#ifdef USE_KKCC
+  XSET_EVENT_CHANNEL (event, Vselected_console);
+  XSET_EVENT_TYPE (event, key_press_event);
+  XSET_KEY_DATA_KEYSYM (XEVENT_DATA (event), raw_key.keysym);
+  XSET_KEY_DATA_MODIFIERS (XEVENT_DATA (event), KEY_DATA_MODIFIERS (&raw_key));
+#else /* not USE_KKCC */
   XEVENT (event)->channel = Vselected_console;
   XEVENT (event)->event_type = key_press_event;
   XEVENT (event)->event.key.keysym = raw_key.keysym;
   XEVENT (event)->event.key.modifiers = raw_key.modifiers;
+#endif /* not USE_KKCC */
 }
 
 
@@ -1589,8 +1730,13 @@
       ch2 = event_to_character (XEVENT (event2), 0, 0, 0);
       retval = (ch1 >= 0 && ch2 >= 0 && ch1 == ch2);
     }
+#ifdef USE_KKCC
+  else if (EQ (XKEY_DATA_KEYSYM (EVENT_DATA (event)), XKEY_DATA_KEYSYM (XEVENT_DATA (event2))) &&
+	   XKEY_DATA_MODIFIERS (EVENT_DATA (event)) == XKEY_DATA_MODIFIERS (XEVENT_DATA (event2)))
+#else /* not USE_KKCC */
   else if (EQ (event->event.key.keysym, XEVENT (event2)->event.key.keysym) &&
 	   event->event.key.modifiers == XEVENT (event2)->event.key.modifiers)
+#endif /* not USE_KKCC */
     retval = 1;
   else
     retval = 0;
@@ -1600,8 +1746,23 @@
 }
 
 static int
+#ifdef USE_KKCC
+meta_prefix_char_p (const Lisp_Key_Data *key)
+#else /* not USE_KKCC */
 meta_prefix_char_p (const struct key_data *key)
+#endif /* not USE_KKCC */
 {
+#ifdef USE_KKCC
+  Lisp_Object event = Fmake_event (Qnil, Qnil);
+  struct gcpro gcpro1;
+  GCPRO1 (event);
+
+  XSET_EVENT_TYPE (event, key_press_event);
+  XSET_EVENT_CHANNEL (event, Vselected_console);
+  XSET_KEY_DATA_KEYSYM (XEVENT_DATA (event), KEY_DATA_KEYSYM (key));
+  XSET_KEY_DATA_MODIFIERS (XEVENT_DATA (event), KEY_DATA_MODIFIERS (key));
+  return event_matches_key_specifier_p (XEVENT(event), Vmeta_prefix_char);
+#else /* not USE_KKCC */
   Lisp_Event event;
 
   event.event_type = key_press_event;
@@ -1609,6 +1770,7 @@
   event.event.key.keysym = key->keysym;
   event.event.key.modifiers = key->modifiers;
   return event_matches_key_specifier_p (&event, Vmeta_prefix_char);
+#endif /* not USE_KKCC */
 }
 
 DEFUN ("event-matches-key-specifier-p", Fevent_matches_key_specifier_p, 2, 2, 0, /*
@@ -1622,28 +1784,49 @@
   return (event_matches_key_specifier_p (XEVENT (event), key_specifier)
 	  ? Qt : Qnil);
 }
-
+#ifdef USE_KKCC
+#define MACROLET(k,m) do {		\
+  SET_KEY_DATA_KEYSYM(returned_value, k);		\
+  SET_KEY_DATA_MODIFIERS(returned_value, m);    	\
+  RETURN_SANS_WARNINGS;			\
+} while (0)
+#else /* not USE_KKCC */
 #define MACROLET(k,m) do {		\
   returned_value->keysym = (k);		\
   returned_value->modifiers = (m);	\
   RETURN_SANS_WARNINGS;			\
 } while (0)
-
+#endif /* not USE_KKCC */
 /* ASCII grunge.
    Given a keysym, return another keysym/modifier pair which could be
    considered the same key in an ASCII world.  Backspace returns ^H, for
    example.
  */
 static void
+#ifdef USE_KKCC
+define_key_alternate_name (Lisp_Key_Data *key,
+                           Lisp_Key_Data *returned_value)
+#else /* not USE_KKCC */
 define_key_alternate_name (struct key_data *key,
                            struct key_data *returned_value)
+#endif /* not USE_KKCC */
 {
+#ifdef USE_KKCC
+  Lisp_Object keysym = KEY_DATA_KEYSYM (key);
+  int modifiers = KEY_DATA_MODIFIERS (key);
+#else /* not USE_KKCC */
   Lisp_Object keysym = key->keysym;
   int modifiers = key->modifiers;
+#endif /* not USE_KKCC */
   int modifiers_sans_control = (modifiers & (~XEMACS_MOD_CONTROL));
   int modifiers_sans_meta = (modifiers & (~XEMACS_MOD_META));
+#ifdef USE_KKCC
+  SET_KEY_DATA_KEYSYM (returned_value, Qnil); /* By default, no "alternate" key */
+  SET_KEY_DATA_MODIFIERS (returned_value, 0);
+#else /* not USE_KKCC */
   returned_value->keysym = Qnil; /* By default, no "alternate" key */
   returned_value->modifiers = 0;
+#endif /* not USE_KKCC */
   if (modifiers_sans_meta == XEMACS_MOD_CONTROL)
     {
       if (EQ (keysym, QKspace))
@@ -1694,8 +1877,11 @@
   Lisp_Object new_keys;
   int i;
   Lisp_Object mpc_binding;
+#ifdef USE_KKCC
+  Lisp_Key_Data meta_key;
+#else /* not USE_KKCC */
   struct key_data meta_key;
-
+#endif /* not USE_KKCC */
   if (NILP (Vmeta_prefix_char) ||
       (INTP (Vmeta_prefix_char) && !CHAR_INTP (Vmeta_prefix_char)))
     return;
@@ -1896,9 +2082,13 @@
   while (1)
     {
       Lisp_Object c;
+#ifdef USE_KKCC
+      Lisp_Key_Data raw_key1;
+      Lisp_Key_Data raw_key2;
+#else /* not USE_KKCC */
       struct key_data raw_key1;
       struct key_data raw_key2;
-
+#endif /* not USE_KKCC */
       if (STRINGP (keys))
 	c = make_char (string_ichar (keys, idx));
       else
@@ -2012,7 +2202,11 @@
 struct raw_lookup_key_mapper_closure
 {
   int remaining;
+#ifdef USE_KKCC
+  const Lisp_Key_Data *raw_keys;
+#else /* not USE_KKCC */
   const struct key_data *raw_keys;
+#endif /* not USE_KKCC */
   int raw_keys_count;
   int keys_so_far;
   int accept_default;
@@ -2023,7 +2217,11 @@
 /* Caller should gc-protect args (keymaps may autoload) */
 static Lisp_Object
 raw_lookup_key (Lisp_Object keymap,
+#ifdef USE_KKCC
+                const Lisp_Key_Data *raw_keys, int raw_keys_count,
+#else /* not USE_KKCC */
                 const struct key_data *raw_keys, int raw_keys_count,
+#endif /* not USE_KKCC */
                 int keys_so_far, int accept_default)
 {
   /* This function can GC */
@@ -2046,7 +2244,11 @@
   int accept_default = c->accept_default;
   int remaining = c->remaining;
   int keys_so_far = c->keys_so_far;
+#ifdef USE_KKCC
+  const Lisp_Key_Data *raw_keys = c->raw_keys;
+#else /* not USE_KKCC */
   const struct key_data *raw_keys = c->raw_keys;
+#endif /* not USE_KKCC */
   Lisp_Object cmd;
 
   if (! meta_prefix_char_p (&(raw_keys[0])))
@@ -2099,7 +2301,11 @@
 				  keys_so_far + 1, accept_default);
 	  else if ((raw_keys[1].modifiers & XEMACS_MOD_META) == 0)
 	    {
+#ifdef USE_KKCC
+	      Lisp_Key_Data metified;
+#else /* not USE_KKCC */
 	      struct key_data metified;
+#endif /* not USE_KKCC */
 	      metified.keysym = raw_keys[1].keysym;
 	      metified.modifiers = raw_keys[1].modifiers |
 		(unsigned char) XEMACS_MOD_META;
@@ -2131,8 +2337,13 @@
              int accept_default)
 {
   /* This function can GC */
+#ifdef USE_KKCC
+  Lisp_Key_Data kkk[20];
+  Lisp_Key_Data *raw_keys;
+#else /* not USE_KKCC */
   struct key_data kkk[20];
   struct key_data *raw_keys;
+#endif /* not USE_KKCC */
   int i;
 
   if (nkeys == 0)
@@ -2141,7 +2352,11 @@
   if (nkeys < countof (kkk))
     raw_keys = kkk;
   else
+#ifdef USE_KKCC
+    raw_keys = alloca_array (Lisp_Key_Data, nkeys);
+#else /* not USE_KKCC */
     raw_keys = alloca_array (struct key_data, nkeys);
+#endif /* not USE_KKCC */
 
   for (i = 0; i < nkeys; i++)
     {
@@ -2155,11 +2370,19 @@
                int accept_default)
 {
   /* This function can GC */
+#ifdef USE_KKCC
+  Lisp_Key_Data kkk[20];
+#else /* not USE_KKCC */
   struct key_data kkk[20];
+#endif /* not USE_KKCC */
   Lisp_Object event;
 
   int nkeys;
+#ifdef USE_KKCC
+  Lisp_Key_Data *raw_keys;
+#else /* not USE_KKCC */
   struct key_data *raw_keys;
+#endif /* not USE_KKCC */
   Lisp_Object tem = Qnil;
   struct gcpro gcpro1, gcpro2;
   int iii;
@@ -2171,7 +2394,11 @@
   if (nkeys < countof (kkk))
     raw_keys = kkk;
   else
+#ifdef USE_KKCC
+    raw_keys = alloca_array (Lisp_Key_Data, nkeys);
+#else /* not USE_KKCC */
     raw_keys = alloca_array (struct key_data, nkeys);
+#endif /* not USE_KKCC */
 
   nkeys = 0;
   EVENT_CHAIN_LOOP (event, event_head)
@@ -2220,7 +2447,11 @@
     {
       int length = string_char_length (keys);
       int i;
+#ifdef USE_KKCC
+      Lisp_Key_Data *raw_keys = alloca_array (Lisp_Key_Data, length);
+#else /* not USE_KKCC */
       struct key_data *raw_keys = alloca_array (struct key_data, length);
+#endif /* not USE_KKCC */
       if (length == 0)
 	return Qnil;
 
@@ -2799,7 +3030,11 @@
 
 struct map_keymap_unsorted_closure
 {
+#ifdef USE_KKCC
+  void (*fn) (const Lisp_Key_Data *, Lisp_Object binding, void *arg);
+#else /* not USE_KKCC */
   void (*fn) (const struct key_data *, Lisp_Object binding, void *arg);
+#endif /* not USE_KKCC */
   void *arg;
   int modifiers;
 };
@@ -2827,7 +3062,11 @@
     }
   else
     {
+#ifdef USE_KKCC
+      Lisp_Key_Data key;
+#else /* not USE_KKCC */
       struct key_data key;
+#endif /* not USE_KKCC */
       key.keysym = keysym;
       key.modifiers = modifiers;
       ((*closure->fn) (&key, value, closure->arg));
@@ -2934,7 +3173,11 @@
 static void
 map_keymap_sorted (Lisp_Object keymap_table,
                    int modifiers,
+#ifdef USE_KKCC
+                   void (*function) (const Lisp_Key_Data *key,
+#else /* not USE_KKCC */
                    void (*function) (const struct key_data *key,
+#endif /* not USE_KKCC */
                                      Lisp_Object binding,
                                      void *map_keymap_sorted_closure),
                    void *map_keymap_sorted_closure)
@@ -2967,7 +3210,11 @@
 			   map_keymap_sorted_closure);
       else
 	{
+#ifdef USE_KKCC
+	  Lisp_Key_Data k;
+#else /* not USE_KKCC */
 	  struct key_data k;
+#endif /* not USE_KKCC */
 	  k.keysym = keysym;
 	  k.modifiers = modifiers;
 	  ((*function) (&k, binding, map_keymap_sorted_closure));
@@ -2979,7 +3226,11 @@
 
 /* used by Fmap_keymap() */
 static void
+#ifdef USE_KKCC
+map_keymap_mapper (const Lisp_Key_Data *key,
+#else /* not USE_KKCC */
 map_keymap_mapper (const struct key_data *key,
+#endif /* not USE_KKCC */
                    Lisp_Object binding,
                    void *function)
 {
@@ -2992,7 +3243,11 @@
 
 static void
 map_keymap (Lisp_Object keymap_table, int sort_first,
+#ifdef USE_KKCC
+            void (*function) (const Lisp_Key_Data *key,
+#else /* not USE_KKCC */
             void (*function) (const struct key_data *key,
+#endif /* not USE_KKCC */
                               Lisp_Object binding,
                               void *fn_arg),
             void *fn_arg)
@@ -3091,7 +3346,11 @@
       Lisp_Object vec;
       int j;
       int len;
+#ifdef USE_KKCC
+      Lisp_Key_Data key;
+#else /* not USE_KKCC */
       struct key_data key;
+#endif /* not USE_KKCC */
       key.keysym = keysym;
       key.modifiers = modifiers;
 
@@ -3179,7 +3438,11 @@
       NGCPRO1 (p);
       for (iii = 0; iii < len; iii++)
 	{
+#ifdef USE_KKCC
+	  Lisp_Key_Data key;
+#else /* not USE_KKCC */
 	  struct key_data key;
+#endif /* not USE_KKCC */
 	  define_key_parser (Faref (prefix, make_int (iii)), &key);
 	  XVECTOR_DATA (p)[iii] = make_key_description (&key, 1);
 	}
@@ -3275,6 +3538,17 @@
       
       if (!EVENTP (key))
 	{
+#ifdef USE_KKCC
+	  Lisp_Object event = Fmake_event (Qnil, Qnil);
+	  XSET_EVENT_TYPE (event, empty_event);
+	  CHECK_CHAR_COERCE_INT (key);
+	  character_to_event (XCHAR (key), XEVENT(event),
+			      XCONSOLE (Vselected_console), 0, 1);
+	  format_event_object (buf, event, 1);
+	}
+      else
+	format_event_object (buf, key, 1);
+#else /* not USE_KKCC */
 	  Lisp_Event event;
 	  event.event_type = empty_event;
 	  CHECK_CHAR_COERCE_INT (key);
@@ -3284,6 +3558,7 @@
 	}
       else
 	format_event_object (buf, XEVENT (key), 1);
+#endif /* not USE_KKCC */
       str = eimake_string (buf);
       eifree (buf);
       return str;
@@ -3507,7 +3782,11 @@
 
 
 static Lisp_Object
+#ifdef USE_KKCC
+raw_keys_to_keys (Lisp_Key_Data *keys, int count)
+#else /* not USE_KKCC */
 raw_keys_to_keys (struct key_data *keys, int count)
+#endif /* not USE_KKCC */
 {
   Lisp_Object result = make_vector (count, Qnil);
   while (count--)
@@ -3517,17 +3796,33 @@
 
 
 static void
+#ifdef USE_KKCC
+format_raw_keys (Lisp_Key_Data *keys, int count, Eistring *buf)
+#else /* not USE_KKCC */
 format_raw_keys (struct key_data *keys, int count, Eistring *buf)
+#endif /* not USE_KKCC */
 {
   int i;
+#ifdef USE_KKCC
+  Lisp_Object event = Fmake_event (Qnil, Qnil);
+  XSET_EVENT_TYPE (event, key_press_event);
+  XSET_EVENT_CHANNEL (event, Vselected_console);
+#else /* not USE_KKCC */
   Lisp_Event event;
   event.event_type = key_press_event;
   event.channel = Vselected_console;
+#endif /* not USE_KKCC */
   for (i = 0; i < count; i++)
     {
+#ifdef USE_KKCC
+      XSET_KEY_DATA_KEYSYM (XEVENT_DATA (event), keys[i].keysym);
+      XSET_KEY_DATA_MODIFIERS (XEVENT_DATA (event), KEY_DATA_MODIFIERS (&keys[i]));
+      format_event_object (buf, event, 1);
+#else /* not USE_KKCC */
       event.event.key.keysym    = keys[i].keysym;
       event.event.key.modifiers = keys[i].modifiers;
       format_event_object (buf, &event, 1);
+#endif /* not USE_KKCC */
       if (i < count - 1)
 	eicat_c (buf, " ");
     }
@@ -3563,7 +3858,11 @@
     int keys_count;
     int modifiers_so_far;
     Eistring *target_buffer;
+#ifdef USE_KKCC
+    Lisp_Key_Data *keys_so_far;
+#else /* not USE_KKCC */
     struct key_data *keys_so_far;
+#endif /* not USE_KKCC */
     int keys_so_far_total_size;
     int keys_so_far_malloced;
   };
@@ -3592,7 +3891,11 @@
 	 Verify that these bindings aren't shadowed by other bindings
 	 in the shadow maps.  Either nil or number as value from
 	 raw_lookup_key() means undefined.  */
+#ifdef USE_KKCC
+      Lisp_Key_Data *so_far = c->keys_so_far;
+#else /* not USE_KKCC */
       struct key_data *so_far = c->keys_so_far;
+#endif /* not USE_KKCC */
 
       for (;;) /* loop over all keys that match */
 	{
@@ -3600,7 +3903,11 @@
 	  int i;
 
 	  so_far [keys_count].keysym = k;
+#ifdef USE_KKCC
+	  SET_KEY_DATA_MODIFIERS (&so_far [keys_count], modifiers_so_far);
+#else /* not USE_KKCC */
 	  so_far [keys_count].modifiers = modifiers_so_far;
+#endif /* not USE_KKCC */
 
 	  /* now loop over all shadow maps */
 	  for (i = 0; i < c->shadow_count; i++)
@@ -3681,10 +3988,18 @@
 	lower_modifiers = (modifiers_so_far | bucky);
       else
 	{
+#ifdef USE_KKCC
+	  Lisp_Key_Data *so_far = c->keys_so_far;
+#else /* not USE_KKCC */
 	  struct key_data *so_far = c->keys_so_far;
+#endif /* not USE_KKCC */
 	  lower_modifiers = 0;
 	  so_far [lower_keys_count].keysym = key;
+#ifdef USE_KKCC
+	  SET_KEY_DATA_MODIFIERS (&so_far [lower_keys_count], modifiers_so_far);
+#else /* not USE_KKCC */
 	  so_far [lower_keys_count].modifiers = modifiers_so_far;
+#endif /* not USE_KKCC */
 	  lower_keys_count++;
 	}
 
@@ -3693,12 +4008,24 @@
 	  int size = lower_keys_count + 50;
 	  if (! c->keys_so_far_malloced)
 	    {
+#ifdef USE_KKCC
+	      Lisp_Key_Data *new = xnew_array (Lisp_Key_Data, size);
+#else /* not USE_KKCC */
 	      struct key_data *new = xnew_array (struct key_data, size);
+#endif /* not USE_KKCC */
 	      memcpy ((void *)new, (const void *)c->keys_so_far,
+#ifdef USE_KKCC
+		      c->keys_so_far_total_size * sizeof (Lisp_Key_Data));
+#else /* not USE_KKCC */
 		      c->keys_so_far_total_size * sizeof (struct key_data));
+#endif /* not USE_KKCC */
 	    }
 	  else
+#ifdef USE_KKCC
+	    XREALLOC_ARRAY (c->keys_so_far, Lisp_Key_Data, size);
+#else /* not USE_KKCC */
 	    XREALLOC_ARRAY (c->keys_so_far, struct key_data, size);
+#endif /* not USE_KKCC */
 
 	  c->keys_so_far_total_size = size;
 	  c->keys_so_far_malloced = 1;
@@ -3732,7 +4059,11 @@
   /* This function can GC */
   Lisp_Object result = Qnil;
   int i;
+#ifdef USE_KKCC
+  Lisp_Key_Data raw[20];
+#else /* not USE_KKCC */
   struct key_data raw[20];
+#endif /* not USE_KKCC */
   struct where_is_closure c;
 
   c.definition = definition;
@@ -3947,7 +4278,11 @@
 
 struct describe_map_shadow_closure
   {
+#ifdef USE_KKCC
+    const Lisp_Key_Data *raw_key;
+#else /* not USE_KKCC */
     const struct key_data *raw_key;
+#endif /* not USE_KKCC */
     Lisp_Object self;
   };
 
@@ -3960,9 +4295,15 @@
   if (EQ (map, c->self))
     return Qzero;		/* Not shadowed; terminate search */
 
+#ifdef USE_KKCC
+  return !NILP (keymap_lookup_directly (map,
+					KEY_DATA_KEYSYM (c->raw_key),
+					KEY_DATA_MODIFIERS (c->raw_key)))
+#else /* not USE_KKCC */
   return !NILP (keymap_lookup_directly (map,
 					c->raw_key->keysym,
 					c->raw_key->modifiers))
+#endif /* not USE_KKCC */
     ? Qt : Qnil;
 }
 
@@ -3970,21 +4311,35 @@
 static Lisp_Object
 keymap_lookup_inherited_mapper (Lisp_Object km, void *arg)
 {
+#ifdef USE_KKCC
+  Lisp_Key_Data *k = (Lisp_Key_Data *) arg;
+  return keymap_lookup_directly (km, KEY_DATA_KEYSYM (k), KEY_DATA_MODIFIERS (k));
+#else /* not USE_KKCC */
   struct key_data *k = (struct key_data *) arg;
   return keymap_lookup_directly (km, k->keysym, k->modifiers);
+#endif /* not USE_KKCC */
 }
 
 
 static void
+#ifdef USE_KKCC
+describe_map_mapper (const Lisp_Key_Data *key,
+#else /* not USE_KKCC */
 describe_map_mapper (const struct key_data *key,
+#endif /* not USE_KKCC */
                      Lisp_Object binding,
 		     void *describe_map_closure)
 {
   /* This function can GC */
   struct describe_map_closure *closure =
     (struct describe_map_closure *) describe_map_closure;
+#ifdef USE_KKCC
+  Lisp_Object keysym = KEY_DATA_KEYSYM (key);
+  int modifiers = KEY_DATA_MODIFIERS (key);
+#else /* not USE_KKCC */
   Lisp_Object keysym = key->keysym;
   int modifiers = key->modifiers;
+#endif /* not USE_KKCC */
 
   /* Don't mention suppressed commands.  */
   if (SYMBOLP (binding)