Contents in latest XEmacs 21.2 at 1999-06-24-19.
[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, void (*markobj) (Lisp_Object))
256 {
257   Lisp_Keymap *keymap = XKEYMAP (obj);
258   markobj (keymap->parents);
259   markobj (keymap->prompt);
260   markobj (keymap->inverse_table);
261   markobj (keymap->sub_maps_cache);
262   markobj (keymap->default_binding);
263   markobj (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   /* After copying the inverse map, we need to copy the conses which
1145      are its values, lest they be shared by the copy, and mangled.
1146    */
1147   elisp_maphash (copy_keymap_inverse_mapper, keymap->inverse_table,
1148                  &copy_keymap_inverse_closure);
1149   return nkm;
1150 }
1151
1152
1153 static Lisp_Object copy_keymap (Lisp_Object keymap);
1154
1155 struct copy_keymap_closure
1156 {
1157   Lisp_Keymap *self;
1158 };
1159
1160 static int
1161 copy_keymap_mapper (Lisp_Object key, Lisp_Object value,
1162                     void *copy_keymap_closure)
1163 {
1164   /* This function can GC */
1165   struct copy_keymap_closure *closure =
1166     (struct copy_keymap_closure *) copy_keymap_closure;
1167
1168   /* When we encounter a keymap which is indirected through a
1169      symbol, we need to copy the sub-map.  In v18, the form
1170        (lookup-key (copy-keymap global-map) "\C-x")
1171      returned a new keymap, not the symbol 'Control-X-prefix.
1172    */
1173   value = get_keymap (value, 0, 1); /* #### autoload GC-safe here? */
1174   if (KEYMAPP (value))
1175     keymap_store_internal (key, closure->self,
1176                            copy_keymap (value));
1177   return 0;
1178 }
1179
1180 static Lisp_Object
1181 copy_keymap (Lisp_Object keymap)
1182 {
1183   /* This function can GC */
1184   struct copy_keymap_closure copy_keymap_closure;
1185
1186   keymap = copy_keymap_internal (XKEYMAP (keymap));
1187   copy_keymap_closure.self = XKEYMAP (keymap);
1188   elisp_maphash (copy_keymap_mapper,
1189                  XKEYMAP (keymap)->table,
1190                  &copy_keymap_closure);
1191   return keymap;
1192 }
1193
1194 DEFUN ("copy-keymap", Fcopy_keymap, 1, 1, 0, /*
1195 Return a copy of the keymap KEYMAP.
1196 The copy starts out with the same definitions of KEYMAP,
1197 but changing either the copy or KEYMAP does not affect the other.
1198 Any key definitions that are subkeymaps are recursively copied.
1199 */
1200        (keymap))
1201 {
1202   /* This function can GC */
1203   keymap = get_keymap (keymap, 1, 1);
1204   return copy_keymap (keymap);
1205 }
1206
1207 \f
1208 static int
1209 keymap_fullness (Lisp_Object keymap)
1210 {
1211   /* This function can GC */
1212   int fullness;
1213   Lisp_Object sub_maps;
1214   struct gcpro gcpro1, gcpro2;
1215
1216   keymap = get_keymap (keymap, 1, 1);
1217   fullness = XKEYMAP (keymap)->fullness;
1218   sub_maps = keymap_submaps (keymap);
1219   GCPRO2 (keymap, sub_maps);
1220   for (; !NILP (sub_maps); sub_maps = XCDR (sub_maps))
1221     {
1222       if (MODIFIER_HASH_KEY_BITS (XCAR (XCAR (sub_maps))) != 0)
1223         {
1224           Lisp_Object sub_map = XCDR (XCAR (sub_maps));
1225           fullness--; /* don't count bucky maps */
1226           fullness += keymap_fullness (sub_map);
1227         }
1228     }
1229   UNGCPRO;
1230   return fullness;
1231 }
1232
1233 DEFUN ("keymap-fullness", Fkeymap_fullness, 1, 1, 0, /*
1234 Return the number of bindings in the keymap.
1235 */
1236        (keymap))
1237 {
1238   /* This function can GC */
1239   return make_int (keymap_fullness (get_keymap (keymap, 1, 1)));
1240 }
1241
1242 \f
1243 /************************************************************************/
1244 /*                        Defining keys in keymaps                      */
1245 /************************************************************************/
1246
1247 /* Given a keysym (should be a symbol, int, char), make sure it's valid
1248    and perform any necessary canonicalization. */
1249
1250 static void
1251 define_key_check_and_coerce_keysym (Lisp_Object spec,
1252                                     Lisp_Object *keysym,
1253                                     unsigned int modifiers)
1254 {
1255   /* Now, check and massage the trailing keysym specifier. */
1256   if (SYMBOLP (*keysym))
1257     {
1258       if (string_char_length (XSYMBOL (*keysym)->name) == 1)
1259         {
1260           Lisp_Object ream_gcc_up_the_ass =
1261             make_char (string_char (XSYMBOL (*keysym)->name, 0));
1262           *keysym = ream_gcc_up_the_ass;
1263           goto fixnum_keysym;
1264         }
1265     }
1266   else if (CHAR_OR_CHAR_INTP (*keysym))
1267     {
1268       CHECK_CHAR_COERCE_INT (*keysym);
1269     fixnum_keysym:
1270       if (XCHAR (*keysym) < ' '
1271           /* || (XCHAR (*keysym) >= 128 && XCHAR (*keysym) < 160) */)
1272         /* yuck!  Can't make the above restriction; too many compatibility
1273            problems ... */
1274         signal_simple_error ("keysym char must be printable", *keysym);
1275       /* #### This bites!  I want to be able to write (control shift a) */
1276       if (modifiers & MOD_SHIFT)
1277         signal_simple_error
1278           ("The `shift' modifier may not be applied to ASCII keysyms",
1279            spec);
1280     }
1281   else
1282     {
1283       signal_simple_error ("Unknown keysym specifier",
1284                            *keysym);
1285     }
1286
1287   if (SYMBOLP (*keysym))
1288     {
1289       char *name = (char *)
1290         string_data (XSYMBOL (*keysym)->name);
1291
1292       /* FSFmacs uses symbols with the printed representation of keysyms in
1293          their names, like 'M-x, and we use the syntax '(meta x).  So, to avoid
1294          confusion, notice the M-x syntax and signal an error - because
1295          otherwise it would be interpreted as a regular keysym, and would even
1296          show up in the list-buffers output, causing confusion to the naive.
1297
1298          We can get away with this because none of the X keysym names contain
1299          a hyphen (some contain underscore, however).
1300
1301          It might be useful to reject keysyms which are not x-valid-keysym-
1302          name-p, but that would interfere with various tricks we do to
1303          sanitize the Sun keyboards, and would make it trickier to
1304          conditionalize a .emacs file for multiple X servers.
1305          */
1306       if (((int) strlen (name) >= 2 && name[1] == '-')
1307 #if 1
1308           ||
1309           /* Ok, this is a bit more dubious - prevent people from doing things
1310              like (global-set-key 'RET 'something) because that will have the
1311              same problem as above.  (Gag!)  Maybe we should just silently
1312              accept these as aliases for the "real" names?
1313              */
1314           (string_length (XSYMBOL (*keysym)->name) <= 3 &&
1315            (!strcmp (name, "LFD") ||
1316             !strcmp (name, "TAB") ||
1317             !strcmp (name, "RET") ||
1318             !strcmp (name, "ESC") ||
1319             !strcmp (name, "DEL") ||
1320             !strcmp (name, "SPC") ||
1321             !strcmp (name, "BS")))
1322 #endif /* unused */
1323           )
1324         signal_simple_error
1325           ("Invalid (FSF Emacs) key format (see doc of define-key)",
1326            *keysym);
1327
1328       /* #### Ok, this is a bit more dubious - make people not lose if they
1329          do things like (global-set-key 'RET 'something) because that would
1330          otherwise have the same problem as above.  (Gag!)  We silently
1331          accept these as aliases for the "real" names.
1332          */
1333       else if (!strncmp(name, "kp_", 3)) {
1334         /* Likewise, the obsolete keysym binding of kp_.* should not lose. */
1335         char temp[50];
1336
1337         strncpy(temp, name, sizeof (temp));
1338         temp[sizeof (temp) - 1] = '\0';
1339         temp[2] = '-';
1340         *keysym = Fintern_soft(make_string((Bufbyte *)temp,
1341                                            strlen(temp)),
1342                                Qnil);
1343       } else if (EQ (*keysym, QLFD))
1344         *keysym = QKlinefeed;
1345       else if (EQ (*keysym, QTAB))
1346         *keysym = QKtab;
1347       else if (EQ (*keysym, QRET))
1348         *keysym = QKreturn;
1349       else if (EQ (*keysym, QESC))
1350         *keysym = QKescape;
1351       else if (EQ (*keysym, QDEL))
1352         *keysym = QKdelete;
1353       else if (EQ (*keysym, QBS))
1354         *keysym = QKbackspace;
1355       /* Emacs compatibility */
1356       else if (EQ(*keysym, Qdown_mouse_1))
1357         *keysym = Qbutton1;
1358       else if (EQ(*keysym, Qdown_mouse_2))
1359         *keysym = Qbutton2;
1360       else if (EQ(*keysym, Qdown_mouse_3))
1361         *keysym = Qbutton3;
1362       else if (EQ(*keysym, Qdown_mouse_4))
1363         *keysym = Qbutton4;
1364       else if (EQ(*keysym, Qdown_mouse_5))
1365         *keysym = Qbutton5;
1366       else if (EQ(*keysym, Qmouse_1))
1367         *keysym = Qbutton1up;
1368       else if (EQ(*keysym, Qmouse_2))
1369         *keysym = Qbutton2up;
1370       else if (EQ(*keysym, Qmouse_3))
1371         *keysym = Qbutton3up;
1372       else if (EQ(*keysym, Qmouse_4))
1373         *keysym = Qbutton4up;
1374       else if (EQ(*keysym, Qmouse_5))
1375         *keysym = Qbutton5up;
1376     }
1377 }
1378
1379
1380 /* Given any kind of key-specifier, return a keysym and modifier mask.
1381    Proper canonicalization is performed:
1382
1383    -- integers are converted into the equivalent characters.
1384    -- one-character strings are converted into the equivalent characters.
1385  */
1386
1387 static void
1388 define_key_parser (Lisp_Object spec, struct key_data *returned_value)
1389 {
1390   if (CHAR_OR_CHAR_INTP (spec))
1391     {
1392       struct Lisp_Event event;
1393       event.event_type = empty_event;
1394       character_to_event (XCHAR_OR_CHAR_INT (spec), &event,
1395                           XCONSOLE (Vselected_console), 0, 0);
1396       returned_value->keysym    = event.event.key.keysym;
1397       returned_value->modifiers = event.event.key.modifiers;
1398     }
1399   else if (EVENTP (spec))
1400     {
1401       switch (XEVENT (spec)->event_type)
1402         {
1403         case key_press_event:
1404           {
1405             returned_value->keysym    = XEVENT (spec)->event.key.keysym;
1406             returned_value->modifiers = XEVENT (spec)->event.key.modifiers;
1407             break;
1408           }
1409         case button_press_event:
1410         case button_release_event:
1411           {
1412             int down = (XEVENT (spec)->event_type == button_press_event);
1413             switch (XEVENT (spec)->event.button.button)
1414               {
1415               case 1:
1416                 returned_value->keysym = (down ? Qbutton1 : Qbutton1up); break;
1417               case 2:
1418                 returned_value->keysym = (down ? Qbutton2 : Qbutton2up); break;
1419               case 3:
1420                 returned_value->keysym = (down ? Qbutton3 : Qbutton3up); break;
1421               case 4:
1422                 returned_value->keysym = (down ? Qbutton4 : Qbutton4up); break;
1423               case 5:
1424                 returned_value->keysym = (down ? Qbutton5 : Qbutton5up); break;
1425               case 6:
1426                 returned_value->keysym = (down ? Qbutton6 : Qbutton6up); break;
1427               case 7:
1428                 returned_value->keysym = (down ? Qbutton7 : Qbutton7up); break;
1429               default:
1430                 returned_value->keysym = (down ? Qbutton0 : Qbutton0up); break;
1431               }
1432             returned_value->modifiers = XEVENT (spec)->event.button.modifiers;
1433             break;
1434           }
1435         default:
1436           signal_error (Qwrong_type_argument,
1437                         list2 (build_translated_string
1438                                ("unable to bind this type of event"),
1439                                spec));
1440         }
1441     }
1442   else if (SYMBOLP (spec))
1443     {
1444       /* Be nice, allow = to mean (=) */
1445       if (bucky_sym_to_bucky_bit (spec) != 0)
1446         signal_simple_error ("Key is a modifier name", spec);
1447       define_key_check_and_coerce_keysym (spec, &spec, 0);
1448       returned_value->keysym = spec;
1449       returned_value->modifiers = 0;
1450     }
1451   else if (CONSP (spec))
1452     {
1453       unsigned int modifiers = 0;
1454       Lisp_Object keysym = Qnil;
1455       Lisp_Object rest = spec;
1456
1457       /* First, parse out the leading modifier symbols. */
1458       while (CONSP (rest))
1459         {
1460           unsigned int modifier;
1461
1462           keysym = XCAR (rest);
1463           modifier = bucky_sym_to_bucky_bit (keysym);
1464           modifiers |= modifier;
1465           if (!NILP (XCDR (rest)))
1466             {
1467               if (! modifier)
1468                 signal_simple_error ("Unknown modifier", keysym);
1469             }
1470           else
1471             {
1472               if (modifier)
1473                 signal_simple_error ("Nothing but modifiers here",
1474                                      spec);
1475             }
1476           rest = XCDR (rest);
1477           QUIT;
1478         }
1479       if (!NILP (rest))
1480         signal_simple_error ("List must be nil-terminated", spec);
1481
1482       define_key_check_and_coerce_keysym (spec, &keysym, modifiers);
1483       returned_value->keysym = keysym;
1484       returned_value->modifiers = modifiers;
1485     }
1486   else
1487     {
1488       signal_simple_error ("Unknown key-sequence specifier",
1489                            spec);
1490     }
1491 }
1492
1493 /* Used by character-to-event */
1494 void
1495 key_desc_list_to_event (Lisp_Object list, Lisp_Object event,
1496                         int allow_menu_events)
1497 {
1498   struct key_data raw_key;
1499
1500   if (allow_menu_events &&
1501       CONSP (list) &&
1502       /* #### where the hell does this come from? */
1503       EQ (XCAR (list), Qmenu_selection))
1504     {
1505       Lisp_Object fn, arg;
1506       if (! NILP (Fcdr (Fcdr (list))))
1507         signal_simple_error ("Invalid menu event desc", list);
1508       arg = Fcar (Fcdr (list));
1509       if (SYMBOLP (arg))
1510         fn = Qcall_interactively;
1511       else
1512         fn = Qeval;
1513       XSETFRAME (XEVENT (event)->channel, selected_frame ());
1514       XEVENT (event)->event_type = misc_user_event;
1515       XEVENT (event)->event.eval.function = fn;
1516       XEVENT (event)->event.eval.object = arg;
1517       return;
1518     }
1519
1520   define_key_parser (list, &raw_key);
1521
1522   if (EQ (raw_key.keysym, Qbutton0) || EQ (raw_key.keysym, Qbutton0up) ||
1523       EQ (raw_key.keysym, Qbutton1) || EQ (raw_key.keysym, Qbutton1up) ||
1524       EQ (raw_key.keysym, Qbutton2) || EQ (raw_key.keysym, Qbutton2up) ||
1525       EQ (raw_key.keysym, Qbutton3) || EQ (raw_key.keysym, Qbutton3up) ||
1526       EQ (raw_key.keysym, Qbutton4) || EQ (raw_key.keysym, Qbutton4up) ||
1527       EQ (raw_key.keysym, Qbutton5) || EQ (raw_key.keysym, Qbutton5up) ||
1528       EQ (raw_key.keysym, Qbutton6) || EQ (raw_key.keysym, Qbutton6up) ||
1529       EQ (raw_key.keysym, Qbutton7) || EQ (raw_key.keysym, Qbutton7up))
1530     error ("Mouse-clicks can't appear in saved keyboard macros.");
1531
1532   XEVENT (event)->channel = Vselected_console;
1533   XEVENT (event)->event_type = key_press_event;
1534   XEVENT (event)->event.key.keysym = raw_key.keysym;
1535   XEVENT (event)->event.key.modifiers = raw_key.modifiers;
1536 }
1537
1538
1539 int
1540 event_matches_key_specifier_p (struct Lisp_Event *event,
1541                                Lisp_Object key_specifier)
1542 {
1543   Lisp_Object event2;
1544   int retval;
1545   struct gcpro gcpro1;
1546
1547   if (event->event_type != key_press_event || NILP (key_specifier) ||
1548       (INTP (key_specifier) && !CHAR_INTP (key_specifier)))
1549     return 0;
1550
1551   /* if the specifier is an integer such as 27, then it should match
1552      both of the events 'escape' and 'control ['.  Calling
1553      Fcharacter_to_event() will only match 'escape'. */
1554   if (CHAR_OR_CHAR_INTP (key_specifier))
1555     return (XCHAR_OR_CHAR_INT (key_specifier)
1556             == event_to_character (event, 0, 0, 0));
1557
1558   /* Otherwise, we cannot call event_to_character() because we may
1559      be dealing with non-ASCII keystrokes.  In any case, if I ask
1560      for 'control [' then I should get exactly that, and not
1561      'escape'.
1562
1563      However, we have to behave differently on TTY's, where 'control ['
1564      is silently converted into 'escape' by the keyboard driver.
1565      In this case, ASCII is the only thing we know about, so we have
1566      to compare the ASCII values. */
1567
1568   GCPRO1 (event2);
1569   event2 = Fmake_event (Qnil, Qnil);
1570   Fcharacter_to_event (key_specifier, event2, Qnil, Qnil);
1571   if (XEVENT (event2)->event_type != key_press_event)
1572     retval = 0;
1573   else if (CONSOLE_TTY_P (XCONSOLE (EVENT_CHANNEL (event))))
1574     {
1575       int ch1, ch2;
1576
1577       ch1 = event_to_character (event, 0, 0, 0);
1578       ch2 = event_to_character (XEVENT (event2), 0, 0, 0);
1579       retval = (ch1 >= 0 && ch2 >= 0 && ch1 == ch2);
1580     }
1581   else if (EQ (event->event.key.keysym, XEVENT (event2)->event.key.keysym) &&
1582            event->event.key.modifiers == XEVENT (event2)->event.key.modifiers)
1583     retval = 1;
1584   else
1585     retval = 0;
1586   Fdeallocate_event (event2);
1587   UNGCPRO;
1588   return retval;
1589 }
1590
1591 static int
1592 meta_prefix_char_p (CONST struct key_data *key)
1593 {
1594   struct Lisp_Event event;
1595
1596   event.event_type = key_press_event;
1597   event.channel = Vselected_console;
1598   event.event.key.keysym = key->keysym;
1599   event.event.key.modifiers = key->modifiers;
1600   return event_matches_key_specifier_p (&event, Vmeta_prefix_char);
1601 }
1602
1603 DEFUN ("event-matches-key-specifier-p", Fevent_matches_key_specifier_p, 2, 2, 0, /*
1604 Return non-nil if EVENT matches KEY-SPECIFIER.
1605 This can be useful, e.g., to determine if the user pressed `help-char' or
1606 `quit-char'.
1607 */
1608        (event, key_specifier))
1609 {
1610   CHECK_LIVE_EVENT (event);
1611   return (event_matches_key_specifier_p (XEVENT (event), key_specifier)
1612           ? Qt : Qnil);
1613 }
1614
1615 #define MACROLET(k,m) do {              \
1616   returned_value->keysym = (k);         \
1617   returned_value->modifiers = (m);      \
1618   RETURN_SANS_WARNINGS;                 \
1619 } while (0)
1620
1621 /* ASCII grunge.
1622    Given a keysym, return another keysym/modifier pair which could be
1623    considered the same key in an ASCII world.  Backspace returns ^H, for
1624    example.
1625  */
1626 static void
1627 define_key_alternate_name (struct key_data *key,
1628                            struct key_data *returned_value)
1629 {
1630   Lisp_Object keysym = key->keysym;
1631   unsigned int modifiers = key->modifiers;
1632   unsigned int modifiers_sans_control = (modifiers & (~MOD_CONTROL));
1633   unsigned int modifiers_sans_meta = (modifiers & (~MOD_META));
1634   returned_value->keysym = Qnil; /* By default, no "alternate" key */
1635   returned_value->modifiers = 0;
1636   if (modifiers_sans_meta == MOD_CONTROL)
1637     {
1638       if EQ (keysym, QKspace)
1639         MACROLET (make_char ('@'), modifiers);
1640       else if (!CHARP (keysym))
1641         return;
1642       else switch (XCHAR (keysym))
1643         {
1644         case '@':               /* c-@ => c-space */
1645           MACROLET (QKspace, modifiers);
1646         case 'h':               /* c-h => backspace */
1647           MACROLET (QKbackspace, modifiers_sans_control);
1648         case 'i':               /* c-i => tab */
1649           MACROLET (QKtab, modifiers_sans_control);
1650         case 'j':               /* c-j => linefeed */
1651           MACROLET (QKlinefeed, modifiers_sans_control);
1652         case 'm':               /* c-m => return */
1653           MACROLET (QKreturn, modifiers_sans_control);
1654         case '[':               /* c-[ => escape */
1655           MACROLET (QKescape, modifiers_sans_control);
1656         default:
1657           return;
1658         }
1659     }
1660   else if (modifiers_sans_meta != 0)
1661     return;
1662   else if (EQ (keysym, QKbackspace)) /* backspace => c-h */
1663     MACROLET (make_char ('h'), (modifiers | MOD_CONTROL));
1664   else if (EQ (keysym, QKtab))       /* tab => c-i */
1665     MACROLET (make_char ('i'), (modifiers | MOD_CONTROL));
1666   else if (EQ (keysym, QKlinefeed))  /* linefeed => c-j */
1667     MACROLET (make_char ('j'), (modifiers | MOD_CONTROL));
1668   else if (EQ (keysym, QKreturn))    /* return => c-m */
1669     MACROLET (make_char ('m'), (modifiers | MOD_CONTROL));
1670   else if (EQ (keysym, QKescape))    /* escape => c-[ */
1671     MACROLET (make_char ('['), (modifiers | MOD_CONTROL));
1672   else
1673     return;
1674 #undef MACROLET
1675 }
1676
1677
1678 static void
1679 ensure_meta_prefix_char_keymapp (Lisp_Object keys, int indx,
1680                                  Lisp_Object keymap)
1681 {
1682   /* This function can GC */
1683   Lisp_Object new_keys;
1684   int i;
1685   Lisp_Object mpc_binding;
1686   struct key_data meta_key;
1687
1688   if (NILP (Vmeta_prefix_char) ||
1689       (INTP (Vmeta_prefix_char) && !CHAR_INTP (Vmeta_prefix_char)))
1690     return;
1691
1692   define_key_parser (Vmeta_prefix_char, &meta_key);
1693   mpc_binding = keymap_lookup_1 (keymap, &meta_key, 0);
1694   if (NILP (mpc_binding) || !NILP (Fkeymapp (mpc_binding)))
1695     return;
1696
1697   if (indx == 0)
1698     new_keys = keys;
1699   else if (STRINGP (keys))
1700     new_keys = Fsubstring (keys, Qzero, make_int (indx));
1701   else if (VECTORP (keys))
1702     {
1703       new_keys = make_vector (indx, Qnil);
1704       for (i = 0; i < indx; i++)
1705         XVECTOR_DATA (new_keys) [i] = XVECTOR_DATA (keys) [i];
1706     }
1707   else
1708     abort ();
1709
1710   if (EQ (keys, new_keys))
1711     error_with_frob (mpc_binding,
1712                      "can't bind %s: %s has a non-keymap binding",
1713                      (char *) XSTRING_DATA (Fkey_description (keys)),
1714                      (char *) XSTRING_DATA (Fsingle_key_description
1715                                             (Vmeta_prefix_char)));
1716   else
1717     error_with_frob (mpc_binding,
1718                      "can't bind %s: %s %s has a non-keymap binding",
1719                      (char *) XSTRING_DATA (Fkey_description (keys)),
1720                      (char *) XSTRING_DATA (Fkey_description (new_keys)),
1721                      (char *) XSTRING_DATA (Fsingle_key_description
1722                                             (Vmeta_prefix_char)));
1723 }
1724
1725 DEFUN ("define-key", Fdefine_key, 3, 3, 0, /*
1726 Define key sequence KEYS, in KEYMAP, as DEF.
1727 KEYMAP is a keymap object.
1728 KEYS is the sequence of keystrokes to bind, described below.
1729 DEF is anything that can be a key's definition:
1730  nil (means key is undefined in this keymap);
1731  a command (a Lisp function suitable for interactive calling);
1732  a string or key sequence vector (treated as a keyboard macro);
1733  a keymap (to define a prefix key);
1734  a symbol; when the key is looked up, the symbol will stand for its
1735     function definition, that should at that time be one of the above,
1736     or another symbol whose function definition is used, and so on.
1737  a cons (STRING . DEFN), meaning that DEFN is the definition
1738     (DEFN should be a valid definition in its own right);
1739  or a cons (KEYMAP . CHAR), meaning use definition of CHAR in map KEYMAP.
1740
1741 Contrary to popular belief, the world is not ASCII.  When running under a
1742 window manager, XEmacs can tell the difference between, for example, the
1743 keystrokes control-h, control-shift-h, and backspace.  You can, in fact,
1744 bind different commands to each of these.
1745
1746 A `key sequence' is a set of keystrokes.  A `keystroke' is a keysym and some
1747 set of modifiers (such as control and meta).  A `keysym' is what is printed
1748 on the keys on your keyboard.
1749
1750 A keysym may be represented by a symbol, or (if and only if it is equivalent
1751 to an ASCII character in the range 32 - 255) by a character or its equivalent
1752 ASCII code.  The `A' key may be represented by the symbol `A', the character
1753 `?A', or by the number 65.  The `break' key may be represented only by the
1754 symbol `break'.
1755
1756 A keystroke may be represented by a list: the last element of the list
1757 is the key (a symbol, character, or number, as above) and the
1758 preceding elements are the symbolic names of modifier keys (control,
1759 meta, super, hyper, alt, and shift).  Thus, the sequence control-b is
1760 represented by the forms `(control b)', `(control ?b)', and `(control
1761 98)'.  A keystroke may also be represented by an event object, as
1762 returned by the `next-command-event' and `read-key-sequence'
1763 functions.
1764
1765 Note that in this context, the keystroke `control-b' is *not* represented
1766 by the number 2 (the ASCII code for ^B) or the character `?\^B'.  See below.
1767
1768 The `shift' modifier is somewhat of a special case.  You should not (and
1769 cannot) use `(meta shift a)' to mean `(meta A)', since for characters that
1770 have ASCII equivalents, the state of the shift key is implicit in the
1771 keysym (a vs. A).  You also cannot say `(shift =)' to mean `+', as that
1772 sort of thing varies from keyboard to keyboard.  The shift modifier is for
1773 use only with characters that do not have a second keysym on the same key,
1774 such as `backspace' and `tab'.
1775
1776 A key sequence is a vector of keystrokes.  As a degenerate case, elements
1777 of this vector may also be keysyms if they have no modifiers.  That is,
1778 the `A' keystroke is represented by all of these forms:
1779         A       ?A      65      (A)     (?A)    (65)
1780         [A]     [?A]    [65]    [(A)]   [(?A)]  [(65)]
1781
1782 the `control-a' keystroke is represented by these forms:
1783         (control A)     (control ?A)    (control 65)
1784         [(control A)]   [(control ?A)]  [(control 65)]
1785 the key sequence `control-c control-a' is represented by these forms:
1786         [(control c) (control a)]       [(control ?c) (control ?a)]
1787         [(control 99) (control 65)]     etc.
1788
1789 Mouse button clicks work just like keypresses: (control button1) means
1790 pressing the left mouse button while holding down the control key.
1791 \[(control c) (shift button3)] means control-c, hold shift, click right.
1792
1793 Commands may be bound to the mouse-button up-stroke rather than the down-
1794 stroke as well.  `button1' means the down-stroke, and `button1up' means the
1795 up-stroke.  Different commands may be bound to the up and down strokes,
1796 though that is probably not what you want, so be careful.
1797
1798 For backward compatibility, a key sequence may also be represented by a
1799 string.  In this case, it represents the key sequence(s) that would
1800 produce that sequence of ASCII characters in a purely ASCII world.  For
1801 example, a string containing the ASCII backspace character, "\\^H", would
1802 represent two key sequences: `(control h)' and `backspace'.  Binding a
1803 command to this will actually bind both of those key sequences.  Likewise
1804 for the following pairs:
1805
1806                 control h       backspace
1807                 control i       tab
1808                 control m       return
1809                 control j       linefeed
1810                 control [       escape
1811                 control @       control space
1812
1813 After binding a command to two key sequences with a form like
1814
1815         (define-key global-map "\\^X\\^I" \'command-1)
1816
1817 it is possible to redefine only one of those sequences like so:
1818
1819         (define-key global-map [(control x) (control i)] \'command-2)
1820         (define-key global-map [(control x) tab] \'command-3)
1821
1822 Of course, all of this applies only when running under a window system.  If
1823 you're talking to XEmacs through a TTY connection, you don't get any of
1824 these features.
1825 */
1826        (keymap, keys, def))
1827 {
1828   /* This function can GC */
1829   int idx;
1830   int metized = 0;
1831   int len;
1832   int ascii_hack;
1833   struct gcpro gcpro1, gcpro2, gcpro3;
1834
1835   if (VECTORP (keys))
1836     len = XVECTOR_LENGTH (keys);
1837   else if (STRINGP (keys))
1838     len = XSTRING_CHAR_LENGTH (keys);
1839   else if (CHAR_OR_CHAR_INTP (keys) || SYMBOLP (keys) || CONSP (keys))
1840     {
1841       if (!CONSP (keys)) keys = list1 (keys);
1842       len = 1;
1843       keys = make_vector (1, keys); /* this is kinda sleazy. */
1844     }
1845   else
1846     {
1847       keys = wrong_type_argument (Qsequencep, keys);
1848       len = XINT (Flength (keys));
1849     }
1850   if (len == 0)
1851     return Qnil;
1852
1853   GCPRO3 (keymap, keys, def);
1854
1855   /* ASCII grunge.
1856      When the user defines a key which, in a strictly ASCII world, would be
1857      produced by two different keys (^J and linefeed, or ^H and backspace,
1858      for example) then the binding will be made for both keysyms.
1859
1860      This is done if the user binds a command to a string, as in
1861      (define-key map "\^H" 'something), but not when using one of the new
1862      syntaxes, like (define-key map '(control h) 'something).
1863      */
1864   ascii_hack = (STRINGP (keys));
1865
1866   keymap = get_keymap (keymap, 1, 1);
1867
1868   idx = 0;
1869   while (1)
1870     {
1871       Lisp_Object c;
1872       struct key_data raw_key1;
1873       struct key_data raw_key2;
1874
1875       if (STRINGP (keys))
1876         c = make_char (string_char (XSTRING (keys), idx));
1877       else
1878         c = XVECTOR_DATA (keys) [idx];
1879
1880       define_key_parser (c, &raw_key1);
1881
1882       if (!metized && ascii_hack && meta_prefix_char_p (&raw_key1))
1883         {
1884           if (idx == (len - 1))
1885             {
1886               /* This is a hack to prevent a binding for the meta-prefix-char
1887                  from being made in a map which already has a non-empty "meta"
1888                  submap.  That is, we can't let both "escape" and "meta" have
1889                  a binding in the same keymap.  This implies that the idiom
1890                  (define-key my-map "\e" my-escape-map)
1891                  (define-key my-escape-map "a" 'my-command)
1892                  no longer works.  That's ok.  Instead the luser should do
1893                  (define-key my-map "\ea" 'my-command)
1894                  or, more correctly
1895                  (define-key my-map "\M-a" 'my-command)
1896                  and then perhaps
1897                  (defvar my-escape-map (lookup-key my-map "\e"))
1898                  if the luser really wants the map in a variable.
1899                  */
1900               Lisp_Object mmap;
1901               struct gcpro ngcpro1;
1902
1903               NGCPRO1 (c);
1904               mmap = Fgethash (MAKE_MODIFIER_HASH_KEY (MOD_META),
1905                                XKEYMAP (keymap)->table, Qnil);
1906               if (!NILP (mmap)
1907                   && keymap_fullness (mmap) != 0)
1908                 {
1909                   Lisp_Object desc
1910                     = Fsingle_key_description (Vmeta_prefix_char);
1911                   signal_simple_error_2
1912                     ("Map contains meta-bindings, can't bind", desc, keymap);
1913                 }
1914               NUNGCPRO;
1915             }
1916           else
1917             {
1918               metized = 1;
1919               idx++;
1920               continue;
1921             }
1922         }
1923
1924       if (ascii_hack)
1925         define_key_alternate_name (&raw_key1, &raw_key2);
1926       else
1927         {
1928           raw_key2.keysym = Qnil;
1929           raw_key2.modifiers = 0;
1930         }
1931
1932       if (metized)
1933         {
1934           raw_key1.modifiers  |= MOD_META;
1935           raw_key2.modifiers |= MOD_META;
1936           metized = 0;
1937         }
1938
1939       /* This crap is to make sure that someone doesn't bind something like
1940          "C-x M-a" while "C-x ESC" has a non-keymap binding. */
1941       if (raw_key1.modifiers & MOD_META)
1942         ensure_meta_prefix_char_keymapp (keys, idx, keymap);
1943
1944       if (++idx == len)
1945         {
1946           keymap_store (keymap, &raw_key1, def);
1947           if (ascii_hack && !NILP (raw_key2.keysym))
1948             keymap_store (keymap, &raw_key2, def);
1949           UNGCPRO;
1950           return def;
1951         }
1952
1953       {
1954         Lisp_Object cmd;
1955         struct gcpro ngcpro1;
1956         NGCPRO1 (c);
1957
1958         cmd = keymap_lookup_1 (keymap, &raw_key1, 0);
1959         if (NILP (cmd))
1960           {
1961             cmd = Fmake_sparse_keymap (Qnil);
1962             XKEYMAP (cmd)->name /* for debugging */
1963               = list2 (make_key_description (&raw_key1, 1), keymap);
1964             keymap_store (keymap, &raw_key1, cmd);
1965           }
1966         if (NILP (Fkeymapp (cmd)))
1967           signal_simple_error_2 ("Invalid prefix keys in sequence",
1968                                  c, keys);
1969
1970         if (ascii_hack && !NILP (raw_key2.keysym) &&
1971             NILP (keymap_lookup_1 (keymap, &raw_key2, 0)))
1972           keymap_store (keymap, &raw_key2, cmd);
1973
1974         keymap = get_keymap (cmd, 1, 1);
1975         NUNGCPRO;
1976       }
1977     }
1978 }
1979
1980 \f
1981 /************************************************************************/
1982 /*                      Looking up keys in keymaps                      */
1983 /************************************************************************/
1984
1985 /* We need a very fast (i.e., non-consing) version of lookup-key in order
1986    to make where-is-internal really fly. */
1987
1988 struct raw_lookup_key_mapper_closure
1989 {
1990   int remaining;
1991   CONST struct key_data *raw_keys;
1992   int raw_keys_count;
1993   int keys_so_far;
1994   int accept_default;
1995 };
1996
1997 static Lisp_Object raw_lookup_key_mapper (Lisp_Object k, void *);
1998
1999 /* Caller should gc-protect args (keymaps may autoload) */
2000 static Lisp_Object
2001 raw_lookup_key (Lisp_Object keymap,
2002                 CONST struct key_data *raw_keys, int raw_keys_count,
2003                 int keys_so_far, int accept_default)
2004 {
2005   /* This function can GC */
2006   struct raw_lookup_key_mapper_closure c;
2007   c.remaining = raw_keys_count - 1;
2008   c.raw_keys = raw_keys;
2009   c.raw_keys_count = raw_keys_count;
2010   c.keys_so_far = keys_so_far;
2011   c.accept_default = accept_default;
2012
2013   return traverse_keymaps (keymap, Qnil, raw_lookup_key_mapper, &c);
2014 }
2015
2016 static Lisp_Object
2017 raw_lookup_key_mapper (Lisp_Object k, void *arg)
2018 {
2019   /* This function can GC */
2020   struct raw_lookup_key_mapper_closure *c =
2021     (struct raw_lookup_key_mapper_closure *) arg;
2022   int accept_default = c->accept_default;
2023   int remaining = c->remaining;
2024   int keys_so_far = c->keys_so_far;
2025   CONST struct key_data *raw_keys = c->raw_keys;
2026   Lisp_Object cmd;
2027
2028   if (! meta_prefix_char_p (&(raw_keys[0])))
2029     {
2030       /* Normal case: every case except the meta-hack (see below). */
2031       cmd = keymap_lookup_1 (k, &(raw_keys[0]), accept_default);
2032
2033       if (remaining == 0)
2034         /* Return whatever we found if we're out of keys */
2035         ;
2036       else if (NILP (cmd))
2037         /* Found nothing (though perhaps parent map may have binding) */
2038         ;
2039       else if (NILP (Fkeymapp (cmd)))
2040         /* Didn't find a keymap, and we have more keys.
2041          * Return a fixnum to indicate that keys were too long.
2042          */
2043         cmd = make_int (keys_so_far + 1);
2044       else
2045         cmd = raw_lookup_key (cmd, raw_keys + 1, remaining,
2046                               keys_so_far + 1, accept_default);
2047     }
2048   else
2049     {
2050       /* This is a hack so that looking up a key-sequence whose last
2051        * element is the meta-prefix-char will return the keymap that
2052        * the "meta" keys are stored in, if there is no binding for
2053        * the meta-prefix-char (and if this map has a "meta" submap).
2054        * If this map doesn't have a "meta" submap, then the
2055        * meta-prefix-char is looked up just like any other key.
2056        */
2057       if (remaining == 0)
2058         {
2059           /* First look for the prefix-char directly */
2060           cmd = keymap_lookup_1 (k, &(raw_keys[0]), accept_default);
2061           if (NILP (cmd))
2062             {
2063               /* Do kludgy return of the meta-map */
2064               cmd = Fgethash (MAKE_MODIFIER_HASH_KEY (MOD_META),
2065                               XKEYMAP (k)->table, Qnil);
2066             }
2067         }
2068       else
2069         {
2070           /* Search for the prefix-char-prefixed sequence directly */
2071           cmd = keymap_lookup_1 (k, &(raw_keys[0]), accept_default);
2072           cmd = get_keymap (cmd, 0, 1);
2073           if (!NILP (cmd))
2074             cmd = raw_lookup_key (cmd, raw_keys + 1, remaining,
2075                                   keys_so_far + 1, accept_default);
2076           else if ((raw_keys[1].modifiers & MOD_META) == 0)
2077             {
2078               struct key_data metified;
2079               metified.keysym = raw_keys[1].keysym;
2080               metified.modifiers = raw_keys[1].modifiers | MOD_META;
2081
2082               /* Search for meta-next-char sequence directly */
2083               cmd = keymap_lookup_1 (k, &metified, accept_default);
2084               if (remaining == 1)
2085                 ;
2086               else
2087                 {
2088                   cmd = get_keymap (cmd, 0, 1);
2089                   if (!NILP (cmd))
2090                     cmd = raw_lookup_key (cmd, raw_keys + 2, remaining - 1,
2091                                           keys_so_far + 2,
2092                                           accept_default);
2093                 }
2094             }
2095         }
2096     }
2097   if (accept_default && NILP (cmd))
2098     cmd = XKEYMAP (k)->default_binding;
2099   return cmd;
2100 }
2101
2102 /* Value is number if `keys' is too long; NIL if valid but has no definition.*/
2103 /* Caller should gc-protect arguments */
2104 static Lisp_Object
2105 lookup_keys (Lisp_Object keymap, int nkeys, Lisp_Object *keys,
2106              int accept_default)
2107 {
2108   /* This function can GC */
2109   struct key_data kkk[20];
2110   struct key_data *raw_keys;
2111   int i;
2112
2113   if (nkeys == 0)
2114     return Qnil;
2115
2116   if (nkeys < (countof (kkk)))
2117     raw_keys = kkk;
2118   else
2119     raw_keys = alloca_array (struct key_data, nkeys);
2120
2121   for (i = 0; i < nkeys; i++)
2122     {
2123       define_key_parser (keys[i], &(raw_keys[i]));
2124     }
2125   return raw_lookup_key (keymap, raw_keys, nkeys, 0, accept_default);
2126 }
2127
2128 static Lisp_Object
2129 lookup_events (Lisp_Object event_head, int nmaps, Lisp_Object keymaps[],
2130                int accept_default)
2131 {
2132   /* This function can GC */
2133   struct key_data kkk[20];
2134   Lisp_Object event;
2135
2136   int nkeys;
2137   struct key_data *raw_keys;
2138   Lisp_Object tem = Qnil;
2139   struct gcpro gcpro1, gcpro2;
2140   int iii;
2141
2142   CHECK_LIVE_EVENT (event_head);
2143
2144   nkeys = event_chain_count (event_head);
2145
2146   if (nkeys < (countof (kkk)))
2147     raw_keys = kkk;
2148   else
2149     raw_keys = alloca_array (struct key_data, nkeys);
2150
2151   nkeys = 0;
2152   EVENT_CHAIN_LOOP (event, event_head)
2153     define_key_parser (event, &(raw_keys[nkeys++]));
2154   GCPRO2 (keymaps[0], event_head);
2155   gcpro1.nvars = nmaps;
2156   /* ####raw_keys[].keysym slots aren't gc-protected.  We rely (but shouldn't)
2157    * on somebody else somewhere (obarray) having a pointer to all keysyms. */
2158   for (iii = 0; iii < nmaps; iii++)
2159     {
2160       tem = raw_lookup_key (keymaps[iii], raw_keys, nkeys, 0,
2161                             accept_default);
2162       if (INTP (tem))
2163         {
2164           /* Too long in some local map means don't look at global map */
2165           tem = Qnil;
2166           break;
2167         }
2168       else if (!NILP (tem))
2169         break;
2170     }
2171   UNGCPRO;
2172   return tem;
2173 }
2174
2175 DEFUN ("lookup-key", Flookup_key, 2, 3, 0, /*
2176 In keymap KEYMAP, look up key-sequence KEYS.  Return the definition.
2177 Nil is returned if KEYS is unbound.  See documentation of `define-key'
2178 for valid key definitions and key-sequence specifications.
2179 A number is returned if KEYS is "too long"; that is, the leading
2180 characters fail to be a valid sequence of prefix characters in KEYMAP.
2181 The number is how many characters at the front of KEYS
2182 it takes to reach a non-prefix command.
2183 */
2184        (keymap, keys, accept_default))
2185 {
2186   /* This function can GC */
2187   if (VECTORP (keys))
2188     return lookup_keys (keymap,
2189                         XVECTOR_LENGTH (keys),
2190                         XVECTOR_DATA (keys),
2191                         !NILP (accept_default));
2192   else if (SYMBOLP (keys) || CHAR_OR_CHAR_INTP (keys) || CONSP (keys))
2193     return lookup_keys (keymap, 1, &keys, !NILP (accept_default));
2194   else if (STRINGP (keys))
2195     {
2196       int length = XSTRING_CHAR_LENGTH (keys);
2197       int i;
2198       struct key_data *raw_keys = alloca_array (struct key_data, length);
2199       if (length == 0)
2200         return Qnil;
2201
2202       for (i = 0; i < length; i++)
2203         {
2204           Emchar n = string_char (XSTRING (keys), i);
2205           define_key_parser (make_char (n), &(raw_keys[i]));
2206         }
2207       return raw_lookup_key (keymap, raw_keys, length, 0,
2208                              !NILP (accept_default));
2209     }
2210   else
2211     {
2212       keys = wrong_type_argument (Qsequencep, keys);
2213       return Flookup_key (keymap, keys, accept_default);
2214     }
2215 }
2216
2217 /* Given a key sequence, returns a list of keymaps to search for bindings.
2218    Does all manner of semi-hairy heuristics, like looking in the current
2219    buffer's map before looking in the global map and looking in the local
2220    map of the buffer in which the mouse was clicked in event0 is a click.
2221
2222    It would be kind of nice if this were in Lisp so that this semi-hairy
2223    semi-heuristic command-lookup behavior could be readily understood and
2224    customised.  However, this needs to be pretty fast, or performance of
2225    keyboard macros goes to shit; putting this in lisp slows macros down
2226    2-3x.  And they're already slower than v18 by 5-6x.
2227  */
2228
2229 struct relevant_maps
2230   {
2231     int nmaps;
2232     unsigned int max_maps;
2233     Lisp_Object *maps;
2234     struct gcpro *gcpro;
2235   };
2236
2237 static void get_relevant_extent_keymaps (Lisp_Object pos,
2238                                          Lisp_Object buffer_or_string,
2239                                          Lisp_Object glyph,
2240                                          struct relevant_maps *closure);
2241 static void get_relevant_minor_maps (Lisp_Object buffer,
2242                                      struct relevant_maps *closure);
2243
2244 static void
2245 relevant_map_push (Lisp_Object map, struct relevant_maps *closure)
2246 {
2247   unsigned int nmaps = closure->nmaps;
2248
2249   if (!KEYMAPP (map))
2250     return;
2251   closure->nmaps = nmaps + 1;
2252   if (nmaps < closure->max_maps)
2253     {
2254       closure->maps[nmaps] = map;
2255       closure->gcpro->nvars = nmaps;
2256     }
2257 }
2258
2259 static int
2260 get_relevant_keymaps (Lisp_Object keys,
2261                       int max_maps, Lisp_Object maps[])
2262 {
2263   /* This function can GC */
2264   Lisp_Object terminal = Qnil;
2265   struct gcpro gcpro1;
2266   struct relevant_maps closure;
2267   struct console *con;
2268
2269   GCPRO1 (*maps);
2270   gcpro1.nvars = 0;
2271   closure.nmaps = 0;
2272   closure.max_maps = max_maps;
2273   closure.maps = maps;
2274   closure.gcpro = &gcpro1;
2275
2276   if (EVENTP (keys))
2277     terminal = event_chain_tail (keys);
2278   else if (VECTORP (keys))
2279     {
2280       int len = XVECTOR_LENGTH (keys);
2281       if (len > 0)
2282         terminal = XVECTOR_DATA (keys)[len - 1];
2283     }
2284
2285   if (EVENTP (terminal))
2286     {
2287       CHECK_LIVE_EVENT (terminal);
2288       con = event_console_or_selected (terminal);
2289     }
2290   else
2291     con = XCONSOLE (Vselected_console);
2292
2293   if (KEYMAPP (con->overriding_terminal_local_map)
2294       || KEYMAPP (Voverriding_local_map))
2295     {
2296       if (KEYMAPP (con->overriding_terminal_local_map))
2297         relevant_map_push (con->overriding_terminal_local_map, &closure);
2298       if (KEYMAPP (Voverriding_local_map))
2299         relevant_map_push (Voverriding_local_map, &closure);
2300     }
2301   else if (!EVENTP (terminal)
2302            || (XEVENT (terminal)->event_type != button_press_event
2303                && XEVENT (terminal)->event_type != button_release_event))
2304     {
2305       Lisp_Object tem;
2306       XSETBUFFER (tem, current_buffer);
2307       /* It's not a mouse event; order of keymaps searched is:
2308          o  keymap of any/all extents under the mouse
2309          o  minor-mode maps
2310          o  local-map of current-buffer
2311          o  global-map
2312          */
2313       /* The terminal element of the lookup may be nil or a keysym.
2314          In those cases we don't want to check for an extent
2315          keymap. */
2316       if (EVENTP (terminal))
2317         {
2318           get_relevant_extent_keymaps (make_int (BUF_PT (current_buffer)),
2319                                        tem, Qnil, &closure);
2320         }
2321       get_relevant_minor_maps (tem, &closure);
2322
2323       tem = current_buffer->keymap;
2324       if (!NILP (tem))
2325         relevant_map_push (tem, &closure);
2326     }
2327 #ifdef HAVE_WINDOW_SYSTEM
2328   else
2329     {
2330       /* It's a mouse event; order of keymaps searched is:
2331          o  vertical-divider-map, if event is over a divider
2332          o  local-map of mouse-grabbed-buffer
2333          o  keymap of any/all extents under the mouse
2334          if the mouse is over a modeline:
2335          o  modeline-map of buffer corresponding to that modeline
2336          o  else, local-map of buffer under the mouse
2337          o  minor-mode maps
2338          o  local-map of current-buffer
2339          o  global-map
2340          */
2341       Lisp_Object window = Fevent_window (terminal);
2342
2343       if (!NILP (Fevent_over_vertical_divider_p (terminal)))
2344         {
2345           if (KEYMAPP (Vvertical_divider_map))
2346             relevant_map_push (Vvertical_divider_map, &closure);
2347         }
2348
2349       if (BUFFERP (Vmouse_grabbed_buffer))
2350         {
2351           Lisp_Object map = XBUFFER (Vmouse_grabbed_buffer)->keymap;
2352
2353           get_relevant_minor_maps (Vmouse_grabbed_buffer, &closure);
2354           if (!NILP (map))
2355             relevant_map_push (map, &closure);
2356         }
2357
2358       if (!NILP (window))
2359         {
2360           Lisp_Object buffer = Fwindow_buffer (window);
2361
2362           if (!NILP (buffer))
2363             {
2364               if (!NILP (Fevent_over_modeline_p (terminal)))
2365                 {
2366                   Lisp_Object map = symbol_value_in_buffer (Qmodeline_map,
2367                                                             buffer);
2368
2369                   get_relevant_extent_keymaps
2370                     (Fevent_modeline_position (terminal),
2371                      XBUFFER (buffer)->generated_modeline_string,
2372                      /* #### third arg should maybe be a glyph. */
2373                      Qnil, &closure);
2374
2375                   if (!UNBOUNDP (map) && !NILP (map))
2376                     relevant_map_push (get_keymap (map, 1, 1), &closure);
2377                 }
2378               else
2379                 {
2380                   get_relevant_extent_keymaps (Fevent_point (terminal), buffer,
2381                                                Fevent_glyph_extent (terminal),
2382                                                &closure);
2383                 }
2384
2385               if (!EQ (buffer, Vmouse_grabbed_buffer)) /* already pushed */
2386                 {
2387                   Lisp_Object map = XBUFFER (buffer)->keymap;
2388
2389                   get_relevant_minor_maps (buffer, &closure);
2390                   if (!NILP(map))
2391                     relevant_map_push (map, &closure);
2392                 }
2393             }
2394         }
2395       else if (!NILP (Fevent_over_toolbar_p (terminal)))
2396         {
2397           Lisp_Object map = Fsymbol_value (Qtoolbar_map);
2398
2399           if (!UNBOUNDP (map) && !NILP (map))
2400             relevant_map_push (map, &closure);
2401         }
2402     }
2403 #endif /* HAVE_WINDOW_SYSTEM */
2404
2405   {
2406     int nmaps = closure.nmaps;
2407     /* Silently truncate at 100 keymaps to prevent infinite lossage */
2408     if (nmaps >= max_maps && max_maps > 0)
2409       maps[max_maps - 1] = Vcurrent_global_map;
2410     else
2411       maps[nmaps] = Vcurrent_global_map;
2412     UNGCPRO;
2413     return nmaps + 1;
2414   }
2415 }
2416
2417 /* Returns a set of keymaps extracted from the extents at POS in
2418    BUFFER_OR_STRING.  The GLYPH arg, if specified, is one more extent
2419    to look for a keymap in, and if it has one, its keymap will be the
2420    first element in the list returned.  This is so we can correctly
2421    search the keymaps associated with glyphs which may be physically
2422    disjoint from their extents: for example, if a glyph is out in the
2423    margin, we should still consult the keymap of that glyph's extent,
2424    which may not itself be under the mouse.
2425  */
2426
2427 static void
2428 get_relevant_extent_keymaps (Lisp_Object pos, Lisp_Object buffer_or_string,
2429                              Lisp_Object glyph,
2430                              struct relevant_maps *closure)
2431 {
2432   /* This function can GC */
2433   /* the glyph keymap, if any, comes first.
2434      (Processing it twice is no big deal: noop.) */
2435   if (!NILP (glyph))
2436     {
2437       Lisp_Object keymap = Fextent_property (glyph, Qkeymap, Qnil);
2438       if (!NILP (keymap))
2439         relevant_map_push (get_keymap (keymap, 1, 1), closure);
2440     }
2441
2442   /* Next check the extents at the text position, if any */
2443   if (!NILP (pos))
2444     {
2445       Lisp_Object extent;
2446       for (extent = Fextent_at (pos, buffer_or_string, Qkeymap, Qnil, Qnil);
2447            !NILP (extent);
2448            extent = Fextent_at (pos, buffer_or_string, Qkeymap, extent, Qnil))
2449         {
2450           Lisp_Object keymap = Fextent_property (extent, Qkeymap, Qnil);
2451           if (!NILP (keymap))
2452             relevant_map_push (get_keymap (keymap, 1, 1), closure);
2453           QUIT;
2454         }
2455     }
2456 }
2457
2458 static Lisp_Object
2459 minor_mode_keymap_predicate (Lisp_Object assoc, Lisp_Object buffer)
2460 {
2461   /* This function can GC */
2462   if (CONSP (assoc))
2463     {
2464       Lisp_Object sym = XCAR (assoc);
2465       if (SYMBOLP (sym))
2466         {
2467           Lisp_Object val = symbol_value_in_buffer (sym, buffer);
2468           if (!NILP (val) && !UNBOUNDP (val))
2469             {
2470               Lisp_Object map = get_keymap (XCDR (assoc), 0, 1);
2471               return map;
2472             }
2473         }
2474     }
2475   return Qnil;
2476 }
2477
2478 static void
2479 get_relevant_minor_maps (Lisp_Object buffer, struct relevant_maps *closure)
2480 {
2481   /* This function can GC */
2482   Lisp_Object alist;
2483
2484   /* Will you ever lose badly if you make this circular! */
2485   for (alist = symbol_value_in_buffer (Qminor_mode_map_alist, buffer);
2486        CONSP (alist);
2487        alist = XCDR (alist))
2488     {
2489       Lisp_Object m = minor_mode_keymap_predicate (XCAR (alist),
2490                                                    buffer);
2491       if (!NILP (m)) relevant_map_push (m, closure);
2492       QUIT;
2493     }
2494 }
2495
2496 /* #### Would map-current-keymaps be a better thing?? */
2497 DEFUN ("current-keymaps", Fcurrent_keymaps, 0, 1, 0, /*
2498 Return a list of the current keymaps that will be searched for bindings.
2499 This lists keymaps such as the current local map and the minor-mode maps,
2500  but does not list the parents of those keymaps.
2501 EVENT-OR-KEYS controls which keymaps will be listed.
2502 If EVENT-OR-KEYS is a mouse event (or a vector whose last element is a
2503  mouse event), the keymaps for that mouse event will be listed (see
2504  `key-binding').  Otherwise, the keymaps for key presses will be listed.
2505 */
2506        (event_or_keys))
2507 {
2508   /* This function can GC */
2509   struct gcpro gcpro1;
2510   Lisp_Object maps[100];
2511   Lisp_Object *gubbish = maps;
2512   int nmaps;
2513
2514   GCPRO1 (event_or_keys);
2515   nmaps = get_relevant_keymaps (event_or_keys, countof (maps),
2516                                 gubbish);
2517   if (nmaps > countof (maps))
2518     {
2519       gubbish = alloca_array (Lisp_Object, nmaps);
2520       nmaps = get_relevant_keymaps (event_or_keys, nmaps, gubbish);
2521     }
2522   UNGCPRO;
2523   return Flist (nmaps, gubbish);
2524 }
2525
2526 DEFUN ("key-binding", Fkey_binding, 1, 2, 0, /*
2527 Return the binding for command KEYS in current keymaps.
2528 KEYS is a string, a vector of events, or a vector of key-description lists
2529 as described in the documentation for the `define-key' function.
2530 The binding is probably a symbol with a function definition; see
2531 the documentation for `lookup-key' for more information.
2532
2533 For key-presses, the order of keymaps searched is:
2534   - the `keymap' property of any extent(s) at point;
2535   - any applicable minor-mode maps;
2536   - the current-local-map of the current-buffer;
2537   - the current global map.
2538
2539 For mouse-clicks, the order of keymaps searched is:
2540   - the current-local-map of the `mouse-grabbed-buffer' if any;
2541   - vertical-divider-map, if the event happened over a vertical divider
2542   - the `keymap' property of any extent(s) at the position of the click
2543     (this includes modeline extents);
2544   - the modeline-map of the buffer corresponding to the modeline under
2545     the mouse (if the click happened over a modeline);
2546   - the value of toolbar-map in the current-buffer (if the click
2547     happened over a toolbar);
2548   - the current-local-map of the buffer under the mouse (does not
2549     apply to toolbar clicks);
2550   - any applicable minor-mode maps;
2551   - the current global map.
2552
2553 Note that if `overriding-local-map' or `overriding-terminal-local-map'
2554 is non-nil, *only* those two maps and the current global map are searched.
2555 */
2556        (keys, accept_default))
2557 {
2558   /* This function can GC */
2559   int i;
2560   Lisp_Object maps[100];
2561   int nmaps;
2562   struct gcpro gcpro1, gcpro2;
2563   GCPRO2 (keys, accept_default); /* get_relevant_keymaps may autoload */
2564
2565   nmaps = get_relevant_keymaps (keys, countof (maps), maps);
2566
2567   UNGCPRO;
2568
2569   if (EVENTP (keys))           /* unadvertised "feature" for the future */
2570     return lookup_events (keys, nmaps, maps, !NILP (accept_default));
2571
2572   for (i = 0; i < nmaps; i++)
2573     {
2574       Lisp_Object tem = Flookup_key (maps[i], keys,
2575                                      accept_default);
2576       if (INTP (tem))
2577         {
2578           /* Too long in some local map means don't look at global map */
2579           return Qnil;
2580         }
2581       else if (!NILP (tem))
2582         return tem;
2583     }
2584   return Qnil;
2585 }
2586
2587 static Lisp_Object
2588 process_event_binding_result (Lisp_Object result)
2589 {
2590   if (EQ (result, Qundefined))
2591     /* The suppress-keymap function binds keys to 'undefined - special-case
2592        that here, so that being bound to that has the same error-behavior as
2593        not being defined at all.
2594        */
2595     result = Qnil;
2596   if (!NILP (result))
2597     {
2598       Lisp_Object map;
2599       /* Snap out possible keymap indirections */
2600       map = get_keymap (result, 0, 1);
2601       if (!NILP (map))
2602         result = map;
2603     }
2604
2605   return result;
2606 }
2607
2608 /* Attempts to find a command corresponding to the event-sequence
2609    whose head is event0 (sequence is threaded though event_next).
2610
2611    The return value will be
2612
2613       -- nil (there is no binding; this will also be returned
2614               whenever the event chain is "too long", i.e. there
2615               is a non-nil, non-keymap binding for a prefix of
2616               the event chain)
2617       -- a keymap (part of a command has been specified)
2618       -- a command (anything that satisfies `commandp'; this includes
2619                     some symbols, lists, subrs, strings, vectors, and
2620                     compiled-function objects) */
2621 Lisp_Object
2622 event_binding (Lisp_Object event0, int accept_default)
2623 {
2624   /* This function can GC */
2625   Lisp_Object maps[100];
2626   int nmaps;
2627
2628   assert (EVENTP (event0));
2629
2630   nmaps = get_relevant_keymaps (event0, countof (maps), maps);
2631   if (nmaps > countof (maps))
2632     nmaps = countof (maps);
2633   return process_event_binding_result (lookup_events (event0, nmaps, maps,
2634                                                       accept_default));
2635 }
2636
2637 /* like event_binding, but specify a keymap to search */
2638
2639 Lisp_Object
2640 event_binding_in (Lisp_Object event0, Lisp_Object keymap, int accept_default)
2641 {
2642   /* This function can GC */
2643   if (!KEYMAPP (keymap))
2644     return Qnil;
2645
2646   return process_event_binding_result (lookup_events (event0, 1, &keymap,
2647                                                       accept_default));
2648 }
2649
2650 /* Attempts to find a function key mapping corresponding to the
2651    event-sequence whose head is event0 (sequence is threaded through
2652    event_next).  The return value will be the same as for event_binding(). */
2653 Lisp_Object
2654 munging_key_map_event_binding (Lisp_Object event0,
2655                                enum munge_me_out_the_door munge)
2656 {
2657   Lisp_Object keymap = (munge == MUNGE_ME_FUNCTION_KEY) ?
2658     CONSOLE_FUNCTION_KEY_MAP (event_console_or_selected (event0)) :
2659     Vkey_translation_map;
2660
2661   if (NILP (keymap))
2662     return Qnil;
2663
2664   return process_event_binding_result (lookup_events (event0, 1, &keymap, 1));
2665 }
2666
2667 \f
2668 /************************************************************************/
2669 /*               Setting/querying the global and local maps             */
2670 /************************************************************************/
2671
2672 DEFUN ("use-global-map", Fuse_global_map, 1, 1, 0, /*
2673 Select KEYMAP as the global keymap.
2674 */
2675        (keymap))
2676 {
2677   /* This function can GC */
2678   keymap = get_keymap (keymap, 1, 1);
2679   Vcurrent_global_map = keymap;
2680   return Qnil;
2681 }
2682
2683 DEFUN ("use-local-map", Fuse_local_map, 1, 2, 0, /*
2684 Select KEYMAP as the local keymap in BUFFER.
2685 If KEYMAP is nil, that means no local keymap.
2686 If BUFFER is nil, the current buffer is assumed.
2687 */
2688        (keymap, buffer))
2689 {
2690   /* This function can GC */
2691   struct buffer *b = decode_buffer (buffer, 0);
2692   if (!NILP (keymap))
2693     keymap = get_keymap (keymap, 1, 1);
2694
2695   b->keymap = keymap;
2696
2697   return Qnil;
2698 }
2699
2700 DEFUN ("current-local-map", Fcurrent_local_map, 0, 1, 0, /*
2701 Return BUFFER's local keymap, or nil if it has none.
2702 If BUFFER is nil, the current buffer is assumed.
2703 */
2704        (buffer))
2705 {
2706   struct buffer *b = decode_buffer (buffer, 0);
2707   return b->keymap;
2708 }
2709
2710 DEFUN ("current-global-map", Fcurrent_global_map, 0, 0, 0, /*
2711 Return the current global keymap.
2712 */
2713        ())
2714 {
2715   return Vcurrent_global_map;
2716 }
2717
2718 \f
2719 /************************************************************************/
2720 /*                    Mapping over keymap elements                      */
2721 /************************************************************************/
2722
2723 /* Since keymaps are arranged in a hierarchy, one keymap per bucky bit or
2724    prefix key, it's not entirely obvious what map-keymap should do, but
2725    what it does is: map over all keys in this map; then recursively map
2726    over all submaps of this map that are "bucky" submaps.  This means that,
2727    when mapping over a keymap, it appears that "x" and "C-x" are in the
2728    same map, although "C-x" is really in the "control" submap of this one.
2729    However, since we don't recursively descend the submaps that are bound
2730    to prefix keys (like C-x, C-h, etc) the caller will have to recurse on
2731    those explicitly, if that's what they want.
2732
2733    So the end result of this is that the bucky keymaps (the ones indexed
2734    under the large integers returned from MAKE_MODIFIER_HASH_KEY()) are
2735    invisible from elisp.  They're just an implementation detail that code
2736    outside of this file doesn't need to know about.
2737  */
2738
2739 struct map_keymap_unsorted_closure
2740 {
2741   void (*fn) (CONST struct key_data *, Lisp_Object binding, void *arg);
2742   void *arg;
2743   unsigned int modifiers;
2744 };
2745
2746 /* used by map_keymap() */
2747 static int
2748 map_keymap_unsorted_mapper (Lisp_Object keysym, Lisp_Object value,
2749                             void *map_keymap_unsorted_closure)
2750 {
2751   /* This function can GC */
2752   struct map_keymap_unsorted_closure *closure =
2753     (struct map_keymap_unsorted_closure *) map_keymap_unsorted_closure;
2754   unsigned int modifiers = closure->modifiers;
2755   unsigned int mod_bit;
2756   mod_bit = MODIFIER_HASH_KEY_BITS (keysym);
2757   if (mod_bit != 0)
2758     {
2759       int omod = modifiers;
2760       closure->modifiers = (modifiers | mod_bit);
2761       value = get_keymap (value, 1, 0);
2762       elisp_maphash (map_keymap_unsorted_mapper,
2763                      XKEYMAP (value)->table,
2764                      map_keymap_unsorted_closure);
2765       closure->modifiers = omod;
2766     }
2767   else
2768     {
2769       struct key_data key;
2770       key.keysym = keysym;
2771       key.modifiers = modifiers;
2772       ((*closure->fn) (&key, value, closure->arg));
2773     }
2774   return 0;
2775 }
2776
2777
2778 struct map_keymap_sorted_closure
2779 {
2780   Lisp_Object *result_locative;
2781 };
2782
2783 /* used by map_keymap_sorted() */
2784 static int
2785 map_keymap_sorted_mapper (Lisp_Object key, Lisp_Object value,
2786                           void *map_keymap_sorted_closure)
2787 {
2788   struct map_keymap_sorted_closure *cl =
2789     (struct map_keymap_sorted_closure *) map_keymap_sorted_closure;
2790   Lisp_Object *list = cl->result_locative;
2791   *list = Fcons (Fcons (key, value), *list);
2792   return 0;
2793 }
2794
2795
2796 /* used by map_keymap_sorted(), describe_map_sort_predicate(),
2797    and keymap_submaps().
2798  */
2799 static int
2800 map_keymap_sort_predicate (Lisp_Object obj1, Lisp_Object obj2,
2801                            Lisp_Object pred)
2802 {
2803   /* obj1 and obj2 are conses with keysyms in their cars.  Cdrs are ignored.
2804    */
2805   unsigned int bit1, bit2;
2806   int sym1_p = 0;
2807   int sym2_p = 0;
2808   obj1 = XCAR (obj1);
2809   obj2 = XCAR (obj2);
2810
2811   if (EQ (obj1, obj2))
2812     return -1;
2813   bit1 = MODIFIER_HASH_KEY_BITS (obj1);
2814   bit2 = MODIFIER_HASH_KEY_BITS (obj2);
2815
2816   /* If either is a symbol with a character-set-property, then sort it by
2817      that code instead of alphabetically.
2818      */
2819   if (! bit1 && SYMBOLP (obj1))
2820     {
2821       Lisp_Object code = Fget (obj1, Vcharacter_set_property, Qnil);
2822       if (CHAR_OR_CHAR_INTP (code))
2823         {
2824           obj1 = code;
2825           CHECK_CHAR_COERCE_INT (obj1);
2826           sym1_p = 1;
2827         }
2828     }
2829   if (! bit2 && SYMBOLP (obj2))
2830     {
2831       Lisp_Object code = Fget (obj2, Vcharacter_set_property, Qnil);
2832       if (CHAR_OR_CHAR_INTP (code))
2833         {
2834           obj2 = code;
2835           CHECK_CHAR_COERCE_INT (obj2);
2836           sym2_p = 1;
2837         }
2838     }
2839
2840   /* all symbols (non-ASCIIs) come after characters (ASCIIs) */
2841   if (XTYPE (obj1) != XTYPE (obj2))
2842     return SYMBOLP (obj2) ? 1 : -1;
2843
2844   if (! bit1 && CHARP (obj1)) /* they're both ASCII */
2845     {
2846       int o1 = XCHAR (obj1);
2847       int o2 = XCHAR (obj2);
2848       if (o1 == o2 &&           /* If one started out as a symbol and the */
2849           sym1_p != sym2_p)     /* other didn't, the symbol comes last. */
2850         return sym2_p ? 1 : -1;
2851
2852       return o1 < o2 ? 1 : -1;  /* else just compare them */
2853     }
2854
2855   /* else they're both symbols.  If they're both buckys, then order them. */
2856   if (bit1 && bit2)
2857     return bit1 < bit2 ? 1 : -1;
2858
2859   /* if only one is a bucky, then it comes later */
2860   if (bit1 || bit2)
2861     return bit2 ? 1 : -1;
2862
2863   /* otherwise, string-sort them. */
2864   {
2865     char *s1 = (char *) string_data (XSYMBOL (obj1)->name);
2866     char *s2 = (char *) string_data (XSYMBOL (obj2)->name);
2867 #ifdef I18N2
2868     return 0 > strcoll (s1, s2) ? 1 : -1;
2869 #else
2870     return 0 > strcmp  (s1, s2) ? 1 : -1;
2871 #endif
2872   }
2873 }
2874
2875
2876 /* used by map_keymap() */
2877 static void
2878 map_keymap_sorted (Lisp_Object keymap_table,
2879                    unsigned int modifiers,
2880                    void (*function) (CONST struct key_data *key,
2881                                      Lisp_Object binding,
2882                                      void *map_keymap_sorted_closure),
2883                    void *map_keymap_sorted_closure)
2884 {
2885   /* This function can GC */
2886   struct gcpro gcpro1;
2887   Lisp_Object contents = Qnil;
2888
2889   if (XINT (Fhash_table_count (keymap_table)) == 0)
2890     return;
2891
2892   GCPRO1 (contents);
2893
2894   {
2895     struct map_keymap_sorted_closure c1;
2896     c1.result_locative = &contents;
2897     elisp_maphash (map_keymap_sorted_mapper, keymap_table, &c1);
2898   }
2899   contents = list_sort (contents, Qnil, map_keymap_sort_predicate);
2900   for (; !NILP (contents); contents = XCDR (contents))
2901     {
2902       Lisp_Object keysym = XCAR (XCAR (contents));
2903       Lisp_Object binding = XCDR (XCAR (contents));
2904       unsigned int sub_bits = MODIFIER_HASH_KEY_BITS (keysym);
2905       if (sub_bits != 0)
2906         map_keymap_sorted (XKEYMAP (get_keymap (binding,
2907                                                 1, 1))->table,
2908                            (modifiers | sub_bits),
2909                            function,
2910                            map_keymap_sorted_closure);
2911       else
2912         {
2913           struct key_data k;
2914           k.keysym = keysym;
2915           k.modifiers = modifiers;
2916           ((*function) (&k, binding, map_keymap_sorted_closure));
2917         }
2918     }
2919   UNGCPRO;
2920 }
2921
2922
2923 /* used by Fmap_keymap() */
2924 static void
2925 map_keymap_mapper (CONST struct key_data *key,
2926                    Lisp_Object binding,
2927                    void *function)
2928 {
2929   /* This function can GC */
2930   Lisp_Object fn;
2931   VOID_TO_LISP (fn, function);
2932   call2 (fn, make_key_description (key, 1), binding);
2933 }
2934
2935
2936 static void
2937 map_keymap (Lisp_Object keymap_table, int sort_first,
2938             void (*function) (CONST struct key_data *key,
2939                               Lisp_Object binding,
2940                               void *fn_arg),
2941             void *fn_arg)
2942 {
2943   /* This function can GC */
2944   if (sort_first)
2945     map_keymap_sorted (keymap_table, 0, function, fn_arg);
2946   else
2947     {
2948       struct map_keymap_unsorted_closure map_keymap_unsorted_closure;
2949       map_keymap_unsorted_closure.fn = function;
2950       map_keymap_unsorted_closure.arg = fn_arg;
2951       map_keymap_unsorted_closure.modifiers = 0;
2952       elisp_maphash (map_keymap_unsorted_mapper, keymap_table,
2953                      &map_keymap_unsorted_closure);
2954     }
2955 }
2956
2957 DEFUN ("map-keymap", Fmap_keymap, 2, 3, 0, /*
2958 Apply FUNCTION to each element of KEYMAP.
2959 FUNCTION will be called with two arguments: a key-description list, and
2960 the binding.  The order in which the elements of the keymap are passed to
2961 the function is unspecified.  If the function inserts new elements into
2962 the keymap, it may or may not be called with them later.  No element of
2963 the keymap will ever be passed to the function more than once.
2964
2965 The function will not be called on elements of this keymap's parents
2966 \(see the function `keymap-parents') or upon keymaps which are contained
2967 within this keymap (multi-character definitions).
2968 It will be called on "meta" characters since they are not really
2969 two-character sequences.
2970
2971 If the optional third argument SORT-FIRST is non-nil, then the elements of
2972 the keymap will be passed to the mapper function in a canonical order.
2973 Otherwise, they will be passed in hash (that is, random) order, which is
2974 faster.
2975 */
2976      (function, keymap, sort_first))
2977 {
2978   /* This function can GC */
2979   struct gcpro gcpro1, gcpro2;
2980
2981  /* tolerate obviously transposed args */
2982   if (!NILP (Fkeymapp (function)))
2983     {
2984       Lisp_Object tmp = function;
2985       function = keymap;
2986       keymap = tmp;
2987     }
2988   GCPRO2 (function, keymap);
2989   keymap = get_keymap (keymap, 1, 1);
2990   map_keymap (XKEYMAP (keymap)->table, !NILP (sort_first),
2991               map_keymap_mapper, LISP_TO_VOID (function));
2992   UNGCPRO;
2993   return Qnil;
2994 }
2995
2996
2997 \f
2998 /************************************************************************/
2999 /*                          Accessible keymaps                          */
3000 /************************************************************************/
3001
3002 struct accessible_keymaps_closure
3003   {
3004     Lisp_Object tail;
3005   };
3006
3007
3008 static void
3009 accessible_keymaps_mapper_1 (Lisp_Object keysym, Lisp_Object contents,
3010                              unsigned int modifiers,
3011                              struct accessible_keymaps_closure *closure)
3012 {
3013   /* This function can GC */
3014   unsigned int subbits = MODIFIER_HASH_KEY_BITS (keysym);
3015
3016   if (subbits != 0)
3017     {
3018       Lisp_Object submaps;
3019
3020       contents = get_keymap (contents, 1, 1);
3021       submaps = keymap_submaps (contents);
3022       for (; !NILP (submaps); submaps = XCDR (submaps))
3023         {
3024           accessible_keymaps_mapper_1 (XCAR (XCAR (submaps)),
3025                                        XCDR (XCAR (submaps)),
3026                                        (subbits | modifiers),
3027                                        closure);
3028         }
3029     }
3030   else
3031     {
3032       Lisp_Object thisseq = Fcar (Fcar (closure->tail));
3033       Lisp_Object cmd = get_keyelt (contents, 1);
3034       Lisp_Object vec;
3035       int j;
3036       int len;
3037       struct key_data key;
3038       key.keysym = keysym;
3039       key.modifiers = modifiers;
3040
3041       if (NILP (cmd))
3042         abort ();
3043       cmd = get_keymap (cmd, 0, 1);
3044       if (!KEYMAPP (cmd))
3045         abort ();
3046
3047       vec = make_vector (XVECTOR_LENGTH (thisseq) + 1, Qnil);
3048       len = XVECTOR_LENGTH (thisseq);
3049       for (j = 0; j < len; j++)
3050         XVECTOR_DATA (vec) [j] = XVECTOR_DATA (thisseq) [j];
3051       XVECTOR_DATA (vec) [j] = make_key_description (&key, 1);
3052
3053       nconc2 (closure->tail, list1 (Fcons (vec, cmd)));
3054     }
3055 }
3056
3057
3058 static Lisp_Object
3059 accessible_keymaps_keymap_mapper (Lisp_Object thismap, void *arg)
3060 {
3061   /* This function can GC */
3062   struct accessible_keymaps_closure *closure =
3063     (struct accessible_keymaps_closure *) arg;
3064   Lisp_Object submaps = keymap_submaps (thismap);
3065
3066   for (; !NILP (submaps); submaps = XCDR (submaps))
3067     {
3068       accessible_keymaps_mapper_1 (XCAR (XCAR (submaps)),
3069                                    XCDR (XCAR (submaps)),
3070                                    0,
3071                                    closure);
3072     }
3073   return Qnil;
3074 }
3075
3076
3077 DEFUN ("accessible-keymaps", Faccessible_keymaps, 1, 2, 0, /*
3078 Find all keymaps accessible via prefix characters from KEYMAP.
3079 Returns a list of elements of the form (KEYS . MAP), where the sequence
3080 KEYS starting from KEYMAP gets you to MAP.  These elements are ordered
3081 so that the KEYS increase in length.  The first element is ([] . KEYMAP).
3082 An optional argument PREFIX, if non-nil, should be a key sequence;
3083 then the value includes only maps for prefixes that start with PREFIX.
3084 */
3085        (keymap, prefix))
3086 {
3087   /* This function can GC */
3088   struct gcpro gcpro1, gcpro2, gcpro3, gcpro4;
3089   Lisp_Object accessible_keymaps = Qnil;
3090   struct accessible_keymaps_closure c;
3091   c.tail = Qnil;
3092   GCPRO4 (accessible_keymaps, c.tail, prefix, keymap);
3093
3094  retry:
3095   keymap = get_keymap (keymap, 1, 1);
3096   if (NILP (prefix))
3097     prefix = make_vector (0, Qnil);
3098   else if (!VECTORP (prefix) || STRINGP (prefix))
3099     {
3100       prefix = wrong_type_argument (Qarrayp, prefix);
3101       goto retry;
3102     }
3103   else
3104     {
3105       int len = XINT (Flength (prefix));
3106       Lisp_Object def = Flookup_key (keymap, prefix, Qnil);
3107       Lisp_Object p;
3108       int iii;
3109       struct gcpro ngcpro1;
3110
3111       def = get_keymap (def, 0, 1);
3112       if (!KEYMAPP (def))
3113         goto RETURN;
3114
3115       keymap = def;
3116       p = make_vector (len, Qnil);
3117       NGCPRO1 (p);
3118       for (iii = 0; iii < len; iii++)
3119         {
3120           struct key_data key;
3121           define_key_parser (Faref (prefix, make_int (iii)), &key);
3122           XVECTOR_DATA (p)[iii] = make_key_description (&key, 1);
3123         }
3124       NUNGCPRO;
3125       prefix = p;
3126     }
3127
3128   accessible_keymaps = list1 (Fcons (prefix, keymap));
3129
3130   /* For each map in the list maps,
3131      look at any other maps it points to
3132      and stick them at the end if they are not already in the list */
3133
3134   for (c.tail = accessible_keymaps;
3135        !NILP (c.tail);
3136        c.tail = XCDR (c.tail))
3137     {
3138       Lisp_Object thismap = Fcdr (Fcar (c.tail));
3139       CHECK_KEYMAP (thismap);
3140       traverse_keymaps (thismap, Qnil,
3141                         accessible_keymaps_keymap_mapper, &c);
3142     }
3143  RETURN:
3144   UNGCPRO;
3145   return accessible_keymaps;
3146 }
3147
3148
3149 \f
3150 /************************************************************************/
3151 /*              Pretty descriptions of key sequences                    */
3152 /************************************************************************/
3153
3154 DEFUN ("key-description", Fkey_description, 1, 1, 0, /*
3155 Return a pretty description of key-sequence KEYS.
3156 Control characters turn into "C-foo" sequences, meta into "M-foo",
3157 spaces are put between sequence elements, etc...
3158 */
3159        (keys))
3160 {
3161   if (CHAR_OR_CHAR_INTP (keys) || CONSP (keys) || SYMBOLP (keys)
3162       || EVENTP (keys))
3163     {
3164       return Fsingle_key_description (keys);
3165     }
3166   else if (VECTORP (keys) ||
3167            STRINGP (keys))
3168     {
3169       Lisp_Object string = Qnil;
3170       /* Lisp_Object sep = Qnil; */
3171       int size = XINT (Flength (keys));
3172       int i;
3173
3174       for (i = 0; i < size; i++)
3175         {
3176           Lisp_Object s2 = Fsingle_key_description
3177             (((STRINGP (keys))
3178               ? make_char (string_char (XSTRING (keys), i))
3179               : XVECTOR_DATA (keys)[i]));
3180
3181           if (i == 0)
3182             string = s2;
3183           else
3184             {
3185               /* if (NILP (sep)) Lisp_Object sep = build_string (" ") */;
3186               string = concat2 (string, concat2 (Vsingle_space_string, s2));
3187             }
3188         }
3189       return string;
3190     }
3191   return Fkey_description (wrong_type_argument (Qsequencep, keys));
3192 }
3193
3194 DEFUN ("single-key-description", Fsingle_key_description, 1, 1, 0, /*
3195 Return a pretty description of command character KEY.
3196 Control characters turn into C-whatever, etc.
3197 This differs from `text-char-description' in that it returns a description
3198 of a key read from the user rather than a character from a buffer.
3199 */
3200        (key))
3201 {
3202   if (SYMBOLP (key))
3203     key = Fcons (key, Qnil); /* sleaze sleaze */
3204
3205   if (EVENTP (key) || CHAR_OR_CHAR_INTP (key))
3206     {
3207       char buf [255];
3208       if (!EVENTP (key))
3209         {
3210           struct Lisp_Event event;
3211           event.event_type = empty_event;
3212           CHECK_CHAR_COERCE_INT (key);
3213           character_to_event (XCHAR (key), &event,
3214                               XCONSOLE (Vselected_console), 0, 1);
3215           format_event_object (buf, &event, 1);
3216         }
3217       else
3218         format_event_object (buf, XEVENT (key), 1);
3219       return build_string (buf);
3220     }
3221
3222   if (CONSP (key))
3223     {
3224       char buf[255];
3225       char *bufp = buf;
3226       Lisp_Object rest;
3227       buf[0] = 0;
3228       LIST_LOOP (rest, key)
3229         {
3230           Lisp_Object keysym = XCAR (rest);
3231           if (EQ (keysym, Qcontrol))    strcpy (bufp, "C-"), bufp += 2;
3232           else if (EQ (keysym, Qctrl))  strcpy (bufp, "C-"), bufp += 2;
3233           else if (EQ (keysym, Qmeta))  strcpy (bufp, "M-"), bufp += 2;
3234           else if (EQ (keysym, Qsuper)) strcpy (bufp, "S-"), bufp += 2;
3235           else if (EQ (keysym, Qhyper)) strcpy (bufp, "H-"), bufp += 2;
3236           else if (EQ (keysym, Qalt))   strcpy (bufp, "A-"), bufp += 2;
3237           else if (EQ (keysym, Qshift)) strcpy (bufp, "Sh-"), bufp += 3;
3238           else if (CHAR_OR_CHAR_INTP (keysym))
3239             {
3240               bufp += set_charptr_emchar ((Bufbyte *) bufp,
3241                                           XCHAR_OR_CHAR_INT (keysym));
3242               *bufp = 0;
3243             }
3244           else
3245             {
3246               CHECK_SYMBOL (keysym);
3247 #if 0                           /* This is bogus */
3248               if (EQ (keysym, QKlinefeed))       strcpy (bufp, "LFD");
3249               else if (EQ (keysym, QKtab))       strcpy (bufp, "TAB");
3250               else if (EQ (keysym, QKreturn))    strcpy (bufp, "RET");
3251               else if (EQ (keysym, QKescape))    strcpy (bufp, "ESC");
3252               else if (EQ (keysym, QKdelete))    strcpy (bufp, "DEL");
3253               else if (EQ (keysym, QKspace))     strcpy (bufp, "SPC");
3254               else if (EQ (keysym, QKbackspace)) strcpy (bufp, "BS");
3255               else
3256 #endif
3257                 strcpy (bufp, (char *) string_data (XSYMBOL (keysym)->name));
3258               if (!NILP (XCDR (rest)))
3259                 signal_simple_error ("Invalid key description",
3260                                      key);
3261             }
3262         }
3263       return build_string (buf);
3264     }
3265   return Fsingle_key_description
3266     (wrong_type_argument (intern ("char-or-event-p"), key));
3267 }
3268
3269 DEFUN ("text-char-description", Ftext_char_description, 1, 1, 0, /*
3270 Return a pretty description of file-character CHR.
3271 Unprintable characters turn into "^char" or \\NNN, depending on the value
3272 of the `ctl-arrow' variable.
3273 This differs from `single-key-description' in that it returns a description
3274 of a character from a buffer rather than a key read from the user.
3275 */
3276        (chr))
3277 {
3278   Bufbyte buf[200];
3279   Bufbyte *p;
3280   Emchar c;
3281   Lisp_Object ctl_arrow = current_buffer->ctl_arrow;
3282   int ctl_p = !NILP (ctl_arrow);
3283   Emchar printable_min = (CHAR_OR_CHAR_INTP (ctl_arrow)
3284                           ? XCHAR_OR_CHAR_INT (ctl_arrow)
3285                           : ((EQ (ctl_arrow, Qt) || NILP (ctl_arrow))
3286                              ? 256 : 160));
3287
3288   if (EVENTP (chr))
3289     {
3290       Lisp_Object ch = Fevent_to_character (chr, Qnil, Qnil, Qt);
3291       if (NILP (ch))
3292         return
3293           signal_simple_continuable_error
3294             ("character has no ASCII equivalent", Fcopy_event (chr, Qnil));
3295       chr = ch;
3296     }
3297
3298   CHECK_CHAR_COERCE_INT (chr);
3299
3300   c = XCHAR (chr);
3301   p = buf;
3302
3303   if (c >= printable_min)
3304     {
3305       p += set_charptr_emchar (p, c);
3306     }
3307   else if (c < 040 && ctl_p)
3308     {
3309       *p++ = '^';
3310       *p++ = c + 64;            /* 'A' - 1 */
3311     }
3312   else if (c == 0177)
3313     {
3314       *p++ = '^';
3315       *p++ = '?';
3316     }
3317   else if (c >= 0200 || c < 040)
3318     {
3319       *p++ = '\\';
3320 #ifdef MULE
3321       /* !!#### This syntax is not readable.  It will
3322          be interpreted as a 3-digit octal number rather
3323          than a 7-digit octal number. */
3324       if (c >= 0400)
3325         {
3326           *p++ = '0' + ((c & 07000000) >> 18);
3327           *p++ = '0' + ((c & 0700000) >> 15);
3328           *p++ = '0' + ((c & 070000) >> 12);
3329           *p++ = '0' + ((c & 07000) >> 9);
3330         }
3331 #endif
3332       *p++ = '0' + ((c & 0700) >> 6);
3333       *p++ = '0' + ((c & 0070) >> 3);
3334       *p++ = '0' + ((c & 0007));
3335     }
3336   else
3337     {
3338       p += set_charptr_emchar (p, c);
3339     }
3340
3341   *p = 0;
3342   return build_string ((char *) buf);
3343 }
3344
3345 \f
3346 /************************************************************************/
3347 /*              where-is (mapping bindings to keys)                     */
3348 /************************************************************************/
3349
3350 static Lisp_Object
3351 where_is_internal (Lisp_Object definition, Lisp_Object *maps, int nmaps,
3352                    Lisp_Object firstonly, char *target_buffer);
3353
3354 DEFUN ("where-is-internal", Fwhere_is_internal, 1, 5, 0, /*
3355 Return list of keys that invoke DEFINITION in KEYMAPS.
3356 KEYMAPS can be either a keymap (meaning search in that keymap and the
3357 current global keymap) or a list of keymaps (meaning search in exactly
3358 those keymaps and no others).  If KEYMAPS is nil, search in the currently
3359 applicable maps for EVENT-OR-KEYS (this is equivalent to specifying
3360 `(current-keymaps EVENT-OR-KEYS)' as the argument to KEYMAPS).
3361
3362 If optional 3rd arg FIRSTONLY is non-nil, return a vector representing
3363  the first key sequence found, rather than a list of all possible key
3364  sequences.
3365
3366 If optional 4th arg NOINDIRECT is non-nil, don't follow indirections
3367  to other keymaps or slots.  This makes it possible to search for an
3368  indirect definition itself.
3369 */
3370        (definition, keymaps, firstonly, noindirect, event_or_keys))
3371 {
3372   /* This function can GC */
3373   Lisp_Object maps[100];
3374   Lisp_Object *gubbish = maps;
3375   int nmaps;
3376
3377   /* Get keymaps as an array */
3378   if (NILP (keymaps))
3379     {
3380       nmaps = get_relevant_keymaps (event_or_keys, countof (maps),
3381                                     gubbish);
3382       if (nmaps > countof (maps))
3383         {
3384           gubbish = alloca_array (Lisp_Object, nmaps);
3385           nmaps = get_relevant_keymaps (event_or_keys, nmaps, gubbish);
3386         }
3387     }
3388   else if (CONSP (keymaps))
3389     {
3390       Lisp_Object rest;
3391       int i;
3392
3393       nmaps = XINT (Flength (keymaps));
3394       if (nmaps > countof (maps))
3395         {
3396           gubbish = alloca_array (Lisp_Object, nmaps);
3397         }
3398       for (rest = keymaps, i = 0; !NILP (rest);
3399            rest = XCDR (keymaps), i++)
3400         {
3401           gubbish[i] = get_keymap (XCAR (keymaps), 1, 1);
3402         }
3403     }
3404   else
3405     {
3406       nmaps = 1;
3407       gubbish[0] = get_keymap (keymaps, 1, 1);
3408       if (!EQ (gubbish[0], Vcurrent_global_map))
3409         {
3410           gubbish[1] = Vcurrent_global_map;
3411           nmaps++;
3412         }
3413     }
3414
3415   return where_is_internal (definition, gubbish, nmaps, firstonly, 0);
3416 }
3417
3418 /* This function is like
3419    (key-description (where-is-internal definition nil t))
3420    except that it writes its output into a (char *) buffer that you
3421    provide; it doesn't cons (or allocate memory) at all, so it's
3422    very fast.  This is used by menubar.c.
3423  */
3424 void
3425 where_is_to_char (Lisp_Object definition, char *buffer)
3426 {
3427   /* This function can GC */
3428   Lisp_Object maps[100];
3429   Lisp_Object *gubbish = maps;
3430   int nmaps;
3431
3432   /* Get keymaps as an array */
3433   nmaps = get_relevant_keymaps (Qnil, countof (maps), gubbish);
3434   if (nmaps > countof (maps))
3435     {
3436       gubbish = alloca_array (Lisp_Object, nmaps);
3437       nmaps = get_relevant_keymaps (Qnil, nmaps, gubbish);
3438     }
3439
3440   buffer[0] = 0;
3441   where_is_internal (definition, maps, nmaps, Qt, buffer);
3442 }
3443
3444
3445 static Lisp_Object
3446 raw_keys_to_keys (struct key_data *keys, int count)
3447 {
3448   Lisp_Object result = make_vector (count, Qnil);
3449   while (count--)
3450     XVECTOR_DATA (result) [count] = make_key_description (&(keys[count]), 1);
3451   return result;
3452 }
3453
3454
3455 static void
3456 format_raw_keys (struct key_data *keys, int count, char *buf)
3457 {
3458   int i;
3459   struct Lisp_Event event;
3460   event.event_type = key_press_event;
3461   event.channel = Vselected_console;
3462   for (i = 0; i < count; i++)
3463     {
3464       event.event.key.keysym    = keys[i].keysym;
3465       event.event.key.modifiers = keys[i].modifiers;
3466       format_event_object (buf, &event, 1);
3467       buf += strlen (buf);
3468       if (i < count-1)
3469         buf[0] = ' ', buf++;
3470     }
3471 }
3472
3473
3474 /* definition is the thing to look for.
3475    map is a keymap.
3476    shadow is an array of shadow_count keymaps; if there is a different
3477    binding in any of the keymaps of a key that we are considering
3478    returning, then we reconsider.
3479    firstonly means give up after finding the first match;
3480    keys_so_far and modifiers_so_far describe which map we're looking in;
3481    If we're in the "meta" submap of the map that "C-x 4" is bound to,
3482    then keys_so_far will be {(control x), \4}, and modifiers_so_far
3483    will be MOD_META.  That is, keys_so_far is the chain of keys that we
3484    have followed, and modifiers_so_far_so_far is the bits (partial keys)
3485    beyond that.
3486
3487    (keys_so_far is a global buffer and the keys_count arg says how much
3488    of it we're currently interested in.)
3489
3490    If target_buffer is provided, then we write a key-description into it,
3491    to avoid consing a string.  This only works with firstonly on.
3492    */
3493
3494 struct where_is_closure
3495   {
3496     Lisp_Object definition;
3497     Lisp_Object *shadow;
3498     int shadow_count;
3499     int firstonly;
3500     int keys_count;
3501     unsigned int modifiers_so_far;
3502     char *target_buffer;
3503     struct key_data *keys_so_far;
3504     int keys_so_far_total_size;
3505     int keys_so_far_malloced;
3506   };
3507
3508 static Lisp_Object where_is_recursive_mapper (Lisp_Object map, void *arg);
3509
3510 static Lisp_Object
3511 where_is_recursive_mapper (Lisp_Object map, void *arg)
3512 {
3513   /* This function can GC */
3514   struct where_is_closure *c = (struct where_is_closure *) arg;
3515   Lisp_Object definition = c->definition;
3516   CONST int firstonly = c->firstonly;
3517   CONST unsigned int keys_count = c->keys_count;
3518   CONST unsigned int modifiers_so_far = c->modifiers_so_far;
3519   char *target_buffer = c->target_buffer;
3520   Lisp_Object keys = Fgethash (definition,
3521                                XKEYMAP (map)->inverse_table,
3522                                Qnil);
3523   Lisp_Object submaps;
3524   Lisp_Object result = Qnil;
3525
3526   if (!NILP (keys))
3527     {
3528       /* One or more keys in this map match the definition we're looking for.
3529          Verify that these bindings aren't shadowed by other bindings
3530          in the shadow maps.  Either nil or number as value from
3531          raw_lookup_key() means undefined.  */
3532       struct key_data *so_far = c->keys_so_far;
3533
3534       for (;;) /* loop over all keys that match */
3535         {
3536           Lisp_Object k = ((CONSP (keys)) ? XCAR (keys) : keys);
3537           int i;
3538
3539           so_far [keys_count].keysym = k;
3540           so_far [keys_count].modifiers = modifiers_so_far;
3541
3542           /* now loop over all shadow maps */
3543           for (i = 0; i < c->shadow_count; i++)
3544             {
3545               Lisp_Object shadowed = raw_lookup_key (c->shadow[i],
3546                                                      so_far,
3547                                                      keys_count + 1,
3548                                                      0, 1);
3549
3550               if (NILP (shadowed) || CHARP (shadowed) ||
3551                   EQ (shadowed, definition))
3552                 continue; /* we passed this test; it's not shadowed here. */
3553               else
3554                 /* ignore this key binding, since it actually has a
3555                    different binding in a shadowing map */
3556                 goto c_doesnt_have_proper_loop_exit_statements;
3557             }
3558
3559           /* OK, the key is for real */
3560           if (target_buffer)
3561             {
3562               if (!firstonly) abort ();
3563               format_raw_keys (so_far, keys_count + 1, target_buffer);
3564               return make_int (1);
3565             }
3566           else if (firstonly)
3567             return raw_keys_to_keys (so_far, keys_count + 1);
3568           else
3569             result = Fcons (raw_keys_to_keys (so_far, keys_count + 1),
3570                             result);
3571
3572         c_doesnt_have_proper_loop_exit_statements:
3573           /* now on to the next matching key ... */
3574           if (!CONSP (keys)) break;
3575           keys = XCDR (keys);
3576         }
3577     }
3578
3579   /* Now search the sub-keymaps of this map.
3580      If we're in "firstonly" mode and have already found one, this
3581      point is not reached.  If we get one from lower down, either
3582      return it immediately (in firstonly mode) or tack it onto the
3583      end of the ones we've gotten so far.
3584      */
3585   for (submaps = keymap_submaps (map);
3586        !NILP (submaps);
3587        submaps = XCDR (submaps))
3588     {
3589       Lisp_Object key    = XCAR (XCAR (submaps));
3590       Lisp_Object submap = XCDR (XCAR (submaps));
3591       unsigned int lower_modifiers;
3592       int lower_keys_count = keys_count;
3593       unsigned int bucky;
3594
3595       submap = get_keymap (submap, 0, 0);
3596
3597       if (EQ (submap, map))
3598         /* Arrgh!  Some loser has introduced a loop... */
3599         continue;
3600
3601       /* If this is not a keymap, then that's probably because someone
3602          did an `fset' of a symbol that used to point to a map such that
3603          it no longer does.  Sigh.  Ignore this, and invalidate the cache
3604          so that it doesn't happen to us next time too.
3605          */
3606       if (NILP (submap))
3607         {
3608           XKEYMAP (map)->sub_maps_cache = Qt;
3609           continue;
3610         }
3611
3612       /* If the map is a "bucky" map, then add a bit to the
3613          modifiers_so_far list.
3614          Otherwise, add a new raw_key onto the end of keys_so_far.
3615          */
3616       bucky = MODIFIER_HASH_KEY_BITS (key);
3617       if (bucky != 0)
3618         lower_modifiers = (modifiers_so_far | bucky);
3619       else
3620         {
3621           struct key_data *so_far = c->keys_so_far;
3622           lower_modifiers = 0;
3623           so_far [lower_keys_count].keysym = key;
3624           so_far [lower_keys_count].modifiers = modifiers_so_far;
3625           lower_keys_count++;
3626         }
3627
3628       if (lower_keys_count >= c->keys_so_far_total_size)
3629         {
3630           int size = lower_keys_count + 50;
3631           if (! c->keys_so_far_malloced)
3632             {
3633               struct key_data *new = xnew_array (struct key_data, size);
3634               memcpy ((void *)new, (CONST void *)c->keys_so_far,
3635                       c->keys_so_far_total_size * sizeof (struct key_data));
3636             }
3637           else
3638             XREALLOC_ARRAY (c->keys_so_far, struct key_data, size);
3639
3640           c->keys_so_far_total_size = size;
3641           c->keys_so_far_malloced = 1;
3642         }
3643
3644       {
3645         Lisp_Object lower;
3646
3647         c->keys_count = lower_keys_count;
3648         c->modifiers_so_far = lower_modifiers;
3649
3650         lower = traverse_keymaps (submap, Qnil, where_is_recursive_mapper, c);
3651
3652         c->keys_count = keys_count;
3653         c->modifiers_so_far = modifiers_so_far;
3654
3655         if (!firstonly)
3656           result = nconc2 (lower, result);
3657         else if (!NILP (lower))
3658           return lower;
3659       }
3660     }
3661   return result;
3662 }
3663
3664
3665 static Lisp_Object
3666 where_is_internal (Lisp_Object definition, Lisp_Object *maps, int nmaps,
3667                    Lisp_Object firstonly, char *target_buffer)
3668 {
3669   /* This function can GC */
3670   Lisp_Object result = Qnil;
3671   int i;
3672   struct key_data raw[20];
3673   struct where_is_closure c;
3674
3675   c.definition = definition;
3676   c.shadow = maps;
3677   c.firstonly = !NILP (firstonly);
3678   c.target_buffer = target_buffer;
3679   c.keys_so_far = raw;
3680   c.keys_so_far_total_size = countof (raw);
3681   c.keys_so_far_malloced = 0;
3682
3683   /* Loop over each of the maps, accumulating the keys found.
3684      For each map searched, all previous maps shadow this one
3685      so that bogus keys aren't listed. */
3686   for (i = 0; i < nmaps; i++)
3687     {
3688       Lisp_Object this_result;
3689       c.shadow_count = i;
3690       /* Reset the things set in each iteration */
3691       c.keys_count = 0;
3692       c.modifiers_so_far = 0;
3693
3694       this_result = traverse_keymaps (maps[i], Qnil, where_is_recursive_mapper,
3695                                       &c);
3696       if (!NILP (firstonly))
3697         {
3698           result = this_result;
3699           if (!NILP (result))
3700             break;
3701         }
3702       else
3703         result = nconc2 (this_result, result);
3704     }
3705
3706   if (NILP (firstonly))
3707     result = Fnreverse (result);
3708
3709   if (c.keys_so_far_malloced)
3710     xfree (c.keys_so_far);
3711   return result;
3712 }
3713
3714 \f
3715 /************************************************************************/
3716 /*                         Describing keymaps                           */
3717 /************************************************************************/
3718
3719 DEFUN ("describe-bindings-internal", Fdescribe_bindings_internal, 1, 5, 0, /*
3720 Insert a list of all defined keys and their definitions in MAP.
3721 Optional second argument ALL says whether to include even "uninteresting"
3722 definitions (ie symbols with a non-nil `suppress-keymap' property.
3723 Third argument SHADOW is a list of keymaps whose bindings shadow those
3724 of map; if a binding is present in any shadowing map, it is not printed.
3725 Fourth argument PREFIX, if non-nil, should be a key sequence;
3726 only bindings which start with that key sequence will be printed.
3727 Fifth argument MOUSE-ONLY-P says to only print bindings for mouse clicks.
3728 */
3729        (map, all, shadow, prefix, mouse_only_p))
3730 {
3731   /* This function can GC */
3732
3733   /* #### At some point, this function should be changed to accept a
3734      BUFFER argument.  Currently, the BUFFER argument to
3735      describe_map_tree is being used only internally.  */
3736   describe_map_tree (map, NILP (all), shadow, prefix,
3737                      !NILP (mouse_only_p), Fcurrent_buffer ());
3738   return Qnil;
3739 }
3740
3741
3742 /* Insert a description of the key bindings in STARTMAP,
3743     followed by those of all maps reachable through STARTMAP.
3744    If PARTIAL is nonzero, omit certain "uninteresting" commands
3745     (such as `undefined').
3746    If SHADOW is non-nil, it is a list of other maps;
3747     don't mention keys which would be shadowed by any of them
3748    If PREFIX is non-nil, only list bindings which start with those keys.
3749  */
3750
3751 void
3752 describe_map_tree (Lisp_Object startmap, int partial, Lisp_Object shadow,
3753                    Lisp_Object prefix, int mice_only_p, Lisp_Object buffer)
3754 {
3755   /* This function can GC */
3756   Lisp_Object maps = Qnil;
3757   struct gcpro gcpro1, gcpro2;  /* get_keymap may autoload */
3758   GCPRO2 (maps, shadow);
3759
3760   maps = Faccessible_keymaps (startmap, prefix);
3761
3762   for (; !NILP (maps); maps = Fcdr (maps))
3763     {
3764       Lisp_Object sub_shadow = Qnil;
3765       Lisp_Object elt = Fcar (maps);
3766       Lisp_Object tail;
3767       int no_prefix = (VECTORP (Fcar (elt))
3768                        && XINT (Flength (Fcar (elt))) == 0);
3769       struct gcpro ngcpro1, ngcpro2, ngcpro3;
3770       NGCPRO3 (sub_shadow, elt, tail);
3771
3772       for (tail = shadow; CONSP (tail); tail = XCDR (tail))
3773         {
3774           Lisp_Object shmap = XCAR (tail);
3775
3776           /* If the sequence by which we reach this keymap is zero-length,
3777              then the shadow maps for this keymap are just SHADOW.  */
3778           if (no_prefix)
3779             ;
3780           /* If the sequence by which we reach this keymap actually has
3781              some elements, then the sequence's definition in SHADOW is
3782              what we should use.  */
3783           else
3784             {
3785               shmap = Flookup_key (shmap, Fcar (elt), Qt);
3786               if (CHARP (shmap))
3787                 shmap = Qnil;
3788             }
3789
3790           if (!NILP (shmap))
3791             {
3792               Lisp_Object shm = get_keymap (shmap, 0, 1);
3793               /* If shmap is not nil and not a keymap, it completely
3794                  shadows this map, so don't describe this map at all.  */
3795               if (!KEYMAPP (shm))
3796                 goto SKIP;
3797               sub_shadow = Fcons (shm, sub_shadow);
3798             }
3799         }
3800
3801       {
3802         /* Describe the contents of map MAP, assuming that this map
3803            itself is reached by the sequence of prefix keys KEYS (a vector).
3804            PARTIAL and SHADOW are as in `describe_map_tree'.  */
3805         Lisp_Object keysdesc
3806           = ((!no_prefix)
3807              ? concat2 (Fkey_description (Fcar (elt)), Vsingle_space_string)
3808              : Qnil);
3809         describe_map (Fcdr (elt), keysdesc,
3810                       describe_command,
3811                       partial,
3812                       sub_shadow,
3813                       mice_only_p,
3814                       buffer);
3815       }
3816     SKIP:
3817       NUNGCPRO;
3818     }
3819   UNGCPRO;
3820 }
3821
3822
3823 static void
3824 describe_command (Lisp_Object definition, Lisp_Object buffer)
3825 {
3826   /* This function can GC */
3827   int keymapp = !NILP (Fkeymapp (definition));
3828   struct gcpro gcpro1;
3829   GCPRO1 (definition);
3830
3831   Findent_to (make_int (16), make_int (3), buffer);
3832   if (keymapp)
3833     buffer_insert_c_string (XBUFFER (buffer), "<< ");
3834
3835   if (SYMBOLP (definition))
3836     {
3837       buffer_insert1 (XBUFFER (buffer), Fsymbol_name (definition));
3838     }
3839   else if (STRINGP (definition) || VECTORP (definition))
3840     {
3841       buffer_insert_c_string (XBUFFER (buffer), "Kbd Macro: ");
3842       buffer_insert1 (XBUFFER (buffer), Fkey_description (definition));
3843     }
3844   else if (COMPILED_FUNCTIONP (definition))
3845     buffer_insert_c_string (XBUFFER (buffer), "Anonymous Compiled Function");
3846   else if (CONSP (definition) && EQ (XCAR (definition), Qlambda))
3847     buffer_insert_c_string (XBUFFER (buffer), "Anonymous Lambda");
3848   else if (KEYMAPP (definition))
3849     {
3850       Lisp_Object name = XKEYMAP (definition)->name;
3851       if (STRINGP (name) || (SYMBOLP (name) && !NILP (name)))
3852         {
3853           buffer_insert_c_string (XBUFFER (buffer), "Prefix command ");
3854           if (SYMBOLP (name)
3855               && EQ (find_symbol_value (name), definition))
3856             buffer_insert1 (XBUFFER (buffer), Fsymbol_name (name));
3857           else
3858             {
3859               buffer_insert1 (XBUFFER (buffer), Fprin1_to_string (name, Qnil));
3860             }
3861         }
3862       else
3863         buffer_insert_c_string (XBUFFER (buffer), "Prefix Command");
3864     }
3865   else
3866     buffer_insert_c_string (XBUFFER (buffer), "??");
3867
3868   if (keymapp)
3869     buffer_insert_c_string (XBUFFER (buffer), " >>");
3870   buffer_insert_c_string (XBUFFER (buffer), "\n");
3871   UNGCPRO;
3872 }
3873
3874 struct describe_map_closure
3875   {
3876     Lisp_Object *list;   /* pointer to the list to update */
3877     Lisp_Object partial; /* whether to ignore suppressed commands */
3878     Lisp_Object shadow;  /* list of maps shadowing this one */
3879     Lisp_Object self;    /* this map */
3880     Lisp_Object self_root; /* this map, or some map that has this map as
3881                               a parent.  this is the base of the tree */
3882     int mice_only_p;     /* whether we are to display only button bindings */
3883   };
3884
3885 struct describe_map_shadow_closure
3886   {
3887     CONST struct key_data *raw_key;
3888     Lisp_Object self;
3889   };
3890
3891 static Lisp_Object
3892 describe_map_mapper_shadow_search (Lisp_Object map, void *arg)
3893 {
3894   struct describe_map_shadow_closure *c =
3895     (struct describe_map_shadow_closure *) arg;
3896
3897   if (EQ (map, c->self))
3898     return Qzero;               /* Not shadowed; terminate search */
3899
3900   return !NILP (keymap_lookup_directly (map,
3901                                         c->raw_key->keysym,
3902                                         c->raw_key->modifiers))
3903     ? Qt : Qnil;
3904 }
3905
3906
3907 static Lisp_Object
3908 keymap_lookup_inherited_mapper (Lisp_Object km, void *arg)
3909 {
3910   struct key_data *k = (struct key_data *) arg;
3911   return keymap_lookup_directly (km, k->keysym, k->modifiers);
3912 }
3913
3914
3915 static void
3916 describe_map_mapper (CONST struct key_data *key,
3917                      Lisp_Object binding,
3918                      void *describe_map_closure)
3919 {
3920   /* This function can GC */
3921   struct describe_map_closure *closure =
3922     (struct describe_map_closure *) describe_map_closure;
3923   Lisp_Object keysym = key->keysym;
3924   unsigned int modifiers = key->modifiers;
3925
3926   /* Don't mention suppressed commands.  */
3927   if (SYMBOLP (binding)
3928       && !NILP (closure->partial)
3929       && !NILP (Fget (binding, closure->partial, Qnil)))
3930     return;
3931
3932   /* If we're only supposed to display mouse bindings and this isn't one,
3933      then bug out. */
3934   if (closure->mice_only_p &&
3935       (! (EQ (keysym, Qbutton0) ||
3936           EQ (keysym, Qbutton1) ||
3937           EQ (keysym, Qbutton2) ||
3938           EQ (keysym, Qbutton3) ||
3939           EQ (keysym, Qbutton4) ||
3940           EQ (keysym, Qbutton5) ||
3941           EQ (keysym, Qbutton6) ||
3942           EQ (keysym, Qbutton7) ||
3943           EQ (keysym, Qbutton0up) ||
3944           EQ (keysym, Qbutton1up) ||
3945           EQ (keysym, Qbutton2up) ||
3946           EQ (keysym, Qbutton3up) ||
3947           EQ (keysym, Qbutton4up) ||
3948           EQ (keysym, Qbutton5up) ||
3949           EQ (keysym, Qbutton6up) ||
3950           EQ (keysym, Qbutton7up))))
3951     return;
3952
3953   /* If this command in this map is shadowed by some other map, ignore it. */
3954   {
3955     Lisp_Object tail;
3956
3957     for (tail = closure->shadow; CONSP (tail); tail = XCDR (tail))
3958       {
3959         QUIT;
3960         if (!NILP (traverse_keymaps (XCAR (tail), Qnil,
3961                                      keymap_lookup_inherited_mapper,
3962                                      /* Cast to discard `const' */
3963                                      (void *)key)))
3964           return;
3965       }
3966   }
3967
3968   /* If this key is in some map of which this map is a parent, then ignore
3969      it (in that case, it has been shadowed).
3970      */
3971   {
3972     Lisp_Object sh;
3973     struct describe_map_shadow_closure c;
3974     c.raw_key = key;
3975     c.self = closure->self;
3976
3977     sh = traverse_keymaps (closure->self_root, Qnil,
3978                            describe_map_mapper_shadow_search, &c);
3979     if (!NILP (sh) && !ZEROP (sh))
3980       return;
3981   }
3982
3983   /* Otherwise add it to the list to be sorted. */
3984   *(closure->list) = Fcons (Fcons (Fcons (keysym, make_int (modifiers)),
3985                                    binding),
3986                             *(closure->list));
3987 }
3988
3989
3990 static int
3991 describe_map_sort_predicate (Lisp_Object obj1, Lisp_Object obj2,
3992                              Lisp_Object pred)
3993 {
3994   /* obj1 and obj2 are conses of the form
3995      ( ( <keysym> . <modifiers> ) . <binding> )
3996      keysym and modifiers are used, binding is ignored.
3997    */
3998   unsigned int bit1, bit2;
3999   obj1 = XCAR (obj1);
4000   obj2 = XCAR (obj2);
4001   bit1 = XINT (XCDR (obj1));
4002   bit2 = XINT (XCDR (obj2));
4003   if (bit1 != bit2)
4004     return bit1 < bit2 ? 1 : -1;
4005   else
4006     return map_keymap_sort_predicate (obj1, obj2, pred);
4007 }
4008
4009 /* Elide 2 or more consecutive numeric keysyms bound to the same thing,
4010    or 2 or more symbolic keysyms that are bound to the same thing and
4011    have consecutive character-set-properties.
4012  */
4013 static int
4014 elide_next_two_p (Lisp_Object list)
4015 {
4016   Lisp_Object s1, s2;
4017
4018   if (NILP (XCDR (list)))
4019     return 0;
4020
4021   /* next two bindings differ */
4022   if (!EQ (XCDR (XCAR (list)),
4023            XCDR (XCAR (XCDR (list)))))
4024     return 0;
4025
4026   /* next two modifier-sets differ */
4027   if (!EQ (XCDR (XCAR (XCAR (list))),
4028            XCDR (XCAR (XCAR (XCDR (list))))))
4029     return 0;
4030
4031   s1 = XCAR (XCAR (XCAR (list)));
4032   s2 = XCAR (XCAR (XCAR (XCDR (list))));
4033
4034   if (SYMBOLP (s1))
4035     {
4036       Lisp_Object code = Fget (s1, Vcharacter_set_property, Qnil);
4037       if (CHAR_OR_CHAR_INTP (code))
4038         {
4039           s1 = code;
4040           CHECK_CHAR_COERCE_INT (s1);
4041         }
4042       else return 0;
4043     }
4044   if (SYMBOLP (s2))
4045     {
4046       Lisp_Object code = Fget (s2, Vcharacter_set_property, Qnil);
4047       if (CHAR_OR_CHAR_INTP (code))
4048         {
4049           s2 = code;
4050           CHECK_CHAR_COERCE_INT (s2);
4051         }
4052       else return 0;
4053     }
4054
4055   return (XCHAR (s1)     == XCHAR (s2) ||
4056           XCHAR (s1) + 1 == XCHAR (s2));
4057 }
4058
4059
4060 static Lisp_Object
4061 describe_map_parent_mapper (Lisp_Object keymap, void *arg)
4062 {
4063   /* This function can GC */
4064   struct describe_map_closure *describe_map_closure =
4065     (struct describe_map_closure *) arg;
4066   describe_map_closure->self = keymap;
4067   map_keymap (XKEYMAP (keymap)->table,
4068               0, /* don't sort: we'll do it later */
4069               describe_map_mapper, describe_map_closure);
4070   return Qnil;
4071 }
4072
4073
4074 /* Describe the contents of map MAP, assuming that this map itself is
4075    reached by the sequence of prefix keys KEYS (a string or vector).
4076    PARTIAL, SHADOW, NOMENU are as in `describe_map_tree' above.  */
4077
4078 static void
4079 describe_map (Lisp_Object keymap, Lisp_Object elt_prefix,
4080               void (*elt_describer) (Lisp_Object, Lisp_Object),
4081               int partial,
4082               Lisp_Object shadow,
4083               int mice_only_p,
4084               Lisp_Object buffer)
4085 {
4086   /* This function can GC */
4087   struct describe_map_closure describe_map_closure;
4088   Lisp_Object list = Qnil;
4089   struct buffer *buf = XBUFFER (buffer);
4090   Emchar printable_min = (CHAR_OR_CHAR_INTP (buf->ctl_arrow)
4091                           ? XCHAR_OR_CHAR_INT (buf->ctl_arrow)
4092                           : ((EQ (buf->ctl_arrow, Qt)
4093                               || EQ (buf->ctl_arrow, Qnil))
4094                              ? 256 : 160));
4095   int elided = 0;
4096   struct gcpro gcpro1, gcpro2, gcpro3, gcpro4;
4097
4098   keymap = get_keymap (keymap, 1, 1);
4099   describe_map_closure.partial = (partial ? Qsuppress_keymap : Qnil);
4100   describe_map_closure.shadow = shadow;
4101   describe_map_closure.list = &list;
4102   describe_map_closure.self_root = keymap;
4103   describe_map_closure.mice_only_p = mice_only_p;
4104
4105   GCPRO4 (keymap, elt_prefix, shadow, list);
4106
4107   traverse_keymaps (keymap, Qnil,
4108                     describe_map_parent_mapper, &describe_map_closure);
4109
4110   if (!NILP (list))
4111     {
4112       list = list_sort (list, Qnil, describe_map_sort_predicate);
4113       buffer_insert_c_string (buf, "\n");
4114       while (!NILP (list))
4115         {
4116           Lisp_Object elt = XCAR (XCAR (list));
4117           Lisp_Object keysym = XCAR (elt);
4118           unsigned int modifiers = XINT (XCDR (elt));
4119
4120           if (!NILP (elt_prefix))
4121             buffer_insert_lisp_string (buf, elt_prefix);
4122
4123           if (modifiers & MOD_META)    buffer_insert_c_string (buf, "M-");
4124           if (modifiers & MOD_CONTROL) buffer_insert_c_string (buf, "C-");
4125           if (modifiers & MOD_SUPER)   buffer_insert_c_string (buf, "S-");
4126           if (modifiers & MOD_HYPER)   buffer_insert_c_string (buf, "H-");
4127           if (modifiers & MOD_ALT)     buffer_insert_c_string (buf, "Alt-");
4128           if (modifiers & MOD_SHIFT)   buffer_insert_c_string (buf, "Sh-");
4129           if (SYMBOLP (keysym))
4130             {
4131               Lisp_Object code = Fget (keysym, Vcharacter_set_property, Qnil);
4132               Emchar c = (CHAR_OR_CHAR_INTP (code)
4133                           ? XCHAR_OR_CHAR_INT (code) : (Emchar) -1);
4134               /* Calling Fsingle_key_description() would cons more */
4135 #if 0                           /* This is bogus */
4136               if (EQ (keysym, QKlinefeed))
4137                 buffer_insert_c_string (buf, "LFD");
4138               else if (EQ (keysym, QKtab))
4139                 buffer_insert_c_string (buf, "TAB");
4140               else if (EQ (keysym, QKreturn))
4141                 buffer_insert_c_string (buf, "RET");
4142               else if (EQ (keysym, QKescape))
4143                 buffer_insert_c_string (buf, "ESC");
4144               else if (EQ (keysym, QKdelete))
4145                 buffer_insert_c_string (buf, "DEL");
4146               else if (EQ (keysym, QKspace))
4147                 buffer_insert_c_string (buf, "SPC");
4148               else if (EQ (keysym, QKbackspace))
4149                 buffer_insert_c_string (buf, "BS");
4150               else
4151 #endif
4152                 if (c >= printable_min)
4153                   buffer_insert_emacs_char (buf, c);
4154                 else buffer_insert1 (buf, Fsymbol_name (keysym));
4155             }
4156           else if (CHARP (keysym))
4157             buffer_insert_emacs_char (buf, XCHAR (keysym));
4158           else
4159             buffer_insert_c_string (buf, "---bad keysym---");
4160
4161           if (elided)
4162             elided = 0;
4163           else
4164             {
4165               int k = 0;
4166
4167               while (elide_next_two_p (list))
4168                 {
4169                   k++;
4170                   list = XCDR (list);
4171                 }
4172               if (k != 0)
4173                 {
4174                   if (k == 1)
4175                     buffer_insert_c_string (buf, ", ");
4176                   else
4177                     buffer_insert_c_string (buf, " .. ");
4178                   elided = 1;
4179                   continue;
4180                 }
4181             }
4182
4183           /* Print a description of the definition of this character.  */
4184           (*elt_describer) (XCDR (XCAR (list)), buffer);
4185           list = XCDR (list);
4186         }
4187     }
4188   UNGCPRO;
4189 }
4190
4191 \f
4192 void
4193 syms_of_keymap (void)
4194 {
4195   defsymbol (&Qminor_mode_map_alist, "minor-mode-map-alist");
4196
4197   defsymbol (&Qkeymapp, "keymapp");
4198
4199   defsymbol (&Qsuppress_keymap, "suppress-keymap");
4200
4201   defsymbol (&Qmodeline_map, "modeline-map");
4202   defsymbol (&Qtoolbar_map, "toolbar-map");
4203
4204   DEFSUBR (Fkeymap_parents);
4205   DEFSUBR (Fset_keymap_parents);
4206   DEFSUBR (Fkeymap_name);
4207   DEFSUBR (Fset_keymap_name);
4208   DEFSUBR (Fkeymap_prompt);
4209   DEFSUBR (Fset_keymap_prompt);
4210   DEFSUBR (Fkeymap_default_binding);
4211   DEFSUBR (Fset_keymap_default_binding);
4212
4213   DEFSUBR (Fkeymapp);
4214   DEFSUBR (Fmake_keymap);
4215   DEFSUBR (Fmake_sparse_keymap);
4216
4217   DEFSUBR (Fcopy_keymap);
4218   DEFSUBR (Fkeymap_fullness);
4219   DEFSUBR (Fmap_keymap);
4220   DEFSUBR (Fevent_matches_key_specifier_p);
4221   DEFSUBR (Fdefine_key);
4222   DEFSUBR (Flookup_key);
4223   DEFSUBR (Fkey_binding);
4224   DEFSUBR (Fuse_global_map);
4225   DEFSUBR (Fuse_local_map);
4226   DEFSUBR (Fcurrent_local_map);
4227   DEFSUBR (Fcurrent_global_map);
4228   DEFSUBR (Fcurrent_keymaps);
4229   DEFSUBR (Faccessible_keymaps);
4230   DEFSUBR (Fkey_description);
4231   DEFSUBR (Fsingle_key_description);
4232   DEFSUBR (Fwhere_is_internal);
4233   DEFSUBR (Fdescribe_bindings_internal);
4234
4235   DEFSUBR (Ftext_char_description);
4236
4237   defsymbol (&Qcontrol, "control");
4238   defsymbol (&Qctrl, "ctrl");
4239   defsymbol (&Qmeta, "meta");
4240   defsymbol (&Qsuper, "super");
4241   defsymbol (&Qhyper, "hyper");
4242   defsymbol (&Qalt, "alt");
4243   defsymbol (&Qshift, "shift");
4244   defsymbol (&Qbutton0, "button0");
4245   defsymbol (&Qbutton1, "button1");
4246   defsymbol (&Qbutton2, "button2");
4247   defsymbol (&Qbutton3, "button3");
4248   defsymbol (&Qbutton4, "button4");
4249   defsymbol (&Qbutton5, "button5");
4250   defsymbol (&Qbutton6, "button6");
4251   defsymbol (&Qbutton7, "button7");
4252   defsymbol (&Qbutton0up, "button0up");
4253   defsymbol (&Qbutton1up, "button1up");
4254   defsymbol (&Qbutton2up, "button2up");
4255   defsymbol (&Qbutton3up, "button3up");
4256   defsymbol (&Qbutton4up, "button4up");
4257   defsymbol (&Qbutton5up, "button5up");
4258   defsymbol (&Qbutton6up, "button6up");
4259   defsymbol (&Qbutton7up, "button7up");
4260   defsymbol (&Qmouse_1, "mouse-1");
4261   defsymbol (&Qmouse_2, "mouse-2");
4262   defsymbol (&Qmouse_3, "mouse-3");
4263   defsymbol (&Qmouse_4, "mouse-4");
4264   defsymbol (&Qmouse_5, "mouse-5");
4265   defsymbol (&Qdown_mouse_1, "down-mouse-1");
4266   defsymbol (&Qdown_mouse_2, "down-mouse-2");
4267   defsymbol (&Qdown_mouse_3, "down-mouse-3");
4268   defsymbol (&Qdown_mouse_4, "down-mouse-4");
4269   defsymbol (&Qdown_mouse_5, "down-mouse-5");
4270   defsymbol (&Qmenu_selection, "menu-selection");
4271   defsymbol (&QLFD, "LFD");
4272   defsymbol (&QTAB, "TAB");
4273   defsymbol (&QRET, "RET");
4274   defsymbol (&QESC, "ESC");
4275   defsymbol (&QDEL, "DEL");
4276   defsymbol (&QBS, "BS");
4277 }
4278
4279 void
4280 vars_of_keymap (void)
4281 {
4282   DEFVAR_LISP ("meta-prefix-char", &Vmeta_prefix_char /*
4283 Meta-prefix character.
4284 This character followed by some character `foo' turns into `Meta-foo'.
4285 This can be any form recognized as a single key specifier.
4286 To disable the meta-prefix-char, set it to a negative number.
4287 */ );
4288   Vmeta_prefix_char = make_char (033);
4289
4290   DEFVAR_LISP ("mouse-grabbed-buffer", &Vmouse_grabbed_buffer /*
4291 A buffer which should be consulted first for all mouse activity.
4292 When a mouse-click is processed, it will first be looked up in the
4293 local-map of this buffer, and then through the normal mechanism if there
4294 is no binding for that click.  This buffer's value of `mode-motion-hook'
4295 will be consulted instead of the `mode-motion-hook' of the buffer of the
4296 window under the mouse.  You should *bind* this, not set it.
4297 */ );
4298   Vmouse_grabbed_buffer = Qnil;
4299
4300   DEFVAR_LISP ("overriding-local-map", &Voverriding_local_map /*
4301 Keymap that overrides all other local keymaps.
4302 If this variable is non-nil, it is used as a keymap instead of the
4303 buffer's local map, and the minor mode keymaps and extent-local keymaps.
4304 You should *bind* this, not set it.
4305 */ );
4306   Voverriding_local_map = Qnil;
4307
4308   Fset (Qminor_mode_map_alist, Qnil);
4309
4310   DEFVAR_LISP ("key-translation-map", &Vkey_translation_map /*
4311 Keymap of key translations that can override keymaps.
4312 This keymap works like `function-key-map', but comes after that,
4313 and applies even for keys that have ordinary bindings.
4314 */ );
4315   Vkey_translation_map = Qnil;
4316
4317   DEFVAR_LISP ("vertical-divider-map", &Vvertical_divider_map /*
4318 Keymap which handles mouse clicks over vertical dividers.
4319 */ );
4320   Vvertical_divider_map = Qnil;
4321
4322   DEFVAR_INT ("keymap-tick", &keymap_tick /*
4323 Incremented for each change to any keymap.
4324 */ );
4325   keymap_tick = 0;
4326
4327   staticpro (&Vcurrent_global_map);
4328
4329   Vsingle_space_string = make_string_nocopy ((CONST Bufbyte *) " ", 1);
4330   staticpro (&Vsingle_space_string);
4331 }
4332
4333 void
4334 complex_vars_of_keymap (void)
4335 {
4336   /* This function can GC */
4337   Lisp_Object ESC_prefix = intern ("ESC-prefix");
4338   Lisp_Object meta_disgustitute;
4339
4340   Vcurrent_global_map = Fmake_keymap (Qnil);
4341
4342   meta_disgustitute = Fmake_keymap (Qnil);
4343   Ffset (ESC_prefix, meta_disgustitute);
4344   /* no need to protect meta_disgustitute, though */
4345   keymap_store_internal (MAKE_MODIFIER_HASH_KEY (MOD_META),
4346                          XKEYMAP (Vcurrent_global_map),
4347                          meta_disgustitute);
4348   XKEYMAP (Vcurrent_global_map)->sub_maps_cache = Qt;
4349
4350   Vkey_translation_map = Fmake_sparse_keymap (intern ("key-translation-map"));
4351 }