summaryrefslogtreecommitdiff
path: root/src/keymap.c
diff options
context:
space:
mode:
authorStefan Monnier <monnier@iro.umontreal.ca>2008-04-04 17:31:20 +0000
committerStefan Monnier <monnier@iro.umontreal.ca>2008-04-04 17:31:20 +0000
commit00f7c5edc6a0703d84f4a37f273c31364e6ce0fc (patch)
tree6b49abd4cff1d6871cde0356e51e196473a29ae1 /src/keymap.c
parent4591d6cbefecb9b967c87be2997e55a9c073a207 (diff)
downloademacs-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.c29
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));