Commit 12270607 authored by Stefan Monnier's avatar Stefan Monnier
Browse files

(map_keymap_internal): New fun.

(map_keymap): Use it.
(Fmap_keymap_internal): New fun.
(Fmap_keymap): Remove left-out test from before make_save_value.
parent a10cca6c
2008-03-25 Stefan Monnier <monnier@iro.umontreal.ca> 2008-03-25 Stefan Monnier <monnier@iro.umontreal.ca>
* keymap.c (map_keymap_internal): New fun.
(map_keymap): Use it.
(Fmap_keymap_internal): New fun.
(Fmap_keymap): Remove left-out test from before make_save_value.
* keymap.c (Fmap_keymap): Use `map-keymap-sorted. * keymap.c (Fmap_keymap): Use `map-keymap-sorted.
* frame.c (Fmodify_frame_parameters, x_set_frame_parameters): * frame.c (Fmodify_frame_parameters, x_set_frame_parameters):
......
...@@ -660,25 +660,20 @@ map_keymap_char_table_item (args, key, val) ...@@ -660,25 +660,20 @@ map_keymap_char_table_item (args, key, val)
} }
} }
/* Call FUN for every binding in MAP. /* Call FUN for every binding in MAP and stop at (and return) the parent.
FUN is called with 4 arguments: FUN (KEY, BINDING, ARGS, DATA). FUN is called with 4 arguments: FUN (KEY, BINDING, ARGS, DATA). */
AUTOLOAD if non-zero means that we can autoload keymaps if necessary. */ Lisp_Object
void map_keymap_internal (Lisp_Object map,
map_keymap (map, fun, args, data, autoload) map_keymap_function_t fun,
map_keymap_function_t fun; Lisp_Object args,
Lisp_Object map, args; void *data)
void *data;
int autoload;
{ {
struct gcpro gcpro1, gcpro2, gcpro3; struct gcpro gcpro1, gcpro2, gcpro3;
Lisp_Object tail; Lisp_Object tail
= (CONSP (map) && EQ (Qkeymap, XCAR (map))) ? XCDR (map) : map;
tail = Qnil;
GCPRO3 (map, args, tail); GCPRO3 (map, args, tail);
map = get_keymap (map, 1, autoload); for (; CONSP (tail) && !EQ (Qkeymap, XCAR (tail)); tail = XCDR (tail))
for (tail = (CONSP (map) && EQ (Qkeymap, XCAR (map))) ? XCDR (map) : map;
CONSP (tail) || (tail = get_keymap (tail, 0, autoload), CONSP (tail));
tail = XCDR (tail))
{ {
Lisp_Object binding = XCAR (tail); Lisp_Object binding = XCAR (tail);
...@@ -705,6 +700,7 @@ map_keymap (map, fun, args, data, autoload) ...@@ -705,6 +700,7 @@ map_keymap (map, fun, args, data, autoload)
} }
} }
UNGCPRO; UNGCPRO;
return tail;
} }
static void static void
...@@ -715,13 +711,46 @@ map_keymap_call (key, val, fun, dummy) ...@@ -715,13 +711,46 @@ map_keymap_call (key, val, fun, dummy)
call2 (fun, key, val); call2 (fun, key, val);
} }
/* Same as map_keymap_internal, but doesn't traverses parent keymaps as well.
A non-zero AUTOLOAD indicates that autoloaded keymaps should be loaded. */
void
map_keymap (map, fun, args, data, autoload)
map_keymap_function_t fun;
Lisp_Object map, args;
void *data;
int autoload;
{
struct gcpro gcpro1;
GCPRO1 (args);
map = get_keymap (map, 1, autoload);
while (CONSP (map))
{
map = map_keymap_internal (map, fun, args, data);
map = get_keymap (map, 0, autoload);
}
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
the definition it is bound to. The event may be a character range.
If KEYMAP has a parent, this function returns it without processing it. */)
(function, keymap)
Lisp_Object function, keymap;
{
struct gcpro gcpro1;
GCPRO1 (function);
keymap = get_keymap (keymap, 1, 1);
keymap = map_keymap_internal (keymap, map_keymap_call, function, NULL);
UNGCPRO;
return keymap;
}
DEFUN ("map-keymap", Fmap_keymap, Smap_keymap, 2, 3, 0, DEFUN ("map-keymap", Fmap_keymap, Smap_keymap, 2, 3, 0,
doc: /* Call FUNCTION once for each event binding in KEYMAP. doc: /* Call FUNCTION once for each event binding in KEYMAP.
FUNCTION is called with two arguments: the event that is bound, and FUNCTION is called with two arguments: the event that is bound, and
the definition it is bound to. If the event is an integer, it may be the definition it is bound to. The event may be a character range.
a generic character (see Info node `(elisp)Splitting Characters'), and
that means that all actual character events belonging to that generic
character are bound to the definition.
If KEYMAP has a parent, the parent's bindings are included as well. If KEYMAP has a parent, the parent's bindings are included as well.
This works recursively: if the parent has itself a parent, then the This works recursively: if the parent has itself a parent, then the
...@@ -730,10 +759,6 @@ usage: (map-keymap FUNCTION KEYMAP) */) ...@@ -730,10 +759,6 @@ usage: (map-keymap FUNCTION KEYMAP) */)
(function, keymap, sort_first) (function, keymap, sort_first)
Lisp_Object function, keymap, sort_first; Lisp_Object function, keymap, sort_first;
{ {
if (INTEGERP (function))
/* We have to stop integers early since map_keymap gives them special
significance. */
xsignal1 (Qinvalid_function, function);
if (! NILP (sort_first)) if (! NILP (sort_first))
return call2 (intern ("map-keymap-sorted"), function, keymap); return call2 (intern ("map-keymap-sorted"), function, keymap);
...@@ -3967,6 +3992,7 @@ the same way. The "active" keymaps in each alist are used before ...@@ -3967,6 +3992,7 @@ the same way. The "active" keymaps in each alist are used before
defsubr (&Sset_keymap_parent); defsubr (&Sset_keymap_parent);
defsubr (&Smake_keymap); defsubr (&Smake_keymap);
defsubr (&Smake_sparse_keymap); defsubr (&Smake_sparse_keymap);
defsubr (&Smap_keymap_internal);
defsubr (&Smap_keymap); defsubr (&Smap_keymap);
defsubr (&Scopy_keymap); defsubr (&Scopy_keymap);
defsubr (&Scommand_remapping); defsubr (&Scommand_remapping);
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment