aboutsummaryrefslogtreecommitdiffstats
path: root/src/keyboard.c
diff options
context:
space:
mode:
authorStefan Monnier <[email protected]>2009-11-08 15:06:50 +0000
committerStefan Monnier <[email protected]>2009-11-08 15:06:50 +0000
commit424d6179b39bdd86bc94144e68962adaa5a1e702 (patch)
treefc1fcc5c0891b58f5c01b1d167ae03fb7ab9c01e /src/keyboard.c
parentc7bd4ebeb5ee493baf78d844234e4d34a09c37e1 (diff)
(parse_menu_item): Handle `notreal' a bit earlier.
Use `tem' less. Make sure KEYEQ holds a string or nil (bug#4879).
Diffstat (limited to 'src/keyboard.c')
-rw-r--r--src/keyboard.c113
1 files changed, 59 insertions, 54 deletions
diff --git a/src/keyboard.c b/src/keyboard.c
index a6bfb08e5d..0117dc346f 100644
--- a/src/keyboard.c
+++ b/src/keyboard.c
@@ -8068,65 +8068,70 @@ parse_menu_item (item, notreal, inmenubar)
if (inmenubar > 0)
return 1;
- /* This is a command. See if there is an equivalent key binding. */
- tem = AREF (item_properties, ITEM_PROPERTY_KEYEQ);
- /* The previous code preferred :key-sequence to :keys, so we
- preserve this behavior. */
- if (STRINGP (tem) && !CONSP (keyhint))
- tem = Fsubstitute_command_keys (tem);
- else
- {
- Lisp_Object prefix = AREF (item_properties, ITEM_PROPERTY_KEYEQ);
- Lisp_Object keys = Qnil;
+
+ /* If we only want to precompute equivalent key bindings (which we
+ don't even do any more anyway), stop here. */
+ if (notreal)
+ return 1;
- if (CONSP (prefix))
- {
- def = XCAR (prefix);
- prefix = XCDR (prefix);
- }
- else
- def = AREF (item_properties, ITEM_PROPERTY_DEF);
+ { /* This is a command. See if there is an equivalent key binding. */
+ Lisp_Object keyeq = AREF (item_properties, ITEM_PROPERTY_KEYEQ);
- if (CONSP (keyhint) && !NILP (XCAR (keyhint)))
- {
- keys = XCAR (keyhint);
- tem = Fkey_binding (keys, Qnil, Qnil, Qnil);
-
- /* We have a suggested key. Is it bound to the command? */
- if (NILP (tem)
- || (!EQ (tem, def)
- /* If the command is an alias for another
- (such as lmenu.el set it up), check if the
- original command matches the cached command. */
- && !(SYMBOLP (def) && EQ (tem, XSYMBOL (def)->function))))
- keys = Qnil;
- }
+ /* The previous code preferred :key-sequence to :keys, so we
+ preserve this behavior. */
+ if (STRINGP (keyeq) && !CONSP (keyhint))
+ keyeq = Fsubstitute_command_keys (keyeq);
+ else
+ {
+ Lisp_Object prefix = keyeq;
+ Lisp_Object keys = Qnil;
+
+ if (CONSP (prefix))
+ {
+ def = XCAR (prefix);
+ prefix = XCDR (prefix);
+ }
+ else
+ def = AREF (item_properties, ITEM_PROPERTY_DEF);
+
+ if (CONSP (keyhint) && !NILP (XCAR (keyhint)))
+ {
+ keys = XCAR (keyhint);
+ tem = Fkey_binding (keys, Qnil, Qnil, Qnil);
+
+ /* We have a suggested key. Is it bound to the command? */
+ if (NILP (tem)
+ || (!EQ (tem, def)
+ /* If the command is an alias for another
+ (such as lmenu.el set it up), check if the
+ original command matches the cached command. */
+ && !(SYMBOLP (def) && EQ (tem, XSYMBOL (def)->function))))
+ keys = Qnil;
+ }
- if (NILP (keys))
- keys = Fwhere_is_internal (def, Qnil, Qt, Qnil, Qnil);
+ if (NILP (keys))
+ keys = Fwhere_is_internal (def, Qnil, Qt, Qnil, Qnil);
- if (!NILP (keys))
- {
- tem = Fkey_description (keys, Qnil);
- if (CONSP (prefix))
- {
- if (STRINGP (XCAR (prefix)))
- tem = concat2 (XCAR (prefix), tem);
- if (STRINGP (XCDR (prefix)))
- tem = concat2 (tem, XCDR (prefix));
- }
- tem = concat2 (build_string (" "), tem);
- /* tem = concat3 (build_string (" ("), tem, build_string (")")); */
- }
- }
-
-
- /* If we only want to precompute equivalent key bindings, stop here. */
- if (notreal)
- return 1;
+ if (!NILP (keys))
+ {
+ tem = Fkey_description (keys, Qnil);
+ if (CONSP (prefix))
+ {
+ if (STRINGP (XCAR (prefix)))
+ tem = concat2 (XCAR (prefix), tem);
+ if (STRINGP (XCDR (prefix)))
+ tem = concat2 (tem, XCDR (prefix));
+ }
+ keyeq = concat2 (build_string (" "), tem);
+ /* keyeq = concat3(build_string(" ("),tem,build_string(")")); */
+ }
+ else
+ keyeq = Qnil;
+ }
- /* If we have an equivalent key binding, use that. */
- ASET (item_properties, ITEM_PROPERTY_KEYEQ, tem);
+ /* If we have an equivalent key binding, use that. */
+ ASET (item_properties, ITEM_PROPERTY_KEYEQ, keyeq);
+ }
/* Include this when menu help is implemented.
tem = XVECTOR (item_properties)->contents[ITEM_PROPERTY_HELP];