XEmacs 21.2.20 "Yoko".
[chise/xemacs-chise.git.1] / src / keymap.c
1 /* Manipulation of keymaps
2    Copyright (C) 1985, 1991-1995 Free Software Foundation, Inc.
3    Copyright (C) 1995 Board of Trustees, University of Illinois.
4    Copyright (C) 1995 Sun Microsystems, Inc.
5    Totally redesigned by jwz in 1991.
6
7 This file is part of XEmacs.
8
9 XEmacs is free software; you can redistribute it and/or modify it
10 under the terms of the GNU General Public License as published by the
11 Free Software Foundation; either version 2, or (at your option) any
12 later version.
13
14 XEmacs is distributed in the hope that it will be useful, but WITHOUT
15 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
16 FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
17 for more details.
18
19 You should have received a copy of the GNU General Public License
20 along with XEmacs; see the file COPYING.  If not, write to
21 the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
22 Boston, MA 02111-1307, USA.  */
23
24 /* Synched up with: Mule 2.0.  Not synched with FSF.  Substantially
25    different from FSF. */
26
27
28 #include <config.h>
29 #include "lisp.h"
30
31 #include "buffer.h"
32 #include "bytecode.h"
33 #include "console.h"
34 #include "elhash.h"
35 #include "events.h"
36 #include "frame.h"
37 #include "insdel.h"
38 #include "keymap.h"
39 #include "window.h"
40
41 #ifdef WINDOWSNT
42 /* Hmm, under unix we want X modifiers, under NT we want X modifiers if
43    we are running X and Windows modifiers otherwise.
44    gak. This is a kludge until we support multiple native GUIs!
45 */
46 #undef MOD_ALT
47 #undef MOD_CONTROL
48 #undef MOD_SHIFT
49 #endif
50
51 #include "events-mod.h"
52
53 \f
54 /* A keymap contains six slots:
55
56    parents         Ordered list of keymaps to search after
57                    this one if no match is found.
58                    Keymaps can thus be arranged in a hierarchy.
59
60    table           A hash table, hashing keysyms to their bindings.
61                    It will be one of the following:
62
63                    -- a symbol, e.g. 'home
64                    -- a character, representing something printable
65                       (not ?\C-c meaning C-c, for instance)
66                    -- an integer representing a modifier combination
67
68    inverse_table   A hash table, hashing bindings to the list of keysyms
69                    in this keymap which are bound to them.  This is to make
70                    the Fwhere_is_internal() function be fast.  It needs to be
71                    fast because we want to be able to call it in realtime to
72                    update the keyboard-equivalents on the pulldown menus.
73                    Values of the table are either atoms (keysyms)
74                    or a dotted list of keysyms.
75
76    sub_maps_cache  An alist; for each entry in this keymap whose binding is
77                    a keymap (that is, Fkeymapp()) this alist associates that
78                    keysym with that binding.  This is used to optimize both
79                    Fwhere_is_internal() and Faccessible_keymaps().  This slot
80                    gets set to the symbol `t' every time a change is made to
81                    this keymap, causing it to be recomputed when next needed.
82
83    prompt          See `set-keymap-prompt'.
84
85    default_binding See `set-keymap-default-binding'.
86
87    Sequences of keys are stored in the obvious way: if the sequence of keys
88    "abc" was bound to some command `foo', the hierarchy would look like
89
90       keymap-1: associates "a" with keymap-2
91       keymap-2: associates "b" with keymap-3
92       keymap-3: associates "c" with foo
93
94    However, bucky bits ("modifiers" to the X-minded) are represented in the
95    keymap hierarchy as well. (This lets us use EQable objects as hash keys.)
96    Each combination of modifiers (e.g. control-hyper) gets its own submap
97    off of the main map.  The hash key for a modifier combination is
98    an integer, computed by MAKE_MODIFIER_HASH_KEY().
99
100    If the key `C-a' was bound to some command, the hierarchy would look like
101
102       keymap-1: associates the integer MOD_CONTROL with keymap-2
103       keymap-2: associates "a" with the command
104
105    Similarly, if the key `C-H-a' was bound to some command, the hierarchy
106    would look like
107
108       keymap-1: associates the integer (MOD_CONTROL | MOD_HYPER)
109                 with keymap-2
110       keymap-2: associates "a" with the command
111
112    Note that a special exception is made for the meta modifier, in order
113    to deal with ESC/meta lossage.  Any key combination containing the
114    meta modifier is first indexed off of the main map into the meta
115    submap (with hash key MOD_META) and then indexed off of the
116    meta submap with the meta modifier removed from the key combination.
117    For example, when associating a command with C-M-H-a, we'd have
118
119       keymap-1: associates the integer MOD_META with keymap-2
120       keymap-2: associates the integer (MOD_CONTROL | MOD_HYPER)
121                 with keymap-3
122       keymap-3: associates "a" with the command
123
124    Note that keymap-2 might have normal bindings in it; these would be
125    for key combinations containing only the meta modifier, such as
126    M-y or meta-backspace.
127
128    If the command that "a" was bound to in keymap-3 was itself a keymap,
129    then that would make the key "C-M-H-a" be a prefix character.
130
131    Note that this new model of keymaps takes much of the magic away from
132    the Escape key: the value of the variable `esc-map' is no longer indexed
133    in the `global-map' under the ESC key.  It's indexed under the integer
134    MOD_META.  This is not user-visible, however; none of the "bucky"
135    maps are.
136
137    There is a hack in Flookup_key() that makes (lookup-key global-map "\^[")
138    and (define-key some-random-map "\^[" my-esc-map) work as before, for
139    compatibility.
140
141    Since keymaps are opaque, the only way to extract information from them
142    is with the functions lookup-key, key-binding, local-key-binding, and
143    global-key-binding, which work just as before, and the new function
144    map-keymap, which is roughly analagous to maphash.
145
146    Note that map-keymap perpetuates the illusion that the "bucky" submaps
147    don't exist: if you map over a keymap with bucky submaps, it will also
148    map over those submaps.  It does not, however, map over other random
149    submaps of the keymap, just the bucky ones.
150
151    One implication of this is that when you map over `global-map', you will
152    also map over `esc-map'.  It is merely for compatibility that the esc-map
153    is accessible at all; I think that's a bad thing, since it blurs the
154    distinction between ESC and "meta" even more.  "M-x" is no more a two-
155    key sequence than "C-x" is.
156
157  */
158
159 typedef struct Lisp_Keymap
160 {
161   struct lcrecord_header header;
162   Lisp_Object parents;          /* Keymaps to be searched after this one
163                                  *  An ordered list */
164   Lisp_Object prompt;           /* Qnil or a string to print in the minibuffer
165                                  *  when reading from this keymap */
166
167   Lisp_Object table;            /* The contents of this keymap */
168   Lisp_Object inverse_table;    /* The inverse mapping of the above */
169
170   Lisp_Object default_binding;  /* Use this if no other binding is found
171                                  *  (this overrides parent maps and the
172                                  *   normal global-map lookup). */
173
174
175   Lisp_Object sub_maps_cache;   /* Cache of directly inferior keymaps;
176                                    This holds an alist, of the key and the
177                                    maps, or the modifier bit and the map.
178                                    If this is the symbol t, then the cache
179                                    needs to be recomputed.
180                                  */
181   int fullness;                 /* How many entries there are in this table.
182                                    This should be the same as the fullness
183                                    of the `table', but hash.c is broken. */
184   Lisp_Object name;             /* Just for debugging convenience */
185 } Lisp_Keymap;
186
187 #define MAKE_MODIFIER_HASH_KEY(modifier) make_int (modifier)
188 #define MODIFIER_HASH_KEY_BITS(x) (INTP (x) ? XINT (x) : 0)
189
190 \f
191
192 /* Actually allocate storage for these variables */
193
194 static Lisp_Object Vcurrent_global_map; /* Always a keymap */
195
196 static Lisp_Object Vmouse_grabbed_buffer;
197
198 /* Alist of minor mode variables and keymaps.  */
199 static Lisp_Object Qminor_mode_map_alist;
200
201 static Lisp_Object Voverriding_local_map;
202
203 static Lisp_Object Vkey_translation_map;
204
205 static Lisp_Object Vvertical_divider_map;
206
207 /* This is incremented whenever a change is made to a keymap.  This is
208    so that things which care (such as the menubar code) can recompute
209    privately-cached data when the user has changed keybindings.
210  */
211 int keymap_tick;
212
213 /* Prefixing a key with this character is the same as sending a meta bit. */
214 Lisp_Object Vmeta_prefix_char;
215
216 Lisp_Object Qkeymapp;
217 Lisp_Object Vsingle_space_string;
218 Lisp_Object Qsuppress_keymap;
219 Lisp_Object Qmodeline_map;
220 Lisp_Object Qtoolbar_map;
221
222 EXFUN (Fkeymap_fullness, 1);
223 EXFUN (Fset_keymap_name, 2);
224 EXFUN (Fsingle_key_description, 1);
225
226 static void describe_command (Lisp_Object definition, Lisp_Object buffer);
227 static void describe_map (Lisp_Object keymap, Lisp_Object elt_prefix,
228                           void (*elt_describer) (Lisp_Object, Lisp_Object),
229                           int partial,
230                           Lisp_Object shadow,
231                           int mice_only_p,
232                           Lisp_Object buffer);
233
234 Lisp_Object Qcontrol, Qctrl, Qmeta, Qsuper, Qhyper, Qalt, Qshift;
235 Lisp_Object Qbutton0, Qbutton1, Qbutton2, Qbutton3;
236 Lisp_Object Qbutton4, Qbutton5, Qbutton6, Qbutton7;
237 Lisp_Object Qbutton0up, Qbutton1up, Qbutton2up, Qbutton3up;
238 Lisp_Object Qbutton4up, Qbutton5up, Qbutton6up, Qbutton7up;
239
240 Lisp_Object Qmenu_selection;
241 /* Emacs compatibility */
242 Lisp_Object Qdown_mouse_1, Qdown_mouse_2, Qdown_mouse_3, Qdown_mouse_4,
243   Qdown_mouse_5;
244 Lisp_Object Qmouse_1, Qmouse_2, Qmouse_3, Qmouse_4, Qmouse_5;
245
246 /* Kludge kludge kludge */
247 Lisp_Object QLFD, QTAB, QRET, QESC, QDEL, QSPC, QBS;
248
249 \f
250 /************************************************************************/
251 /*                     The keymap Lisp object                           */
252 /************************************************************************/
253
254 static Lisp_Object
255 mark_keymap (Lisp_Object obj)
256 {
257   Lisp_Keymap *keymap = XKEYMAP (obj);
258   mark_object (keymap->parents);
259   mark_object (keymap->prompt);
260   mark_object (keymap->inverse_table);
261   mark_object (keymap->sub_maps_cache);
262   mark_object (keymap->default_binding);
263   mark_object (keymap->name);
264   return keymap->table;
265 }
266
267 static void
268 print_keymap (Lisp_Object obj, Lisp_Object printcharfun, int escapeflag)
269 {
270   /* This function can GC */
271   Lisp_Keymap *keymap = XKEYMAP (obj);
272   char buf[200];
273   int size = XINT (Fkeymap_fullness (obj));
274   if (print_readably)
275     error ("printing unreadable object #<keymap 0x%x>", keymap->header.uid);
276   write_c_string ("#<keymap ", printcharfun);
277   if (!NILP (keymap->name))
278     print_internal (keymap->name, printcharfun, 1);
279   /* #### Yuck!  This is no way to form plural!  --hniksic */
280   sprintf (buf, "%s%d entr%s 0x%x>",
281            (NILP (keymap->name) ? "" : " "),
282            size,
283            ((size == 1) ? "y" : "ies"),
284            keymap->header.uid);
285   write_c_string (buf, printcharfun);
286 }
287
288 static const struct lrecord_description keymap_description[] = {
289   { XD_LISP_OBJECT, offsetof(Lisp_Keymap, parents), 6 },
290   { XD_LISP_OBJECT, offsetof(Lisp_Keymap, name), 1 },
291   { XD_END }
292 };
293
294 /* No need for keymap_equal #### Why not? */
295 DEFINE_LRECORD_IMPLEMENTATION ("keymap", keymap,
296                                mark_keymap, print_keymap, 0, 0, 0,
297                                keymap_description,
298                                Lisp_Keymap);
299 \f
300 /************************************************************************/
301 /*                Traversing keymaps and their parents                  */
302 /************************************************************************/
303
304 static Lisp_Object
305 traverse_keymaps (Lisp_Object start_keymap, Lisp_Object start_parents,
306                   Lisp_Object (*mapper) (Lisp_Object keymap, void *mapper_arg),
307                   void *mapper_arg)
308 {
309   /* This function can GC */
310   Lisp_Object keymap;
311   Lisp_Object tail = start_parents;
312   Lisp_Object malloc_sucks[10];
313   Lisp_Object malloc_bites = Qnil;
314   int stack_depth = 0;
315   struct gcpro gcpro1, gcpro2, gcpro3, gcpro4;
316   GCPRO4 (*malloc_sucks, malloc_bites, start_keymap, tail);
317   gcpro1.nvars = 0;
318
319   start_keymap = get_keymap (start_keymap, 1, 1);
320   keymap = start_keymap;
321   /* Hack special-case parents at top-level */
322   tail = ((!NILP (tail)) ? tail : XKEYMAP (keymap)->parents);
323
324   for (;;)
325     {
326       Lisp_Object result;
327
328       QUIT;
329       result = ((mapper) (keymap, mapper_arg));
330       if (!NILP (result))
331         {
332           while (CONSP (malloc_bites))
333             {
334               struct Lisp_Cons *victim = XCONS (malloc_bites);
335               malloc_bites = victim->cdr;
336               free_cons (victim);
337             }
338           UNGCPRO;
339           return result;
340         }
341       if (NILP (tail))
342         {
343           if (stack_depth == 0)
344             {
345               UNGCPRO;
346               return Qnil;          /* Nothing found */
347             }
348           stack_depth--;
349           if (CONSP (malloc_bites))
350             {
351               struct Lisp_Cons *victim = XCONS (malloc_bites);
352               tail = victim->car;
353               malloc_bites = victim->cdr;
354               free_cons (victim);
355             }
356           else
357             {
358               tail = malloc_sucks[stack_depth];
359               gcpro1.nvars = stack_depth;
360             }
361           keymap = XCAR (tail);
362           tail = XCDR (tail);
363         }
364       else
365         {
366           Lisp_Object parents;
367
368           keymap = XCAR (tail);
369           tail = XCDR (tail);
370           parents = XKEYMAP (keymap)->parents;
371           if (!CONSP (parents))
372             ;
373           else if (NILP (tail))
374             /* Tail-recurse */
375             tail = parents;
376           else
377             {
378               if (CONSP (malloc_bites))
379                 malloc_bites = noseeum_cons (tail, malloc_bites);
380               else if (stack_depth < countof (malloc_sucks))
381                 {
382                   malloc_sucks[stack_depth++] = tail;
383                   gcpro1.nvars = stack_depth;
384                 }
385               else
386                 {
387                   /* *&@##[*&^$ C. @#[$*&@# Unix.  Losers all. */
388                   int i;
389                   for (i = 0, malloc_bites = Qnil;
390                        i < countof (malloc_sucks);
391                        i++)
392                     malloc_bites = noseeum_cons (malloc_sucks[i],
393                                                  malloc_bites);
394                   gcpro1.nvars = 0;
395                 }
396               tail = parents;
397             }
398         }
399       keymap = get_keymap (keymap, 1, 1);
400       if (EQ (keymap, start_keymap))
401         {
402           signal_simple_error ("Cyclic keymap indirection",
403                                start_keymap);
404         }
405     }
406 }
407
408 \f
409 /************************************************************************/
410 /*                     Some low-level functions                         */
411 /************************************************************************/
412
413 static unsigned int
414 bucky_sym_to_bucky_bit (Lisp_Object sym)
415 {
416   if (EQ (sym, Qcontrol)) return MOD_CONTROL;
417   if (EQ (sym, Qmeta))    return MOD_META;
418   if (EQ (sym, Qsuper))   return MOD_SUPER;
419   if (EQ (sym, Qhyper))   return MOD_HYPER;
420   if (EQ (sym, Qalt))     return MOD_ALT;
421   if (EQ (sym, Qsymbol))  return MOD_ALT; /* #### - reverse compat */
422   if (EQ (sym, Qshift))   return MOD_SHIFT;
423
424   return 0;
425 }
426
427 static Lisp_Object
428 control_meta_superify (Lisp_Object frob, unsigned int modifiers)
429 {
430   if (modifiers == 0)
431     return frob;
432   frob = Fcons (frob, Qnil);
433   if (modifiers & MOD_SHIFT)   frob = Fcons (Qshift,   frob);
434   if (modifiers & MOD_ALT)     frob = Fcons (Qalt,     frob);
435   if (modifiers & MOD_HYPER)   frob = Fcons (Qhyper,   frob);
436   if (modifiers & MOD_SUPER)   frob = Fcons (Qsuper,   frob);
437   if (modifiers & MOD_CONTROL) frob = Fcons (Qcontrol, frob);
438   if (modifiers & MOD_META)    frob = Fcons (Qmeta,    frob);
439   return frob;
440 }
441
442 static Lisp_Object
443 make_key_description (CONST struct key_data *key, int prettify)
444 {
445   Lisp_Object keysym = key->keysym;
446   unsigned int modifiers = key->modifiers;
447
448   if (prettify && CHARP (keysym))
449     {
450       /* This is a little slow, but (control a) is prettier than (control 65).
451          It's now ok to do this for digit-chars too, since we've fixed the
452          bug where \9 read as the integer 9 instead of as the symbol with
453          "9" as its name.
454        */
455       /* !!#### I'm not sure how correct this is. */
456       Bufbyte str [1 + MAX_EMCHAR_LEN];
457       Bytecount count = set_charptr_emchar (str, XCHAR (keysym));
458       str[count] = 0;
459       keysym = intern ((char *) str);
460     }
461   return control_meta_superify (keysym, modifiers);
462 }
463
464 \f
465 /************************************************************************/
466 /*                   Low-level keymap-store functions                   */
467 /************************************************************************/
468
469 static Lisp_Object
470 raw_lookup_key (Lisp_Object keymap,
471                 CONST struct key_data *raw_keys, int raw_keys_count,
472                 int keys_so_far, int accept_default);
473
474 /* Relies on caller to gc-protect args */
475 static Lisp_Object
476 keymap_lookup_directly (Lisp_Object keymap,
477                         Lisp_Object keysym, unsigned int modifiers)
478 {
479   Lisp_Keymap *k;
480
481   if ((modifiers & ~(MOD_CONTROL | MOD_META | MOD_SUPER | MOD_HYPER
482                      | MOD_ALT | MOD_SHIFT)) != 0)
483     abort ();
484
485   k = XKEYMAP (keymap);
486
487   /* If the keysym is a one-character symbol, use the char code instead. */
488   if (SYMBOLP (keysym) && string_char_length (XSYMBOL (keysym)->name) == 1)
489     {
490       Lisp_Object i_fart_on_gcc =
491         make_char (string_char (XSYMBOL (keysym)->name, 0));
492       keysym = i_fart_on_gcc;
493     }
494
495   if (modifiers & MOD_META)     /* Utterly hateful ESC lossage */
496     {
497       Lisp_Object submap = Fgethash (MAKE_MODIFIER_HASH_KEY (MOD_META),
498                                      k->table, Qnil);
499       if (NILP (submap))
500         return Qnil;
501       k = XKEYMAP (submap);
502       modifiers &= ~MOD_META;
503     }
504
505   if (modifiers != 0)
506     {
507       Lisp_Object submap = Fgethash (MAKE_MODIFIER_HASH_KEY (modifiers),
508                                      k->table, Qnil);
509       if (NILP (submap))
510         return Qnil;
511       k = XKEYMAP (submap);
512     }
513   return Fgethash (keysym, k->table, Qnil);
514 }
515
516 static void
517 keymap_store_inverse_internal (Lisp_Object inverse_table,
518                                Lisp_Object keysym,
519                                Lisp_Object value)
520 {
521   Lisp_Object keys = Fgethash (value, inverse_table, Qunbound);
522
523   if (UNBOUNDP (keys))
524     {
525       keys = keysym;
526       /* Don't cons this unless necessary */
527       /* keys = Fcons (keysym, Qnil); */
528       Fputhash (value, keys, inverse_table);
529     }
530   else if (!CONSP (keys))
531     {
532       /* Now it's necessary to cons */
533       keys = Fcons (keys, keysym);
534       Fputhash (value, keys, inverse_table);
535     }
536   else
537     {
538       while (CONSP (XCDR (keys)))
539         keys = XCDR (keys);
540       XCDR (keys) = Fcons (XCDR (keys), keysym);
541       /* No need to call puthash because we've destructively
542          modified the list tail in place */
543     }
544 }
545
546
547 static void
548 keymap_delete_inverse_internal (Lisp_Object inverse_table,
549                                 Lisp_Object keysym,
550                                 Lisp_Object value)
551 {
552   Lisp_Object keys = Fgethash (value, inverse_table, Qunbound);
553   Lisp_Object new_keys = keys;
554   Lisp_Object tail;
555   Lisp_Object *prev;
556
557   if (UNBOUNDP (keys))
558     abort ();
559
560   for (prev = &new_keys, tail = new_keys;
561        ;
562        prev = &(XCDR (tail)), tail = XCDR (tail))
563     {
564       if (EQ (tail, keysym))
565         {
566           *prev = Qnil;
567           break;
568         }
569       else if (EQ (keysym, XCAR (tail)))
570         {
571           *prev = XCDR (tail);
572           break;
573         }
574     }
575
576   if (NILP (new_keys))
577     Fremhash (value, inverse_table);
578   else if (!EQ (keys, new_keys))
579     /* Removed the first elt */
580     Fputhash (value, new_keys, inverse_table);
581   /* else the list's tail has been modified, so we don't need to
582      touch the hash table again (the pointer in there is ok).
583    */
584 }
585
586
587 static void
588 keymap_store_internal (Lisp_Object keysym, Lisp_Keymap *keymap,
589                        Lisp_Object value)
590 {
591   Lisp_Object prev_value = Fgethash (keysym, keymap->table, Qnil);
592
593   if (EQ (prev_value, value))
594       return;
595   if (!NILP (prev_value))
596     keymap_delete_inverse_internal (keymap->inverse_table,
597                                     keysym, prev_value);
598   if (NILP (value))
599     {
600       keymap->fullness--;
601       if (keymap->fullness < 0) abort ();
602       Fremhash (keysym, keymap->table);
603     }
604   else
605     {
606       if (NILP (prev_value))
607         keymap->fullness++;
608       Fputhash (keysym, value, keymap->table);
609       keymap_store_inverse_internal (keymap->inverse_table,
610                                      keysym, value);
611     }
612   keymap_tick++;
613 }
614
615
616 static Lisp_Object
617 create_bucky_submap (Lisp_Keymap *k, unsigned int modifiers,
618                      Lisp_Object parent_for_debugging_info)
619 {
620   Lisp_Object submap = Fmake_sparse_keymap (Qnil);
621   /* User won't see this, but it is nice for debugging Emacs */
622   XKEYMAP (submap)->name
623     = control_meta_superify (parent_for_debugging_info, modifiers);
624   /* Invalidate cache */
625   k->sub_maps_cache = Qt;
626   keymap_store_internal (MAKE_MODIFIER_HASH_KEY (modifiers), k, submap);
627   return submap;
628 }
629
630
631 /* Relies on caller to gc-protect keymap, keysym, value */
632 static void
633 keymap_store (Lisp_Object keymap, CONST struct key_data *key,
634               Lisp_Object value)
635 {
636   Lisp_Object keysym = key->keysym;
637   unsigned int modifiers = key->modifiers;
638   Lisp_Keymap *k;
639
640   if ((modifiers & ~(MOD_CONTROL | MOD_META | MOD_SUPER | MOD_HYPER
641                      | MOD_ALT | MOD_SHIFT)) != 0)
642     abort ();
643
644   k = XKEYMAP (keymap);
645
646   /* If the keysym is a one-character symbol, use the char code instead. */
647   if (SYMBOLP (keysym) && string_char_length (XSYMBOL (keysym)->name) == 1)
648     {
649       Lisp_Object run_the_gcc_developers_over_with_a_steamroller =
650         make_char (string_char (XSYMBOL (keysym)->name, 0));
651       keysym = run_the_gcc_developers_over_with_a_steamroller;
652     }
653
654   if (modifiers & MOD_META)     /* Utterly hateful ESC lossage */
655     {
656       Lisp_Object submap = Fgethash (MAKE_MODIFIER_HASH_KEY (MOD_META),
657                                      k->table, Qnil);
658       if (NILP (submap))
659         submap = create_bucky_submap (k, MOD_META, keymap);
660       k = XKEYMAP (submap);
661       modifiers &= ~MOD_META;
662     }
663
664   if (modifiers != 0)
665     {
666       Lisp_Object submap = Fgethash (MAKE_MODIFIER_HASH_KEY (modifiers),
667                                      k->table, Qnil);
668       if (NILP (submap))
669         submap = create_bucky_submap (k, modifiers, keymap);
670       k = XKEYMAP (submap);
671     }
672   k->sub_maps_cache = Qt; /* Invalidate cache */
673   keymap_store_internal (keysym, k, value);
674 }
675
676 \f
677 /************************************************************************/
678 /*                   Listing the submaps of a keymap                    */
679 /************************************************************************/
680
681 struct keymap_submaps_closure
682 {
683   Lisp_Object *result_locative;
684 };
685
686 static int
687 keymap_submaps_mapper_0 (Lisp_Object key, Lisp_Object value,
688                          void *keymap_submaps_closure)
689 {
690   /* This function can GC */
691   /* Perform any autoloads, etc */
692   Fkeymapp (value);
693   return 0;
694 }
695
696 static int
697 keymap_submaps_mapper (Lisp_Object key, Lisp_Object value,
698                        void *keymap_submaps_closure)
699 {
700   /* This function can GC */
701   Lisp_Object *result_locative;
702   struct keymap_submaps_closure *cl =
703     (struct keymap_submaps_closure *) keymap_submaps_closure;
704   result_locative = cl->result_locative;
705
706   if (!NILP (Fkeymapp (value)))
707     *result_locative = Fcons (Fcons (key, value), *result_locative);
708   return 0;
709 }
710
711 static int map_keymap_sort_predicate (Lisp_Object obj1, Lisp_Object obj2,
712                                       Lisp_Object pred);
713
714 static Lisp_Object
715 keymap_submaps (Lisp_Object keymap)
716 {
717   /* This function can GC */
718   Lisp_Keymap *k = XKEYMAP (keymap);
719
720   if (EQ (k->sub_maps_cache, Qt)) /* Unknown */
721     {
722       Lisp_Object result = Qnil;
723       struct gcpro gcpro1, gcpro2;
724       struct keymap_submaps_closure keymap_submaps_closure;
725
726       GCPRO2 (keymap, result);
727       keymap_submaps_closure.result_locative = &result;
728       /* Do this first pass to touch (and load) any autoloaded maps */
729       elisp_maphash (keymap_submaps_mapper_0, k->table,
730                      &keymap_submaps_closure);
731       result = Qnil;
732       elisp_maphash (keymap_submaps_mapper, k->table,
733                      &keymap_submaps_closure);
734       /* keep it sorted so that the result of accessible-keymaps is ordered */
735       k->sub_maps_cache = list_sort (result,
736                                      Qnil,
737                                      map_keymap_sort_predicate);
738       UNGCPRO;
739     }
740   return k->sub_maps_cache;
741 }
742
743 \f
744 /************************************************************************/
745 /*                    Basic operations on keymaps                       */
746 /************************************************************************/
747
748 static Lisp_Object
749 make_keymap (size_t size)
750 {
751   Lisp_Object result;
752   Lisp_Keymap *keymap = alloc_lcrecord_type (Lisp_Keymap, &lrecord_keymap);
753
754   XSETKEYMAP (result, keymap);
755
756   keymap->parents         = Qnil;
757   keymap->prompt          = Qnil;
758   keymap->table           = Qnil;
759   keymap->inverse_table   = Qnil;
760   keymap->default_binding = Qnil;
761   keymap->sub_maps_cache  = Qnil; /* No possible submaps */
762   keymap->fullness        = 0;
763   keymap->name            = Qnil;
764
765   if (size != 0) /* hack for copy-keymap */
766     {
767       keymap->table =
768         make_lisp_hash_table (size, HASH_TABLE_NON_WEAK, HASH_TABLE_EQ);
769       /* Inverse table is often less dense because of duplicate key-bindings.
770          If not, it will grow anyway. */
771       keymap->inverse_table =
772         make_lisp_hash_table (size * 3 / 4, HASH_TABLE_NON_WEAK, HASH_TABLE_EQ);
773     }
774   return result;
775 }
776
777 DEFUN ("make-keymap", Fmake_keymap, 0, 1, 0, /*
778 Construct and return a new keymap object.
779 All entries in it are nil, meaning "command undefined".
780
781 Optional argument NAME specifies a name to assign to the keymap,
782 as in `set-keymap-name'.  This name is only a debugging convenience;
783 it is not used except when printing the keymap.
784 */
785        (name))
786 {
787   Lisp_Object keymap = make_keymap (60);
788   if (!NILP (name))
789     Fset_keymap_name (keymap, name);
790   return keymap;
791 }
792
793 DEFUN ("make-sparse-keymap", Fmake_sparse_keymap, 0, 1, 0, /*
794 Construct and return a new keymap object.
795 All entries in it are nil, meaning "command undefined".  The only
796 difference between this function and make-keymap is that this function
797 returns a "smaller" keymap (one that is expected to contain fewer
798 entries).  As keymaps dynamically resize, the distinction is not great.
799
800 Optional argument NAME specifies a name to assign to the keymap,
801 as in `set-keymap-name'.  This name is only a debugging convenience;
802 it is not used except when printing the keymap.
803 */
804        (name))
805 {
806   Lisp_Object keymap = make_keymap (8);
807   if (!NILP (name))
808     Fset_keymap_name (keymap, name);
809   return keymap;
810 }
811
812 DEFUN ("keymap-parents", Fkeymap_parents, 1, 1, 0, /*
813 Return the `parent' keymaps of KEYMAP, or nil.
814 The parents of a keymap are searched for keybindings when a key sequence
815 isn't bound in this one.  `(current-global-map)' is the default parent
816 of all keymaps.
817 */
818        (keymap))
819 {
820   keymap = get_keymap (keymap, 1, 1);
821   return Fcopy_sequence (XKEYMAP (keymap)->parents);
822 }
823
824
825
826 static Lisp_Object
827 traverse_keymaps_noop (Lisp_Object keymap, void *arg)
828 {
829   return Qnil;
830 }
831
832 DEFUN ("set-keymap-parents", Fset_keymap_parents, 2, 2, 0, /*
833 Set the `parent' keymaps of KEYMAP to PARENTS.
834 The parents of a keymap are searched for keybindings when a key sequence
835 isn't bound in this one.  `(current-global-map)' is the default parent
836 of all keymaps.
837 */
838        (keymap, parents))
839 {
840   /* This function can GC */
841   Lisp_Object k;
842   struct gcpro gcpro1, gcpro2;
843
844   GCPRO2 (keymap, parents);
845   keymap = get_keymap (keymap, 1, 1);
846
847   if (KEYMAPP (parents))        /* backwards-compatibility */
848     parents = list1 (parents);
849   if (!NILP (parents))
850     {
851       Lisp_Object tail = parents;
852       while (!NILP (tail))
853         {
854           QUIT;
855           CHECK_CONS (tail);
856           k = XCAR (tail);
857           /* Require that it be an actual keymap object, rather than a symbol
858              with a (crockish) symbol-function which is a keymap */
859           CHECK_KEYMAP (k); /* get_keymap (k, 1, 1); */
860           tail = XCDR (tail);
861         }
862     }
863
864   /* Check for circularities */
865   traverse_keymaps (keymap, parents, traverse_keymaps_noop, 0);
866   keymap_tick++;
867   XKEYMAP (keymap)->parents = Fcopy_sequence (parents);
868   UNGCPRO;
869   return parents;
870 }
871
872 DEFUN ("set-keymap-name", Fset_keymap_name, 2, 2, 0, /*
873 Set the `name' of the KEYMAP to NEW-NAME.
874 The name is only a debugging convenience; it is not used except
875 when printing the keymap.
876 */
877        (keymap, new_name))
878 {
879   keymap = get_keymap (keymap, 1, 1);
880
881   XKEYMAP (keymap)->name = new_name;
882   return new_name;
883 }
884
885 DEFUN ("keymap-name", Fkeymap_name, 1, 1, 0, /*
886 Return the `name' of KEYMAP.
887 The name is only a debugging convenience; it is not used except
888 when printing the keymap.
889 */
890        (keymap))
891 {
892   keymap = get_keymap (keymap, 1, 1);
893
894   return XKEYMAP (keymap)->name;
895 }
896
897 DEFUN ("set-keymap-prompt", Fset_keymap_prompt, 2, 2, 0, /*
898 Set the `prompt' of KEYMAP to string NEW-PROMPT, or `nil'
899 if no prompt is desired.  The prompt is shown in the echo-area
900 when reading a key-sequence to be looked-up in this keymap.
901 */
902        (keymap, new_prompt))
903 {
904   keymap = get_keymap (keymap, 1, 1);
905
906   if (!NILP (new_prompt))
907     CHECK_STRING (new_prompt);
908
909   XKEYMAP (keymap)->prompt = new_prompt;
910   return new_prompt;
911 }
912
913 static Lisp_Object
914 keymap_prompt_mapper (Lisp_Object keymap, void *arg)
915 {
916   return XKEYMAP (keymap)->prompt;
917 }
918
919
920 DEFUN ("keymap-prompt", Fkeymap_prompt, 1, 2, 0, /*
921 Return the `prompt' of KEYMAP.
922 If non-nil, the prompt is shown in the echo-area
923 when reading a key-sequence to be looked-up in this keymap.
924 */
925        (keymap, use_inherited))
926 {
927   /* This function can GC */
928   Lisp_Object prompt;
929
930   keymap = get_keymap (keymap, 1, 1);
931   prompt = XKEYMAP (keymap)->prompt;
932   if (!NILP (prompt) || NILP (use_inherited))
933     return prompt;
934   else
935     return traverse_keymaps (keymap, Qnil, keymap_prompt_mapper, 0);
936 }
937
938 DEFUN ("set-keymap-default-binding", Fset_keymap_default_binding, 2, 2, 0, /*
939 Sets the default binding of KEYMAP to COMMAND, or `nil'
940 if no default is desired.  The default-binding is returned when
941 no other binding for a key-sequence is found in the keymap.
942 If a keymap has a non-nil default-binding, neither the keymap's
943 parents nor the current global map are searched for key bindings.
944 */
945        (keymap, command))
946 {
947   /* This function can GC */
948   keymap = get_keymap (keymap, 1, 1);
949
950   XKEYMAP (keymap)->default_binding = command;
951   return command;
952 }
953
954 DEFUN ("keymap-default-binding", Fkeymap_default_binding, 1, 1, 0, /*
955 Return the default binding of KEYMAP, or `nil' if it has none.
956 The default-binding is returned when no other binding for a key-sequence
957 is found in the keymap.
958 If a keymap has a non-nil default-binding, neither the keymap's
959 parents nor the current global map are searched for key bindings.
960 */
961        (keymap))
962 {
963   /* This function can GC */
964   keymap = get_keymap (keymap, 1, 1);
965   return XKEYMAP (keymap)->default_binding;
966 }
967
968 DEFUN ("keymapp", Fkeymapp, 1, 1, 0, /*
969 Return t if ARG is a keymap object.
970 The keymap may be autoloaded first if necessary.
971 */
972        (object))
973 {
974   /* This function can GC */
975   return KEYMAPP (get_keymap (object, 0, 0)) ? Qt : Qnil;
976 }
977
978 /* Check that OBJECT is a keymap (after dereferencing through any
979    symbols).  If it is, return it.
980
981    If AUTOLOAD is non-zero and OBJECT is a symbol whose function value
982    is an autoload form, do the autoload and try again.
983    If AUTOLOAD is nonzero, callers must assume GC is possible.
984
985    ERRORP controls how we respond if OBJECT isn't a keymap.
986    If ERRORP is non-zero, signal an error; otherwise, just return Qnil.
987
988    Note that most of the time, we don't want to pursue autoloads.
989    Functions like Faccessible_keymaps which scan entire keymap trees
990    shouldn't load every autoloaded keymap.  I'm not sure about this,
991    but it seems to me that only read_key_sequence, Flookup_key, and
992    Fdefine_key should cause keymaps to be autoloaded.  */
993
994 Lisp_Object
995 get_keymap (Lisp_Object object, int errorp, int autoload)
996 {
997   /* This function can GC */
998   while (1)
999     {
1000       Lisp_Object tem = indirect_function (object, 0);
1001
1002       if (KEYMAPP (tem))
1003         return tem;
1004       /* Should we do an autoload?  */
1005       else if (autoload
1006                /* (autoload "filename" doc nil keymap) */
1007                && SYMBOLP (object)
1008                && CONSP (tem)
1009                && EQ (XCAR (tem), Qautoload)
1010                && EQ (Fcar (Fcdr (Fcdr (Fcdr (Fcdr (tem))))), Qkeymap))
1011         {
1012           struct gcpro gcpro1, gcpro2;
1013           GCPRO2 (tem, object);
1014           do_autoload (tem, object);
1015           UNGCPRO;
1016         }
1017       else if (errorp)
1018         object = wrong_type_argument (Qkeymapp, object);
1019       else
1020         return Qnil;
1021     }
1022 }
1023
1024 /* Given OBJECT which was found in a slot in a keymap,
1025    trace indirect definitions to get the actual definition of that slot.
1026    An indirect definition is a list of the form
1027    (KEYMAP . INDEX), where KEYMAP is a keymap or a symbol defined as one
1028    and INDEX is an ASCII code, or a cons of (KEYSYM . MODIFIERS).
1029  */
1030 static Lisp_Object
1031 get_keyelt (Lisp_Object object, int accept_default)
1032 {
1033   /* This function can GC */
1034   Lisp_Object map;
1035
1036  tail_recurse:
1037   if (!CONSP (object))
1038     return object;
1039
1040   {
1041     struct gcpro gcpro1;
1042     GCPRO1 (object);
1043     map = XCAR (object);
1044     map = get_keymap (map, 0, 1);
1045     UNGCPRO;
1046   }
1047   /* If the contents are (KEYMAP . ELEMENT), go indirect.  */
1048   if (!NILP (map))
1049     {
1050       Lisp_Object idx = Fcdr (object);
1051       struct key_data indirection;
1052       if (CHARP (idx))
1053         {
1054           struct Lisp_Event event;
1055           event.event_type = empty_event;
1056           character_to_event (XCHAR (idx), &event,
1057                               XCONSOLE (Vselected_console), 0, 0);
1058           indirection = event.event.key;
1059         }
1060       else if (CONSP (idx))
1061         {
1062           if (!INTP (XCDR (idx)))
1063             return Qnil;
1064           indirection.keysym = XCAR (idx);
1065           indirection.modifiers = XINT (XCDR (idx));
1066         }
1067       else if (SYMBOLP (idx))
1068         {
1069           indirection.keysym = idx;
1070           indirection.modifiers = 0;
1071         }
1072       else
1073         {
1074           /* Random junk */
1075           return Qnil;
1076         }
1077       return raw_lookup_key (map, &indirection, 1, 0, accept_default);
1078     }
1079   else if (STRINGP (XCAR (object)))
1080     {
1081       /* If the keymap contents looks like (STRING . DEFN),
1082          use DEFN.
1083          Keymap alist elements like (CHAR MENUSTRING . DEFN)
1084          will be used by HierarKey menus.  */
1085       object = XCDR (object);
1086       goto tail_recurse;
1087     }
1088   else
1089     {
1090       /* Anything else is really the value.  */
1091       return object;
1092     }
1093 }
1094
1095 static Lisp_Object
1096 keymap_lookup_1 (Lisp_Object keymap, CONST struct key_data *key,
1097                  int accept_default)
1098 {
1099   /* This function can GC */
1100   return get_keyelt (keymap_lookup_directly (keymap,
1101                                              key->keysym, key->modifiers),
1102                      accept_default);
1103 }
1104
1105 \f
1106 /************************************************************************/
1107 /*                          Copying keymaps                             */
1108 /************************************************************************/
1109
1110 struct copy_keymap_inverse_closure
1111 {
1112   Lisp_Object inverse_table;
1113 };
1114
1115 static int
1116 copy_keymap_inverse_mapper (Lisp_Object key, Lisp_Object value,
1117                             void *copy_keymap_inverse_closure)
1118 {
1119   struct copy_keymap_inverse_closure *closure =
1120     (struct copy_keymap_inverse_closure *) copy_keymap_inverse_closure;
1121
1122   /* copy-sequence deals with dotted lists. */
1123   if (CONSP (value))
1124     value = Fcopy_list (value);
1125   Fputhash (key, value, closure->inverse_table);
1126
1127   return 0;
1128 }
1129
1130
1131 static Lisp_Object
1132 copy_keymap_internal (Lisp_Keymap *keymap)
1133 {
1134   Lisp_Object nkm = make_keymap (0);
1135   Lisp_Keymap *new_keymap = XKEYMAP (nkm);
1136   struct copy_keymap_inverse_closure copy_keymap_inverse_closure;
1137   copy_keymap_inverse_closure.inverse_table = keymap->inverse_table;
1138
1139   new_keymap->parents        = Fcopy_sequence (keymap->parents);
1140   new_keymap->fullness       = keymap->fullness;
1141   new_keymap->sub_maps_cache = Qnil; /* No submaps */
1142   new_keymap->table          = Fcopy_hash_table (keymap->table);
1143   new_keymap->inverse_table  = Fcopy_hash_table (keymap->inverse_table);
1144   new_keymap->default_binding = keymap->default_binding;
1145   /* After copying the inverse map, we need to copy the conses which
1146      are its values, lest they be shared by the copy, and mangled.
1147    */
1148   elisp_maphash (copy_keymap_inverse_mapper, keymap->inverse_table,
1149                  &copy_keymap_inverse_closure);
1150   return nkm;
1151 }
1152
1153
1154 static Lisp_Object copy_keymap (Lisp_Object keymap);
1155
1156 struct copy_keymap_closure
1157 {
1158   Lisp_Keymap *self;
1159 };
1160
1161 static int
1162 copy_keymap_mapper (Lisp_Object key, Lisp_Object value,
1163                     void *copy_keymap_closure)
1164 {
1165   /* This function can GC */
1166   struct copy_keymap_closure *closure =
1167     (struct copy_keymap_closure *) copy_keymap_closure;
1168
1169   /* When we encounter a keymap which is indirected through a
1170      symbol, we need to copy the sub-map.  In v18, the form
1171        (lookup-key (copy-keymap global-map) "\C-x")
1172      returned a new keymap, not the symbol 'Control-X-prefix.
1173    */
1174   value = get_keymap (value, 0, 1); /* #### autoload GC-safe here? */
1175   if (KEYMAPP (value))
1176     keymap_store_internal (key, closure->self,
1177                            copy_keymap (value));
1178   return 0;
1179 }
1180
1181 static Lisp_Object
1182 copy_keymap (Lisp_Object keymap)
1183 {
1184   /* This function can GC */
1185   struct copy_keymap_closure copy_keymap_closure;
1186
1187   keymap = copy_keymap_internal (XKEYMAP (keymap));
1188   copy_keymap_closure.self = XKEYMAP (keymap);
1189   elisp_maphash (copy_keymap_mapper,
1190                  XKEYMAP (keymap)->table,
1191                  &copy_keymap_closure);
1192   return keymap;
1193 }
1194
1195 DEFUN ("copy-keymap", Fcopy_keymap, 1, 1, 0, /*
1196 Return a copy of the keymap KEYMAP.
1197 The copy starts out with the same definitions of KEYMAP,
1198 but changing either the copy or KEYMAP does not affect the other.
1199 Any key definitions that are subkeymaps are recursively copied.
1200 */
1201        (keymap))
1202 {
1203   /* This function can GC */
1204   keymap = get_keymap (keymap, 1, 1);
1205   return copy_keymap (keymap);
1206 }
1207
1208 \f
1209 static int
1210 keymap_fullness (Lisp_Object keymap)
1211 {
1212   /* This function can GC */
1213   int fullness;
1214   Lisp_Object sub_maps;
1215   struct gcpro gcpro1, gcpro2;
1216
1217   keymap = get_keymap (keymap, 1, 1);
1218   fullness = XKEYMAP (keymap)->fullness;
1219   sub_maps = keymap_submaps (keymap);
1220   GCPRO2 (keymap, sub_maps);
1221   for (; !NILP (sub_maps); sub_maps = XCDR (sub_maps))
1222     {
1223       if (MODIFIER_HASH_KEY_BITS (XCAR (XCAR (sub_maps))) != 0)
1224         {
1225           Lisp_Object sub_map = XCDR (XCAR (sub_maps));
1226           fullness--; /* don't count bucky maps */
1227           fullness += keymap_fullness (sub_map);
1228         }
1229     }
1230   UNGCPRO;
1231   return fullness;
1232 }
1233
1234 DEFUN ("keymap-fullness", Fkeymap_fullness, 1, 1, 0, /*
1235 Return the number of bindings in the keymap.
1236 */
1237        (keymap))
1238 {
1239   /* This function can GC */
1240   return make_int (keymap_fullness (get_keymap (keymap, 1, 1)));
1241 }
1242
1243 \f
1244 /************************************************************************/
1245 /*                        Defining keys in keymaps                      */
1246 /************************************************************************/
1247
1248 /* Given a keysym (should be a symbol, int, char), make sure it's valid
1249    and perform any necessary canonicalization. */
1250
1251 static void
1252 define_key_check_and_coerce_keysym (Lisp_Object spec,
1253                                     Lisp_Object *keysym,
1254                                     unsigned int modifiers)
1255 {
1256   /* Now, check and massage the trailing keysym specifier. */
1257   if (SYMBOLP (*keysym))
1258     {
1259       if (string_char_length (XSYMBOL (*keysym)->name) == 1)
1260         {
1261           Lisp_Object ream_gcc_up_the_ass =
1262             make_char (string_char (XSYMBOL (*keysym)->name, 0));
1263           *keysym = ream_gcc_up_the_ass;
1264           goto fixnum_keysym;
1265         }
1266     }
1267   else if (CHAR_OR_CHAR_INTP (*keysym))
1268     {
1269       CHECK_CHAR_COERCE_INT (*keysym);
1270     fixnum_keysym:
1271       if (XCHAR (*keysym) < ' '
1272           /* || (XCHAR (*keysym) >= 128 && XCHAR (*keysym) < 160) */)
1273         /* yuck!  Can't make the above restriction; too many compatibility
1274            problems ... */
1275         signal_simple_error ("keysym char must be printable", *keysym);
1276       /* #### This bites!  I want to be able to write (control shift a) */
1277       if (modifiers & MOD_SHIFT)
1278         signal_simple_error
1279           ("The `shift' modifier may not be applied to ASCII keysyms",
1280            spec);
1281     }
1282   else
1283     {
1284       signal_simple_error ("Unknown keysym specifier",
1285                            *keysym);
1286     }
1287
1288   if (SYMBOLP (*keysym))
1289     {
1290       char *name = (char *)
1291         string_data (XSYMBOL (*keysym)->name);
1292
1293       /* FSFmacs uses symbols with the printed representation of keysyms in
1294          their names, like 'M-x, and we use the syntax '(meta x).  So, to avoid
1295          confusion, notice the M-x syntax and signal an error - because
1296          otherwise it would be interpreted as a regular keysym, and would even
1297          show up in the list-buffers output, causing confusion to the naive.
1298
1299          We can get away with this because none of the X keysym names contain
1300          a hyphen (some contain underscore, however).
1301
1302          It might be useful to reject keysyms which are not x-valid-keysym-
1303          name-p, but that would interfere with various tricks we do to
1304          sanitize the Sun keyboards, and would make it trickier to
1305          conditionalize a .emacs file for multiple X servers.
1306          */
1307       if (((int) strlen (name) >= 2 && name[1] == '-')
1308 #if 1
1309           ||
1310           /* Ok, this is a bit more dubious - prevent people from doing things
1311              like (global-set-key 'RET 'something) because that will have the
1312              same problem as above.  (Gag!)  Maybe we should just silently
1313              accept these as aliases for the "real" names?
1314              */
1315           (string_length (XSYMBOL (*keysym)->name) <= 3 &&
1316            (!strcmp (name, "LFD") ||
1317             !strcmp (name, "TAB") ||
1318             !strcmp (name, "RET") ||
1319             !strcmp (name, "ESC") ||
1320             !strcmp (name, "DEL") ||
1321             !strcmp (name, "SPC") ||
1322             !strcmp (name, "BS")))
1323 #endif /* unused */
1324           )
1325         signal_simple_error
1326           ("Invalid (FSF Emacs) key format (see doc of define-key)",
1327            *keysym);
1328
1329       /* #### Ok, this is a bit more dubious - make people not lose if they
1330          do things like (global-set-key 'RET 'something) because that would
1331          otherwise have the same problem as above.  (Gag!)  We silently
1332          accept these as aliases for the "real" names.
1333          */
1334       else if (!strncmp(name, "kp_", 3)) {
1335         /* Likewise, the obsolete keysym binding of kp_.* should not lose. */
1336         char temp[50];
1337
1338         strncpy(temp, name, sizeof (temp));
1339         temp[sizeof (temp) - 1] = '\0';
1340         temp[2] = '-';
1341         *keysym = Fintern_soft(make_string((Bufbyte *)temp,
1342                                            strlen(temp)),
1343                                Qnil);
1344       } else if (EQ (*keysym, QLFD))
1345         *keysym = QKlinefeed;
1346       else if (EQ (*keysym, QTAB))
1347         *keysym = QKtab;
1348       else if (EQ (*keysym, QRET))
1349         *keysym = QKreturn;
1350       else if (EQ (*keysym, QESC))
1351         *keysym = QKescape;
1352       else if (EQ (*keysym, QDEL))
1353         *keysym = QKdelete;
1354       else if (EQ (*keysym, QSPC))
1355         *keysym = QKspace;
1356       else if (EQ (*keysym, QBS))
1357         *keysym = QKbackspace;
1358       /* Emacs compatibility */
1359       else if (EQ(*keysym, Qdown_mouse_1))
1360         *keysym = Qbutton1;
1361       else if (EQ(*keysym, Qdown_mouse_2))
1362         *keysym = Qbutton2;
1363       else if (EQ(*keysym, Qdown_mouse_3))
1364         *keysym = Qbutton3;
1365       else if (EQ(*keysym, Qdown_mouse_4))
1366         *keysym = Qbutton4;
1367       else if (EQ(*keysym, Qdown_mouse_5))
1368         *keysym = Qbutton5;
1369       else if (EQ(*keysym, Qmouse_1))
1370         *keysym = Qbutton1up;
1371       else if (EQ(*keysym, Qmouse_2))
1372         *keysym = Qbutton2up;
1373       else if (EQ(*keysym, Qmouse_3))
1374         *keysym = Qbutton3up;
1375       else if (EQ(*keysym, Qmouse_4))
1376         *keysym = Qbutton4up;
1377       else if (EQ(*keysym, Qmouse_5))
1378         *keysym = Qbutton5up;
1379     }
1380 }
1381
1382
1383 /* Given any kind of key-specifier, return a keysym and modifier mask.
1384    Proper canonicalization is performed:
1385
1386    -- integers are converted into the equivalent characters.
1387    -- one-character strings are converted into the equivalent characters.
1388  */
1389
1390 static void
1391 define_key_parser (Lisp_Object spec, struct key_data *returned_value)
1392 {
1393   if (CHAR_OR_CHAR_INTP (spec))
1394     {
1395       struct Lisp_Event event;
1396       event.event_type = empty_event;
1397       character_to_event (XCHAR_OR_CHAR_INT (spec), &event,
1398                           XCONSOLE (Vselected_console), 0, 0);
1399       returned_value->keysym    = event.event.key.keysym;
1400       returned_value->modifiers = event.event.key.modifiers;
1401     }
1402   else if (EVENTP (spec))
1403     {
1404       switch (XEVENT (spec)->event_type)
1405         {
1406         case key_press_event:
1407           {
1408             returned_value->keysym    = XEVENT (spec)->event.key.keysym;
1409             returned_value->modifiers = XEVENT (spec)->event.key.modifiers;
1410             break;
1411           }
1412         case button_press_event:
1413         case button_release_event:
1414           {
1415             int down = (XEVENT (spec)->event_type == button_press_event);
1416             switch (XEVENT (spec)->event.button.button)
1417               {
1418               case 1:
1419                 returned_value->keysym = (down ? Qbutton1 : Qbutton1up); break;
1420               case 2:
1421                 returned_value->keysym = (down ? Qbutton2 : Qbutton2up); break;
1422               case 3:
1423                 returned_value->keysym = (down ? Qbutton3 : Qbutton3up); break;
1424               case 4:
1425                 returned_value->keysym = (down ? Qbutton4 : Qbutton4up); break;
1426               case 5:
1427                 returned_value->keysym = (down ? Qbutton5 : Qbutton5up); break;
1428               case 6:
1429                 returned_value->keysym = (down ? Qbutton6 : Qbutton6up); break;
1430               case 7:
1431                 returned_value->keysym = (down ? Qbutton7 : Qbutton7up); break;
1432               default:
1433                 returned_value->keysym = (down ? Qbutton0 : Qbutton0up); break;
1434               }
1435             returned_value->modifiers = XEVENT (spec)->event.button.modifiers;
1436             break;
1437           }
1438         default:
1439           signal_error (Qwrong_type_argument,
1440                         list2 (build_translated_string
1441                                ("unable to bind this type of event"),
1442                                spec));
1443         }
1444     }
1445   else if (SYMBOLP (spec))
1446     {
1447       /* Be nice, allow = to mean (=) */
1448       if (bucky_sym_to_bucky_bit (spec) != 0)
1449         signal_simple_error ("Key is a modifier name", spec);
1450       define_key_check_and_coerce_keysym (spec, &spec, 0);
1451       returned_value->keysym = spec;
1452       returned_value->modifiers = 0;
1453     }
1454   else if (CONSP (spec))
1455     {
1456       unsigned int modifiers = 0;
1457       Lisp_Object keysym = Qnil;
1458       Lisp_Object rest = spec;
1459
1460       /* First, parse out the leading modifier symbols. */
1461       while (CONSP (rest))
1462         {
1463           unsigned int modifier;
1464
1465           keysym = XCAR (rest);
1466           modifier = bucky_sym_to_bucky_bit (keysym);
1467           modifiers |= modifier;
1468           if (!NILP (XCDR (rest)))
1469             {
1470               if (! modifier)
1471                 signal_simple_error ("Unknown modifier", keysym);
1472             }
1473           else
1474             {
1475               if (modifier)
1476                 signal_simple_error ("Nothing but modifiers here",
1477                                      spec);
1478             }
1479           rest = XCDR (rest);
1480           QUIT;
1481         }
1482       if (!NILP (rest))
1483         signal_simple_error ("List must be nil-terminated", spec);
1484
1485       define_key_check_and_coerce_keysym (spec, &keysym, modifiers);
1486       returned_value->keysym = keysym;
1487       returned_value->modifiers = modifiers;
1488     }
1489   else
1490     {
1491       signal_simple_error ("Unknown key-sequence specifier",
1492                            spec);
1493     }
1494 }
1495
1496 /* Used by character-to-event */
1497 void
1498 key_desc_list_to_event (Lisp_Object list, Lisp_Object event,
1499                         int allow_menu_events)
1500 {
1501   struct key_data raw_key;
1502
1503   if (allow_menu_events &&
1504       CONSP (list) &&
1505       /* #### where the hell does this come from? */
1506       EQ (XCAR (list), Qmenu_selection))
1507     {
1508       Lisp_Object fn, arg;
1509       if (! NILP (Fcdr (Fcdr (list))))
1510         signal_simple_error ("Invalid menu event desc", list);
1511       arg = Fcar (Fcdr (list));
1512       if (SYMBOLP (arg))
1513         fn = Qcall_interactively;
1514       else
1515         fn = Qeval;
1516       XSETFRAME (XEVENT (event)->channel, selected_frame ());
1517       XEVENT (event)->event_type = misc_user_event;
1518       XEVENT (event)->event.eval.function = fn;
1519       XEVENT (event)->event.eval.object = arg;
1520       return;
1521     }
1522
1523   define_key_parser (list, &raw_key);
1524
1525   if (EQ (raw_key.keysym, Qbutton0) || EQ (raw_key.keysym, Qbutton0up) ||
1526       EQ (raw_key.keysym, Qbutton1) || EQ (raw_key.keysym, Qbutton1up) ||
1527       EQ (raw_key.keysym, Qbutton2) || EQ (raw_key.keysym, Qbutton2up) ||
1528       EQ (raw_key.keysym, Qbutton3) || EQ (raw_key.keysym, Qbutton3up) ||
1529       EQ (raw_key.keysym, Qbutton4) || EQ (raw_key.keysym, Qbutton4up) ||
1530       EQ (raw_key.keysym, Qbutton5) || EQ (raw_key.keysym, Qbutton5up) ||
1531       EQ (raw_key.keysym, Qbutton6) || EQ (raw_key.keysym, Qbutton6up) ||
1532       EQ (raw_key.keysym, Qbutton7) || EQ (raw_key.keysym, Qbutton7up))
1533     error ("Mouse-clicks can't appear in saved keyboard macros.");
1534
1535   XEVENT (event)->channel = Vselected_console;
1536   XEVENT (event)->event_type = key_press_event;
1537   XEVENT (event)->event.key.keysym = raw_key.keysym;
1538   XEVENT (event)->event.key.modifiers = raw_key.modifiers;
1539 }
1540
1541
1542 int
1543 event_matches_key_specifier_p (struct Lisp_Event *event,
1544                                Lisp_Object key_specifier)
1545 {
1546   Lisp_Object event2;
1547   int retval;
1548   struct gcpro gcpro1;
1549
1550   if (event->event_type != key_press_event || NILP (key_specifier) ||
1551       (INTP (key_specifier) && !CHAR_INTP (key_specifier)))
1552     return 0;
1553
1554   /* if the specifier is an integer such as 27, then it should match
1555      both of the events 'escape' and 'control ['.  Calling
1556      Fcharacter_to_event() will only match 'escape'. */
1557   if (CHAR_OR_CHAR_INTP (key_specifier))
1558     return (XCHAR_OR_CHAR_INT (key_specifier)
1559             == event_to_character (event, 0, 0, 0));
1560
1561   /* Otherwise, we cannot call event_to_character() because we may
1562      be dealing with non-ASCII keystrokes.  In any case, if I ask
1563      for 'control [' then I should get exactly that, and not
1564      'escape'.
1565
1566      However, we have to behave differently on TTY's, where 'control ['
1567      is silently converted into 'escape' by the keyboard driver.
1568      In this case, ASCII is the only thing we know about, so we have
1569      to compare the ASCII values. */
1570
1571   GCPRO1 (event2);
1572   event2 = Fmake_event (Qnil, Qnil);
1573   Fcharacter_to_event (key_specifier, event2, Qnil, Qnil);
1574   if (XEVENT (event2)->event_type != key_press_event)
1575     retval = 0;
1576   else if (CONSOLE_TTY_P (XCONSOLE (EVENT_CHANNEL (event))))
1577     {
1578       int ch1, ch2;
1579
1580       ch1 = event_to_character (event, 0, 0, 0);
1581       ch2 = event_to_character (XEVENT (event2), 0, 0, 0);
1582       retval = (ch1 >= 0 && ch2 >= 0 && ch1 == ch2);
1583     }
1584   else if (EQ (event->event.key.keysym, XEVENT (event2)->event.key.keysym) &&
1585            event->event.key.modifiers == XEVENT (event2)->event.key.modifiers)
1586     retval = 1;
1587   else
1588     retval = 0;
1589   Fdeallocate_event (event2);
1590   UNGCPRO;
1591   return retval;
1592 }
1593
1594 static int
1595 meta_prefix_char_p (CONST struct key_data *key)
1596 {
1597   struct Lisp_Event event;
1598
1599   event.event_type = key_press_event;
1600   event.channel = Vselected_console;
1601   event.event.key.keysym = key->keysym;
1602   event.event.key.modifiers = key->modifiers;
1603   return event_matches_key_specifier_p (&event, Vmeta_prefix_char);
1604 }
1605
1606 DEFUN ("event-matches-key-specifier-p", Fevent_matches_key_specifier_p, 2, 2, 0, /*
1607 Return non-nil if EVENT matches KEY-SPECIFIER.
1608 This can be useful, e.g., to determine if the user pressed `help-char' or
1609 `quit-char'.
1610 */
1611        (event, key_specifier))
1612 {
1613   CHECK_LIVE_EVENT (event);
1614   return (event_matches_key_specifier_p (XEVENT (event), key_specifier)
1615           ? Qt : Qnil);
1616 }
1617
1618 #define MACROLET(k,m) do {              \
1619   returned_value->keysym = (k);         \
1620   returned_value->modifiers = (m);      \
1621   RETURN_SANS_WARNINGS;                 \
1622 } while (0)
1623
1624 /* ASCII grunge.
1625    Given a keysym, return another keysym/modifier pair which could be
1626    considered the same key in an ASCII world.  Backspace returns ^H, for
1627    example.
1628  */
1629 static void
1630 define_key_alternate_name (struct key_data *key,
1631                            struct key_data *returned_value)
1632 {
1633   Lisp_Object keysym = key->keysym;
1634   unsigned int modifiers = key->modifiers;
1635   unsigned int modifiers_sans_control = (modifiers & (~MOD_CONTROL));
1636   unsigned int modifiers_sans_meta = (modifiers & (~MOD_META));
1637   returned_value->keysym = Qnil; /* By default, no "alternate" key */
1638   returned_value->modifiers = 0;
1639   if (modifiers_sans_meta == MOD_CONTROL)
1640     {
1641       if EQ (keysym, QKspace)
1642         MACROLET (make_char ('@'), modifiers);
1643       else if (!CHARP (keysym))
1644         return;
1645       else switch (XCHAR (keysym))
1646         {
1647         case '@':               /* c-@ => c-space */
1648           MACROLET (QKspace, modifiers);
1649         case 'h':               /* c-h => backspace */
1650           MACROLET (QKbackspace, modifiers_sans_control);
1651         case 'i':               /* c-i => tab */
1652           MACROLET (QKtab, modifiers_sans_control);
1653         case 'j':               /* c-j => linefeed */
1654           MACROLET (QKlinefeed, modifiers_sans_control);
1655         case 'm':               /* c-m => return */
1656           MACROLET (QKreturn, modifiers_sans_control);
1657         case '[':               /* c-[ => escape */
1658           MACROLET (QKescape, modifiers_sans_control);
1659         default:
1660           return;
1661         }
1662     }
1663   else if (modifiers_sans_meta != 0)
1664     return;
1665   else if (EQ (keysym, QKbackspace)) /* backspace => c-h */
1666     MACROLET (make_char ('h'), (modifiers | MOD_CONTROL));
1667   else if (EQ (keysym, QKtab))       /* tab => c-i */
1668     MACROLET (make_char ('i'), (modifiers | MOD_CONTROL));
1669   else if (EQ (keysym, QKlinefeed))  /* linefeed => c-j */
1670     MACROLET (make_char ('j'), (modifiers | MOD_CONTROL));
1671   else if (EQ (keysym, QKreturn))    /* return => c-m */
1672     MACROLET (make_char ('m'), (modifiers | MOD_CONTROL));
1673   else if (EQ (keysym, QKescape))    /* escape => c-[ */
1674     MACROLET (make_char ('['), (modifiers | MOD_CONTROL));
1675   else
1676     return;
1677 #undef MACROLET
1678 }
1679
1680
1681 static void
1682 ensure_meta_prefix_char_keymapp (Lisp_Object keys, int indx,
1683                                  Lisp_Object keymap)
1684 {
1685   /* This function can GC */
1686   Lisp_Object new_keys;
1687   int i;
1688   Lisp_Object mpc_binding;
1689   struct key_data meta_key;
1690
1691   if (NILP (Vmeta_prefix_char) ||
1692       (INTP (Vmeta_prefix_char) && !CHAR_INTP (Vmeta_prefix_char)))
1693     return;
1694
1695   define_key_parser (Vmeta_prefix_char, &meta_key);
1696   mpc_binding = keymap_lookup_1 (keymap, &meta_key, 0);
1697   if (NILP (mpc_binding) || !NILP (Fkeymapp (mpc_binding)))
1698     return;
1699
1700   if (indx == 0)
1701     new_keys = keys;
1702   else if (STRINGP (keys))
1703     new_keys = Fsubstring (keys, Qzero, make_int (indx));
1704   else if (VECTORP (keys))
1705     {
1706       new_keys = make_vector (indx, Qnil);
1707       for (i = 0; i < indx; i++)
1708         XVECTOR_DATA (new_keys) [i] = XVECTOR_DATA (keys) [i];
1709     }
1710   else
1711     abort ();
1712
1713   if (EQ (keys, new_keys))
1714     error_with_frob (mpc_binding,
1715                      "can't bind %s: %s has a non-keymap binding",
1716                      (char *) XSTRING_DATA (Fkey_description (keys)),
1717                      (char *) XSTRING_DATA (Fsingle_key_description
1718                                             (Vmeta_prefix_char)));
1719   else
1720     error_with_frob (mpc_binding,
1721                      "can't bind %s: %s %s has a non-keymap binding",
1722                      (char *) XSTRING_DATA (Fkey_description (keys)),
1723                      (char *) XSTRING_DATA (Fkey_description (new_keys)),
1724                      (char *) XSTRING_DATA (Fsingle_key_description
1725                                             (Vmeta_prefix_char)));
1726 }
1727
1728 DEFUN ("define-key", Fdefine_key, 3, 3, 0, /*
1729 Define key sequence KEYS, in KEYMAP, as DEF.
1730 KEYMAP is a keymap object.
1731 KEYS is the sequence of keystrokes to bind, described below.
1732 DEF is anything that can be a key's definition:
1733  nil (means key is undefined in this keymap);
1734  a command (a Lisp function suitable for interactive calling);
1735  a string or key sequence vector (treated as a keyboard macro);
1736  a keymap (to define a prefix key);
1737  a symbol; when the key is looked up, the symbol will stand for its
1738     function definition, that should at that time be one of the above,
1739     or another symbol whose function definition is used, and so on.
1740  a cons (STRING . DEFN), meaning that DEFN is the definition
1741     (DEFN should be a valid definition in its own right);
1742  or a cons (KEYMAP . CHAR), meaning use definition of CHAR in map KEYMAP.
1743
1744 Contrary to popular belief, the world is not ASCII.  When running under a
1745 window manager, XEmacs can tell the difference between, for example, the
1746 keystrokes control-h, control-shift-h, and backspace.  You can, in fact,
1747 bind different commands to each of these.
1748
1749 A `key sequence' is a set of keystrokes.  A `keystroke' is a keysym and some
1750 set of modifiers (such as control and meta).  A `keysym' is what is printed
1751 on the keys on your keyboard.
1752
1753 A keysym may be represented by a symbol, or (if and only if it is equivalent
1754 to an ASCII character in the range 32 - 255) by a character or its equivalent
1755 ASCII code.  The `A' key may be represented by the symbol `A', the character
1756 `?A', or by the number 65.  The `break' key may be represented only by the
1757 symbol `break'.
1758
1759 A keystroke may be represented by a list: the last element of the list
1760 is the key (a symbol, character, or number, as above) and the
1761 preceding elements are the symbolic names of modifier keys (control,
1762 meta, super, hyper, alt, and shift).  Thus, the sequence control-b is
1763 represented by the forms `(control b)', `(control ?b)', and `(control
1764 98)'.  A keystroke may also be represented by an event object, as
1765 returned by the `next-command-event' and `read-key-sequence'
1766 functions.
1767
1768 Note that in this context, the keystroke `control-b' is *not* represented
1769 by the number 2 (the ASCII code for ^B) or the character `?\^B'.  See below.
1770
1771 The `shift' modifier is somewhat of a special case.  You should not (and
1772 cannot) use `(meta shift a)' to mean `(meta A)', since for characters that
1773 have ASCII equivalents, the state of the shift key is implicit in the
1774 keysym (a vs. A).  You also cannot say `(shift =)' to mean `+', as that
1775 sort of thing varies from keyboard to keyboard.  The shift modifier is for
1776 use only with characters that do not have a second keysym on the same key,
1777 such as `backspace' and `tab'.
1778
1779 A key sequence is a vector of keystrokes.  As a degenerate case, elements
1780 of this vector may also be keysyms if they have no modifiers.  That is,
1781 the `A' keystroke is represented by all of these forms:
1782         A       ?A      65      (A)     (?A)    (65)
1783         [A]     [?A]    [65]    [(A)]   [(?A)]  [(65)]
1784
1785 the `control-a' keystroke is represented by these forms:
1786         (control A)     (control ?A)    (control 65)
1787         [(control A)]   [(control ?A)]  [(control 65)]
1788 the key sequence `control-c control-a' is represented by these forms:
1789         [(control c) (control a)]       [(control ?c) (control ?a)]
1790         [(control 99) (control 65)]     etc.
1791
1792 Mouse button clicks work just like keypresses: (control button1) means
1793 pressing the left mouse button while holding down the control key.
1794 \[(control c) (shift button3)] means control-c, hold shift, click right.
1795
1796 Commands may be bound to the mouse-button up-stroke rather than the down-
1797 stroke as well.  `button1' means the down-stroke, and `button1up' means the
1798 up-stroke.  Different commands may be bound to the up and down strokes,
1799 though that is probably not what you want, so be careful.
1800
1801 For backward compatibility, a key sequence may also be represented by a
1802 string.  In this case, it represents the key sequence(s) that would
1803 produce that sequence of ASCII characters in a purely ASCII world.  For
1804 example, a string containing the ASCII backspace character, "\\^H", would
1805 represent two key sequences: `(control h)' and `backspace'.  Binding a
1806 command to this will actually bind both of those key sequences.  Likewise
1807 for the following pairs:
1808
1809                 control h       backspace
1810                 control i       tab
1811                 control m       return
1812                 control j       linefeed
1813                 control [       escape
1814                 control @       control space
1815
1816 After binding a command to two key sequences with a form like
1817
1818         (define-key global-map "\\^X\\^I" \'command-1)
1819
1820 it is possible to redefine only one of those sequences like so:
1821
1822         (define-key global-map [(control x) (control i)] \'command-2)
1823         (define-key global-map [(control x) tab] \'command-3)
1824
1825 Of course, all of this applies only when running under a window system.  If
1826 you're talking to XEmacs through a TTY connection, you don't get any of
1827 these features.
1828 */
1829        (keymap, keys, def))
1830 {
1831   /* This function can GC */
1832   int idx;
1833   int metized = 0;
1834   int len;
1835   int ascii_hack;
1836   struct gcpro gcpro1, gcpro2, gcpro3;
1837
1838   if (VECTORP (keys))
1839     len = XVECTOR_LENGTH (keys);
1840   else if (STRINGP (keys))
1841     len = XSTRING_CHAR_LENGTH (keys);
1842   else if (CHAR_OR_CHAR_INTP (keys) || SYMBOLP (keys) || CONSP (keys))
1843     {
1844       if (!CONSP (keys)) keys = list1 (keys);
1845       len = 1;
1846       keys = make_vector (1, keys); /* this is kinda sleazy. */
1847     }
1848   else
1849     {
1850       keys = wrong_type_argument (Qsequencep, keys);
1851       len = XINT (Flength (keys));
1852     }
1853   if (len == 0)
1854     return Qnil;
1855
1856   GCPRO3 (keymap, keys, def);
1857
1858   /* ASCII grunge.
1859      When the user defines a key which, in a strictly ASCII world, would be
1860      produced by two different keys (^J and linefeed, or ^H and backspace,
1861      for example) then the binding will be made for both keysyms.
1862
1863      This is done if the user binds a command to a string, as in
1864      (define-key map "\^H" 'something), but not when using one of the new
1865      syntaxes, like (define-key map '(control h) 'something).
1866      */
1867   ascii_hack = (STRINGP (keys));
1868
1869   keymap = get_keymap (keymap, 1, 1);
1870
1871   idx = 0;
1872   while (1)
1873     {
1874       Lisp_Object c;
1875       struct key_data raw_key1;
1876       struct key_data raw_key2;
1877
1878       if (STRINGP (keys))
1879         c = make_char (string_char (XSTRING (keys), idx));
1880       else
1881         c = XVECTOR_DATA (keys) [idx];
1882
1883       define_key_parser (c, &raw_key1);
1884
1885       if (!metized && ascii_hack && meta_prefix_char_p (&raw_key1))
1886         {
1887           if (idx == (len - 1))
1888             {
1889               /* This is a hack to prevent a binding for the meta-prefix-char
1890                  from being made in a map which already has a non-empty "meta"
1891                  submap.  That is, we can't let both "escape" and "meta" have
1892                  a binding in the same keymap.  This implies that the idiom
1893                  (define-key my-map "\e" my-escape-map)
1894                  (define-key my-escape-map "a" 'my-command)
1895                  no longer works.  That's ok.  Instead the luser should do
1896                  (define-key my-map "\ea" 'my-command)
1897                  or, more correctly
1898                  (define-key my-map "\M-a" 'my-command)
1899                  and then perhaps
1900                  (defvar my-escape-map (lookup-key my-map "\e"))
1901                  if the luser really wants the map in a variable.
1902                  */
1903               Lisp_Object mmap;
1904               struct gcpro ngcpro1;
1905
1906               NGCPRO1 (c);
1907               mmap = Fgethash (MAKE_MODIFIER_HASH_KEY (MOD_META),
1908                                XKEYMAP (keymap)->table, Qnil);
1909               if (!NILP (mmap)
1910                   && keymap_fullness (mmap) != 0)
1911                 {
1912                   Lisp_Object desc
1913                     = Fsingle_key_description (Vmeta_prefix_char);
1914                   signal_simple_error_2
1915                     ("Map contains meta-bindings, can't bind", desc, keymap);
1916                 }
1917               NUNGCPRO;
1918             }
1919           else
1920             {
1921               metized = 1;
1922               idx++;
1923               continue;
1924             }
1925         }
1926
1927       if (ascii_hack)
1928         define_key_alternate_name (&raw_key1, &raw_key2);
1929       else
1930         {
1931           raw_key2.keysym = Qnil;
1932           raw_key2.modifiers = 0;
1933         }
1934
1935       if (metized)
1936         {
1937           raw_key1.modifiers  |= MOD_META;
1938           raw_key2.modifiers |= MOD_META;
1939           metized = 0;
1940         }
1941
1942       /* This crap is to make sure that someone doesn't bind something like
1943          "C-x M-a" while "C-x ESC" has a non-keymap binding. */
1944       if (raw_key1.modifiers & MOD_META)
1945         ensure_meta_prefix_char_keymapp (keys, idx, keymap);
1946
1947       if (++idx == len)
1948         {
1949           keymap_store (keymap, &raw_key1, def);
1950           if (ascii_hack && !NILP (raw_key2.keysym))
1951             keymap_store (keymap, &raw_key2, def);
1952           UNGCPRO;
1953           return def;
1954         }
1955
1956       {
1957         Lisp_Object cmd;
1958         struct gcpro ngcpro1;
1959         NGCPRO1 (c);
1960
1961         cmd = keymap_lookup_1 (keymap, &raw_key1, 0);
1962         if (NILP (cmd))
1963           {
1964             cmd = Fmake_sparse_keymap (Qnil);
1965             XKEYMAP (cmd)->name /* for debugging */
1966               = list2 (make_key_description (&raw_key1, 1), keymap);
1967             keymap_store (keymap, &raw_key1, cmd);
1968           }
1969         if (NILP (Fkeymapp (cmd)))
1970           signal_simple_error_2 ("Invalid prefix keys in sequence",
1971                                  c, keys);
1972
1973         if (ascii_hack && !NILP (raw_key2.keysym) &&
1974             NILP (keymap_lookup_1 (keymap, &raw_key2, 0)))
1975           keymap_store (keymap, &raw_key2, cmd);
1976
1977         keymap = get_keymap (cmd, 1, 1);
1978         NUNGCPRO;
1979       }
1980     }
1981 }
1982
1983 \f
1984 /************************************************************************/
1985 /*                      Looking up keys in keymaps                      */
1986 /************************************************************************/
1987
1988 /* We need a very fast (i.e., non-consing) version of lookup-key in order
1989    to make where-is-internal really fly. */
1990
1991 struct raw_lookup_key_mapper_closure
1992 {
1993   int remaining;
1994   CONST struct key_data *raw_keys;
1995   int raw_keys_count;
1996   int keys_so_far;
1997   int accept_default;
1998 };
1999
2000 static Lisp_Object raw_lookup_key_mapper (Lisp_Object k, void *);
2001
2002 /* Caller should gc-protect args (keymaps may autoload) */
2003 static Lisp_Object
2004 raw_lookup_key (Lisp_Object keymap,
2005                 CONST struct key_data *raw_keys, int raw_keys_count,
2006                 int keys_so_far, int accept_default)
2007 {
2008   /* This function can GC */
2009   struct raw_lookup_key_mapper_closure c;
2010   c.remaining = raw_keys_count - 1;
2011   c.raw_keys = raw_keys;
2012   c.raw_keys_count = raw_keys_count;
2013   c.keys_so_far = keys_so_far;
2014   c.accept_default = accept_default;
2015
2016   return traverse_keymaps (keymap, Qnil, raw_lookup_key_mapper, &c);
2017 }
2018
2019 static Lisp_Object
2020 raw_lookup_key_mapper (Lisp_Object k, void *arg)
2021 {
2022   /* This function can GC */
2023   struct raw_lookup_key_mapper_closure *c =
2024     (struct raw_lookup_key_mapper_closure *) arg;
2025   int accept_default = c->accept_default;
2026   int remaining = c->remaining;
2027   int keys_so_far = c->keys_so_far;
2028   CONST struct key_data *raw_keys = c->raw_keys;
2029   Lisp_Object cmd;
2030
2031   if (! meta_prefix_char_p (&(raw_keys[0])))
2032     {
2033       /* Normal case: every case except the meta-hack (see below). */
2034       cmd = keymap_lookup_1 (k, &(raw_keys[0]), accept_default);
2035
2036       if (remaining == 0)
2037         /* Return whatever we found if we're out of keys */
2038         ;
2039       else if (NILP (cmd))
2040         /* Found nothing (though perhaps parent map may have binding) */
2041         ;
2042       else if (NILP (Fkeymapp (cmd)))
2043         /* Didn't find a keymap, and we have more keys.
2044          * Return a fixnum to indicate that keys were too long.
2045          */
2046         cmd = make_int (keys_so_far + 1);
2047       else
2048         cmd = raw_lookup_key (cmd, raw_keys + 1, remaining,
2049                               keys_so_far + 1, accept_default);
2050     }
2051   else
2052     {
2053       /* This is a hack so that looking up a key-sequence whose last
2054        * element is the meta-prefix-char will return the keymap that
2055        * the "meta" keys are stored in, if there is no binding for
2056        * the meta-prefix-char (and if this map has a "meta" submap).
2057        * If this map doesn't have a "meta" submap, then the
2058        * meta-prefix-char is looked up just like any other key.
2059        */
2060       if (remaining == 0)
2061         {
2062           /* First look for the prefix-char directly */
2063           cmd = keymap_lookup_1 (k, &(raw_keys[0]), accept_default);
2064           if (NILP (cmd))
2065             {
2066               /* Do kludgy return of the meta-map */
2067               cmd = Fgethash (MAKE_MODIFIER_HASH_KEY (MOD_META),
2068                               XKEYMAP (k)->table, Qnil);
2069             }
2070         }
2071       else
2072         {
2073           /* Search for the prefix-char-prefixed sequence directly */
2074           cmd = keymap_lookup_1 (k, &(raw_keys[0]), accept_default);
2075           cmd = get_keymap (cmd, 0, 1);
2076           if (!NILP (cmd))
2077             cmd = raw_lookup_key (cmd, raw_keys + 1, remaining,
2078                                   keys_so_far + 1, accept_default);
2079           else if ((raw_keys[1].modifiers & MOD_META) == 0)
2080             {
2081               struct key_data metified;
2082               metified.keysym = raw_keys[1].keysym;
2083               metified.modifiers = raw_keys[1].modifiers | MOD_META;
2084
2085               /* Search for meta-next-char sequence directly */
2086               cmd = keymap_lookup_1 (k, &metified, accept_default);
2087               if (remaining == 1)
2088                 ;
2089               else
2090                 {
2091                   cmd = get_keymap (cmd, 0, 1);
2092                   if (!NILP (cmd))
2093                     cmd = raw_lookup_key (cmd, raw_keys + 2, remaining - 1,
2094                                           keys_so_far + 2,
2095                                           accept_default);
2096                 }
2097             }
2098         }
2099     }
2100   if (accept_default && NILP (cmd))
2101     cmd = XKEYMAP (k)->default_binding;
2102   return cmd;
2103 }
2104
2105 /* Value is number if `keys' is too long; NIL if valid but has no definition.*/
2106 /* Caller should gc-protect arguments */
2107 static Lisp_Object
2108 lookup_keys (Lisp_Object keymap, int nkeys, Lisp_Object *keys,
2109              int accept_default)
2110 {
2111   /* This function can GC */
2112   struct key_data kkk[20];
2113   struct key_data *raw_keys;
2114   int i;
2115
2116   if (nkeys == 0)
2117     return Qnil;
2118
2119   if (nkeys < (countof (kkk)))
2120     raw_keys = kkk;
2121   else
2122     raw_keys = alloca_array (struct key_data, nkeys);
2123
2124   for (i = 0; i < nkeys; i++)
2125     {
2126       define_key_parser (keys[i], &(raw_keys[i]));
2127     }
2128   return raw_lookup_key (keymap, raw_keys, nkeys, 0, accept_default);
2129 }
2130
2131 static Lisp_Object
2132 lookup_events (Lisp_Object event_head, int nmaps, Lisp_Object keymaps[],
2133                int accept_default)
2134 {
2135   /* This function can GC */
2136   struct key_data kkk[20];
2137   Lisp_Object event;
2138
2139   int nkeys;
2140   struct key_data *raw_keys;
2141   Lisp_Object tem = Qnil;
2142   struct gcpro gcpro1, gcpro2;
2143   int iii;
2144
2145   CHECK_LIVE_EVENT (event_head);
2146
2147   nkeys = event_chain_count (event_head);
2148
2149   if (nkeys < (countof (kkk)))
2150     raw_keys = kkk;
2151   else
2152     raw_keys = alloca_array (struct key_data, nkeys);
2153
2154   nkeys = 0;
2155   EVENT_CHAIN_LOOP (event, event_head)
2156     define_key_parser (event, &(raw_keys[nkeys++]));
2157   GCPRO2 (keymaps[0], event_head);
2158   gcpro1.nvars = nmaps;
2159   /* ####raw_keys[].keysym slots aren't gc-protected.  We rely (but shouldn't)
2160    * on somebody else somewhere (obarray) having a pointer to all keysyms. */
2161   for (iii = 0; iii < nmaps; iii++)
2162     {
2163       tem = raw_lookup_key (keymaps[iii], raw_keys, nkeys, 0,
2164                             accept_default);
2165       if (INTP (tem))
2166         {
2167           /* Too long in some local map means don't look at global map */
2168           tem = Qnil;
2169           break;
2170         }
2171       else if (!NILP (tem))
2172         break;
2173     }
2174   UNGCPRO;
2175   return tem;
2176 }
2177
2178 DEFUN ("lookup-key", Flookup_key, 2, 3, 0, /*
2179 In keymap KEYMAP, look up key-sequence KEYS.  Return the definition.
2180 Nil is returned if KEYS is unbound.  See documentation of `define-key'
2181 for valid key definitions and key-sequence specifications.
2182 A number is returned if KEYS is "too long"; that is, the leading
2183 characters fail to be a valid sequence of prefix characters in KEYMAP.
2184 The number is how many characters at the front of KEYS
2185 it takes to reach a non-prefix command.
2186 */
2187        (keymap, keys, accept_default))
2188 {
2189   /* This function can GC */
2190   if (VECTORP (keys))
2191     return lookup_keys (keymap,
2192                         XVECTOR_LENGTH (keys),
2193                         XVECTOR_DATA (keys),
2194                         !NILP (accept_default));
2195   else if (SYMBOLP (keys) || CHAR_OR_CHAR_INTP (keys) || CONSP (keys))
2196     return lookup_keys (keymap, 1, &keys, !NILP (accept_default));
2197   else if (STRINGP (keys))
2198     {
2199       int length = XSTRING_CHAR_LENGTH (keys);
2200       int i;
2201       struct key_data *raw_keys = alloca_array (struct key_data, length);
2202       if (length == 0)
2203         return Qnil;
2204
2205       for (i = 0; i < length; i++)
2206         {
2207           Emchar n = string_char (XSTRING (keys), i);
2208           define_key_parser (make_char (n), &(raw_keys[i]));
2209         }
2210       return raw_lookup_key (keymap, raw_keys, length, 0,
2211                              !NILP (accept_default));
2212     }
2213   else
2214     {
2215       keys = wrong_type_argument (Qsequencep, keys);
2216       return Flookup_key (keymap, keys, accept_default);
2217     }
2218 }
2219
2220 /* Given a key sequence, returns a list of keymaps to search for bindings.
2221    Does all manner of semi-hairy heuristics, like looking in the current
2222    buffer's map before looking in the global map and looking in the local
2223    map of the buffer in which the mouse was clicked in event0 is a click.
2224
2225    It would be kind of nice if this were in Lisp so that this semi-hairy
2226    semi-heuristic command-lookup behavior could be readily understood and
2227    customised.  However, this needs to be pretty fast, or performance of
2228    keyboard macros goes to shit; putting this in lisp slows macros down
2229    2-3x.  And they're already slower than v18 by 5-6x.
2230  */
2231
2232 struct relevant_maps
2233   {
2234     int nmaps;
2235     unsigned int max_maps;
2236     Lisp_Object *maps;
2237     struct gcpro *gcpro;
2238   };
2239
2240 static void get_relevant_extent_keymaps (Lisp_Object pos,
2241                                          Lisp_Object buffer_or_string,
2242                                          Lisp_Object glyph,
2243                                          struct relevant_maps *closure);
2244 static void get_relevant_minor_maps (Lisp_Object buffer,
2245                                      struct relevant_maps *closure);
2246
2247 static void
2248 relevant_map_push (Lisp_Object map, struct relevant_maps *closure)
2249 {
2250   unsigned int nmaps = closure->nmaps;
2251
2252   if (!KEYMAPP (map))
2253     return;
2254   closure->nmaps = nmaps + 1;
2255   if (nmaps < closure->max_maps)
2256     {
2257       closure->maps[nmaps] = map;
2258       closure->gcpro->nvars = nmaps;
2259     }
2260 }
2261
2262 static int
2263 get_relevant_keymaps (Lisp_Object keys,
2264                       int max_maps, Lisp_Object maps[])
2265 {
2266   /* This function can GC */
2267   Lisp_Object terminal = Qnil;
2268   struct gcpro gcpro1;
2269   struct relevant_maps closure;
2270   struct console *con;
2271
2272   GCPRO1 (*maps);
2273   gcpro1.nvars = 0;
2274   closure.nmaps = 0;
2275   closure.max_maps = max_maps;
2276   closure.maps = maps;
2277   closure.gcpro = &gcpro1;
2278
2279   if (EVENTP (keys))
2280     terminal = event_chain_tail (keys);
2281   else if (VECTORP (keys))
2282     {
2283       int len = XVECTOR_LENGTH (keys);
2284       if (len > 0)
2285         terminal = XVECTOR_DATA (keys)[len - 1];
2286     }
2287
2288   if (EVENTP (terminal))
2289     {
2290       CHECK_LIVE_EVENT (terminal);
2291       con = event_console_or_selected (terminal);
2292     }
2293   else
2294     con = XCONSOLE (Vselected_console);
2295
2296   if (KEYMAPP (con->overriding_terminal_local_map)
2297       || KEYMAPP (Voverriding_local_map))
2298     {
2299       if (KEYMAPP (con->overriding_terminal_local_map))
2300         relevant_map_push (con->overriding_terminal_local_map, &closure);
2301       if (KEYMAPP (Voverriding_local_map))
2302         relevant_map_push (Voverriding_local_map, &closure);
2303     }
2304   else if (!EVENTP (terminal)
2305            || (XEVENT (terminal)->event_type != button_press_event
2306                && XEVENT (terminal)->event_type != button_release_event))
2307     {
2308       Lisp_Object tem;
2309       XSETBUFFER (tem, current_buffer);
2310       /* It's not a mouse event; order of keymaps searched is:
2311          o  keymap of any/all extents under the mouse
2312          o  minor-mode maps
2313          o  local-map of current-buffer
2314          o  global-map
2315          */
2316       /* The terminal element of the lookup may be nil or a keysym.
2317          In those cases we don't want to check for an extent
2318          keymap. */
2319       if (EVENTP (terminal))
2320         {
2321           get_relevant_extent_keymaps (make_int (BUF_PT (current_buffer)),
2322                                        tem, Qnil, &closure);
2323         }
2324       get_relevant_minor_maps (tem, &closure);
2325
2326       tem = current_buffer->keymap;
2327       if (!NILP (tem))
2328         relevant_map_push (tem, &closure);
2329     }
2330 #ifdef HAVE_WINDOW_SYSTEM
2331   else
2332     {
2333       /* It's a mouse event; order of keymaps searched is:
2334          o  vertical-divider-map, if event is over a divider
2335          o  local-map of mouse-grabbed-buffer
2336          o  keymap of any/all extents under the mouse
2337          if the mouse is over a modeline:
2338          o  modeline-map of buffer corresponding to that modeline
2339          o  else, local-map of buffer under the mouse
2340          o  minor-mode maps
2341          o  local-map of current-buffer
2342          o  global-map
2343          */
2344       Lisp_Object window = Fevent_window (terminal);
2345
2346       if (!NILP (Fevent_over_vertical_divider_p (terminal)))
2347         {
2348           if (KEYMAPP (Vvertical_divider_map))
2349             relevant_map_push (Vvertical_divider_map, &closure);
2350         }
2351
2352       if (BUFFERP (Vmouse_grabbed_buffer))
2353         {
2354           Lisp_Object map = XBUFFER (Vmouse_grabbed_buffer)->keymap;
2355
2356           get_relevant_minor_maps (Vmouse_grabbed_buffer, &closure);
2357           if (!NILP (map))
2358             relevant_map_push (map, &closure);
2359         }
2360
2361       if (!NILP (window))
2362         {
2363           Lisp_Object buffer = Fwindow_buffer (window);
2364
2365           if (!NILP (buffer))
2366             {
2367               if (!NILP (Fevent_over_modeline_p (terminal)))
2368                 {
2369                   Lisp_Object map = symbol_value_in_buffer (Qmodeline_map,
2370                                                             buffer);
2371
2372                   get_relevant_extent_keymaps
2373                     (Fevent_modeline_position (terminal),
2374                      XBUFFER (buffer)->generated_modeline_string,
2375                      /* #### third arg should maybe be a glyph. */
2376                      Qnil, &closure);
2377
2378                   if (!UNBOUNDP (map) && !NILP (map))
2379                     relevant_map_push (get_keymap (map, 1, 1), &closure);
2380                 }
2381               else
2382                 {
2383                   get_relevant_extent_keymaps (Fevent_point (terminal), buffer,
2384                                                Fevent_glyph_extent (terminal),
2385                                                &closure);
2386                 }
2387
2388               if (!EQ (buffer, Vmouse_grabbed_buffer)) /* already pushed */
2389                 {
2390                   Lisp_Object map = XBUFFER (buffer)->keymap;
2391
2392                   get_relevant_minor_maps (buffer, &closure);
2393                   if (!NILP(map))
2394                     relevant_map_push (map, &closure);
2395                 }
2396             }
2397         }
2398       else if (!NILP (Fevent_over_toolbar_p (terminal)))
2399         {
2400           Lisp_Object map = Fsymbol_value (Qtoolbar_map);
2401
2402           if (!UNBOUNDP (map) && !NILP (map))
2403             relevant_map_push (map, &closure);
2404         }
2405     }
2406 #endif /* HAVE_WINDOW_SYSTEM */
2407
2408   {
2409     int nmaps = closure.nmaps;
2410     /* Silently truncate at 100 keymaps to prevent infinite lossage */
2411     if (nmaps >= max_maps && max_maps > 0)
2412       maps[max_maps - 1] = Vcurrent_global_map;
2413     else
2414       maps[nmaps] = Vcurrent_global_map;
2415     UNGCPRO;
2416     return nmaps + 1;
2417   }
2418 }
2419
2420 /* Returns a set of keymaps extracted from the extents at POS in
2421    BUFFER_OR_STRING.  The GLYPH arg, if specified, is one more extent
2422    to look for a keymap in, and if it has one, its keymap will be the
2423    first element in the list returned.  This is so we can correctly
2424    search the keymaps associated with glyphs which may be physically
2425    disjoint from their extents: for example, if a glyph is out in the
2426    margin, we should still consult the keymap of that glyph's extent,
2427    which may not itself be under the mouse.
2428  */
2429
2430 static void
2431 get_relevant_extent_keymaps (Lisp_Object pos, Lisp_Object buffer_or_string,
2432                              Lisp_Object glyph,
2433                              struct relevant_maps *closure)
2434 {
2435   /* This function can GC */
2436   /* the glyph keymap, if any, comes first.
2437      (Processing it twice is no big deal: noop.) */
2438   if (!NILP (glyph))
2439     {
2440       Lisp_Object keymap = Fextent_property (glyph, Qkeymap, Qnil);
2441       if (!NILP (keymap))
2442         relevant_map_push (get_keymap (keymap, 1, 1), closure);
2443     }
2444
2445   /* Next check the extents at the text position, if any */
2446   if (!NILP (pos))
2447     {
2448       Lisp_Object extent;
2449       for (extent = Fextent_at (pos, buffer_or_string, Qkeymap, Qnil, Qnil);
2450            !NILP (extent);
2451            extent = Fextent_at (pos, buffer_or_string, Qkeymap, extent, Qnil))
2452         {
2453           Lisp_Object keymap = Fextent_property (extent, Qkeymap, Qnil);
2454           if (!NILP (keymap))
2455             relevant_map_push (get_keymap (keymap, 1, 1), closure);
2456           QUIT;
2457         }
2458     }
2459 }
2460
2461 static Lisp_Object
2462 minor_mode_keymap_predicate (Lisp_Object assoc, Lisp_Object buffer)
2463 {
2464   /* This function can GC */
2465   if (CONSP (assoc))
2466     {
2467       Lisp_Object sym = XCAR (assoc);
2468       if (SYMBOLP (sym))
2469         {
2470           Lisp_Object val = symbol_value_in_buffer (sym, buffer);
2471           if (!NILP (val) && !UNBOUNDP (val))
2472             {
2473               Lisp_Object map = get_keymap (XCDR (assoc), 0, 1);
2474               return map;
2475             }
2476         }
2477     }
2478   return Qnil;
2479 }
2480
2481 static void
2482 get_relevant_minor_maps (Lisp_Object buffer, struct relevant_maps *closure)
2483 {
2484   /* This function can GC */
2485   Lisp_Object alist;
2486
2487   /* Will you ever lose badly if you make this circular! */
2488   for (alist = symbol_value_in_buffer (Qminor_mode_map_alist, buffer);
2489        CONSP (alist);
2490        alist = XCDR (alist))
2491     {
2492       Lisp_Object m = minor_mode_keymap_predicate (XCAR (alist),
2493                                                    buffer);
2494       if (!NILP (m)) relevant_map_push (m, closure);
2495       QUIT;
2496     }
2497 }
2498
2499 /* #### Would map-current-keymaps be a better thing?? */
2500 DEFUN ("current-keymaps", Fcurrent_keymaps, 0, 1, 0, /*
2501 Return a list of the current keymaps that will be searched for bindings.
2502 This lists keymaps such as the current local map and the minor-mode maps,
2503  but does not list the parents of those keymaps.
2504 EVENT-OR-KEYS controls which keymaps will be listed.
2505 If EVENT-OR-KEYS is a mouse event (or a vector whose last element is a
2506  mouse event), the keymaps for that mouse event will be listed (see
2507  `key-binding').  Otherwise, the keymaps for key presses will be listed.
2508 */
2509        (event_or_keys))
2510 {
2511   /* This function can GC */
2512   struct gcpro gcpro1;
2513   Lisp_Object maps[100];
2514   Lisp_Object *gubbish = maps;
2515   int nmaps;
2516
2517   GCPRO1 (event_or_keys);
2518   nmaps = get_relevant_keymaps (event_or_keys, countof (maps),
2519                                 gubbish);
2520   if (nmaps > countof (maps))
2521     {
2522       gubbish = alloca_array (Lisp_Object, nmaps);
2523       nmaps = get_relevant_keymaps (event_or_keys, nmaps, gubbish);
2524     }
2525   UNGCPRO;
2526   return Flist (nmaps, gubbish);
2527 }
2528
2529 DEFUN ("key-binding", Fkey_binding, 1, 2, 0, /*
2530 Return the binding for command KEYS in current keymaps.
2531 KEYS is a string, a vector of events, or a vector of key-description lists
2532 as described in the documentation for the `define-key' function.
2533 The binding is probably a symbol with a function definition; see
2534 the documentation for `lookup-key' for more information.
2535
2536 For key-presses, the order of keymaps searched is:
2537   - the `keymap' property of any extent(s) at point;
2538   - any applicable minor-mode maps;
2539   - the current-local-map of the current-buffer;
2540   - the current global map.
2541
2542 For mouse-clicks, the order of keymaps searched is:
2543   - the current-local-map of the `mouse-grabbed-buffer' if any;
2544   - vertical-divider-map, if the event happened over a vertical divider
2545   - the `keymap' property of any extent(s) at the position of the click
2546     (this includes modeline extents);
2547   - the modeline-map of the buffer corresponding to the modeline under
2548     the mouse (if the click happened over a modeline);
2549   - the value of toolbar-map in the current-buffer (if the click
2550     happened over a toolbar);
2551   - the current-local-map of the buffer under the mouse (does not
2552     apply to toolbar clicks);
2553   - any applicable minor-mode maps;
2554   - the current global map.
2555
2556 Note that if `overriding-local-map' or `overriding-terminal-local-map'
2557 is non-nil, *only* those two maps and the current global map are searched.
2558 */
2559        (keys, accept_default))
2560 {
2561   /* This function can GC */
2562   int i;
2563   Lisp_Object maps[100];
2564   int nmaps;
2565   struct gcpro gcpro1, gcpro2;
2566   GCPRO2 (keys, accept_default); /* get_relevant_keymaps may autoload */
2567
2568   nmaps = get_relevant_keymaps (keys, countof (maps), maps);
2569
2570   UNGCPRO;
2571
2572   if (EVENTP (keys))           /* unadvertised "feature" for the future */
2573     return lookup_events (keys, nmaps, maps, !NILP (accept_default));
2574
2575   for (i = 0; i < nmaps; i++)
2576     {
2577       Lisp_Object tem = Flookup_key (maps[i], keys,
2578                                      accept_default);
2579       if (INTP (tem))
2580         {
2581           /* Too long in some local map means don't look at global map */
2582           return Qnil;
2583         }
2584       else if (!NILP (tem))
2585         return tem;
2586     }
2587   return Qnil;
2588 }
2589
2590 static Lisp_Object
2591 process_event_binding_result (Lisp_Object result)
2592 {
2593   if (EQ (result, Qundefined))
2594     /* The suppress-keymap function binds keys to 'undefined - special-case
2595        that here, so that being bound to that has the same error-behavior as
2596        not being defined at all.
2597        */
2598     result = Qnil;
2599   if (!NILP (result))
2600     {
2601       Lisp_Object map;
2602       /* Snap out possible keymap indirections */
2603       map = get_keymap (result, 0, 1);
2604       if (!NILP (map))
2605         result = map;
2606     }
2607
2608   return result;
2609 }
2610
2611 /* Attempts to find a command corresponding to the event-sequence
2612    whose head is event0 (sequence is threaded though event_next).
2613
2614    The return value will be
2615
2616       -- nil (there is no binding; this will also be returned
2617               whenever the event chain is "too long", i.e. there
2618               is a non-nil, non-keymap binding for a prefix of
2619               the event chain)
2620       -- a keymap (part of a command has been specified)
2621       -- a command (anything that satisfies `commandp'; this includes
2622                     some symbols, lists, subrs, strings, vectors, and
2623                     compiled-function objects) */
2624 Lisp_Object
2625 event_binding (Lisp_Object event0, int accept_default)
2626 {
2627   /* This function can GC */
2628   Lisp_Object maps[100];
2629   int nmaps;
2630
2631   assert (EVENTP (event0));
2632
2633   nmaps = get_relevant_keymaps (event0, countof (maps), maps);
2634   if (nmaps > countof (maps))
2635     nmaps = countof (maps);
2636   return process_event_binding_result (lookup_events (event0, nmaps, maps,
2637                                                       accept_default));
2638 }
2639
2640 /* like event_binding, but specify a keymap to search */
2641
2642 Lisp_Object
2643 event_binding_in (Lisp_Object event0, Lisp_Object keymap, int accept_default)
2644 {
2645   /* This function can GC */
2646   if (!KEYMAPP (keymap))
2647     return Qnil;
2648
2649   return process_event_binding_result (lookup_events (event0, 1, &keymap,
2650                                                       accept_default));
2651 }
2652
2653 /* Attempts to find a function key mapping corresponding to the
2654    event-sequence whose head is event0 (sequence is threaded through
2655    event_next).  The return value will be the same as for event_binding(). */
2656 Lisp_Object
2657 munging_key_map_event_binding (Lisp_Object event0,
2658                                enum munge_me_out_the_door munge)
2659 {
2660   Lisp_Object keymap = (munge == MUNGE_ME_FUNCTION_KEY) ?
2661     CONSOLE_FUNCTION_KEY_MAP (event_console_or_selected (event0)) :
2662     Vkey_translation_map;
2663
2664   if (NILP (keymap))
2665     return Qnil;
2666
2667   return process_event_binding_result (lookup_events (event0, 1, &keymap, 1));
2668 }
2669
2670 \f
2671 /************************************************************************/
2672 /*               Setting/querying the global and local maps             */
2673 /************************************************************************/
2674
2675 DEFUN ("use-global-map", Fuse_global_map, 1, 1, 0, /*
2676 Select KEYMAP as the global keymap.
2677 */
2678        (keymap))
2679 {
2680   /* This function can GC */
2681   keymap = get_keymap (keymap, 1, 1);
2682   Vcurrent_global_map = keymap;
2683   return Qnil;
2684 }
2685
2686 DEFUN ("use-local-map", Fuse_local_map, 1, 2, 0, /*
2687 Select KEYMAP as the local keymap in BUFFER.
2688 If KEYMAP is nil, that means no local keymap.
2689 If BUFFER is nil, the current buffer is assumed.
2690 */
2691        (keymap, buffer))
2692 {
2693   /* This function can GC */
2694   struct buffer *b = decode_buffer (buffer, 0);
2695   if (!NILP (keymap))
2696     keymap = get_keymap (keymap, 1, 1);
2697
2698   b->keymap = keymap;
2699
2700   return Qnil;
2701 }
2702
2703 DEFUN ("current-local-map", Fcurrent_local_map, 0, 1, 0, /*
2704 Return BUFFER's local keymap, or nil if it has none.
2705 If BUFFER is nil, the current buffer is assumed.
2706 */
2707        (buffer))
2708 {
2709   struct buffer *b = decode_buffer (buffer, 0);
2710   return b->keymap;
2711 }
2712
2713 DEFUN ("current-global-map", Fcurrent_global_map, 0, 0, 0, /*
2714 Return the current global keymap.
2715 */
2716        ())
2717 {
2718   return Vcurrent_global_map;
2719 }
2720
2721 \f
2722 /************************************************************************/
2723 /*                    Mapping over keymap elements                      */
2724 /************************************************************************/
2725
2726 /* Since keymaps are arranged in a hierarchy, one keymap per bucky bit or
2727    prefix key, it's not entirely obvious what map-keymap should do, but
2728    what it does is: map over all keys in this map; then recursively map
2729    over all submaps of this map that are "bucky" submaps.  This means that,
2730    when mapping over a keymap, it appears that "x" and "C-x" are in the
2731    same map, although "C-x" is really in the "control" submap of this one.
2732    However, since we don't recursively descend the submaps that are bound
2733    to prefix keys (like C-x, C-h, etc) the caller will have to recurse on
2734    those explicitly, if that's what they want.
2735
2736    So the end result of this is that the bucky keymaps (the ones indexed
2737    under the large integers returned from MAKE_MODIFIER_HASH_KEY()) are
2738    invisible from elisp.  They're just an implementation detail that code
2739    outside of this file doesn't need to know about.
2740  */
2741
2742 struct map_keymap_unsorted_closure
2743 {
2744   void (*fn) (CONST struct key_data *, Lisp_Object binding, void *arg);
2745   void *arg;
2746   unsigned int modifiers;
2747 };
2748
2749 /* used by map_keymap() */
2750 static int
2751 map_keymap_unsorted_mapper (Lisp_Object keysym, Lisp_Object value,
2752                             void *map_keymap_unsorted_closure)
2753 {
2754   /* This function can GC */
2755   struct map_keymap_unsorted_closure *closure =
2756     (struct map_keymap_unsorted_closure *) map_keymap_unsorted_closure;
2757   unsigned int modifiers = closure->modifiers;
2758   unsigned int mod_bit;
2759   mod_bit = MODIFIER_HASH_KEY_BITS (keysym);
2760   if (mod_bit != 0)
2761     {
2762       int omod = modifiers;
2763       closure->modifiers = (modifiers | mod_bit);
2764       value = get_keymap (value, 1, 0);
2765       elisp_maphash (map_keymap_unsorted_mapper,
2766                      XKEYMAP (value)->table,
2767                      map_keymap_unsorted_closure);
2768       closure->modifiers = omod;
2769     }
2770   else
2771     {
2772       struct key_data key;
2773       key.keysym = keysym;
2774       key.modifiers = modifiers;
2775       ((*closure->fn) (&key, value, closure->arg));
2776     }
2777   return 0;
2778 }
2779
2780
2781 struct map_keymap_sorted_closure
2782 {
2783   Lisp_Object *result_locative;
2784 };
2785
2786 /* used by map_keymap_sorted() */
2787 static int
2788 map_keymap_sorted_mapper (Lisp_Object key, Lisp_Object value,
2789                           void *map_keymap_sorted_closure)
2790 {
2791   struct map_keymap_sorted_closure *cl =
2792     (struct map_keymap_sorted_closure *) map_keymap_sorted_closure;
2793   Lisp_Object *list = cl->result_locative;
2794   *list = Fcons (Fcons (key, value), *list);
2795   return 0;
2796 }
2797
2798
2799 /* used by map_keymap_sorted(), describe_map_sort_predicate(),
2800    and keymap_submaps().
2801  */
2802 static int
2803 map_keymap_sort_predicate (Lisp_Object obj1, Lisp_Object obj2,
2804                            Lisp_Object pred)
2805 {
2806   /* obj1 and obj2 are conses with keysyms in their cars.  Cdrs are ignored.
2807    */
2808   unsigned int bit1, bit2;
2809   int sym1_p = 0;
2810   int sym2_p = 0;
2811   obj1 = XCAR (obj1);
2812   obj2 = XCAR (obj2);
2813
2814   if (EQ (obj1, obj2))
2815     return -1;
2816   bit1 = MODIFIER_HASH_KEY_BITS (obj1);
2817   bit2 = MODIFIER_HASH_KEY_BITS (obj2);
2818
2819   /* If either is a symbol with a character-set-property, then sort it by
2820      that code instead of alphabetically.
2821      */
2822   if (! bit1 && SYMBOLP (obj1))
2823     {
2824       Lisp_Object code = Fget (obj1, Vcharacter_set_property, Qnil);
2825       if (CHAR_OR_CHAR_INTP (code))
2826         {
2827           obj1 = code;
2828           CHECK_CHAR_COERCE_INT (obj1);
2829           sym1_p = 1;
2830         }
2831     }
2832   if (! bit2 && SYMBOLP (obj2))
2833     {
2834       Lisp_Object code = Fget (obj2, Vcharacter_set_property, Qnil);
2835       if (CHAR_OR_CHAR_INTP (code))
2836         {
2837           obj2 = code;
2838           CHECK_CHAR_COERCE_INT (obj2);
2839           sym2_p = 1;
2840         }
2841     }
2842
2843   /* all symbols (non-ASCIIs) come after characters (ASCIIs) */
2844   if (XTYPE (obj1) != XTYPE (obj2))
2845     return SYMBOLP (obj2) ? 1 : -1;
2846
2847   if (! bit1 && CHARP (obj1)) /* they're both ASCII */
2848     {
2849       int o1 = XCHAR (obj1);
2850       int o2 = XCHAR (obj2);
2851       if (o1 == o2 &&           /* If one started out as a symbol and the */
2852           sym1_p != sym2_p)     /* other didn't, the symbol comes last. */
2853         return sym2_p ? 1 : -1;
2854
2855       return o1 < o2 ? 1 : -1;  /* else just compare them */
2856     }
2857
2858   /* else they're both symbols.  If they're both buckys, then order them. */
2859   if (bit1 && bit2)
2860     return bit1 < bit2 ? 1 : -1;
2861
2862   /* if only one is a bucky, then it comes later */
2863   if (bit1 || bit2)
2864     return bit2 ? 1 : -1;
2865
2866   /* otherwise, string-sort them. */
2867   {
2868     char *s1 = (char *) string_data (XSYMBOL (obj1)->name);
2869     char *s2 = (char *) string_data (XSYMBOL (obj2)->name);
2870 #ifdef I18N2
2871     return 0 > strcoll (s1, s2) ? 1 : -1;
2872 #else
2873     return 0 > strcmp  (s1, s2) ? 1 : -1;
2874 #endif
2875   }
2876 }
2877
2878
2879 /* used by map_keymap() */
2880 static void
2881 map_keymap_sorted (Lisp_Object keymap_table,
2882                    unsigned int modifiers,
2883                    void (*function) (CONST struct key_data *key,
2884                                      Lisp_Object binding,
2885                                      void *map_keymap_sorted_closure),
2886                    void *map_keymap_sorted_closure)
2887 {
2888   /* This function can GC */
2889   struct gcpro gcpro1;
2890   Lisp_Object contents = Qnil;
2891
2892   if (XINT (Fhash_table_count (keymap_table)) == 0)
2893     return;
2894
2895   GCPRO1 (contents);
2896
2897   {
2898     struct map_keymap_sorted_closure c1;
2899     c1.result_locative = &contents;
2900     elisp_maphash (map_keymap_sorted_mapper, keymap_table, &c1);
2901   }
2902   contents = list_sort (contents, Qnil, map_keymap_sort_predicate);
2903   for (; !NILP (contents); contents = XCDR (contents))
2904     {
2905       Lisp_Object keysym = XCAR (XCAR (contents));
2906       Lisp_Object binding = XCDR (XCAR (contents));
2907       unsigned int sub_bits = MODIFIER_HASH_KEY_BITS (keysym);
2908       if (sub_bits != 0)
2909         map_keymap_sorted (XKEYMAP (get_keymap (binding,
2910                                                 1, 1))->table,
2911                            (modifiers | sub_bits),
2912                            function,
2913                            map_keymap_sorted_closure);
2914       else
2915         {
2916           struct key_data k;
2917           k.keysym = keysym;
2918           k.modifiers = modifiers;
2919           ((*function) (&k, binding, map_keymap_sorted_closure));
2920         }
2921     }
2922   UNGCPRO;
2923 }
2924
2925
2926 /* used by Fmap_keymap() */
2927 static void
2928 map_keymap_mapper (CONST struct key_data *key,
2929                    Lisp_Object binding,
2930                    void *function)
2931 {
2932   /* This function can GC */
2933   Lisp_Object fn;
2934   VOID_TO_LISP (fn, function);
2935   call2 (fn, make_key_description (key, 1), binding);
2936 }
2937
2938
2939 static void
2940 map_keymap (Lisp_Object keymap_table, int sort_first,
2941             void (*function) (CONST struct key_data *key,
2942                               Lisp_Object binding,
2943                               void *fn_arg),
2944             void *fn_arg)
2945 {
2946   /* This function can GC */
2947   if (sort_first)
2948     map_keymap_sorted (keymap_table, 0, function, fn_arg);
2949   else
2950     {
2951       struct map_keymap_unsorted_closure map_keymap_unsorted_closure;
2952       map_keymap_unsorted_closure.fn = function;
2953       map_keymap_unsorted_closure.arg = fn_arg;
2954       map_keymap_unsorted_closure.modifiers = 0;
2955       elisp_maphash (map_keymap_unsorted_mapper, keymap_table,
2956                      &map_keymap_unsorted_closure);
2957     }
2958 }
2959
2960 DEFUN ("map-keymap", Fmap_keymap, 2, 3, 0, /*
2961 Apply FUNCTION to each element of KEYMAP.
2962 FUNCTION will be called with two arguments: a key-description list, and
2963 the binding.  The order in which the elements of the keymap are passed to
2964 the function is unspecified.  If the function inserts new elements into
2965 the keymap, it may or may not be called with them later.  No element of
2966 the keymap will ever be passed to the function more than once.
2967
2968 The function will not be called on elements of this keymap's parents
2969 \(see the function `keymap-parents') or upon keymaps which are contained
2970 within this keymap (multi-character definitions).
2971 It will be called on "meta" characters since they are not really
2972 two-character sequences.
2973
2974 If the optional third argument SORT-FIRST is non-nil, then the elements of
2975 the keymap will be passed to the mapper function in a canonical order.
2976 Otherwise, they will be passed in hash (that is, random) order, which is
2977 faster.
2978 */
2979      (function, keymap, sort_first))
2980 {
2981   /* This function can GC */
2982   struct gcpro gcpro1, gcpro2;
2983
2984  /* tolerate obviously transposed args */
2985   if (!NILP (Fkeymapp (function)))
2986     {
2987       Lisp_Object tmp = function;
2988       function = keymap;
2989       keymap = tmp;
2990     }
2991   GCPRO2 (function, keymap);
2992   keymap = get_keymap (keymap, 1, 1);
2993   map_keymap (XKEYMAP (keymap)->table, !NILP (sort_first),
2994               map_keymap_mapper, LISP_TO_VOID (function));
2995   UNGCPRO;
2996   return Qnil;
2997 }
2998
2999
3000 \f
3001 /************************************************************************/
3002 /*                          Accessible keymaps                          */
3003 /************************************************************************/
3004
3005 struct accessible_keymaps_closure
3006   {
3007     Lisp_Object tail;
3008   };
3009
3010
3011 static void
3012 accessible_keymaps_mapper_1 (Lisp_Object keysym, Lisp_Object contents,
3013                              unsigned int modifiers,
3014                              struct accessible_keymaps_closure *closure)
3015 {
3016   /* This function can GC */
3017   unsigned int subbits = MODIFIER_HASH_KEY_BITS (keysym);
3018
3019   if (subbits != 0)
3020     {
3021       Lisp_Object submaps;
3022
3023       contents = get_keymap (contents, 1, 1);
3024       submaps = keymap_submaps (contents);
3025       for (; !NILP (submaps); submaps = XCDR (submaps))
3026         {
3027           accessible_keymaps_mapper_1 (XCAR (XCAR (submaps)),
3028                                        XCDR (XCAR (submaps)),
3029                                        (subbits | modifiers),
3030                                        closure);
3031         }
3032     }
3033   else
3034     {
3035       Lisp_Object thisseq = Fcar (Fcar (closure->tail));
3036       Lisp_Object cmd = get_keyelt (contents, 1);
3037       Lisp_Object vec;
3038       int j;
3039       int len;
3040       struct key_data key;
3041       key.keysym = keysym;
3042       key.modifiers = modifiers;
3043
3044       if (NILP (cmd))
3045         abort ();
3046       cmd = get_keymap (cmd, 0, 1);
3047       if (!KEYMAPP (cmd))
3048         abort ();
3049
3050       vec = make_vector (XVECTOR_LENGTH (thisseq) + 1, Qnil);
3051       len = XVECTOR_LENGTH (thisseq);
3052       for (j = 0; j < len; j++)
3053         XVECTOR_DATA (vec) [j] = XVECTOR_DATA (thisseq) [j];
3054       XVECTOR_DATA (vec) [j] = make_key_description (&key, 1);
3055
3056       nconc2 (closure->tail, list1 (Fcons (vec, cmd)));
3057     }
3058 }
3059
3060
3061 static Lisp_Object
3062 accessible_keymaps_keymap_mapper (Lisp_Object thismap, void *arg)
3063 {
3064   /* This function can GC */
3065   struct accessible_keymaps_closure *closure =
3066     (struct accessible_keymaps_closure *) arg;
3067   Lisp_Object submaps = keymap_submaps (thismap);
3068
3069   for (; !NILP (submaps); submaps = XCDR (submaps))
3070     {
3071       accessible_keymaps_mapper_1 (XCAR (XCAR (submaps)),
3072                                    XCDR (XCAR (submaps)),
3073                                    0,
3074                                    closure);
3075     }
3076   return Qnil;
3077 }
3078
3079
3080 DEFUN ("accessible-keymaps", Faccessible_keymaps, 1, 2, 0, /*
3081 Find all keymaps accessible via prefix characters from KEYMAP.
3082 Returns a list of elements of the form (KEYS . MAP), where the sequence
3083 KEYS starting from KEYMAP gets you to MAP.  These elements are ordered
3084 so that the KEYS increase in length.  The first element is ([] . KEYMAP).
3085 An optional argument PREFIX, if non-nil, should be a key sequence;
3086 then the value includes only maps for prefixes that start with PREFIX.
3087 */
3088        (keymap, prefix))
3089 {
3090   /* This function can GC */
3091   struct gcpro gcpro1, gcpro2, gcpro3, gcpro4;
3092   Lisp_Object accessible_keymaps = Qnil;
3093   struct accessible_keymaps_closure c;
3094   c.tail = Qnil;
3095   GCPRO4 (accessible_keymaps, c.tail, prefix, keymap);
3096
3097  retry:
3098   keymap = get_keymap (keymap, 1, 1);
3099   if (NILP (prefix))
3100     prefix = make_vector (0, Qnil);
3101   else if (!VECTORP (prefix) || STRINGP (prefix))
3102     {
3103       prefix = wrong_type_argument (Qarrayp, prefix);
3104       goto retry;
3105     }
3106   else
3107     {
3108       int len = XINT (Flength (prefix));
3109       Lisp_Object def = Flookup_key (keymap, prefix, Qnil);
3110       Lisp_Object p;
3111       int iii;
3112       struct gcpro ngcpro1;
3113
3114       def = get_keymap (def, 0, 1);
3115       if (!KEYMAPP (def))
3116         goto RETURN;
3117
3118       keymap = def;
3119       p = make_vector (len, Qnil);
3120       NGCPRO1 (p);
3121       for (iii = 0; iii < len; iii++)
3122         {
3123           struct key_data key;
3124           define_key_parser (Faref (prefix, make_int (iii)), &key);
3125           XVECTOR_DATA (p)[iii] = make_key_description (&key, 1);
3126         }
3127       NUNGCPRO;
3128       prefix = p;
3129     }
3130
3131   accessible_keymaps = list1 (Fcons (prefix, keymap));
3132
3133   /* For each map in the list maps,
3134      look at any other maps it points to
3135      and stick them at the end if they are not already in the list */
3136
3137   for (c.tail = accessible_keymaps;
3138        !NILP (c.tail);
3139        c.tail = XCDR (c.tail))
3140     {
3141       Lisp_Object thismap = Fcdr (Fcar (c.tail));
3142       CHECK_KEYMAP (thismap);
3143       traverse_keymaps (thismap, Qnil,
3144                         accessible_keymaps_keymap_mapper, &c);
3145     }
3146  RETURN:
3147   UNGCPRO;
3148   return accessible_keymaps;
3149 }
3150
3151
3152 \f
3153 /************************************************************************/
3154 /*              Pretty descriptions of key sequences                    */
3155 /************************************************************************/
3156
3157 DEFUN ("key-description", Fkey_description, 1, 1, 0, /*
3158 Return a pretty description of key-sequence KEYS.
3159 Control characters turn into "C-foo" sequences, meta into "M-foo",
3160 spaces are put between sequence elements, etc...
3161 */
3162        (keys))
3163 {
3164   if (CHAR_OR_CHAR_INTP (keys) || CONSP (keys) || SYMBOLP (keys)
3165       || EVENTP (keys))
3166     {
3167       return Fsingle_key_description (keys);
3168     }
3169   else if (VECTORP (keys) ||
3170            STRINGP (keys))
3171     {
3172       Lisp_Object string = Qnil;
3173       /* Lisp_Object sep = Qnil; */
3174       int size = XINT (Flength (keys));
3175       int i;
3176
3177       for (i = 0; i < size; i++)
3178         {
3179           Lisp_Object s2 = Fsingle_key_description
3180             (STRINGP (keys)
3181              ? make_char (string_char (XSTRING (keys), i))
3182              : XVECTOR_DATA (keys)[i]);
3183
3184           if (i == 0)
3185             string = s2;
3186           else
3187             {
3188               /* if (NILP (sep)) Lisp_Object sep = build_string (" ") */;
3189               string = concat2 (string, concat2 (Vsingle_space_string, s2));
3190             }
3191         }
3192       return string;
3193     }
3194   return Fkey_description (wrong_type_argument (Qsequencep, keys));
3195 }
3196
3197 DEFUN ("single-key-description", Fsingle_key_description, 1, 1, 0, /*
3198 Return a pretty description of command character KEY.
3199 Control characters turn into C-whatever, etc.
3200 This differs from `text-char-description' in that it returns a description
3201 of a key read from the user rather than a character from a buffer.
3202 */
3203        (key))
3204 {
3205   if (SYMBOLP (key))
3206     key = Fcons (key, Qnil); /* sleaze sleaze */
3207
3208   if (EVENTP (key) || CHAR_OR_CHAR_INTP (key))
3209     {
3210       char buf [255];
3211       if (!EVENTP (key))
3212         {
3213           struct Lisp_Event event;
3214           event.event_type = empty_event;
3215           CHECK_CHAR_COERCE_INT (key);
3216           character_to_event (XCHAR (key), &event,
3217                               XCONSOLE (Vselected_console), 0, 1);
3218           format_event_object (buf, &event, 1);
3219         }
3220       else
3221         format_event_object (buf, XEVENT (key), 1);
3222       return build_string (buf);
3223     }
3224
3225   if (CONSP (key))
3226     {
3227       char buf[255];
3228       char *bufp = buf;
3229       Lisp_Object rest;
3230       buf[0] = 0;
3231       LIST_LOOP (rest, key)
3232         {
3233           Lisp_Object keysym = XCAR (rest);
3234           if (EQ (keysym, Qcontrol))    strcpy (bufp, "C-"), bufp += 2;
3235           else if (EQ (keysym, Qctrl))  strcpy (bufp, "C-"), bufp += 2;
3236           else if (EQ (keysym, Qmeta))  strcpy (bufp, "M-"), bufp += 2;
3237           else if (EQ (keysym, Qsuper)) strcpy (bufp, "S-"), bufp += 2;
3238           else if (EQ (keysym, Qhyper)) strcpy (bufp, "H-"), bufp += 2;
3239           else if (EQ (keysym, Qalt))   strcpy (bufp, "A-"), bufp += 2;
3240           else if (EQ (keysym, Qshift)) strcpy (bufp, "Sh-"), bufp += 3;
3241           else if (CHAR_OR_CHAR_INTP (keysym))
3242             {
3243               bufp += set_charptr_emchar ((Bufbyte *) bufp,
3244                                           XCHAR_OR_CHAR_INT (keysym));
3245               *bufp = 0;
3246             }
3247           else
3248             {
3249               CHECK_SYMBOL (keysym);
3250 #if 0                           /* This is bogus */
3251               if (EQ (keysym, QKlinefeed))       strcpy (bufp, "LFD");
3252               else if (EQ (keysym, QKtab))       strcpy (bufp, "TAB");
3253               else if (EQ (keysym, QKreturn))    strcpy (bufp, "RET");
3254               else if (EQ (keysym, QKescape))    strcpy (bufp, "ESC");
3255               else if (EQ (keysym, QKdelete))    strcpy (bufp, "DEL");
3256               else if (EQ (keysym, QKspace))     strcpy (bufp, "SPC");
3257               else if (EQ (keysym, QKbackspace)) strcpy (bufp, "BS");
3258               else
3259 #endif
3260                 strcpy (bufp, (char *) string_data (XSYMBOL (keysym)->name));
3261               if (!NILP (XCDR (rest)))
3262                 signal_simple_error ("Invalid key description",
3263                                      key);
3264             }
3265         }
3266       return build_string (buf);
3267     }
3268   return Fsingle_key_description
3269     (wrong_type_argument (intern ("char-or-event-p"), key));
3270 }
3271
3272 DEFUN ("text-char-description", Ftext_char_description, 1, 1, 0, /*
3273 Return a pretty description of file-character CHR.
3274 Unprintable characters turn into "^char" or \\NNN, depending on the value
3275 of the `ctl-arrow' variable.
3276 This differs from `single-key-description' in that it returns a description
3277 of a character from a buffer rather than a key read from the user.
3278 */
3279        (chr))
3280 {
3281   Bufbyte buf[200];
3282   Bufbyte *p;
3283   Emchar c;
3284   Lisp_Object ctl_arrow = current_buffer->ctl_arrow;
3285   int ctl_p = !NILP (ctl_arrow);
3286   Emchar printable_min = (CHAR_OR_CHAR_INTP (ctl_arrow)
3287                           ? XCHAR_OR_CHAR_INT (ctl_arrow)
3288                           : ((EQ (ctl_arrow, Qt) || NILP (ctl_arrow))
3289                              ? 256 : 160));
3290
3291   if (EVENTP (chr))
3292     {
3293       Lisp_Object ch = Fevent_to_character (chr, Qnil, Qnil, Qt);
3294       if (NILP (ch))
3295         return
3296           signal_simple_continuable_error
3297             ("character has no ASCII equivalent", Fcopy_event (chr, Qnil));
3298       chr = ch;
3299     }
3300
3301   CHECK_CHAR_COERCE_INT (chr);
3302
3303   c = XCHAR (chr);
3304   p = buf;
3305
3306   if (c >= printable_min)
3307     {
3308       p += set_charptr_emchar (p, c);
3309     }
3310   else if (c < 040 && ctl_p)
3311     {
3312       *p++ = '^';
3313       *p++ = c + 64;            /* 'A' - 1 */
3314     }
3315   else if (c == 0177)
3316     {
3317       *p++ = '^';
3318       *p++ = '?';
3319     }
3320   else if (c >= 0200 || c < 040)
3321     {
3322       *p++ = '\\';
3323 #ifdef MULE
3324       /* !!#### This syntax is not readable.  It will
3325          be interpreted as a 3-digit octal number rather
3326          than a 7-digit octal number. */
3327       if (c >= 0400)
3328         {
3329           *p++ = '0' + ((c & 07000000) >> 18);
3330           *p++ = '0' + ((c & 0700000) >> 15);
3331           *p++ = '0' + ((c & 070000) >> 12);
3332           *p++ = '0' + ((c & 07000) >> 9);
3333         }
3334 #endif
3335       *p++ = '0' + ((c & 0700) >> 6);
3336       *p++ = '0' + ((c & 0070) >> 3);
3337       *p++ = '0' + ((c & 0007));
3338     }
3339   else
3340     {
3341       p += set_charptr_emchar (p, c);
3342     }
3343
3344   *p = 0;
3345   return build_string ((char *) buf);
3346 }
3347
3348 \f
3349 /************************************************************************/
3350 /*              where-is (mapping bindings to keys)                     */
3351 /************************************************************************/
3352
3353 static Lisp_Object
3354 where_is_internal (Lisp_Object definition, Lisp_Object *maps, int nmaps,
3355                    Lisp_Object firstonly, char *target_buffer);
3356
3357 DEFUN ("where-is-internal", Fwhere_is_internal, 1, 5, 0, /*
3358 Return list of keys that invoke DEFINITION in KEYMAPS.
3359 KEYMAPS can be either a keymap (meaning search in that keymap and the
3360 current global keymap) or a list of keymaps (meaning search in exactly
3361 those keymaps and no others).  If KEYMAPS is nil, search in the currently
3362 applicable maps for EVENT-OR-KEYS (this is equivalent to specifying
3363 `(current-keymaps EVENT-OR-KEYS)' as the argument to KEYMAPS).
3364
3365 If optional 3rd arg FIRSTONLY is non-nil, return a vector representing
3366  the first key sequence found, rather than a list of all possible key
3367  sequences.
3368
3369 If optional 4th arg NOINDIRECT is non-nil, don't follow indirections
3370  to other keymaps or slots.  This makes it possible to search for an
3371  indirect definition itself.
3372 */
3373        (definition, keymaps, firstonly, noindirect, event_or_keys))
3374 {
3375   /* This function can GC */
3376   Lisp_Object maps[100];
3377   Lisp_Object *gubbish = maps;
3378   int nmaps;
3379
3380   /* Get keymaps as an array */
3381   if (NILP (keymaps))
3382     {
3383       nmaps = get_relevant_keymaps (event_or_keys, countof (maps),
3384                                     gubbish);
3385       if (nmaps > countof (maps))
3386         {
3387           gubbish = alloca_array (Lisp_Object, nmaps);
3388           nmaps = get_relevant_keymaps (event_or_keys, nmaps, gubbish);
3389         }
3390     }
3391   else if (CONSP (keymaps))
3392     {
3393       Lisp_Object rest;
3394       int i;
3395
3396       nmaps = XINT (Flength (keymaps));
3397       if (nmaps > countof (maps))
3398         {
3399           gubbish = alloca_array (Lisp_Object, nmaps);
3400         }
3401       for (rest = keymaps, i = 0; !NILP (rest);
3402            rest = XCDR (keymaps), i++)
3403         {
3404           gubbish[i] = get_keymap (XCAR (keymaps), 1, 1);
3405         }
3406     }
3407   else
3408     {
3409       nmaps = 1;
3410       gubbish[0] = get_keymap (keymaps, 1, 1);
3411       if (!EQ (gubbish[0], Vcurrent_global_map))
3412         {
3413           gubbish[1] = Vcurrent_global_map;
3414           nmaps++;
3415         }
3416     }
3417
3418   return where_is_internal (definition, gubbish, nmaps, firstonly, 0);
3419 }
3420
3421 /* This function is like
3422    (key-description (where-is-internal definition nil t))
3423    except that it writes its output into a (char *) buffer that you
3424    provide; it doesn't cons (or allocate memory) at all, so it's
3425    very fast.  This is used by menubar.c.
3426  */
3427 void
3428 where_is_to_char (Lisp_Object definition, char *buffer)
3429 {
3430   /* This function can GC */
3431   Lisp_Object maps[100];
3432   Lisp_Object *gubbish = maps;
3433   int nmaps;
3434
3435   /* Get keymaps as an array */
3436   nmaps = get_relevant_keymaps (Qnil, countof (maps), gubbish);
3437   if (nmaps > countof (maps))
3438     {
3439       gubbish = alloca_array (Lisp_Object, nmaps);
3440       nmaps = get_relevant_keymaps (Qnil, nmaps, gubbish);
3441     }
3442
3443   buffer[0] = 0;
3444   where_is_internal (definition, maps, nmaps, Qt, buffer);
3445 }
3446
3447
3448 static Lisp_Object
3449 raw_keys_to_keys (struct key_data *keys, int count)
3450 {
3451   Lisp_Object result = make_vector (count, Qnil);
3452   while (count--)
3453     XVECTOR_DATA (result) [count] = make_key_description (&(keys[count]), 1);
3454   return result;
3455 }
3456
3457
3458 static void
3459 format_raw_keys (struct key_data *keys, int count, char *buf)
3460 {
3461   int i;
3462   struct Lisp_Event event;
3463   event.event_type = key_press_event;
3464   event.channel = Vselected_console;
3465   for (i = 0; i < count; i++)
3466     {
3467       event.event.key.keysym    = keys[i].keysym;
3468       event.event.key.modifiers = keys[i].modifiers;
3469       format_event_object (buf, &event, 1);
3470       buf += strlen (buf);
3471       if (i < count-1)
3472         buf[0] = ' ', buf++;
3473     }
3474 }
3475
3476
3477 /* definition is the thing to look for.
3478    map is a keymap.
3479    shadow is an array of shadow_count keymaps; if there is a different
3480    binding in any of the keymaps of a key that we are considering
3481    returning, then we reconsider.
3482    firstonly means give up after finding the first match;
3483    keys_so_far and modifiers_so_far describe which map we're looking in;
3484    If we're in the "meta" submap of the map that "C-x 4" is bound to,
3485    then keys_so_far will be {(control x), \4}, and modifiers_so_far
3486    will be MOD_META.  That is, keys_so_far is the chain of keys that we
3487    have followed, and modifiers_so_far_so_far is the bits (partial keys)
3488    beyond that.
3489
3490    (keys_so_far is a global buffer and the keys_count arg says how much
3491    of it we're currently interested in.)
3492
3493    If target_buffer is provided, then we write a key-description into it,
3494    to avoid consing a string.  This only works with firstonly on.
3495    */
3496
3497 struct where_is_closure
3498   {
3499     Lisp_Object definition;
3500     Lisp_Object *shadow;
3501     int shadow_count;
3502     int firstonly;
3503     int keys_count;
3504     unsigned int modifiers_so_far;
3505     char *target_buffer;
3506     struct key_data *keys_so_far;
3507     int keys_so_far_total_size;
3508     int keys_so_far_malloced;
3509   };
3510
3511 static Lisp_Object where_is_recursive_mapper (Lisp_Object map, void *arg);
3512
3513 static Lisp_Object
3514 where_is_recursive_mapper (Lisp_Object map, void *arg)
3515 {
3516   /* This function can GC */
3517   struct where_is_closure *c = (struct where_is_closure *) arg;
3518   Lisp_Object definition = c->definition;
3519   CONST int firstonly = c->firstonly;
3520   CONST unsigned int keys_count = c->keys_count;
3521   CONST unsigned int modifiers_so_far = c->modifiers_so_far;
3522   char *target_buffer = c->target_buffer;
3523   Lisp_Object keys = Fgethash (definition,
3524                                XKEYMAP (map)->inverse_table,
3525                                Qnil);
3526   Lisp_Object submaps;
3527   Lisp_Object result = Qnil;
3528
3529   if (!NILP (keys))
3530     {
3531       /* One or more keys in this map match the definition we're looking for.
3532          Verify that these bindings aren't shadowed by other bindings
3533          in the shadow maps.  Either nil or number as value from
3534          raw_lookup_key() means undefined.  */
3535       struct key_data *so_far = c->keys_so_far;
3536
3537       for (;;) /* loop over all keys that match */
3538         {
3539           Lisp_Object k = CONSP (keys) ? XCAR (keys) : keys;
3540           int i;
3541
3542           so_far [keys_count].keysym = k;
3543           so_far [keys_count].modifiers = modifiers_so_far;
3544
3545           /* now loop over all shadow maps */
3546           for (i = 0; i < c->shadow_count; i++)
3547             {
3548               Lisp_Object shadowed = raw_lookup_key (c->shadow[i],
3549                                                      so_far,
3550                                                      keys_count + 1,
3551                                                      0, 1);
3552
3553               if (NILP (shadowed) || CHARP (shadowed) ||
3554                   EQ (shadowed, definition))
3555                 continue; /* we passed this test; it's not shadowed here. */
3556               else
3557                 /* ignore this key binding, since it actually has a
3558                    different binding in a shadowing map */
3559                 goto c_doesnt_have_proper_loop_exit_statements;
3560             }
3561
3562           /* OK, the key is for real */
3563           if (target_buffer)
3564             {
3565               if (!firstonly) abort ();
3566               format_raw_keys (so_far, keys_count + 1, target_buffer);
3567               return make_int (1);
3568             }
3569           else if (firstonly)
3570             return raw_keys_to_keys (so_far, keys_count + 1);
3571           else
3572             result = Fcons (raw_keys_to_keys (so_far, keys_count + 1),
3573                             result);
3574
3575         c_doesnt_have_proper_loop_exit_statements:
3576           /* now on to the next matching key ... */
3577           if (!CONSP (keys)) break;
3578           keys = XCDR (keys);
3579         }
3580     }
3581
3582   /* Now search the sub-keymaps of this map.
3583      If we're in "firstonly" mode and have already found one, this
3584      point is not reached.  If we get one from lower down, either
3585      return it immediately (in firstonly mode) or tack it onto the
3586      end of the ones we've gotten so far.
3587      */
3588   for (submaps = keymap_submaps (map);
3589        !NILP (submaps);
3590        submaps = XCDR (submaps))
3591     {
3592       Lisp_Object key    = XCAR (XCAR (submaps));
3593       Lisp_Object submap = XCDR (XCAR (submaps));
3594       unsigned int lower_modifiers;
3595       int lower_keys_count = keys_count;
3596       unsigned int bucky;
3597
3598       submap = get_keymap (submap, 0, 0);
3599
3600       if (EQ (submap, map))
3601         /* Arrgh!  Some loser has introduced a loop... */
3602         continue;
3603
3604       /* If this is not a keymap, then that's probably because someone
3605          did an `fset' of a symbol that used to point to a map such that
3606          it no longer does.  Sigh.  Ignore this, and invalidate the cache
3607          so that it doesn't happen to us next time too.
3608          */
3609       if (NILP (submap))
3610         {
3611           XKEYMAP (map)->sub_maps_cache = Qt;
3612           continue;
3613         }
3614
3615       /* If the map is a "bucky" map, then add a bit to the
3616          modifiers_so_far list.
3617          Otherwise, add a new raw_key onto the end of keys_so_far.
3618          */
3619       bucky = MODIFIER_HASH_KEY_BITS (key);
3620       if (bucky != 0)
3621         lower_modifiers = (modifiers_so_far | bucky);
3622       else
3623         {
3624           struct key_data *so_far = c->keys_so_far;
3625           lower_modifiers = 0;
3626           so_far [lower_keys_count].keysym = key;
3627           so_far [lower_keys_count].modifiers = modifiers_so_far;
3628           lower_keys_count++;
3629         }
3630
3631       if (lower_keys_count >= c->keys_so_far_total_size)
3632         {
3633           int size = lower_keys_count + 50;
3634           if (! c->keys_so_far_malloced)
3635             {
3636               struct key_data *new = xnew_array (struct key_data, size);
3637               memcpy ((void *)new, (CONST void *)c->keys_so_far,
3638                       c->keys_so_far_total_size * sizeof (struct key_data));
3639             }
3640           else
3641             XREALLOC_ARRAY (c->keys_so_far, struct key_data, size);
3642
3643           c->keys_so_far_total_size = size;
3644           c->keys_so_far_malloced = 1;
3645         }
3646
3647       {
3648         Lisp_Object lower;
3649
3650         c->keys_count = lower_keys_count;
3651         c->modifiers_so_far = lower_modifiers;
3652
3653         lower = traverse_keymaps (submap, Qnil, where_is_recursive_mapper, c);
3654
3655         c->keys_count = keys_count;
3656         c->modifiers_so_far = modifiers_so_far;
3657
3658         if (!firstonly)
3659           result = nconc2 (lower, result);
3660         else if (!NILP (lower))
3661           return lower;
3662       }
3663     }
3664   return result;
3665 }
3666
3667
3668 static Lisp_Object
3669 where_is_internal (Lisp_Object definition, Lisp_Object *maps, int nmaps,
3670                    Lisp_Object firstonly, char *target_buffer)
3671 {
3672   /* This function can GC */
3673   Lisp_Object result = Qnil;
3674   int i;
3675   struct key_data raw[20];
3676   struct where_is_closure c;
3677
3678   c.definition = definition;
3679   c.shadow = maps;
3680   c.firstonly = !NILP (firstonly);
3681   c.target_buffer = target_buffer;
3682   c.keys_so_far = raw;
3683   c.keys_so_far_total_size = countof (raw);
3684   c.keys_so_far_malloced = 0;
3685
3686   /* Loop over each of the maps, accumulating the keys found.
3687      For each map searched, all previous maps shadow this one
3688      so that bogus keys aren't listed. */
3689   for (i = 0; i < nmaps; i++)
3690     {
3691       Lisp_Object this_result;
3692       c.shadow_count = i;
3693       /* Reset the things set in each iteration */
3694       c.keys_count = 0;
3695       c.modifiers_so_far = 0;
3696
3697       this_result = traverse_keymaps (maps[i], Qnil, where_is_recursive_mapper,
3698                                       &c);
3699       if (!NILP (firstonly))
3700         {
3701           result = this_result;
3702           if (!NILP (result))
3703             break;
3704         }
3705       else
3706         result = nconc2 (this_result, result);
3707     }
3708
3709   if (NILP (firstonly))
3710     result = Fnreverse (result);
3711
3712   if (c.keys_so_far_malloced)
3713     xfree (c.keys_so_far);
3714   return result;
3715 }
3716
3717 \f
3718 /************************************************************************/
3719 /*                         Describing keymaps                           */
3720 /************************************************************************/
3721
3722 DEFUN ("describe-bindings-internal", Fdescribe_bindings_internal, 1, 5, 0, /*
3723 Insert a list of all defined keys and their definitions in MAP.
3724 Optional second argument ALL says whether to include even "uninteresting"
3725 definitions (ie symbols with a non-nil `suppress-keymap' property.
3726 Third argument SHADOW is a list of keymaps whose bindings shadow those
3727 of map; if a binding is present in any shadowing map, it is not printed.
3728 Fourth argument PREFIX, if non-nil, should be a key sequence;
3729 only bindings which start with that key sequence will be printed.
3730 Fifth argument MOUSE-ONLY-P says to only print bindings for mouse clicks.
3731 */
3732        (map, all, shadow, prefix, mouse_only_p))
3733 {
3734   /* This function can GC */
3735
3736   /* #### At some point, this function should be changed to accept a
3737      BUFFER argument.  Currently, the BUFFER argument to
3738      describe_map_tree is being used only internally.  */
3739   describe_map_tree (map, NILP (all), shadow, prefix,
3740                      !NILP (mouse_only_p), Fcurrent_buffer ());
3741   return Qnil;
3742 }
3743
3744
3745 /* Insert a description of the key bindings in STARTMAP,
3746     followed by those of all maps reachable through STARTMAP.
3747    If PARTIAL is nonzero, omit certain "uninteresting" commands
3748     (such as `undefined').
3749    If SHADOW is non-nil, it is a list of other maps;
3750     don't mention keys which would be shadowed by any of them
3751    If PREFIX is non-nil, only list bindings which start with those keys.
3752  */
3753
3754 void
3755 describe_map_tree (Lisp_Object startmap, int partial, Lisp_Object shadow,
3756                    Lisp_Object prefix, int mice_only_p, Lisp_Object buffer)
3757 {
3758   /* This function can GC */
3759   Lisp_Object maps = Qnil;
3760   struct gcpro gcpro1, gcpro2;  /* get_keymap may autoload */
3761   GCPRO2 (maps, shadow);
3762
3763   maps = Faccessible_keymaps (startmap, prefix);
3764
3765   for (; !NILP (maps); maps = Fcdr (maps))
3766     {
3767       Lisp_Object sub_shadow = Qnil;
3768       Lisp_Object elt = Fcar (maps);
3769       Lisp_Object tail;
3770       int no_prefix = (VECTORP (Fcar (elt))
3771                        && XINT (Flength (Fcar (elt))) == 0);
3772       struct gcpro ngcpro1, ngcpro2, ngcpro3;
3773       NGCPRO3 (sub_shadow, elt, tail);
3774
3775       for (tail = shadow; CONSP (tail); tail = XCDR (tail))
3776         {
3777           Lisp_Object shmap = XCAR (tail);
3778
3779           /* If the sequence by which we reach this keymap is zero-length,
3780              then the shadow maps for this keymap are just SHADOW.  */
3781           if (no_prefix)
3782             ;
3783           /* If the sequence by which we reach this keymap actually has
3784              some elements, then the sequence's definition in SHADOW is
3785              what we should use.  */
3786           else
3787             {
3788               shmap = Flookup_key (shmap, Fcar (elt), Qt);
3789               if (CHARP (shmap))
3790                 shmap = Qnil;
3791             }
3792
3793           if (!NILP (shmap))
3794             {
3795               Lisp_Object shm = get_keymap (shmap, 0, 1);
3796               /* If shmap is not nil and not a keymap, it completely
3797                  shadows this map, so don't describe this map at all.  */
3798               if (!KEYMAPP (shm))
3799                 goto SKIP;
3800               sub_shadow = Fcons (shm, sub_shadow);
3801             }
3802         }
3803
3804       {
3805         /* Describe the contents of map MAP, assuming that this map
3806            itself is reached by the sequence of prefix keys KEYS (a vector).
3807            PARTIAL and SHADOW are as in `describe_map_tree'.  */
3808         Lisp_Object keysdesc
3809           = ((!no_prefix)
3810              ? concat2 (Fkey_description (Fcar (elt)), Vsingle_space_string)
3811              : Qnil);
3812         describe_map (Fcdr (elt), keysdesc,
3813                       describe_command,
3814                       partial,
3815                       sub_shadow,
3816                       mice_only_p,
3817                       buffer);
3818       }
3819     SKIP:
3820       NUNGCPRO;
3821     }
3822   UNGCPRO;
3823 }
3824
3825
3826 static void
3827 describe_command (Lisp_Object definition, Lisp_Object buffer)
3828 {
3829   /* This function can GC */
3830   int keymapp = !NILP (Fkeymapp (definition));
3831   struct gcpro gcpro1;
3832   GCPRO1 (definition);
3833
3834   Findent_to (make_int (16), make_int (3), buffer);
3835   if (keymapp)
3836     buffer_insert_c_string (XBUFFER (buffer), "<< ");
3837
3838   if (SYMBOLP (definition))
3839     {
3840       buffer_insert1 (XBUFFER (buffer), Fsymbol_name (definition));
3841     }
3842   else if (STRINGP (definition) || VECTORP (definition))
3843     {
3844       buffer_insert_c_string (XBUFFER (buffer), "Kbd Macro: ");
3845       buffer_insert1 (XBUFFER (buffer), Fkey_description (definition));
3846     }
3847   else if (COMPILED_FUNCTIONP (definition))
3848     buffer_insert_c_string (XBUFFER (buffer), "Anonymous Compiled Function");
3849   else if (CONSP (definition) && EQ (XCAR (definition), Qlambda))
3850     buffer_insert_c_string (XBUFFER (buffer), "Anonymous Lambda");
3851   else if (KEYMAPP (definition))
3852     {
3853       Lisp_Object name = XKEYMAP (definition)->name;
3854       if (STRINGP (name) || (SYMBOLP (name) && !NILP (name)))
3855         {
3856           buffer_insert_c_string (XBUFFER (buffer), "Prefix command ");
3857           if (SYMBOLP (name)
3858               && EQ (find_symbol_value (name), definition))
3859             buffer_insert1 (XBUFFER (buffer), Fsymbol_name (name));
3860           else
3861             {
3862               buffer_insert1 (XBUFFER (buffer), Fprin1_to_string (name, Qnil));
3863             }
3864         }
3865       else
3866         buffer_insert_c_string (XBUFFER (buffer), "Prefix Command");
3867     }
3868   else
3869     buffer_insert_c_string (XBUFFER (buffer), "??");
3870
3871   if (keymapp)
3872     buffer_insert_c_string (XBUFFER (buffer), " >>");
3873   buffer_insert_c_string (XBUFFER (buffer), "\n");
3874   UNGCPRO;
3875 }
3876
3877 struct describe_map_closure
3878   {
3879     Lisp_Object *list;   /* pointer to the list to update */
3880     Lisp_Object partial; /* whether to ignore suppressed commands */
3881     Lisp_Object shadow;  /* list of maps shadowing this one */
3882     Lisp_Object self;    /* this map */
3883     Lisp_Object self_root; /* this map, or some map that has this map as
3884                               a parent.  this is the base of the tree */
3885     int mice_only_p;     /* whether we are to display only button bindings */
3886   };
3887
3888 struct describe_map_shadow_closure
3889   {
3890     CONST struct key_data *raw_key;
3891     Lisp_Object self;
3892   };
3893
3894 static Lisp_Object
3895 describe_map_mapper_shadow_search (Lisp_Object map, void *arg)
3896 {
3897   struct describe_map_shadow_closure *c =
3898     (struct describe_map_shadow_closure *) arg;
3899
3900   if (EQ (map, c->self))
3901     return Qzero;               /* Not shadowed; terminate search */
3902
3903   return !NILP (keymap_lookup_directly (map,
3904                                         c->raw_key->keysym,
3905                                         c->raw_key->modifiers))
3906     ? Qt : Qnil;
3907 }
3908
3909
3910 static Lisp_Object
3911 keymap_lookup_inherited_mapper (Lisp_Object km, void *arg)
3912 {
3913   struct key_data *k = (struct key_data *) arg;
3914   return keymap_lookup_directly (km, k->keysym, k->modifiers);
3915 }
3916
3917
3918 static void
3919 describe_map_mapper (CONST struct key_data *key,
3920                      Lisp_Object binding,
3921                      void *describe_map_closure)
3922 {
3923   /* This function can GC */
3924   struct describe_map_closure *closure =
3925     (struct describe_map_closure *) describe_map_closure;
3926   Lisp_Object keysym = key->keysym;
3927   unsigned int modifiers = key->modifiers;
3928
3929   /* Don't mention suppressed commands.  */
3930   if (SYMBOLP (binding)
3931       && !NILP (closure->partial)
3932       && !NILP (Fget (binding, closure->partial, Qnil)))
3933     return;
3934
3935   /* If we're only supposed to display mouse bindings and this isn't one,
3936      then bug out. */
3937   if (closure->mice_only_p &&
3938       (! (EQ (keysym, Qbutton0) ||
3939           EQ (keysym, Qbutton1) ||
3940           EQ (keysym, Qbutton2) ||
3941           EQ (keysym, Qbutton3) ||
3942           EQ (keysym, Qbutton4) ||
3943           EQ (keysym, Qbutton5) ||
3944           EQ (keysym, Qbutton6) ||
3945           EQ (keysym, Qbutton7) ||
3946           EQ (keysym, Qbutton0up) ||
3947           EQ (keysym, Qbutton1up) ||
3948           EQ (keysym, Qbutton2up) ||
3949           EQ (keysym, Qbutton3up) ||
3950           EQ (keysym, Qbutton4up) ||
3951           EQ (keysym, Qbutton5up) ||
3952           EQ (keysym, Qbutton6up) ||
3953           EQ (keysym, Qbutton7up))))
3954     return;
3955
3956   /* If this command in this map is shadowed by some other map, ignore it. */
3957   {
3958     Lisp_Object tail;
3959
3960     for (tail = closure->shadow; CONSP (tail); tail = XCDR (tail))
3961       {
3962         QUIT;
3963         if (!NILP (traverse_keymaps (XCAR (tail), Qnil,
3964                                      keymap_lookup_inherited_mapper,
3965                                      /* Cast to discard `const' */
3966                                      (void *)key)))
3967           return;
3968       }
3969   }
3970
3971   /* If this key is in some map of which this map is a parent, then ignore
3972      it (in that case, it has been shadowed).
3973      */
3974   {
3975     Lisp_Object sh;
3976     struct describe_map_shadow_closure c;
3977     c.raw_key = key;
3978     c.self = closure->self;
3979
3980     sh = traverse_keymaps (closure->self_root, Qnil,
3981                            describe_map_mapper_shadow_search, &c);
3982     if (!NILP (sh) && !ZEROP (sh))
3983       return;
3984   }
3985
3986   /* Otherwise add it to the list to be sorted. */
3987   *(closure->list) = Fcons (Fcons (Fcons (keysym, make_int (modifiers)),
3988                                    binding),
3989                             *(closure->list));
3990 }
3991
3992
3993 static int
3994 describe_map_sort_predicate (Lisp_Object obj1, Lisp_Object obj2,
3995                              Lisp_Object pred)
3996 {
3997   /* obj1 and obj2 are conses of the form
3998      ( ( <keysym> . <modifiers> ) . <binding> )
3999      keysym and modifiers are used, binding is ignored.
4000    */
4001   unsigned int bit1, bit2;
4002   obj1 = XCAR (obj1);
4003   obj2 = XCAR (obj2);
4004   bit1 = XINT (XCDR (obj1));
4005   bit2 = XINT (XCDR (obj2));
4006   if (bit1 != bit2)
4007     return bit1 < bit2 ? 1 : -1;
4008   else
4009     return map_keymap_sort_predicate (obj1, obj2, pred);
4010 }
4011
4012 /* Elide 2 or more consecutive numeric keysyms bound to the same thing,
4013    or 2 or more symbolic keysyms that are bound to the same thing and
4014    have consecutive character-set-properties.
4015  */
4016 static int
4017 elide_next_two_p (Lisp_Object list)
4018 {
4019   Lisp_Object s1, s2;
4020
4021   if (NILP (XCDR (list)))
4022     return 0;
4023
4024   /* next two bindings differ */
4025   if (!EQ (XCDR (XCAR (list)),
4026            XCDR (XCAR (XCDR (list)))))
4027     return 0;
4028
4029   /* next two modifier-sets differ */
4030   if (!EQ (XCDR (XCAR (XCAR (list))),
4031            XCDR (XCAR (XCAR (XCDR (list))))))
4032     return 0;
4033
4034   s1 = XCAR (XCAR (XCAR (list)));
4035   s2 = XCAR (XCAR (XCAR (XCDR (list))));
4036
4037   if (SYMBOLP (s1))
4038     {
4039       Lisp_Object code = Fget (s1, Vcharacter_set_property, Qnil);
4040       if (CHAR_OR_CHAR_INTP (code))
4041         {
4042           s1 = code;
4043           CHECK_CHAR_COERCE_INT (s1);
4044         }
4045       else return 0;
4046     }
4047   if (SYMBOLP (s2))
4048     {
4049       Lisp_Object code = Fget (s2, Vcharacter_set_property, Qnil);
4050       if (CHAR_OR_CHAR_INTP (code))
4051         {
4052           s2 = code;
4053           CHECK_CHAR_COERCE_INT (s2);
4054         }
4055       else return 0;
4056     }
4057
4058   return (XCHAR (s1)     == XCHAR (s2) ||
4059           XCHAR (s1) + 1 == XCHAR (s2));
4060 }
4061
4062
4063 static Lisp_Object
4064 describe_map_parent_mapper (Lisp_Object keymap, void *arg)
4065 {
4066   /* This function can GC */
4067   struct describe_map_closure *describe_map_closure =
4068     (struct describe_map_closure *) arg;
4069   describe_map_closure->self = keymap;
4070   map_keymap (XKEYMAP (keymap)->table,
4071               0, /* don't sort: we'll do it later */
4072               describe_map_mapper, describe_map_closure);
4073   return Qnil;
4074 }
4075
4076
4077 /* Describe the contents of map MAP, assuming that this map itself is
4078    reached by the sequence of prefix keys KEYS (a string or vector).
4079    PARTIAL, SHADOW, NOMENU are as in `describe_map_tree' above.  */
4080
4081 static void
4082 describe_map (Lisp_Object keymap, Lisp_Object elt_prefix,
4083               void (*elt_describer) (Lisp_Object, Lisp_Object),
4084               int partial,
4085               Lisp_Object shadow,
4086               int mice_only_p,
4087               Lisp_Object buffer)
4088 {
4089   /* This function can GC */
4090   struct describe_map_closure describe_map_closure;
4091   Lisp_Object list = Qnil;
4092   struct buffer *buf = XBUFFER (buffer);
4093   Emchar printable_min = (CHAR_OR_CHAR_INTP (buf->ctl_arrow)
4094                           ? XCHAR_OR_CHAR_INT (buf->ctl_arrow)
4095                           : ((EQ (buf->ctl_arrow, Qt)
4096                               || EQ (buf->ctl_arrow, Qnil))
4097                              ? 256 : 160));
4098   int elided = 0;
4099   struct gcpro gcpro1, gcpro2, gcpro3, gcpro4;
4100
4101   keymap = get_keymap (keymap, 1, 1);
4102   describe_map_closure.partial = (partial ? Qsuppress_keymap : Qnil);
4103   describe_map_closure.shadow = shadow;
4104   describe_map_closure.list = &list;
4105   describe_map_closure.self_root = keymap;
4106   describe_map_closure.mice_only_p = mice_only_p;
4107
4108   GCPRO4 (keymap, elt_prefix, shadow, list);
4109
4110   traverse_keymaps (keymap, Qnil,
4111                     describe_map_parent_mapper, &describe_map_closure);
4112
4113   if (!NILP (list))
4114     {
4115       list = list_sort (list, Qnil, describe_map_sort_predicate);
4116       buffer_insert_c_string (buf, "\n");
4117       while (!NILP (list))
4118         {
4119           Lisp_Object elt = XCAR (XCAR (list));
4120           Lisp_Object keysym = XCAR (elt);
4121           unsigned int modifiers = XINT (XCDR (elt));
4122
4123           if (!NILP (elt_prefix))
4124             buffer_insert_lisp_string (buf, elt_prefix);
4125
4126           if (modifiers & MOD_META)    buffer_insert_c_string (buf, "M-");
4127           if (modifiers & MOD_CONTROL) buffer_insert_c_string (buf, "C-");
4128           if (modifiers & MOD_SUPER)   buffer_insert_c_string (buf, "S-");
4129           if (modifiers & MOD_HYPER)   buffer_insert_c_string (buf, "H-");
4130           if (modifiers & MOD_ALT)     buffer_insert_c_string (buf, "Alt-");
4131           if (modifiers & MOD_SHIFT)   buffer_insert_c_string (buf, "Sh-");
4132           if (SYMBOLP (keysym))
4133             {
4134               Lisp_Object code = Fget (keysym, Vcharacter_set_property, Qnil);
4135               Emchar c = (CHAR_OR_CHAR_INTP (code)
4136                           ? XCHAR_OR_CHAR_INT (code) : (Emchar) -1);
4137               /* Calling Fsingle_key_description() would cons more */
4138 #if 0                           /* This is bogus */
4139               if (EQ (keysym, QKlinefeed))
4140                 buffer_insert_c_string (buf, "LFD");
4141               else if (EQ (keysym, QKtab))
4142                 buffer_insert_c_string (buf, "TAB");
4143               else if (EQ (keysym, QKreturn))
4144                 buffer_insert_c_string (buf, "RET");
4145               else if (EQ (keysym, QKescape))
4146                 buffer_insert_c_string (buf, "ESC");
4147               else if (EQ (keysym, QKdelete))
4148                 buffer_insert_c_string (buf, "DEL");
4149               else if (EQ (keysym, QKspace))
4150                 buffer_insert_c_string (buf, "SPC");
4151               else if (EQ (keysym, QKbackspace))
4152                 buffer_insert_c_string (buf, "BS");
4153               else
4154 #endif
4155                 if (c >= printable_min)
4156                   buffer_insert_emacs_char (buf, c);
4157                 else buffer_insert1 (buf, Fsymbol_name (keysym));
4158             }
4159           else if (CHARP (keysym))
4160             buffer_insert_emacs_char (buf, XCHAR (keysym));
4161           else
4162             buffer_insert_c_string (buf, "---bad keysym---");
4163
4164           if (elided)
4165             elided = 0;
4166           else
4167             {
4168               int k = 0;
4169
4170               while (elide_next_two_p (list))
4171                 {
4172                   k++;
4173                   list = XCDR (list);
4174                 }
4175               if (k != 0)
4176                 {
4177                   if (k == 1)
4178                     buffer_insert_c_string (buf, ", ");
4179                   else
4180                     buffer_insert_c_string (buf, " .. ");
4181                   elided = 1;
4182                   continue;
4183                 }
4184             }
4185
4186           /* Print a description of the definition of this character.  */
4187           (*elt_describer) (XCDR (XCAR (list)), buffer);
4188           list = XCDR (list);
4189         }
4190     }
4191   UNGCPRO;
4192 }
4193
4194 \f
4195 void
4196 syms_of_keymap (void)
4197 {
4198   defsymbol (&Qminor_mode_map_alist, "minor-mode-map-alist");
4199
4200   defsymbol (&Qkeymapp, "keymapp");
4201
4202   defsymbol (&Qsuppress_keymap, "suppress-keymap");
4203
4204   defsymbol (&Qmodeline_map, "modeline-map");
4205   defsymbol (&Qtoolbar_map, "toolbar-map");
4206
4207   DEFSUBR (Fkeymap_parents);
4208   DEFSUBR (Fset_keymap_parents);
4209   DEFSUBR (Fkeymap_name);
4210   DEFSUBR (Fset_keymap_name);
4211   DEFSUBR (Fkeymap_prompt);
4212   DEFSUBR (Fset_keymap_prompt);
4213   DEFSUBR (Fkeymap_default_binding);
4214   DEFSUBR (Fset_keymap_default_binding);
4215
4216   DEFSUBR (Fkeymapp);
4217   DEFSUBR (Fmake_keymap);
4218   DEFSUBR (Fmake_sparse_keymap);
4219
4220   DEFSUBR (Fcopy_keymap);
4221   DEFSUBR (Fkeymap_fullness);
4222   DEFSUBR (Fmap_keymap);
4223   DEFSUBR (Fevent_matches_key_specifier_p);
4224   DEFSUBR (Fdefine_key);
4225   DEFSUBR (Flookup_key);
4226   DEFSUBR (Fkey_binding);
4227   DEFSUBR (Fuse_global_map);
4228   DEFSUBR (Fuse_local_map);
4229   DEFSUBR (Fcurrent_local_map);
4230   DEFSUBR (Fcurrent_global_map);
4231   DEFSUBR (Fcurrent_keymaps);
4232   DEFSUBR (Faccessible_keymaps);
4233   DEFSUBR (Fkey_description);
4234   DEFSUBR (Fsingle_key_description);
4235   DEFSUBR (Fwhere_is_internal);
4236   DEFSUBR (Fdescribe_bindings_internal);
4237
4238   DEFSUBR (Ftext_char_description);
4239
4240   defsymbol (&Qcontrol, "control");
4241   defsymbol (&Qctrl, "ctrl");
4242   defsymbol (&Qmeta, "meta");
4243   defsymbol (&Qsuper, "super");
4244   defsymbol (&Qhyper, "hyper");
4245   defsymbol (&Qalt, "alt");
4246   defsymbol (&Qshift, "shift");
4247   defsymbol (&Qbutton0, "button0");
4248   defsymbol (&Qbutton1, "button1");
4249   defsymbol (&Qbutton2, "button2");
4250   defsymbol (&Qbutton3, "button3");
4251   defsymbol (&Qbutton4, "button4");
4252   defsymbol (&Qbutton5, "button5");
4253   defsymbol (&Qbutton6, "button6");
4254   defsymbol (&Qbutton7, "button7");
4255   defsymbol (&Qbutton0up, "button0up");
4256   defsymbol (&Qbutton1up, "button1up");
4257   defsymbol (&Qbutton2up, "button2up");
4258   defsymbol (&Qbutton3up, "button3up");
4259   defsymbol (&Qbutton4up, "button4up");
4260   defsymbol (&Qbutton5up, "button5up");
4261   defsymbol (&Qbutton6up, "button6up");
4262   defsymbol (&Qbutton7up, "button7up");
4263   defsymbol (&Qmouse_1, "mouse-1");
4264   defsymbol (&Qmouse_2, "mouse-2");
4265   defsymbol (&Qmouse_3, "mouse-3");
4266   defsymbol (&Qmouse_4, "mouse-4");
4267   defsymbol (&Qmouse_5, "mouse-5");
4268   defsymbol (&Qdown_mouse_1, "down-mouse-1");
4269   defsymbol (&Qdown_mouse_2, "down-mouse-2");
4270   defsymbol (&Qdown_mouse_3, "down-mouse-3");
4271   defsymbol (&Qdown_mouse_4, "down-mouse-4");
4272   defsymbol (&Qdown_mouse_5, "down-mouse-5");
4273   defsymbol (&Qmenu_selection, "menu-selection");
4274   defsymbol (&QLFD, "LFD");
4275   defsymbol (&QTAB, "TAB");
4276   defsymbol (&QRET, "RET");
4277   defsymbol (&QESC, "ESC");
4278   defsymbol (&QDEL, "DEL");
4279   defsymbol (&QSPC, "SPC");
4280   defsymbol (&QBS, "BS");
4281 }
4282
4283 void
4284 vars_of_keymap (void)
4285 {
4286   DEFVAR_LISP ("meta-prefix-char", &Vmeta_prefix_char /*
4287 Meta-prefix character.
4288 This character followed by some character `foo' turns into `Meta-foo'.
4289 This can be any form recognized as a single key specifier.
4290 To disable the meta-prefix-char, set it to a negative number.
4291 */ );
4292   Vmeta_prefix_char = make_char (033);
4293
4294   DEFVAR_LISP ("mouse-grabbed-buffer", &Vmouse_grabbed_buffer /*
4295 A buffer which should be consulted first for all mouse activity.
4296 When a mouse-click is processed, it will first be looked up in the
4297 local-map of this buffer, and then through the normal mechanism if there
4298 is no binding for that click.  This buffer's value of `mode-motion-hook'
4299 will be consulted instead of the `mode-motion-hook' of the buffer of the
4300 window under the mouse.  You should *bind* this, not set it.
4301 */ );
4302   Vmouse_grabbed_buffer = Qnil;
4303
4304   DEFVAR_LISP ("overriding-local-map", &Voverriding_local_map /*
4305 Keymap that overrides all other local keymaps.
4306 If this variable is non-nil, it is used as a keymap instead of the
4307 buffer's local map, and the minor mode keymaps and extent-local keymaps.
4308 You should *bind* this, not set it.
4309 */ );
4310   Voverriding_local_map = Qnil;
4311
4312   Fset (Qminor_mode_map_alist, Qnil);
4313
4314   DEFVAR_LISP ("key-translation-map", &Vkey_translation_map /*
4315 Keymap of key translations that can override keymaps.
4316 This keymap works like `function-key-map', but comes after that,
4317 and applies even for keys that have ordinary bindings.
4318 */ );
4319   Vkey_translation_map = Qnil;
4320
4321   DEFVAR_LISP ("vertical-divider-map", &Vvertical_divider_map /*
4322 Keymap which handles mouse clicks over vertical dividers.
4323 */ );
4324   Vvertical_divider_map = Qnil;
4325
4326   DEFVAR_INT ("keymap-tick", &keymap_tick /*
4327 Incremented for each change to any keymap.
4328 */ );
4329   keymap_tick = 0;
4330
4331   staticpro (&Vcurrent_global_map);
4332
4333   Vsingle_space_string = make_string ((CONST Bufbyte *) " ", 1);
4334   staticpro (&Vsingle_space_string);
4335 }
4336
4337 void
4338 complex_vars_of_keymap (void)
4339 {
4340   /* This function can GC */
4341   Lisp_Object ESC_prefix = intern ("ESC-prefix");
4342   Lisp_Object meta_disgustitute;
4343
4344   Vcurrent_global_map = Fmake_keymap (Qnil);
4345
4346   meta_disgustitute = Fmake_keymap (Qnil);
4347   Ffset (ESC_prefix, meta_disgustitute);
4348   /* no need to protect meta_disgustitute, though */
4349   keymap_store_internal (MAKE_MODIFIER_HASH_KEY (MOD_META),
4350                          XKEYMAP (Vcurrent_global_map),
4351                          meta_disgustitute);
4352   XKEYMAP (Vcurrent_global_map)->sub_maps_cache = Qt;
4353
4354   Vkey_translation_map = Fmake_sparse_keymap (intern ("key-translation-map"));
4355 }