From 424d6179b39bdd86bc94144e68962adaa5a1e702 Mon Sep 17 00:00:00 2001 From: Stefan Monnier Date: Sun, 8 Nov 2009 15:06:50 +0000 Subject: [PATCH] (parse_menu_item): Handle `notreal' a bit earlier. Use `tem' less. Make sure KEYEQ holds a string or nil (bug#4879). --- src/ChangeLog | 5 +++ src/keyboard.c | 113 ++++++++++++++++++++++++++----------------------- 2 files changed, 64 insertions(+), 54 deletions(-) diff --git a/src/ChangeLog b/src/ChangeLog index 9fb03a341e0..3b9bef861d6 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,8 @@ +2009-11-08 Stefan Monnier + + * keyboard.c (parse_menu_item): Handle `notreal' a bit earlier. + Use `tem' less. Make sure KEYEQ holds a string or nil (bug#4879). + 2009-11-08 Chong Yidong * xmenu.c (Fx_popup_menu): Extract event timestamp. Pass it to diff --git a/src/keyboard.c b/src/keyboard.c index a6bfb08e5d8..0117dc346f3 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]; -- 2.39.2