comparison src/keymap.c @ 428:3ecd8885ac67 r21-2-22

Import from CVS: tag r21-2-22
author cvs
date Mon, 13 Aug 2007 11:28:15 +0200
parents
children 84b14dcb0985
comparison
equal deleted inserted replaced
427:0a0253eac470 428:3ecd8885ac67
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
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
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
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
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
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
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
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
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
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
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
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
1984 /************************************************************************/
1985 /* Looking up keys in keymaps */
1986 /************************************************************************/
1987
1988 /* We need a very fast (i.e., non-consing) version of lookup-key in order
1989 to make where-is-internal really fly. */
1990
1991 struct raw_lookup_key_mapper_closure
1992 {
1993 int remaining;
1994 CONST struct key_data *raw_keys;
1995 int raw_keys_count;
1996 int keys_so_far;
1997 int accept_default;
1998 };
1999
2000 static Lisp_Object raw_lookup_key_mapper (Lisp_Object k, void *);
2001
2002 /* Caller should gc-protect args (keymaps may autoload) */
2003 static Lisp_Object
2004 raw_lookup_key (Lisp_Object keymap,
2005 CONST struct key_data *raw_keys, int raw_keys_count,
2006 int keys_so_far, int accept_default)
2007 {
2008 /* This function can GC */
2009 struct raw_lookup_key_mapper_closure c;
2010 c.remaining = raw_keys_count - 1;
2011 c.raw_keys = raw_keys;
2012 c.raw_keys_count = raw_keys_count;
2013 c.keys_so_far = keys_so_far;
2014 c.accept_default = accept_default;
2015
2016 return traverse_keymaps (keymap, Qnil, raw_lookup_key_mapper, &c);
2017 }
2018
2019 static Lisp_Object
2020 raw_lookup_key_mapper (Lisp_Object k, void *arg)
2021 {
2022 /* This function can GC */
2023 struct raw_lookup_key_mapper_closure *c =
2024 (struct raw_lookup_key_mapper_closure *) arg;
2025 int accept_default = c->accept_default;
2026 int remaining = c->remaining;
2027 int keys_so_far = c->keys_so_far;
2028 CONST struct key_data *raw_keys = c->raw_keys;
2029 Lisp_Object cmd;
2030
2031 if (! meta_prefix_char_p (&(raw_keys[0])))
2032 {
2033 /* Normal case: every case except the meta-hack (see below). */
2034 cmd = keymap_lookup_1 (k, &(raw_keys[0]), accept_default);
2035
2036 if (remaining == 0)
2037 /* Return whatever we found if we're out of keys */
2038 ;
2039 else if (NILP (cmd))
2040 /* Found nothing (though perhaps parent map may have binding) */
2041 ;
2042 else if (NILP (Fkeymapp (cmd)))
2043 /* Didn't find a keymap, and we have more keys.
2044 * Return a fixnum to indicate that keys were too long.
2045 */
2046 cmd = make_int (keys_so_far + 1);
2047 else
2048 cmd = raw_lookup_key (cmd, raw_keys + 1, remaining,
2049 keys_so_far + 1, accept_default);
2050 }
2051 else
2052 {
2053 /* This is a hack so that looking up a key-sequence whose last
2054 * element is the meta-prefix-char will return the keymap that
2055 * the "meta" keys are stored in, if there is no binding for
2056 * the meta-prefix-char (and if this map has a "meta" submap).
2057 * If this map doesn't have a "meta" submap, then the
2058 * meta-prefix-char is looked up just like any other key.
2059 */
2060 if (remaining == 0)
2061 {
2062 /* First look for the prefix-char directly */
2063 cmd = keymap_lookup_1 (k, &(raw_keys[0]), accept_default);
2064 if (NILP (cmd))
2065 {
2066 /* Do kludgy return of the meta-map */
2067 cmd = Fgethash (MAKE_MODIFIER_HASH_KEY (MOD_META),
2068 XKEYMAP (k)->table, Qnil);
2069 }
2070 }
2071 else
2072 {
2073 /* Search for the prefix-char-prefixed sequence directly */
2074 cmd = keymap_lookup_1 (k, &(raw_keys[0]), accept_default);
2075 cmd = get_keymap (cmd, 0, 1);
2076 if (!NILP (cmd))
2077 cmd = raw_lookup_key (cmd, raw_keys + 1, remaining,
2078 keys_so_far + 1, accept_default);
2079 else if ((raw_keys[1].modifiers & MOD_META) == 0)
2080 {
2081 struct key_data metified;
2082 metified.keysym = raw_keys[1].keysym;
2083 metified.modifiers = raw_keys[1].modifiers | MOD_META;
2084
2085 /* Search for meta-next-char sequence directly */
2086 cmd = keymap_lookup_1 (k, &metified, accept_default);
2087 if (remaining == 1)
2088 ;
2089 else
2090 {
2091 cmd = get_keymap (cmd, 0, 1);
2092 if (!NILP (cmd))
2093 cmd = raw_lookup_key (cmd, raw_keys + 2, remaining - 1,
2094 keys_so_far + 2,
2095 accept_default);
2096 }
2097 }
2098 }
2099 }
2100 if (accept_default && NILP (cmd))
2101 cmd = XKEYMAP (k)->default_binding;
2102 return cmd;
2103 }
2104
2105 /* Value is number if `keys' is too long; NIL if valid but has no definition.*/
2106 /* Caller should gc-protect arguments */
2107 static Lisp_Object
2108 lookup_keys (Lisp_Object keymap, int nkeys, Lisp_Object *keys,
2109 int accept_default)
2110 {
2111 /* This function can GC */
2112 struct key_data kkk[20];
2113 struct key_data *raw_keys;
2114 int i;
2115
2116 if (nkeys == 0)
2117 return Qnil;
2118
2119 if (nkeys < (countof (kkk)))
2120 raw_keys = kkk;
2121 else
2122 raw_keys = alloca_array (struct key_data, nkeys);
2123
2124 for (i = 0; i < nkeys; i++)
2125 {
2126 define_key_parser (keys[i], &(raw_keys[i]));
2127 }
2128 return raw_lookup_key (keymap, raw_keys, nkeys, 0, accept_default);
2129 }
2130
2131 static Lisp_Object
2132 lookup_events (Lisp_Object event_head, int nmaps, Lisp_Object keymaps[],
2133 int accept_default)
2134 {
2135 /* This function can GC */
2136 struct key_data kkk[20];
2137 Lisp_Object event;
2138
2139 int nkeys;
2140 struct key_data *raw_keys;
2141 Lisp_Object tem = Qnil;
2142 struct gcpro gcpro1, gcpro2;
2143 int iii;
2144
2145 CHECK_LIVE_EVENT (event_head);
2146
2147 nkeys = event_chain_count (event_head);
2148
2149 if (nkeys < (countof (kkk)))
2150 raw_keys = kkk;
2151 else
2152 raw_keys = alloca_array (struct key_data, nkeys);
2153
2154 nkeys = 0;
2155 EVENT_CHAIN_LOOP (event, event_head)
2156 define_key_parser (event, &(raw_keys[nkeys++]));
2157 GCPRO2 (keymaps[0], event_head);
2158 gcpro1.nvars = nmaps;
2159 /* ####raw_keys[].keysym slots aren't gc-protected. We rely (but shouldn't)
2160 * on somebody else somewhere (obarray) having a pointer to all keysyms. */
2161 for (iii = 0; iii < nmaps; iii++)
2162 {
2163 tem = raw_lookup_key (keymaps[iii], raw_keys, nkeys, 0,
2164 accept_default);
2165 if (INTP (tem))
2166 {
2167 /* Too long in some local map means don't look at global map */
2168 tem = Qnil;
2169 break;
2170 }
2171 else if (!NILP (tem))
2172 break;
2173 }
2174 UNGCPRO;
2175 return tem;
2176 }
2177
2178 DEFUN ("lookup-key", Flookup_key, 2, 3, 0, /*
2179 In keymap KEYMAP, look up key-sequence KEYS. Return the definition.
2180 Nil is returned if KEYS is unbound. See documentation of `define-key'
2181 for valid key definitions and key-sequence specifications.
2182 A number is returned if KEYS is "too long"; that is, the leading
2183 characters fail to be a valid sequence of prefix characters in KEYMAP.
2184 The number is how many characters at the front of KEYS
2185 it takes to reach a non-prefix command.
2186 */
2187 (keymap, keys, accept_default))
2188 {
2189 /* This function can GC */
2190 if (VECTORP (keys))
2191 return lookup_keys (keymap,
2192 XVECTOR_LENGTH (keys),
2193 XVECTOR_DATA (keys),
2194 !NILP (accept_default));
2195 else if (SYMBOLP (keys) || CHAR_OR_CHAR_INTP (keys) || CONSP (keys))
2196 return lookup_keys (keymap, 1, &keys, !NILP (accept_default));
2197 else if (STRINGP (keys))
2198 {
2199 int length = XSTRING_CHAR_LENGTH (keys);
2200 int i;
2201 struct key_data *raw_keys = alloca_array (struct key_data, length);
2202 if (length == 0)
2203 return Qnil;
2204
2205 for (i = 0; i < length; i++)
2206 {
2207 Emchar n = string_char (XSTRING (keys), i);
2208 define_key_parser (make_char (n), &(raw_keys[i]));
2209 }
2210 return raw_lookup_key (keymap, raw_keys, length, 0,
2211 !NILP (accept_default));
2212 }
2213 else
2214 {
2215 keys = wrong_type_argument (Qsequencep, keys);
2216 return Flookup_key (keymap, keys, accept_default);
2217 }
2218 }
2219
2220 /* Given a key sequence, returns a list of keymaps to search for bindings.
2221 Does all manner of semi-hairy heuristics, like looking in the current
2222 buffer's map before looking in the global map and looking in the local
2223 map of the buffer in which the mouse was clicked in event0 is a click.
2224
2225 It would be kind of nice if this were in Lisp so that this semi-hairy
2226 semi-heuristic command-lookup behavior could be readily understood and
2227 customised. However, this needs to be pretty fast, or performance of
2228 keyboard macros goes to shit; putting this in lisp slows macros down
2229 2-3x. And they're already slower than v18 by 5-6x.
2230 */
2231
2232 struct relevant_maps
2233 {
2234 int nmaps;
2235 unsigned int max_maps;
2236 Lisp_Object *maps;
2237 struct gcpro *gcpro;
2238 };
2239
2240 static void get_relevant_extent_keymaps (Lisp_Object pos,
2241 Lisp_Object buffer_or_string,
2242 Lisp_Object glyph,
2243 struct relevant_maps *closure);
2244 static void get_relevant_minor_maps (Lisp_Object buffer,
2245 struct relevant_maps *closure);
2246
2247 static void
2248 relevant_map_push (Lisp_Object map, struct relevant_maps *closure)
2249 {
2250 unsigned int nmaps = closure->nmaps;
2251
2252 if (!KEYMAPP (map))
2253 return;
2254 closure->nmaps = nmaps + 1;
2255 if (nmaps < closure->max_maps)
2256 {
2257 closure->maps[nmaps] = map;
2258 closure->gcpro->nvars = nmaps;
2259 }
2260 }
2261
2262 static int
2263 get_relevant_keymaps (Lisp_Object keys,
2264 int max_maps, Lisp_Object maps[])
2265 {
2266 /* This function can GC */
2267 Lisp_Object terminal = Qnil;
2268 struct gcpro gcpro1;
2269 struct relevant_maps closure;
2270 struct console *con;
2271
2272 GCPRO1 (*maps);
2273 gcpro1.nvars = 0;
2274 closure.nmaps = 0;
2275 closure.max_maps = max_maps;
2276 closure.maps = maps;
2277 closure.gcpro = &gcpro1;
2278
2279 if (EVENTP (keys))
2280 terminal = event_chain_tail (keys);
2281 else if (VECTORP (keys))
2282 {
2283 int len = XVECTOR_LENGTH (keys);
2284 if (len > 0)
2285 terminal = XVECTOR_DATA (keys)[len - 1];
2286 }
2287
2288 if (EVENTP (terminal))
2289 {
2290 CHECK_LIVE_EVENT (terminal);
2291 con = event_console_or_selected (terminal);
2292 }
2293 else
2294 con = XCONSOLE (Vselected_console);
2295
2296 if (KEYMAPP (con->overriding_terminal_local_map)
2297 || KEYMAPP (Voverriding_local_map))
2298 {
2299 if (KEYMAPP (con->overriding_terminal_local_map))
2300 relevant_map_push (con->overriding_terminal_local_map, &closure);
2301 if (KEYMAPP (Voverriding_local_map))
2302 relevant_map_push (Voverriding_local_map, &closure);
2303 }
2304 else if (!EVENTP (terminal)
2305 || (XEVENT (terminal)->event_type != button_press_event
2306 && XEVENT (terminal)->event_type != button_release_event))
2307 {
2308 Lisp_Object tem;
2309 XSETBUFFER (tem, current_buffer);
2310 /* It's not a mouse event; order of keymaps searched is:
2311 o keymap of any/all extents under the mouse
2312 o minor-mode maps
2313 o local-map of current-buffer
2314 o global-map
2315 */
2316 /* The terminal element of the lookup may be nil or a keysym.
2317 In those cases we don't want to check for an extent
2318 keymap. */
2319 if (EVENTP (terminal))
2320 {
2321 get_relevant_extent_keymaps (make_int (BUF_PT (current_buffer)),
2322 tem, Qnil, &closure);
2323 }
2324 get_relevant_minor_maps (tem, &closure);
2325
2326 tem = current_buffer->keymap;
2327 if (!NILP (tem))
2328 relevant_map_push (tem, &closure);
2329 }
2330 #ifdef HAVE_WINDOW_SYSTEM
2331 else
2332 {
2333 /* It's a mouse event; order of keymaps searched is:
2334 o vertical-divider-map, if event is over a divider
2335 o local-map of mouse-grabbed-buffer
2336 o keymap of any/all extents under the mouse
2337 if the mouse is over a modeline:
2338 o modeline-map of buffer corresponding to that modeline
2339 o else, local-map of buffer under the mouse
2340 o minor-mode maps
2341 o local-map of current-buffer
2342 o global-map
2343 */
2344 Lisp_Object window = Fevent_window (terminal);
2345
2346 if (!NILP (Fevent_over_vertical_divider_p (terminal)))
2347 {
2348 if (KEYMAPP (Vvertical_divider_map))
2349 relevant_map_push (Vvertical_divider_map, &closure);
2350 }
2351
2352 if (BUFFERP (Vmouse_grabbed_buffer))
2353 {
2354 Lisp_Object map = XBUFFER (Vmouse_grabbed_buffer)->keymap;
2355
2356 get_relevant_minor_maps (Vmouse_grabbed_buffer, &closure);
2357 if (!NILP (map))
2358 relevant_map_push (map, &closure);
2359 }
2360
2361 if (!NILP (window))
2362 {
2363 Lisp_Object buffer = Fwindow_buffer (window);
2364
2365 if (!NILP (buffer))
2366 {
2367 if (!NILP (Fevent_over_modeline_p (terminal)))
2368 {
2369 Lisp_Object map = symbol_value_in_buffer (Qmodeline_map,
2370 buffer);
2371
2372 get_relevant_extent_keymaps
2373 (Fevent_modeline_position (terminal),
2374 XBUFFER (buffer)->generated_modeline_string,
2375 /* #### third arg should maybe be a glyph. */
2376 Qnil, &closure);
2377
2378 if (!UNBOUNDP (map) && !NILP (map))
2379 relevant_map_push (get_keymap (map, 1, 1), &closure);
2380 }
2381 else
2382 {
2383 get_relevant_extent_keymaps (Fevent_point (terminal), buffer,
2384 Fevent_glyph_extent (terminal),
2385 &closure);
2386 }
2387
2388 if (!EQ (buffer, Vmouse_grabbed_buffer)) /* already pushed */
2389 {
2390 Lisp_Object map = XBUFFER (buffer)->keymap;
2391
2392 get_relevant_minor_maps (buffer, &closure);
2393 if (!NILP(map))
2394 relevant_map_push (map, &closure);
2395 }
2396 }
2397 }
2398 else if (!NILP (Fevent_over_toolbar_p (terminal)))
2399 {
2400 Lisp_Object map = Fsymbol_value (Qtoolbar_map);
2401
2402 if (!UNBOUNDP (map) && !NILP (map))
2403 relevant_map_push (map, &closure);
2404 }
2405 }
2406 #endif /* HAVE_WINDOW_SYSTEM */
2407
2408 {
2409 int nmaps = closure.nmaps;
2410 /* Silently truncate at 100 keymaps to prevent infinite lossage */
2411 if (nmaps >= max_maps && max_maps > 0)
2412 maps[max_maps - 1] = Vcurrent_global_map;
2413 else
2414 maps[nmaps] = Vcurrent_global_map;
2415 UNGCPRO;
2416 return nmaps + 1;
2417 }
2418 }
2419
2420 /* Returns a set of keymaps extracted from the extents at POS in
2421 BUFFER_OR_STRING. The GLYPH arg, if specified, is one more extent
2422 to look for a keymap in, and if it has one, its keymap will be the
2423 first element in the list returned. This is so we can correctly
2424 search the keymaps associated with glyphs which may be physically
2425 disjoint from their extents: for example, if a glyph is out in the
2426 margin, we should still consult the keymap of that glyph's extent,
2427 which may not itself be under the mouse.
2428 */
2429
2430 static void
2431 get_relevant_extent_keymaps (Lisp_Object pos, Lisp_Object buffer_or_string,
2432 Lisp_Object glyph,
2433 struct relevant_maps *closure)
2434 {
2435 /* This function can GC */
2436 /* the glyph keymap, if any, comes first.
2437 (Processing it twice is no big deal: noop.) */
2438 if (!NILP (glyph))
2439 {
2440 Lisp_Object keymap = Fextent_property (glyph, Qkeymap, Qnil);
2441 if (!NILP (keymap))
2442 relevant_map_push (get_keymap (keymap, 1, 1), closure);
2443 }
2444
2445 /* Next check the extents at the text position, if any */
2446 if (!NILP (pos))
2447 {
2448 Lisp_Object extent;
2449 for (extent = Fextent_at (pos, buffer_or_string, Qkeymap, Qnil, Qnil);
2450 !NILP (extent);
2451 extent = Fextent_at (pos, buffer_or_string, Qkeymap, extent, Qnil))
2452 {
2453 Lisp_Object keymap = Fextent_property (extent, Qkeymap, Qnil);
2454 if (!NILP (keymap))
2455 relevant_map_push (get_keymap (keymap, 1, 1), closure);
2456 QUIT;
2457 }
2458 }
2459 }
2460
2461 static Lisp_Object
2462 minor_mode_keymap_predicate (Lisp_Object assoc, Lisp_Object buffer)
2463 {
2464 /* This function can GC */
2465 if (CONSP (assoc))
2466 {
2467 Lisp_Object sym = XCAR (assoc);
2468 if (SYMBOLP (sym))
2469 {
2470 Lisp_Object val = symbol_value_in_buffer (sym, buffer);
2471 if (!NILP (val) && !UNBOUNDP (val))
2472 {
2473 Lisp_Object map = get_keymap (XCDR (assoc), 0, 1);
2474 return map;
2475 }
2476 }
2477 }
2478 return Qnil;
2479 }
2480
2481 static void
2482 get_relevant_minor_maps (Lisp_Object buffer, struct relevant_maps *closure)
2483 {
2484 /* This function can GC */
2485 Lisp_Object alist;
2486
2487 /* Will you ever lose badly if you make this circular! */
2488 for (alist = symbol_value_in_buffer (Qminor_mode_map_alist, buffer);
2489 CONSP (alist);
2490 alist = XCDR (alist))
2491 {
2492 Lisp_Object m = minor_mode_keymap_predicate (XCAR (alist),
2493 buffer);
2494 if (!NILP (m)) relevant_map_push (m, closure);
2495 QUIT;
2496 }
2497 }
2498
2499 /* #### Would map-current-keymaps be a better thing?? */
2500 DEFUN ("current-keymaps", Fcurrent_keymaps, 0, 1, 0, /*
2501 Return a list of the current keymaps that will be searched for bindings.
2502 This lists keymaps such as the current local map and the minor-mode maps,
2503 but does not list the parents of those keymaps.
2504 EVENT-OR-KEYS controls which keymaps will be listed.
2505 If EVENT-OR-KEYS is a mouse event (or a vector whose last element is a
2506 mouse event), the keymaps for that mouse event will be listed (see
2507 `key-binding'). Otherwise, the keymaps for key presses will be listed.
2508 */
2509 (event_or_keys))
2510 {
2511 /* This function can GC */
2512 struct gcpro gcpro1;
2513 Lisp_Object maps[100];
2514 Lisp_Object *gubbish = maps;
2515 int nmaps;
2516
2517 GCPRO1 (event_or_keys);
2518 nmaps = get_relevant_keymaps (event_or_keys, countof (maps),
2519 gubbish);
2520 if (nmaps > countof (maps))
2521 {
2522 gubbish = alloca_array (Lisp_Object, nmaps);
2523 nmaps = get_relevant_keymaps (event_or_keys, nmaps, gubbish);
2524 }
2525 UNGCPRO;
2526 return Flist (nmaps, gubbish);
2527 }
2528
2529 DEFUN ("key-binding", Fkey_binding, 1, 2, 0, /*
2530 Return the binding for command KEYS in current keymaps.
2531 KEYS is a string, a vector of events, or a vector of key-description lists
2532 as described in the documentation for the `define-key' function.
2533 The binding is probably a symbol with a function definition; see
2534 the documentation for `lookup-key' for more information.
2535
2536 For key-presses, the order of keymaps searched is:
2537 - the `keymap' property of any extent(s) at point;
2538 - any applicable minor-mode maps;
2539 - the current-local-map of the current-buffer;
2540 - the current global map.
2541
2542 For mouse-clicks, the order of keymaps searched is:
2543 - the current-local-map of the `mouse-grabbed-buffer' if any;
2544 - vertical-divider-map, if the event happened over a vertical divider
2545 - the `keymap' property of any extent(s) at the position of the click
2546 (this includes modeline extents);
2547 - the modeline-map of the buffer corresponding to the modeline under
2548 the mouse (if the click happened over a modeline);
2549 - the value of toolbar-map in the current-buffer (if the click
2550 happened over a toolbar);
2551 - the current-local-map of the buffer under the mouse (does not
2552 apply to toolbar clicks);
2553 - any applicable minor-mode maps;
2554 - the current global map.
2555
2556 Note that if `overriding-local-map' or `overriding-terminal-local-map'
2557 is non-nil, *only* those two maps and the current global map are searched.
2558 */
2559 (keys, accept_default))
2560 {
2561 /* This function can GC */
2562 int i;
2563 Lisp_Object maps[100];
2564 int nmaps;
2565 struct gcpro gcpro1, gcpro2;
2566 GCPRO2 (keys, accept_default); /* get_relevant_keymaps may autoload */
2567
2568 nmaps = get_relevant_keymaps (keys, countof (maps), maps);
2569
2570 UNGCPRO;
2571
2572 if (EVENTP (keys)) /* unadvertised "feature" for the future */
2573 return lookup_events (keys, nmaps, maps, !NILP (accept_default));
2574
2575 for (i = 0; i < nmaps; i++)
2576 {
2577 Lisp_Object tem = Flookup_key (maps[i], keys,
2578 accept_default);
2579 if (INTP (tem))
2580 {
2581 /* Too long in some local map means don't look at global map */
2582 return Qnil;
2583 }
2584 else if (!NILP (tem))
2585 return tem;
2586 }
2587 return Qnil;
2588 }
2589
2590 static Lisp_Object
2591 process_event_binding_result (Lisp_Object result)
2592 {
2593 if (EQ (result, Qundefined))
2594 /* The suppress-keymap function binds keys to 'undefined - special-case
2595 that here, so that being bound to that has the same error-behavior as
2596 not being defined at all.
2597 */
2598 result = Qnil;
2599 if (!NILP (result))
2600 {
2601 Lisp_Object map;
2602 /* Snap out possible keymap indirections */
2603 map = get_keymap (result, 0, 1);
2604 if (!NILP (map))
2605 result = map;
2606 }
2607
2608 return result;
2609 }
2610
2611 /* Attempts to find a command corresponding to the event-sequence
2612 whose head is event0 (sequence is threaded though event_next).
2613
2614 The return value will be
2615
2616 -- nil (there is no binding; this will also be returned
2617 whenever the event chain is "too long", i.e. there
2618 is a non-nil, non-keymap binding for a prefix of
2619 the event chain)
2620 -- a keymap (part of a command has been specified)
2621 -- a command (anything that satisfies `commandp'; this includes
2622 some symbols, lists, subrs, strings, vectors, and
2623 compiled-function objects) */
2624 Lisp_Object
2625 event_binding (Lisp_Object event0, int accept_default)
2626 {
2627 /* This function can GC */
2628 Lisp_Object maps[100];
2629 int nmaps;
2630
2631 assert (EVENTP (event0));
2632
2633 nmaps = get_relevant_keymaps (event0, countof (maps), maps);
2634 if (nmaps > countof (maps))
2635 nmaps = countof (maps);
2636 return process_event_binding_result (lookup_events (event0, nmaps, maps,
2637 accept_default));
2638 }
2639
2640 /* like event_binding, but specify a keymap to search */
2641
2642 Lisp_Object
2643 event_binding_in (Lisp_Object event0, Lisp_Object keymap, int accept_default)
2644 {
2645 /* This function can GC */
2646 if (!KEYMAPP (keymap))
2647 return Qnil;
2648
2649 return process_event_binding_result (lookup_events (event0, 1, &keymap,
2650 accept_default));
2651 }
2652
2653 /* Attempts to find a function key mapping corresponding to the
2654 event-sequence whose head is event0 (sequence is threaded through
2655 event_next). The return value will be the same as for event_binding(). */
2656 Lisp_Object
2657 munging_key_map_event_binding (Lisp_Object event0,
2658 enum munge_me_out_the_door munge)
2659 {
2660 Lisp_Object keymap = (munge == MUNGE_ME_FUNCTION_KEY) ?
2661 CONSOLE_FUNCTION_KEY_MAP (event_console_or_selected (event0)) :
2662 Vkey_translation_map;
2663
2664 if (NILP (keymap))
2665 return Qnil;
2666
2667 return process_event_binding_result (lookup_events (event0, 1, &keymap, 1));
2668 }
2669
2670
2671 /************************************************************************/
2672 /* Setting/querying the global and local maps */
2673 /************************************************************************/
2674
2675 DEFUN ("use-global-map", Fuse_global_map, 1, 1, 0, /*
2676 Select KEYMAP as the global keymap.
2677 */
2678 (keymap))
2679 {
2680 /* This function can GC */
2681 keymap = get_keymap (keymap, 1, 1);
2682 Vcurrent_global_map = keymap;
2683 return Qnil;
2684 }
2685
2686 DEFUN ("use-local-map", Fuse_local_map, 1, 2, 0, /*
2687 Select KEYMAP as the local keymap in BUFFER.
2688 If KEYMAP is nil, that means no local keymap.
2689 If BUFFER is nil, the current buffer is assumed.
2690 */
2691 (keymap, buffer))
2692 {
2693 /* This function can GC */
2694 struct buffer *b = decode_buffer (buffer, 0);
2695 if (!NILP (keymap))
2696 keymap = get_keymap (keymap, 1, 1);
2697
2698 b->keymap = keymap;
2699
2700 return Qnil;
2701 }
2702
2703 DEFUN ("current-local-map", Fcurrent_local_map, 0, 1, 0, /*
2704 Return BUFFER's local keymap, or nil if it has none.
2705 If BUFFER is nil, the current buffer is assumed.
2706 */
2707 (buffer))
2708 {
2709 struct buffer *b = decode_buffer (buffer, 0);
2710 return b->keymap;
2711 }
2712
2713 DEFUN ("current-global-map", Fcurrent_global_map, 0, 0, 0, /*
2714 Return the current global keymap.
2715 */
2716 ())
2717 {
2718 return Vcurrent_global_map;
2719 }
2720
2721
2722 /************************************************************************/
2723 /* Mapping over keymap elements */
2724 /************************************************************************/
2725
2726 /* Since keymaps are arranged in a hierarchy, one keymap per bucky bit or
2727 prefix key, it's not entirely obvious what map-keymap should do, but
2728 what it does is: map over all keys in this map; then recursively map
2729 over all submaps of this map that are "bucky" submaps. This means that,
2730 when mapping over a keymap, it appears that "x" and "C-x" are in the
2731 same map, although "C-x" is really in the "control" submap of this one.
2732 However, since we don't recursively descend the submaps that are bound
2733 to prefix keys (like C-x, C-h, etc) the caller will have to recurse on
2734 those explicitly, if that's what they want.
2735
2736 So the end result of this is that the bucky keymaps (the ones indexed
2737 under the large integers returned from MAKE_MODIFIER_HASH_KEY()) are
2738 invisible from elisp. They're just an implementation detail that code
2739 outside of this file doesn't need to know about.
2740 */
2741
2742 struct map_keymap_unsorted_closure
2743 {
2744 void (*fn) (CONST struct key_data *, Lisp_Object binding, void *arg);
2745 void *arg;
2746 unsigned int modifiers;
2747 };
2748
2749 /* used by map_keymap() */
2750 static int
2751 map_keymap_unsorted_mapper (Lisp_Object keysym, Lisp_Object value,
2752 void *map_keymap_unsorted_closure)
2753 {
2754 /* This function can GC */
2755 struct map_keymap_unsorted_closure *closure =
2756 (struct map_keymap_unsorted_closure *) map_keymap_unsorted_closure;
2757 unsigned int modifiers = closure->modifiers;
2758 unsigned int mod_bit;
2759 mod_bit = MODIFIER_HASH_KEY_BITS (keysym);
2760 if (mod_bit != 0)
2761 {
2762 int omod = modifiers;
2763 closure->modifiers = (modifiers | mod_bit);
2764 value = get_keymap (value, 1, 0);
2765 elisp_maphash (map_keymap_unsorted_mapper,
2766 XKEYMAP (value)->table,
2767 map_keymap_unsorted_closure);
2768 closure->modifiers = omod;
2769 }
2770 else
2771 {
2772 struct key_data key;
2773 key.keysym = keysym;
2774 key.modifiers = modifiers;
2775 ((*closure->fn) (&key, value, closure->arg));
2776 }
2777 return 0;
2778 }
2779
2780
2781 struct map_keymap_sorted_closure
2782 {
2783 Lisp_Object *result_locative;
2784 };
2785
2786 /* used by map_keymap_sorted() */
2787 static int
2788 map_keymap_sorted_mapper (Lisp_Object key, Lisp_Object value,
2789 void *map_keymap_sorted_closure)
2790 {
2791 struct map_keymap_sorted_closure *cl =
2792 (struct map_keymap_sorted_closure *) map_keymap_sorted_closure;
2793 Lisp_Object *list = cl->result_locative;
2794 *list = Fcons (Fcons (key, value), *list);
2795 return 0;
2796 }
2797
2798
2799 /* used by map_keymap_sorted(), describe_map_sort_predicate(),
2800 and keymap_submaps().
2801 */
2802 static int
2803 map_keymap_sort_predicate (Lisp_Object obj1, Lisp_Object obj2,
2804 Lisp_Object pred)
2805 {
2806 /* obj1 and obj2 are conses with keysyms in their cars. Cdrs are ignored.
2807 */
2808 unsigned int bit1, bit2;
2809 int sym1_p = 0;
2810 int sym2_p = 0;
2811 obj1 = XCAR (obj1);
2812 obj2 = XCAR (obj2);
2813
2814 if (EQ (obj1, obj2))
2815 return -1;
2816 bit1 = MODIFIER_HASH_KEY_BITS (obj1);
2817 bit2 = MODIFIER_HASH_KEY_BITS (obj2);
2818
2819 /* If either is a symbol with a character-set-property, then sort it by
2820 that code instead of alphabetically.
2821 */
2822 if (! bit1 && SYMBOLP (obj1))
2823 {
2824 Lisp_Object code = Fget (obj1, Vcharacter_set_property, Qnil);
2825 if (CHAR_OR_CHAR_INTP (code))
2826 {
2827 obj1 = code;
2828 CHECK_CHAR_COERCE_INT (obj1);
2829 sym1_p = 1;
2830 }
2831 }
2832 if (! bit2 && SYMBOLP (obj2))
2833 {
2834 Lisp_Object code = Fget (obj2, Vcharacter_set_property, Qnil);
2835 if (CHAR_OR_CHAR_INTP (code))
2836 {
2837 obj2 = code;
2838 CHECK_CHAR_COERCE_INT (obj2);
2839 sym2_p = 1;
2840 }
2841 }
2842
2843 /* all symbols (non-ASCIIs) come after characters (ASCIIs) */
2844 if (XTYPE (obj1) != XTYPE (obj2))
2845 return SYMBOLP (obj2) ? 1 : -1;
2846
2847 if (! bit1 && CHARP (obj1)) /* they're both ASCII */
2848 {
2849 int o1 = XCHAR (obj1);
2850 int o2 = XCHAR (obj2);
2851 if (o1 == o2 && /* If one started out as a symbol and the */
2852 sym1_p != sym2_p) /* other didn't, the symbol comes last. */
2853 return sym2_p ? 1 : -1;
2854
2855 return o1 < o2 ? 1 : -1; /* else just compare them */
2856 }
2857
2858 /* else they're both symbols. If they're both buckys, then order them. */
2859 if (bit1 && bit2)
2860 return bit1 < bit2 ? 1 : -1;
2861
2862 /* if only one is a bucky, then it comes later */
2863 if (bit1 || bit2)
2864 return bit2 ? 1 : -1;
2865
2866 /* otherwise, string-sort them. */
2867 {
2868 char *s1 = (char *) string_data (XSYMBOL (obj1)->name);
2869 char *s2 = (char *) string_data (XSYMBOL (obj2)->name);
2870 #ifdef I18N2
2871 return 0 > strcoll (s1, s2) ? 1 : -1;
2872 #else
2873 return 0 > strcmp (s1, s2) ? 1 : -1;
2874 #endif
2875 }
2876 }
2877
2878
2879 /* used by map_keymap() */
2880 static void
2881 map_keymap_sorted (Lisp_Object keymap_table,
2882 unsigned int modifiers,
2883 void (*function) (CONST struct key_data *key,
2884 Lisp_Object binding,
2885 void *map_keymap_sorted_closure),
2886 void *map_keymap_sorted_closure)
2887 {
2888 /* This function can GC */
2889 struct gcpro gcpro1;
2890 Lisp_Object contents = Qnil;
2891
2892 if (XINT (Fhash_table_count (keymap_table)) == 0)
2893 return;
2894
2895 GCPRO1 (contents);
2896
2897 {
2898 struct map_keymap_sorted_closure c1;
2899 c1.result_locative = &contents;
2900 elisp_maphash (map_keymap_sorted_mapper, keymap_table, &c1);
2901 }
2902 contents = list_sort (contents, Qnil, map_keymap_sort_predicate);
2903 for (; !NILP (contents); contents = XCDR (contents))
2904 {
2905 Lisp_Object keysym = XCAR (XCAR (contents));
2906 Lisp_Object binding = XCDR (XCAR (contents));
2907 unsigned int sub_bits = MODIFIER_HASH_KEY_BITS (keysym);
2908 if (sub_bits != 0)
2909 map_keymap_sorted (XKEYMAP (get_keymap (binding,
2910 1, 1))->table,
2911 (modifiers | sub_bits),
2912 function,
2913 map_keymap_sorted_closure);
2914 else
2915 {
2916 struct key_data k;
2917 k.keysym = keysym;
2918 k.modifiers = modifiers;
2919 ((*function) (&k, binding, map_keymap_sorted_closure));
2920 }
2921 }
2922 UNGCPRO;
2923 }
2924
2925
2926 /* used by Fmap_keymap() */
2927 static void
2928 map_keymap_mapper (CONST struct key_data *key,
2929 Lisp_Object binding,
2930 void *function)
2931 {
2932 /* This function can GC */
2933 Lisp_Object fn;
2934 VOID_TO_LISP (fn, function);
2935 call2 (fn, make_key_description (key, 1), binding);
2936 }
2937
2938
2939 static void
2940 map_keymap (Lisp_Object keymap_table, int sort_first,
2941 void (*function) (CONST struct key_data *key,
2942 Lisp_Object binding,
2943 void *fn_arg),
2944 void *fn_arg)
2945 {
2946 /* This function can GC */
2947 if (sort_first)
2948 map_keymap_sorted (keymap_table, 0, function, fn_arg);
2949 else
2950 {
2951 struct map_keymap_unsorted_closure map_keymap_unsorted_closure;
2952 map_keymap_unsorted_closure.fn = function;
2953 map_keymap_unsorted_closure.arg = fn_arg;
2954 map_keymap_unsorted_closure.modifiers = 0;
2955 elisp_maphash (map_keymap_unsorted_mapper, keymap_table,
2956 &map_keymap_unsorted_closure);
2957 }
2958 }
2959
2960 DEFUN ("map-keymap", Fmap_keymap, 2, 3, 0, /*
2961 Apply FUNCTION to each element of KEYMAP.
2962 FUNCTION will be called with two arguments: a key-description list, and
2963 the binding. The order in which the elements of the keymap are passed to
2964 the function is unspecified. If the function inserts new elements into
2965 the keymap, it may or may not be called with them later. No element of
2966 the keymap will ever be passed to the function more than once.
2967
2968 The function will not be called on elements of this keymap's parents
2969 \(see the function `keymap-parents') or upon keymaps which are contained
2970 within this keymap (multi-character definitions).
2971 It will be called on "meta" characters since they are not really
2972 two-character sequences.
2973
2974 If the optional third argument SORT-FIRST is non-nil, then the elements of
2975 the keymap will be passed to the mapper function in a canonical order.
2976 Otherwise, they will be passed in hash (that is, random) order, which is
2977 faster.
2978 */
2979 (function, keymap, sort_first))
2980 {
2981 /* This function can GC */
2982 struct gcpro gcpro1, gcpro2;
2983
2984 /* tolerate obviously transposed args */
2985 if (!NILP (Fkeymapp (function)))
2986 {
2987 Lisp_Object tmp = function;
2988 function = keymap;
2989 keymap = tmp;
2990 }
2991 GCPRO2 (function, keymap);
2992 keymap = get_keymap (keymap, 1, 1);
2993 map_keymap (XKEYMAP (keymap)->table, !NILP (sort_first),
2994 map_keymap_mapper, LISP_TO_VOID (function));
2995 UNGCPRO;
2996 return Qnil;
2997 }
2998
2999
3000
3001 /************************************************************************/
3002 /* Accessible keymaps */
3003 /************************************************************************/
3004
3005 struct accessible_keymaps_closure
3006 {
3007 Lisp_Object tail;
3008 };
3009
3010
3011 static void
3012 accessible_keymaps_mapper_1 (Lisp_Object keysym, Lisp_Object contents,
3013 unsigned int modifiers,
3014 struct accessible_keymaps_closure *closure)
3015 {
3016 /* This function can GC */
3017 unsigned int subbits = MODIFIER_HASH_KEY_BITS (keysym);
3018
3019 if (subbits != 0)
3020 {
3021 Lisp_Object submaps;
3022
3023 contents = get_keymap (contents, 1, 1);
3024 submaps = keymap_submaps (contents);
3025 for (; !NILP (submaps); submaps = XCDR (submaps))
3026 {
3027 accessible_keymaps_mapper_1 (XCAR (XCAR (submaps)),
3028 XCDR (XCAR (submaps)),
3029 (subbits | modifiers),
3030 closure);
3031 }
3032 }
3033 else
3034 {
3035 Lisp_Object thisseq = Fcar (Fcar (closure->tail));
3036 Lisp_Object cmd = get_keyelt (contents, 1);
3037 Lisp_Object vec;
3038 int j;
3039 int len;
3040 struct key_data key;
3041 key.keysym = keysym;
3042 key.modifiers = modifiers;
3043
3044 if (NILP (cmd))
3045 abort ();
3046 cmd = get_keymap (cmd, 0, 1);
3047 if (!KEYMAPP (cmd))
3048 abort ();
3049
3050 vec = make_vector (XVECTOR_LENGTH (thisseq) + 1, Qnil);
3051 len = XVECTOR_LENGTH (thisseq);
3052 for (j = 0; j < len; j++)
3053 XVECTOR_DATA (vec) [j] = XVECTOR_DATA (thisseq) [j];
3054 XVECTOR_DATA (vec) [j] = make_key_description (&key, 1);
3055
3056 nconc2 (closure->tail, list1 (Fcons (vec, cmd)));
3057 }
3058 }
3059
3060
3061 static Lisp_Object
3062 accessible_keymaps_keymap_mapper (Lisp_Object thismap, void *arg)
3063 {
3064 /* This function can GC */
3065 struct accessible_keymaps_closure *closure =
3066 (struct accessible_keymaps_closure *) arg;
3067 Lisp_Object submaps = keymap_submaps (thismap);
3068
3069 for (; !NILP (submaps); submaps = XCDR (submaps))
3070 {
3071 accessible_keymaps_mapper_1 (XCAR (XCAR (submaps)),
3072 XCDR (XCAR (submaps)),
3073 0,
3074 closure);
3075 }
3076 return Qnil;
3077 }
3078
3079
3080 DEFUN ("accessible-keymaps", Faccessible_keymaps, 1, 2, 0, /*
3081 Find all keymaps accessible via prefix characters from KEYMAP.
3082 Returns a list of elements of the form (KEYS . MAP), where the sequence
3083 KEYS starting from KEYMAP gets you to MAP. These elements are ordered
3084 so that the KEYS increase in length. The first element is ([] . KEYMAP).
3085 An optional argument PREFIX, if non-nil, should be a key sequence;
3086 then the value includes only maps for prefixes that start with PREFIX.
3087 */
3088 (keymap, prefix))
3089 {
3090 /* This function can GC */
3091 struct gcpro gcpro1, gcpro2, gcpro3, gcpro4;
3092 Lisp_Object accessible_keymaps = Qnil;
3093 struct accessible_keymaps_closure c;
3094 c.tail = Qnil;
3095 GCPRO4 (accessible_keymaps, c.tail, prefix, keymap);
3096
3097 retry:
3098 keymap = get_keymap (keymap, 1, 1);
3099 if (NILP (prefix))
3100 prefix = make_vector (0, Qnil);
3101 else if (!VECTORP (prefix) || STRINGP (prefix))
3102 {
3103 prefix = wrong_type_argument (Qarrayp, prefix);
3104 goto retry;
3105 }
3106 else
3107 {
3108 int len = XINT (Flength (prefix));
3109 Lisp_Object def = Flookup_key (keymap, prefix, Qnil);
3110 Lisp_Object p;
3111 int iii;
3112 struct gcpro ngcpro1;
3113
3114 def = get_keymap (def, 0, 1);
3115 if (!KEYMAPP (def))
3116 goto RETURN;
3117
3118 keymap = def;
3119 p = make_vector (len, Qnil);
3120 NGCPRO1 (p);
3121 for (iii = 0; iii < len; iii++)
3122 {
3123 struct key_data key;
3124 define_key_parser (Faref (prefix, make_int (iii)), &key);
3125 XVECTOR_DATA (p)[iii] = make_key_description (&key, 1);
3126 }
3127 NUNGCPRO;
3128 prefix = p;
3129 }
3130
3131 accessible_keymaps = list1 (Fcons (prefix, keymap));
3132
3133 /* For each map in the list maps,
3134 look at any other maps it points to
3135 and stick them at the end if they are not already in the list */
3136
3137 for (c.tail = accessible_keymaps;
3138 !NILP (c.tail);
3139 c.tail = XCDR (c.tail))
3140 {
3141 Lisp_Object thismap = Fcdr (Fcar (c.tail));
3142 CHECK_KEYMAP (thismap);
3143 traverse_keymaps (thismap, Qnil,
3144 accessible_keymaps_keymap_mapper, &c);
3145 }
3146 RETURN:
3147 UNGCPRO;
3148 return accessible_keymaps;
3149 }
3150
3151
3152
3153 /************************************************************************/
3154 /* Pretty descriptions of key sequences */
3155 /************************************************************************/
3156
3157 DEFUN ("key-description", Fkey_description, 1, 1, 0, /*
3158 Return a pretty description of key-sequence KEYS.
3159 Control characters turn into "C-foo" sequences, meta into "M-foo",
3160 spaces are put between sequence elements, etc...
3161 */
3162 (keys))
3163 {
3164 if (CHAR_OR_CHAR_INTP (keys) || CONSP (keys) || SYMBOLP (keys)
3165 || EVENTP (keys))
3166 {
3167 return Fsingle_key_description (keys);
3168 }
3169 else if (VECTORP (keys) ||
3170 STRINGP (keys))
3171 {
3172 Lisp_Object string = Qnil;
3173 /* Lisp_Object sep = Qnil; */
3174 int size = XINT (Flength (keys));
3175 int i;
3176
3177 for (i = 0; i < size; i++)
3178 {
3179 Lisp_Object s2 = Fsingle_key_description
3180 (STRINGP (keys)
3181 ? make_char (string_char (XSTRING (keys), i))
3182 : XVECTOR_DATA (keys)[i]);
3183
3184 if (i == 0)
3185 string = s2;
3186 else
3187 {
3188 /* if (NILP (sep)) Lisp_Object sep = build_string (" ") */;
3189 string = concat2 (string, concat2 (Vsingle_space_string, s2));
3190 }
3191 }
3192 return string;
3193 }
3194 return Fkey_description (wrong_type_argument (Qsequencep, keys));
3195 }
3196
3197 DEFUN ("single-key-description", Fsingle_key_description, 1, 1, 0, /*
3198 Return a pretty description of command character KEY.
3199 Control characters turn into C-whatever, etc.
3200 This differs from `text-char-description' in that it returns a description
3201 of a key read from the user rather than a character from a buffer.
3202 */
3203 (key))
3204 {
3205 if (SYMBOLP (key))
3206 key = Fcons (key, Qnil); /* sleaze sleaze */
3207
3208 if (EVENTP (key) || CHAR_OR_CHAR_INTP (key))
3209 {
3210 char buf [255];
3211 if (!EVENTP (key))
3212 {
3213 struct Lisp_Event event;
3214 event.event_type = empty_event;
3215 CHECK_CHAR_COERCE_INT (key);
3216 character_to_event (XCHAR (key), &event,
3217 XCONSOLE (Vselected_console), 0, 1);
3218 format_event_object (buf, &event, 1);
3219 }
3220 else
3221 format_event_object (buf, XEVENT (key), 1);
3222 return build_string (buf);
3223 }
3224
3225 if (CONSP (key))
3226 {
3227 char buf[255];
3228 char *bufp = buf;
3229 Lisp_Object rest;
3230 buf[0] = 0;
3231 LIST_LOOP (rest, key)
3232 {
3233 Lisp_Object keysym = XCAR (rest);
3234 if (EQ (keysym, Qcontrol)) strcpy (bufp, "C-"), bufp += 2;
3235 else if (EQ (keysym, Qctrl)) strcpy (bufp, "C-"), bufp += 2;
3236 else if (EQ (keysym, Qmeta)) strcpy (bufp, "M-"), bufp += 2;
3237 else if (EQ (keysym, Qsuper)) strcpy (bufp, "S-"), bufp += 2;
3238 else if (EQ (keysym, Qhyper)) strcpy (bufp, "H-"), bufp += 2;
3239 else if (EQ (keysym, Qalt)) strcpy (bufp, "A-"), bufp += 2;
3240 else if (EQ (keysym, Qshift)) strcpy (bufp, "Sh-"), bufp += 3;
3241 else if (CHAR_OR_CHAR_INTP (keysym))
3242 {
3243 bufp += set_charptr_emchar ((Bufbyte *) bufp,
3244 XCHAR_OR_CHAR_INT (keysym));
3245 *bufp = 0;
3246 }
3247 else
3248 {
3249 CHECK_SYMBOL (keysym);
3250 #if 0 /* This is bogus */
3251 if (EQ (keysym, QKlinefeed)) strcpy (bufp, "LFD");
3252 else if (EQ (keysym, QKtab)) strcpy (bufp, "TAB");
3253 else if (EQ (keysym, QKreturn)) strcpy (bufp, "RET");
3254 else if (EQ (keysym, QKescape)) strcpy (bufp, "ESC");
3255 else if (EQ (keysym, QKdelete)) strcpy (bufp, "DEL");
3256 else if (EQ (keysym, QKspace)) strcpy (bufp, "SPC");
3257 else if (EQ (keysym, QKbackspace)) strcpy (bufp, "BS");
3258 else
3259 #endif
3260 strcpy (bufp, (char *) string_data (XSYMBOL (keysym)->name));
3261 if (!NILP (XCDR (rest)))
3262 signal_simple_error ("Invalid key description",
3263 key);
3264 }
3265 }
3266 return build_string (buf);
3267 }
3268 return Fsingle_key_description
3269 (wrong_type_argument (intern ("char-or-event-p"), key));
3270 }
3271
3272 DEFUN ("text-char-description", Ftext_char_description, 1, 1, 0, /*
3273 Return a pretty description of file-character CHR.
3274 Unprintable characters turn into "^char" or \\NNN, depending on the value
3275 of the `ctl-arrow' variable.
3276 This differs from `single-key-description' in that it returns a description
3277 of a character from a buffer rather than a key read from the user.
3278 */
3279 (chr))
3280 {
3281 Bufbyte buf[200];
3282 Bufbyte *p;
3283 Emchar c;
3284 Lisp_Object ctl_arrow = current_buffer->ctl_arrow;
3285 int ctl_p = !NILP (ctl_arrow);
3286 Emchar printable_min = (CHAR_OR_CHAR_INTP (ctl_arrow)
3287 ? XCHAR_OR_CHAR_INT (ctl_arrow)
3288 : ((EQ (ctl_arrow, Qt) || NILP (ctl_arrow))
3289 ? 256 : 160));
3290
3291 if (EVENTP (chr))
3292 {
3293 Lisp_Object ch = Fevent_to_character (chr, Qnil, Qnil, Qt);
3294 if (NILP (ch))
3295 return
3296 signal_simple_continuable_error
3297 ("character has no ASCII equivalent", Fcopy_event (chr, Qnil));
3298 chr = ch;
3299 }
3300
3301 CHECK_CHAR_COERCE_INT (chr);
3302
3303 c = XCHAR (chr);
3304 p = buf;
3305
3306 if (c >= printable_min)
3307 {
3308 p += set_charptr_emchar (p, c);
3309 }
3310 else if (c < 040 && ctl_p)
3311 {
3312 *p++ = '^';
3313 *p++ = c + 64; /* 'A' - 1 */
3314 }
3315 else if (c == 0177)
3316 {
3317 *p++ = '^';
3318 *p++ = '?';
3319 }
3320 else if (c >= 0200 || c < 040)
3321 {
3322 *p++ = '\\';
3323 #ifdef MULE
3324 /* !!#### This syntax is not readable. It will
3325 be interpreted as a 3-digit octal number rather
3326 than a 7-digit octal number. */
3327 if (c >= 0400)
3328 {
3329 *p++ = '0' + ((c & 07000000) >> 18);
3330 *p++ = '0' + ((c & 0700000) >> 15);
3331 *p++ = '0' + ((c & 070000) >> 12);
3332 *p++ = '0' + ((c & 07000) >> 9);
3333 }
3334 #endif
3335 *p++ = '0' + ((c & 0700) >> 6);
3336 *p++ = '0' + ((c & 0070) >> 3);
3337 *p++ = '0' + ((c & 0007));
3338 }
3339 else
3340 {
3341 p += set_charptr_emchar (p, c);
3342 }
3343
3344 *p = 0;
3345 return build_string ((char *) buf);
3346 }
3347
3348
3349 /************************************************************************/
3350 /* where-is (mapping bindings to keys) */
3351 /************************************************************************/
3352
3353 static Lisp_Object
3354 where_is_internal (Lisp_Object definition, Lisp_Object *maps, int nmaps,
3355 Lisp_Object firstonly, char *target_buffer);
3356
3357 DEFUN ("where-is-internal", Fwhere_is_internal, 1, 5, 0, /*
3358 Return list of keys that invoke DEFINITION in KEYMAPS.
3359 KEYMAPS can be either a keymap (meaning search in that keymap and the
3360 current global keymap) or a list of keymaps (meaning search in exactly
3361 those keymaps and no others). If KEYMAPS is nil, search in the currently
3362 applicable maps for EVENT-OR-KEYS (this is equivalent to specifying
3363 `(current-keymaps EVENT-OR-KEYS)' as the argument to KEYMAPS).
3364
3365 If optional 3rd arg FIRSTONLY is non-nil, return a vector representing
3366 the first key sequence found, rather than a list of all possible key
3367 sequences.
3368
3369 If optional 4th arg NOINDIRECT is non-nil, don't follow indirections
3370 to other keymaps or slots. This makes it possible to search for an
3371 indirect definition itself.
3372 */
3373 (definition, keymaps, firstonly, noindirect, event_or_keys))
3374 {
3375 /* This function can GC */
3376 Lisp_Object maps[100];
3377 Lisp_Object *gubbish = maps;
3378 int nmaps;
3379
3380 /* Get keymaps as an array */
3381 if (NILP (keymaps))
3382 {
3383 nmaps = get_relevant_keymaps (event_or_keys, countof (maps),
3384 gubbish);
3385 if (nmaps > countof (maps))
3386 {
3387 gubbish = alloca_array (Lisp_Object, nmaps);
3388 nmaps = get_relevant_keymaps (event_or_keys, nmaps, gubbish);
3389 }
3390 }
3391 else if (CONSP (keymaps))
3392 {
3393 Lisp_Object rest;
3394 int i;
3395
3396 nmaps = XINT (Flength (keymaps));
3397 if (nmaps > countof (maps))
3398 {
3399 gubbish = alloca_array (Lisp_Object, nmaps);
3400 }
3401 for (rest = keymaps, i = 0; !NILP (rest);
3402 rest = XCDR (keymaps), i++)
3403 {
3404 gubbish[i] = get_keymap (XCAR (keymaps), 1, 1);
3405 }
3406 }
3407 else
3408 {
3409 nmaps = 1;
3410 gubbish[0] = get_keymap (keymaps, 1, 1);
3411 if (!EQ (gubbish[0], Vcurrent_global_map))
3412 {
3413 gubbish[1] = Vcurrent_global_map;
3414 nmaps++;
3415 }
3416 }
3417
3418 return where_is_internal (definition, gubbish, nmaps, firstonly, 0);
3419 }
3420
3421 /* This function is like
3422 (key-description (where-is-internal definition nil t))
3423 except that it writes its output into a (char *) buffer that you
3424 provide; it doesn't cons (or allocate memory) at all, so it's
3425 very fast. This is used by menubar.c.
3426 */
3427 void
3428 where_is_to_char (Lisp_Object definition, char *buffer)
3429 {
3430 /* This function can GC */
3431 Lisp_Object maps[100];
3432 Lisp_Object *gubbish = maps;
3433 int nmaps;
3434
3435 /* Get keymaps as an array */
3436 nmaps = get_relevant_keymaps (Qnil, countof (maps), gubbish);
3437 if (nmaps > countof (maps))
3438 {
3439 gubbish = alloca_array (Lisp_Object, nmaps);
3440 nmaps = get_relevant_keymaps (Qnil, nmaps, gubbish);
3441 }
3442
3443 buffer[0] = 0;
3444 where_is_internal (definition, maps, nmaps, Qt, buffer);
3445 }
3446
3447
3448 static Lisp_Object
3449 raw_keys_to_keys (struct key_data *keys, int count)
3450 {
3451 Lisp_Object result = make_vector (count, Qnil);
3452 while (count--)
3453 XVECTOR_DATA (result) [count] = make_key_description (&(keys[count]), 1);
3454 return result;
3455 }
3456
3457
3458 static void
3459 format_raw_keys (struct key_data *keys, int count, char *buf)
3460 {
3461 int i;
3462 struct Lisp_Event event;
3463 event.event_type = key_press_event;
3464 event.channel = Vselected_console;
3465 for (i = 0; i < count; i++)
3466 {
3467 event.event.key.keysym = keys[i].keysym;
3468 event.event.key.modifiers = keys[i].modifiers;
3469 format_event_object (buf, &event, 1);
3470 buf += strlen (buf);
3471 if (i < count-1)
3472 buf[0] = ' ', buf++;
3473 }
3474 }
3475
3476
3477 /* definition is the thing to look for.
3478 map is a keymap.
3479 shadow is an array of shadow_count keymaps; if there is a different
3480 binding in any of the keymaps of a key that we are considering
3481 returning, then we reconsider.
3482 firstonly means give up after finding the first match;
3483 keys_so_far and modifiers_so_far describe which map we're looking in;
3484 If we're in the "meta" submap of the map that "C-x 4" is bound to,
3485 then keys_so_far will be {(control x), \4}, and modifiers_so_far
3486 will be MOD_META. That is, keys_so_far is the chain of keys that we
3487 have followed, and modifiers_so_far_so_far is the bits (partial keys)
3488 beyond that.
3489
3490 (keys_so_far is a global buffer and the keys_count arg says how much
3491 of it we're currently interested in.)
3492
3493 If target_buffer is provided, then we write a key-description into it,
3494 to avoid consing a string. This only works with firstonly on.
3495 */
3496
3497 struct where_is_closure
3498 {
3499 Lisp_Object definition;
3500 Lisp_Object *shadow;
3501 int shadow_count;
3502 int firstonly;
3503 int keys_count;
3504 unsigned int modifiers_so_far;
3505 char *target_buffer;
3506 struct key_data *keys_so_far;
3507 int keys_so_far_total_size;
3508 int keys_so_far_malloced;
3509 };
3510
3511 static Lisp_Object where_is_recursive_mapper (Lisp_Object map, void *arg);
3512
3513 static Lisp_Object
3514 where_is_recursive_mapper (Lisp_Object map, void *arg)
3515 {
3516 /* This function can GC */
3517 struct where_is_closure *c = (struct where_is_closure *) arg;
3518 Lisp_Object definition = c->definition;
3519 CONST int firstonly = c->firstonly;
3520 CONST unsigned int keys_count = c->keys_count;
3521 CONST unsigned int modifiers_so_far = c->modifiers_so_far;
3522 char *target_buffer = c->target_buffer;
3523 Lisp_Object keys = Fgethash (definition,
3524 XKEYMAP (map)->inverse_table,
3525 Qnil);
3526 Lisp_Object submaps;
3527 Lisp_Object result = Qnil;
3528
3529 if (!NILP (keys))
3530 {
3531 /* One or more keys in this map match the definition we're looking for.
3532 Verify that these bindings aren't shadowed by other bindings
3533 in the shadow maps. Either nil or number as value from
3534 raw_lookup_key() means undefined. */
3535 struct key_data *so_far = c->keys_so_far;
3536
3537 for (;;) /* loop over all keys that match */
3538 {
3539 Lisp_Object k = CONSP (keys) ? XCAR (keys) : keys;
3540 int i;
3541
3542 so_far [keys_count].keysym = k;
3543 so_far [keys_count].modifiers = modifiers_so_far;
3544
3545 /* now loop over all shadow maps */
3546 for (i = 0; i < c->shadow_count; i++)
3547 {
3548 Lisp_Object shadowed = raw_lookup_key (c->shadow[i],
3549 so_far,
3550 keys_count + 1,
3551 0, 1);
3552
3553 if (NILP (shadowed) || CHARP (shadowed) ||
3554 EQ (shadowed, definition))
3555 continue; /* we passed this test; it's not shadowed here. */
3556 else
3557 /* ignore this key binding, since it actually has a
3558 different binding in a shadowing map */
3559 goto c_doesnt_have_proper_loop_exit_statements;
3560 }
3561
3562 /* OK, the key is for real */
3563 if (target_buffer)
3564 {
3565 if (!firstonly) abort ();
3566 format_raw_keys (so_far, keys_count + 1, target_buffer);
3567 return make_int (1);
3568 }
3569 else if (firstonly)
3570 return raw_keys_to_keys (so_far, keys_count + 1);
3571 else
3572 result = Fcons (raw_keys_to_keys (so_far, keys_count + 1),
3573 result);
3574
3575 c_doesnt_have_proper_loop_exit_statements:
3576 /* now on to the next matching key ... */
3577 if (!CONSP (keys)) break;
3578 keys = XCDR (keys);
3579 }
3580 }
3581
3582 /* Now search the sub-keymaps of this map.
3583 If we're in "firstonly" mode and have already found one, this
3584 point is not reached. If we get one from lower down, either
3585 return it immediately (in firstonly mode) or tack it onto the
3586 end of the ones we've gotten so far.
3587 */
3588 for (submaps = keymap_submaps (map);
3589 !NILP (submaps);
3590 submaps = XCDR (submaps))
3591 {
3592 Lisp_Object key = XCAR (XCAR (submaps));
3593 Lisp_Object submap = XCDR (XCAR (submaps));
3594 unsigned int lower_modifiers;
3595 int lower_keys_count = keys_count;
3596 unsigned int bucky;
3597
3598 submap = get_keymap (submap, 0, 0);
3599
3600 if (EQ (submap, map))
3601 /* Arrgh! Some loser has introduced a loop... */
3602 continue;
3603
3604 /* If this is not a keymap, then that's probably because someone
3605 did an `fset' of a symbol that used to point to a map such that
3606 it no longer does. Sigh. Ignore this, and invalidate the cache
3607 so that it doesn't happen to us next time too.
3608 */
3609 if (NILP (submap))
3610 {
3611 XKEYMAP (map)->sub_maps_cache = Qt;
3612 continue;
3613 }
3614
3615 /* If the map is a "bucky" map, then add a bit to the
3616 modifiers_so_far list.
3617 Otherwise, add a new raw_key onto the end of keys_so_far.
3618 */
3619 bucky = MODIFIER_HASH_KEY_BITS (key);
3620 if (bucky != 0)
3621 lower_modifiers = (modifiers_so_far | bucky);
3622 else
3623 {
3624 struct key_data *so_far = c->keys_so_far;
3625 lower_modifiers = 0;
3626 so_far [lower_keys_count].keysym = key;
3627 so_far [lower_keys_count].modifiers = modifiers_so_far;
3628 lower_keys_count++;
3629 }
3630
3631 if (lower_keys_count >= c->keys_so_far_total_size)
3632 {
3633 int size = lower_keys_count + 50;
3634 if (! c->keys_so_far_malloced)
3635 {
3636 struct key_data *new = xnew_array (struct key_data, size);
3637 memcpy ((void *)new, (CONST void *)c->keys_so_far,
3638 c->keys_so_far_total_size * sizeof (struct key_data));
3639 }
3640 else
3641 XREALLOC_ARRAY (c->keys_so_far, struct key_data, size);
3642
3643 c->keys_so_far_total_size = size;
3644 c->keys_so_far_malloced = 1;
3645 }
3646
3647 {
3648 Lisp_Object lower;
3649
3650 c->keys_count = lower_keys_count;
3651 c->modifiers_so_far = lower_modifiers;
3652
3653 lower = traverse_keymaps (submap, Qnil, where_is_recursive_mapper, c);
3654
3655 c->keys_count = keys_count;
3656 c->modifiers_so_far = modifiers_so_far;
3657
3658 if (!firstonly)
3659 result = nconc2 (lower, result);
3660 else if (!NILP (lower))
3661 return lower;
3662 }
3663 }
3664 return result;
3665 }
3666
3667
3668 static Lisp_Object
3669 where_is_internal (Lisp_Object definition, Lisp_Object *maps, int nmaps,
3670 Lisp_Object firstonly, char *target_buffer)
3671 {
3672 /* This function can GC */
3673 Lisp_Object result = Qnil;
3674 int i;
3675 struct key_data raw[20];
3676 struct where_is_closure c;
3677
3678 c.definition = definition;
3679 c.shadow = maps;
3680 c.firstonly = !NILP (firstonly);
3681 c.target_buffer = target_buffer;
3682 c.keys_so_far = raw;
3683 c.keys_so_far_total_size = countof (raw);
3684 c.keys_so_far_malloced = 0;
3685
3686 /* Loop over each of the maps, accumulating the keys found.
3687 For each map searched, all previous maps shadow this one
3688 so that bogus keys aren't listed. */
3689 for (i = 0; i < nmaps; i++)
3690 {
3691 Lisp_Object this_result;
3692 c.shadow_count = i;
3693 /* Reset the things set in each iteration */
3694 c.keys_count = 0;
3695 c.modifiers_so_far = 0;
3696
3697 this_result = traverse_keymaps (maps[i], Qnil, where_is_recursive_mapper,
3698 &c);
3699 if (!NILP (firstonly))
3700 {
3701 result = this_result;
3702 if (!NILP (result))
3703 break;
3704 }
3705 else
3706 result = nconc2 (this_result, result);
3707 }
3708
3709 if (NILP (firstonly))
3710 result = Fnreverse (result);
3711
3712 if (c.keys_so_far_malloced)
3713 xfree (c.keys_so_far);
3714 return result;
3715 }
3716
3717
3718 /************************************************************************/
3719 /* Describing keymaps */
3720 /************************************************************************/
3721
3722 DEFUN ("describe-bindings-internal", Fdescribe_bindings_internal, 1, 5, 0, /*
3723 Insert a list of all defined keys and their definitions in MAP.
3724 Optional second argument ALL says whether to include even "uninteresting"
3725 definitions (ie symbols with a non-nil `suppress-keymap' property.
3726 Third argument SHADOW is a list of keymaps whose bindings shadow those
3727 of map; if a binding is present in any shadowing map, it is not printed.
3728 Fourth argument PREFIX, if non-nil, should be a key sequence;
3729 only bindings which start with that key sequence will be printed.
3730 Fifth argument MOUSE-ONLY-P says to only print bindings for mouse clicks.
3731 */
3732 (map, all, shadow, prefix, mouse_only_p))
3733 {
3734 /* This function can GC */
3735
3736 /* #### At some point, this function should be changed to accept a
3737 BUFFER argument. Currently, the BUFFER argument to
3738 describe_map_tree is being used only internally. */
3739 describe_map_tree (map, NILP (all), shadow, prefix,
3740 !NILP (mouse_only_p), Fcurrent_buffer ());
3741 return Qnil;
3742 }
3743
3744
3745 /* Insert a description of the key bindings in STARTMAP,
3746 followed by those of all maps reachable through STARTMAP.
3747 If PARTIAL is nonzero, omit certain "uninteresting" commands
3748 (such as `undefined').
3749 If SHADOW is non-nil, it is a list of other maps;
3750 don't mention keys which would be shadowed by any of them
3751 If PREFIX is non-nil, only list bindings which start with those keys.
3752 */
3753
3754 void
3755 describe_map_tree (Lisp_Object startmap, int partial, Lisp_Object shadow,
3756 Lisp_Object prefix, int mice_only_p, Lisp_Object buffer)
3757 {
3758 /* This function can GC */
3759 Lisp_Object maps = Qnil;
3760 struct gcpro gcpro1, gcpro2; /* get_keymap may autoload */
3761 GCPRO2 (maps, shadow);
3762
3763 maps = Faccessible_keymaps (startmap, prefix);
3764
3765 for (; !NILP (maps); maps = Fcdr (maps))
3766 {
3767 Lisp_Object sub_shadow = Qnil;
3768 Lisp_Object elt = Fcar (maps);
3769 Lisp_Object tail;
3770 int no_prefix = (VECTORP (Fcar (elt))
3771 && XINT (Flength (Fcar (elt))) == 0);
3772 struct gcpro ngcpro1, ngcpro2, ngcpro3;
3773 NGCPRO3 (sub_shadow, elt, tail);
3774
3775 for (tail = shadow; CONSP (tail); tail = XCDR (tail))
3776 {
3777 Lisp_Object shmap = XCAR (tail);
3778
3779 /* If the sequence by which we reach this keymap is zero-length,
3780 then the shadow maps for this keymap are just SHADOW. */
3781 if (no_prefix)
3782 ;
3783 /* If the sequence by which we reach this keymap actually has
3784 some elements, then the sequence's definition in SHADOW is
3785 what we should use. */
3786 else
3787 {
3788 shmap = Flookup_key (shmap, Fcar (elt), Qt);
3789 if (CHARP (shmap))
3790 shmap = Qnil;
3791 }
3792
3793 if (!NILP (shmap))
3794 {
3795 Lisp_Object shm = get_keymap (shmap, 0, 1);
3796 /* If shmap is not nil and not a keymap, it completely
3797 shadows this map, so don't describe this map at all. */
3798 if (!KEYMAPP (shm))
3799 goto SKIP;
3800 sub_shadow = Fcons (shm, sub_shadow);
3801 }
3802 }
3803
3804 {
3805 /* Describe the contents of map MAP, assuming that this map
3806 itself is reached by the sequence of prefix keys KEYS (a vector).
3807 PARTIAL and SHADOW are as in `describe_map_tree'. */
3808 Lisp_Object keysdesc
3809 = ((!no_prefix)
3810 ? concat2 (Fkey_description (Fcar (elt)), Vsingle_space_string)
3811 : Qnil);
3812 describe_map (Fcdr (elt), keysdesc,
3813 describe_command,
3814 partial,
3815 sub_shadow,
3816 mice_only_p,
3817 buffer);
3818 }
3819 SKIP:
3820 NUNGCPRO;
3821 }
3822 UNGCPRO;
3823 }
3824
3825
3826 static void
3827 describe_command (Lisp_Object definition, Lisp_Object buffer)
3828 {
3829 /* This function can GC */
3830 int keymapp = !NILP (Fkeymapp (definition));
3831 struct gcpro gcpro1;
3832 GCPRO1 (definition);
3833
3834 Findent_to (make_int (16), make_int (3), buffer);
3835 if (keymapp)
3836 buffer_insert_c_string (XBUFFER (buffer), "<< ");
3837
3838 if (SYMBOLP (definition))
3839 {
3840 buffer_insert1 (XBUFFER (buffer), Fsymbol_name (definition));
3841 }
3842 else if (STRINGP (definition) || VECTORP (definition))
3843 {
3844 buffer_insert_c_string (XBUFFER (buffer), "Kbd Macro: ");
3845 buffer_insert1 (XBUFFER (buffer), Fkey_description (definition));
3846 }
3847 else if (COMPILED_FUNCTIONP (definition))
3848 buffer_insert_c_string (XBUFFER (buffer), "Anonymous Compiled Function");
3849 else if (CONSP (definition) && EQ (XCAR (definition), Qlambda))
3850 buffer_insert_c_string (XBUFFER (buffer), "Anonymous Lambda");
3851 else if (KEYMAPP (definition))
3852 {
3853 Lisp_Object name = XKEYMAP (definition)->name;
3854 if (STRINGP (name) || (SYMBOLP (name) && !NILP (name)))
3855 {
3856 buffer_insert_c_string (XBUFFER (buffer), "Prefix command ");
3857 if (SYMBOLP (name)
3858 && EQ (find_symbol_value (name), definition))
3859 buffer_insert1 (XBUFFER (buffer), Fsymbol_name (name));
3860 else
3861 {
3862 buffer_insert1 (XBUFFER (buffer), Fprin1_to_string (name, Qnil));
3863 }
3864 }
3865 else
3866 buffer_insert_c_string (XBUFFER (buffer), "Prefix Command");
3867 }
3868 else
3869 buffer_insert_c_string (XBUFFER (buffer), "??");
3870
3871 if (keymapp)
3872 buffer_insert_c_string (XBUFFER (buffer), " >>");
3873 buffer_insert_c_string (XBUFFER (buffer), "\n");
3874 UNGCPRO;
3875 }
3876
3877 struct describe_map_closure
3878 {
3879 Lisp_Object *list; /* pointer to the list to update */
3880 Lisp_Object partial; /* whether to ignore suppressed commands */
3881 Lisp_Object shadow; /* list of maps shadowing this one */
3882 Lisp_Object self; /* this map */
3883 Lisp_Object self_root; /* this map, or some map that has this map as
3884 a parent. this is the base of the tree */
3885 int mice_only_p; /* whether we are to display only button bindings */
3886 };
3887
3888 struct describe_map_shadow_closure
3889 {
3890 CONST struct key_data *raw_key;
3891 Lisp_Object self;
3892 };
3893
3894 static Lisp_Object
3895 describe_map_mapper_shadow_search (Lisp_Object map, void *arg)
3896 {
3897 struct describe_map_shadow_closure *c =
3898 (struct describe_map_shadow_closure *) arg;
3899
3900 if (EQ (map, c->self))
3901 return Qzero; /* Not shadowed; terminate search */
3902
3903 return !NILP (keymap_lookup_directly (map,
3904 c->raw_key->keysym,
3905 c->raw_key->modifiers))
3906 ? Qt : Qnil;
3907 }
3908
3909
3910 static Lisp_Object
3911 keymap_lookup_inherited_mapper (Lisp_Object km, void *arg)
3912 {
3913 struct key_data *k = (struct key_data *) arg;
3914 return keymap_lookup_directly (km, k->keysym, k->modifiers);
3915 }
3916
3917
3918 static void
3919 describe_map_mapper (CONST struct key_data *key,
3920 Lisp_Object binding,
3921 void *describe_map_closure)
3922 {
3923 /* This function can GC */
3924 struct describe_map_closure *closure =
3925 (struct describe_map_closure *) describe_map_closure;
3926 Lisp_Object keysym = key->keysym;
3927 unsigned int modifiers = key->modifiers;
3928
3929 /* Don't mention suppressed commands. */
3930 if (SYMBOLP (binding)
3931 && !NILP (closure->partial)
3932 && !NILP (Fget (binding, closure->partial, Qnil)))
3933 return;
3934
3935 /* If we're only supposed to display mouse bindings and this isn't one,
3936 then bug out. */
3937 if (closure->mice_only_p &&
3938 (! (EQ (keysym, Qbutton0) ||
3939 EQ (keysym, Qbutton1) ||
3940 EQ (keysym, Qbutton2) ||
3941 EQ (keysym, Qbutton3) ||
3942 EQ (keysym, Qbutton4) ||
3943 EQ (keysym, Qbutton5) ||
3944 EQ (keysym, Qbutton6) ||
3945 EQ (keysym, Qbutton7) ||
3946 EQ (keysym, Qbutton0up) ||
3947 EQ (keysym, Qbutton1up) ||
3948 EQ (keysym, Qbutton2up) ||
3949 EQ (keysym, Qbutton3up) ||
3950 EQ (keysym, Qbutton4up) ||
3951 EQ (keysym, Qbutton5up) ||
3952 EQ (keysym, Qbutton6up) ||
3953 EQ (keysym, Qbutton7up))))
3954 return;
3955
3956 /* If this command in this map is shadowed by some other map, ignore it. */
3957 {
3958 Lisp_Object tail;
3959
3960 for (tail = closure->shadow; CONSP (tail); tail = XCDR (tail))
3961 {
3962 QUIT;
3963 if (!NILP (traverse_keymaps (XCAR (tail), Qnil,
3964 keymap_lookup_inherited_mapper,
3965 /* Cast to discard `const' */
3966 (void *)key)))
3967 return;
3968 }
3969 }
3970
3971 /* If this key is in some map of which this map is a parent, then ignore
3972 it (in that case, it has been shadowed).
3973 */
3974 {
3975 Lisp_Object sh;
3976 struct describe_map_shadow_closure c;
3977 c.raw_key = key;
3978 c.self = closure->self;
3979
3980 sh = traverse_keymaps (closure->self_root, Qnil,
3981 describe_map_mapper_shadow_search, &c);
3982 if (!NILP (sh) && !ZEROP (sh))
3983 return;
3984 }
3985
3986 /* Otherwise add it to the list to be sorted. */
3987 *(closure->list) = Fcons (Fcons (Fcons (keysym, make_int (modifiers)),
3988 binding),
3989 *(closure->list));
3990 }
3991
3992
3993 static int
3994 describe_map_sort_predicate (Lisp_Object obj1, Lisp_Object obj2,
3995 Lisp_Object pred)
3996 {
3997 /* obj1 and obj2 are conses of the form
3998 ( ( <keysym> . <modifiers> ) . <binding> )
3999 keysym and modifiers are used, binding is ignored.
4000 */
4001 unsigned int bit1, bit2;
4002 obj1 = XCAR (obj1);
4003 obj2 = XCAR (obj2);
4004 bit1 = XINT (XCDR (obj1));
4005 bit2 = XINT (XCDR (obj2));
4006 if (bit1 != bit2)
4007 return bit1 < bit2 ? 1 : -1;
4008 else
4009 return map_keymap_sort_predicate (obj1, obj2, pred);
4010 }
4011
4012 /* Elide 2 or more consecutive numeric keysyms bound to the same thing,
4013 or 2 or more symbolic keysyms that are bound to the same thing and
4014 have consecutive character-set-properties.
4015 */
4016 static int
4017 elide_next_two_p (Lisp_Object list)
4018 {
4019 Lisp_Object s1, s2;
4020
4021 if (NILP (XCDR (list)))
4022 return 0;
4023
4024 /* next two bindings differ */
4025 if (!EQ (XCDR (XCAR (list)),
4026 XCDR (XCAR (XCDR (list)))))
4027 return 0;
4028
4029 /* next two modifier-sets differ */
4030 if (!EQ (XCDR (XCAR (XCAR (list))),
4031 XCDR (XCAR (XCAR (XCDR (list))))))
4032 return 0;
4033
4034 s1 = XCAR (XCAR (XCAR (list)));
4035 s2 = XCAR (XCAR (XCAR (XCDR (list))));
4036
4037 if (SYMBOLP (s1))
4038 {
4039 Lisp_Object code = Fget (s1, Vcharacter_set_property, Qnil);
4040 if (CHAR_OR_CHAR_INTP (code))
4041 {
4042 s1 = code;
4043 CHECK_CHAR_COERCE_INT (s1);
4044 }
4045 else return 0;
4046 }
4047 if (SYMBOLP (s2))
4048 {
4049 Lisp_Object code = Fget (s2, Vcharacter_set_property, Qnil);
4050 if (CHAR_OR_CHAR_INTP (code))
4051 {
4052 s2 = code;
4053 CHECK_CHAR_COERCE_INT (s2);
4054 }
4055 else return 0;
4056 }
4057
4058 return (XCHAR (s1) == XCHAR (s2) ||
4059 XCHAR (s1) + 1 == XCHAR (s2));
4060 }
4061
4062
4063 static Lisp_Object
4064 describe_map_parent_mapper (Lisp_Object keymap, void *arg)
4065 {
4066 /* This function can GC */
4067 struct describe_map_closure *describe_map_closure =
4068 (struct describe_map_closure *) arg;
4069 describe_map_closure->self = keymap;
4070 map_keymap (XKEYMAP (keymap)->table,
4071 0, /* don't sort: we'll do it later */
4072 describe_map_mapper, describe_map_closure);
4073 return Qnil;
4074 }
4075
4076
4077 /* Describe the contents of map MAP, assuming that this map itself is
4078 reached by the sequence of prefix keys KEYS (a string or vector).
4079 PARTIAL, SHADOW, NOMENU are as in `describe_map_tree' above. */
4080
4081 static void
4082 describe_map (Lisp_Object keymap, Lisp_Object elt_prefix,
4083 void (*elt_describer) (Lisp_Object, Lisp_Object),
4084 int partial,
4085 Lisp_Object shadow,
4086 int mice_only_p,
4087 Lisp_Object buffer)
4088 {
4089 /* This function can GC */
4090 struct describe_map_closure describe_map_closure;
4091 Lisp_Object list = Qnil;
4092 struct buffer *buf = XBUFFER (buffer);
4093 Emchar printable_min = (CHAR_OR_CHAR_INTP (buf->ctl_arrow)
4094 ? XCHAR_OR_CHAR_INT (buf->ctl_arrow)
4095 : ((EQ (buf->ctl_arrow, Qt)
4096 || EQ (buf->ctl_arrow, Qnil))
4097 ? 256 : 160));
4098 int elided = 0;
4099 struct gcpro gcpro1, gcpro2, gcpro3, gcpro4;
4100
4101 keymap = get_keymap (keymap, 1, 1);
4102 describe_map_closure.partial = (partial ? Qsuppress_keymap : Qnil);
4103 describe_map_closure.shadow = shadow;
4104 describe_map_closure.list = &list;
4105 describe_map_closure.self_root = keymap;
4106 describe_map_closure.mice_only_p = mice_only_p;
4107
4108 GCPRO4 (keymap, elt_prefix, shadow, list);
4109
4110 traverse_keymaps (keymap, Qnil,
4111 describe_map_parent_mapper, &describe_map_closure);
4112
4113 if (!NILP (list))
4114 {
4115 list = list_sort (list, Qnil, describe_map_sort_predicate);
4116 buffer_insert_c_string (buf, "\n");
4117 while (!NILP (list))
4118 {
4119 Lisp_Object elt = XCAR (XCAR (list));
4120 Lisp_Object keysym = XCAR (elt);
4121 unsigned int modifiers = XINT (XCDR (elt));
4122
4123 if (!NILP (elt_prefix))
4124 buffer_insert_lisp_string (buf, elt_prefix);
4125
4126 if (modifiers & MOD_META) buffer_insert_c_string (buf, "M-");
4127 if (modifiers & MOD_CONTROL) buffer_insert_c_string (buf, "C-");
4128 if (modifiers & MOD_SUPER) buffer_insert_c_string (buf, "S-");
4129 if (modifiers & MOD_HYPER) buffer_insert_c_string (buf, "H-");
4130 if (modifiers & MOD_ALT) buffer_insert_c_string (buf, "Alt-");
4131 if (modifiers & MOD_SHIFT) buffer_insert_c_string (buf, "Sh-");
4132 if (SYMBOLP (keysym))
4133 {
4134 Lisp_Object code = Fget (keysym, Vcharacter_set_property, Qnil);
4135 Emchar c = (CHAR_OR_CHAR_INTP (code)
4136 ? XCHAR_OR_CHAR_INT (code) : (Emchar) -1);
4137 /* Calling Fsingle_key_description() would cons more */
4138 #if 0 /* This is bogus */
4139 if (EQ (keysym, QKlinefeed))
4140 buffer_insert_c_string (buf, "LFD");
4141 else if (EQ (keysym, QKtab))
4142 buffer_insert_c_string (buf, "TAB");
4143 else if (EQ (keysym, QKreturn))
4144 buffer_insert_c_string (buf, "RET");
4145 else if (EQ (keysym, QKescape))
4146 buffer_insert_c_string (buf, "ESC");
4147 else if (EQ (keysym, QKdelete))
4148 buffer_insert_c_string (buf, "DEL");
4149 else if (EQ (keysym, QKspace))
4150 buffer_insert_c_string (buf, "SPC");
4151 else if (EQ (keysym, QKbackspace))
4152 buffer_insert_c_string (buf, "BS");
4153 else
4154 #endif
4155 if (c >= printable_min)
4156 buffer_insert_emacs_char (buf, c);
4157 else buffer_insert1 (buf, Fsymbol_name (keysym));
4158 }
4159 else if (CHARP (keysym))
4160 buffer_insert_emacs_char (buf, XCHAR (keysym));
4161 else
4162 buffer_insert_c_string (buf, "---bad keysym---");
4163
4164 if (elided)
4165 elided = 0;
4166 else
4167 {
4168 int k = 0;
4169
4170 while (elide_next_two_p (list))
4171 {
4172 k++;
4173 list = XCDR (list);
4174 }
4175 if (k != 0)
4176 {
4177 if (k == 1)
4178 buffer_insert_c_string (buf, ", ");
4179 else
4180 buffer_insert_c_string (buf, " .. ");
4181 elided = 1;
4182 continue;
4183 }
4184 }
4185
4186 /* Print a description of the definition of this character. */
4187 (*elt_describer) (XCDR (XCAR (list)), buffer);
4188 list = XCDR (list);
4189 }
4190 }
4191 UNGCPRO;
4192 }
4193
4194
4195 void
4196 syms_of_keymap (void)
4197 {
4198 defsymbol (&Qminor_mode_map_alist, "minor-mode-map-alist");
4199
4200 defsymbol (&Qkeymapp, "keymapp");
4201
4202 defsymbol (&Qsuppress_keymap, "suppress-keymap");
4203
4204 defsymbol (&Qmodeline_map, "modeline-map");
4205 defsymbol (&Qtoolbar_map, "toolbar-map");
4206
4207 DEFSUBR (Fkeymap_parents);
4208 DEFSUBR (Fset_keymap_parents);
4209 DEFSUBR (Fkeymap_name);
4210 DEFSUBR (Fset_keymap_name);
4211 DEFSUBR (Fkeymap_prompt);
4212 DEFSUBR (Fset_keymap_prompt);
4213 DEFSUBR (Fkeymap_default_binding);
4214 DEFSUBR (Fset_keymap_default_binding);
4215
4216 DEFSUBR (Fkeymapp);
4217 DEFSUBR (Fmake_keymap);
4218 DEFSUBR (Fmake_sparse_keymap);
4219
4220 DEFSUBR (Fcopy_keymap);
4221 DEFSUBR (Fkeymap_fullness);
4222 DEFSUBR (Fmap_keymap);
4223 DEFSUBR (Fevent_matches_key_specifier_p);
4224 DEFSUBR (Fdefine_key);
4225 DEFSUBR (Flookup_key);
4226 DEFSUBR (Fkey_binding);
4227 DEFSUBR (Fuse_global_map);
4228 DEFSUBR (Fuse_local_map);
4229 DEFSUBR (Fcurrent_local_map);
4230 DEFSUBR (Fcurrent_global_map);
4231 DEFSUBR (Fcurrent_keymaps);
4232 DEFSUBR (Faccessible_keymaps);
4233 DEFSUBR (Fkey_description);
4234 DEFSUBR (Fsingle_key_description);
4235 DEFSUBR (Fwhere_is_internal);
4236 DEFSUBR (Fdescribe_bindings_internal);
4237
4238 DEFSUBR (Ftext_char_description);
4239
4240 defsymbol (&Qcontrol, "control");
4241 defsymbol (&Qctrl, "ctrl");
4242 defsymbol (&Qmeta, "meta");
4243 defsymbol (&Qsuper, "super");
4244 defsymbol (&Qhyper, "hyper");
4245 defsymbol (&Qalt, "alt");
4246 defsymbol (&Qshift, "shift");
4247 defsymbol (&Qbutton0, "button0");
4248 defsymbol (&Qbutton1, "button1");
4249 defsymbol (&Qbutton2, "button2");
4250 defsymbol (&Qbutton3, "button3");
4251 defsymbol (&Qbutton4, "button4");
4252 defsymbol (&Qbutton5, "button5");
4253 defsymbol (&Qbutton6, "button6");
4254 defsymbol (&Qbutton7, "button7");
4255 defsymbol (&Qbutton0up, "button0up");
4256 defsymbol (&Qbutton1up, "button1up");
4257 defsymbol (&Qbutton2up, "button2up");
4258 defsymbol (&Qbutton3up, "button3up");
4259 defsymbol (&Qbutton4up, "button4up");
4260 defsymbol (&Qbutton5up, "button5up");
4261 defsymbol (&Qbutton6up, "button6up");
4262 defsymbol (&Qbutton7up, "button7up");
4263 defsymbol (&Qmouse_1, "mouse-1");
4264 defsymbol (&Qmouse_2, "mouse-2");
4265 defsymbol (&Qmouse_3, "mouse-3");
4266 defsymbol (&Qmouse_4, "mouse-4");
4267 defsymbol (&Qmouse_5, "mouse-5");
4268 defsymbol (&Qdown_mouse_1, "down-mouse-1");
4269 defsymbol (&Qdown_mouse_2, "down-mouse-2");
4270 defsymbol (&Qdown_mouse_3, "down-mouse-3");
4271 defsymbol (&Qdown_mouse_4, "down-mouse-4");
4272 defsymbol (&Qdown_mouse_5, "down-mouse-5");
4273 defsymbol (&Qmenu_selection, "menu-selection");
4274 defsymbol (&QLFD, "LFD");
4275 defsymbol (&QTAB, "TAB");
4276 defsymbol (&QRET, "RET");
4277 defsymbol (&QESC, "ESC");
4278 defsymbol (&QDEL, "DEL");
4279 defsymbol (&QSPC, "SPC");
4280 defsymbol (&QBS, "BS");
4281 }
4282
4283 void
4284 vars_of_keymap (void)
4285 {
4286 DEFVAR_LISP ("meta-prefix-char", &Vmeta_prefix_char /*
4287 Meta-prefix character.
4288 This character followed by some character `foo' turns into `Meta-foo'.
4289 This can be any form recognized as a single key specifier.
4290 To disable the meta-prefix-char, set it to a negative number.
4291 */ );
4292 Vmeta_prefix_char = make_char (033);
4293
4294 DEFVAR_LISP ("mouse-grabbed-buffer", &Vmouse_grabbed_buffer /*
4295 A buffer which should be consulted first for all mouse activity.
4296 When a mouse-click is processed, it will first be looked up in the
4297 local-map of this buffer, and then through the normal mechanism if there
4298 is no binding for that click. This buffer's value of `mode-motion-hook'
4299 will be consulted instead of the `mode-motion-hook' of the buffer of the
4300 window under the mouse. You should *bind* this, not set it.
4301 */ );
4302 Vmouse_grabbed_buffer = Qnil;
4303
4304 DEFVAR_LISP ("overriding-local-map", &Voverriding_local_map /*
4305 Keymap that overrides all other local keymaps.
4306 If this variable is non-nil, it is used as a keymap instead of the
4307 buffer's local map, and the minor mode keymaps and extent-local keymaps.
4308 You should *bind* this, not set it.
4309 */ );
4310 Voverriding_local_map = Qnil;
4311
4312 Fset (Qminor_mode_map_alist, Qnil);
4313
4314 DEFVAR_LISP ("key-translation-map", &Vkey_translation_map /*
4315 Keymap of key translations that can override keymaps.
4316 This keymap works like `function-key-map', but comes after that,
4317 and applies even for keys that have ordinary bindings.
4318 */ );
4319 Vkey_translation_map = Qnil;
4320
4321 DEFVAR_LISP ("vertical-divider-map", &Vvertical_divider_map /*
4322 Keymap which handles mouse clicks over vertical dividers.
4323 */ );
4324 Vvertical_divider_map = Qnil;
4325
4326 DEFVAR_INT ("keymap-tick", &keymap_tick /*
4327 Incremented for each change to any keymap.
4328 */ );
4329 keymap_tick = 0;
4330
4331 staticpro (&Vcurrent_global_map);
4332
4333 Vsingle_space_string = make_string ((CONST Bufbyte *) " ", 1);
4334 staticpro (&Vsingle_space_string);
4335 }
4336
4337 void
4338 complex_vars_of_keymap (void)
4339 {
4340 /* This function can GC */
4341 Lisp_Object ESC_prefix = intern ("ESC-prefix");
4342 Lisp_Object meta_disgustitute;
4343
4344 Vcurrent_global_map = Fmake_keymap (Qnil);
4345
4346 meta_disgustitute = Fmake_keymap (Qnil);
4347 Ffset (ESC_prefix, meta_disgustitute);
4348 /* no need to protect meta_disgustitute, though */
4349 keymap_store_internal (MAKE_MODIFIER_HASH_KEY (MOD_META),
4350 XKEYMAP (Vcurrent_global_map),
4351 meta_disgustitute);
4352 XKEYMAP (Vcurrent_global_map)->sub_maps_cache = Qt;
4353
4354 Vkey_translation_map = Fmake_sparse_keymap (intern ("key-translation-map"));
4355 }