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