diff options
author | Stefan Monnier <monnier@iro.umontreal.ca> | 2008-04-04 17:31:20 +0000 |
---|---|---|
committer | Stefan Monnier <monnier@iro.umontreal.ca> | 2008-04-04 17:31:20 +0000 |
commit | 00f7c5edc6a0703d84f4a37f273c31364e6ce0fc (patch) | |
tree | 6b49abd4cff1d6871cde0356e51e196473a29ae1 /src/keymap.c | |
parent | 4591d6cbefecb9b967c87be2997e55a9c073a207 (diff) | |
download | emacs-00f7c5edc6a0703d84f4a37f273c31364e6ce0fc.tar.gz |
* subr.el (keymap-canonicalize): New function.
* mouse.el (mouse-menu-non-singleton): Use it.
(mouse-major-mode-menu): Remove hack made unnecessary.
* keymap.c (Qkeymap_canonicalize): New var.
(Fmap_keymap_internal): New fun.
(describe_map): Use keymap-canonicalize.
Diffstat (limited to 'src/keymap.c')
-rw-r--r-- | src/keymap.c | 29 |
1 files changed, 27 insertions, 2 deletions
diff --git a/src/keymap.c b/src/keymap.c index 9ed1e92c84b..94d2ab5fe67 100644 --- a/src/keymap.c +++ b/src/keymap.c @@ -731,6 +731,26 @@ map_keymap (map, fun, args, data, autoload) UNGCPRO; } +Lisp_Object Qkeymap_canonicalize; + +/* Same as map_keymap, but does it right, properly eliminating duplicate + bindings due to inheritance. */ +void +map_keymap_canonical (map, fun, args, data) + map_keymap_function_t fun; + Lisp_Object map, args; + void *data; +{ + struct gcpro gcpro1; + GCPRO1 (args); + /* map_keymap_canonical may be used from redisplay (e.g. when building menus) + so be careful to ignore errors and to inhibit redisplay. */ + map = safe_call1 (Qkeymap_canonicalize, map); + /* No need to use `map_keymap' here because canonical map has no parent. */ + map_keymap_internal (map, fun, args, data); + UNGCPRO; +} + DEFUN ("map-keymap-internal", Fmap_keymap_internal, Smap_keymap_internal, 2, 2, 0, doc: /* Call FUNCTION once for each event binding in KEYMAP. FUNCTION is called with two arguments: the event that is bound, and @@ -3407,14 +3427,16 @@ describe_map (map, prefix, elt_describer, partial, shadow, kludge = Fmake_vector (make_number (1), Qnil); definition = Qnil; + GCPRO3 (prefix, definition, kludge); + + map = call1 (Qkeymap_canonicalize, map); + for (tail = map; CONSP (tail); tail = XCDR (tail)) length_needed++; vect = ((struct describe_map_elt *) alloca (sizeof (struct describe_map_elt) * length_needed)); - GCPRO3 (prefix, definition, kludge); - for (tail = map; CONSP (tail); tail = XCDR (tail)) { QUIT; @@ -3850,6 +3872,9 @@ syms_of_keymap () apropos_predicate = Qnil; apropos_accumulate = Qnil; + Qkeymap_canonicalize = intern ("keymap-canonicalize"); + staticpro (&Qkeymap_canonicalize); + /* Now we are ready to set up this property, so we can create char tables. */ Fput (Qkeymap, Qchar_table_extra_slots, make_number (0)); |