diff --git a/headers/os/interface/Menu.h b/headers/os/interface/Menu.h index bbca5c4d6d..bc808197df 100644 --- a/headers/os/interface/Menu.h +++ b/headers/os/interface/Menu.h @@ -268,6 +268,7 @@ private: int _State(BMenuItem** _item = NULL) const; void _InvokeItem(BMenuItem* item, bool now = false); + void _InvokeTrigger(const char* bytes); void _QuitTracking(bool onlyThis = true); static menu_info sMenuInfo; diff --git a/src/kits/interface/Menu.cpp b/src/kits/interface/Menu.cpp index e4bb30abab..64483cb12a 100644 --- a/src/kits/interface/Menu.cpp +++ b/src/kits/interface/Menu.cpp @@ -476,6 +476,11 @@ BMenu::MessageReceived(BMessage* msg) void BMenu::KeyDown(const char* bytes, int32 numBytes) { + if (numBytes != 1) { + _InvokeTrigger(bytes); + return; + } + // TODO: Test how it works on BeOS R5 and implement this correctly switch (bytes[0]) { case B_UP_ARROW: @@ -574,19 +579,7 @@ BMenu::KeyDown(const char* bytes, int32 numBytes) break; default: - { - uint32 trigger = UTF8ToCharCode(&bytes); - - for (uint32 i = CountItems(); i-- > 0;) { - BMenuItem* item = ItemAt(i); - if (item->fTriggerIndex < 0 || item->fTrigger != trigger) - continue; - - _InvokeItem(item); - break; - } - break; - } + _InvokeTrigger(bytes); } } @@ -2467,6 +2460,22 @@ BMenu::_InvokeItem(BMenuItem* item, bool now) } +void +BMenu::_InvokeTrigger(const char* bytes) +{ + uint32 trigger = UTF8ToCharCode(&bytes); + + for (uint32 i = CountItems(); i-- > 0;) { + BMenuItem* item = ItemAt(i); + if (item->fTriggerIndex < 0 || item->fTrigger != trigger) + continue; + + _InvokeItem(item); + break; + } +} + + bool BMenu::_OverSuper(BPoint location) {