diff --git a/headers/os/interface/Menu.h b/headers/os/interface/Menu.h index 9a5298b963..f79904bd61 100644 --- a/headers/os/interface/Menu.h +++ b/headers/os/interface/Menu.h @@ -243,7 +243,14 @@ private: void _SetIgnoreHidden(bool on); void _SetStickyMode(bool on); bool _IsStickyMode() const; - void _GetIsAltCommandKey(bool &value) const; + + // Methods to get the current modifier keycode + void _GetShiftKey(uint32 &value) const; + void _GetControlKey(uint32 &value) const; + void _GetCommandKey(uint32 &value) const; + void _GetOptionKey(uint32 &value) const; + void _GetMenuKey(uint32 &value) const; + void _CalcTriggers(); bool _ChooseTrigger(const char* title, int32& index, uint32& trigger, @@ -260,7 +267,14 @@ private: void _QuitTracking(bool onlyThis = true); static menu_info sMenuInfo; - static bool sAltAsCommandKey; + + // Variables to keep track of what code is currently assigned to + // each modifier key + static uint32 sShiftKey; + static uint32 sControlKey; + static uint32 sOptionKey; + static uint32 sCommandKey; + static uint32 sMenuKey; BMenuItem* fChosenItem; BList fItems; diff --git a/headers/private/interface/MenuPrivate.h b/headers/private/interface/MenuPrivate.h index 76076b075b..daf866fd51 100644 --- a/headers/private/interface/MenuPrivate.h +++ b/headers/private/interface/MenuPrivate.h @@ -34,39 +34,39 @@ public: menu_layout Layout() const; - void ItemMarked(BMenuItem *item); - void CacheFontInfo(); + void ItemMarked(BMenuItem *item); + void CacheFontInfo(); - float FontHeight() const; - float Ascent() const; - BRect Padding() const; - void GetItemMargins(float *, float *, float *, float *) const; + float FontHeight() const; + float Ascent() const; + BRect Padding() const; + void GetItemMargins(float *, float *, float *, float *) const; - static bool IsAltCommandKey(); - - int State(BMenuItem **item = NULL) const; + int State(BMenuItem **item = NULL) const; - void Install(BWindow *window); - void Uninstall(); - void SetSuper(BMenu *menu); - void SetSuperItem(BMenuItem *item); - void InvokeItem(BMenuItem *item, bool now = false); - void QuitTracking(bool thisMenuOnly = true); + void Install(BWindow *window); + void Uninstall(); + void SetSuper(BMenu *menu); + void SetSuperItem(BMenuItem *item); + void InvokeItem(BMenuItem *item, bool now = false); + void QuitTracking(bool thisMenuOnly = true); static status_t CreateBitmaps(); static void DeleteBitmaps(); - static const BBitmap *MenuItemCommand(); - static const BBitmap *MenuItemControl(); - static const BBitmap *MenuItemOption(); - static const BBitmap *MenuItemShift(); + static const BBitmap *MenuItemShift(); + static const BBitmap *MenuItemControl(); + static const BBitmap *MenuItemOption(); + static const BBitmap *MenuItemCommand(); + static const BBitmap *MenuItemMenu(); private: - BMenu *fMenu; + BMenu *fMenu; - static BBitmap *sMenuItemAlt; + static BBitmap *sMenuItemShift; static BBitmap *sMenuItemControl; static BBitmap *sMenuItemOption; - static BBitmap *sMenuItemShift; + static BBitmap *sMenuItemAlt; + static BBitmap *sMenuItemMenu; }; diff --git a/src/kits/interface/Menu.cpp b/src/kits/interface/Menu.cpp index bd658433bd..c0370ca361 100644 --- a/src/kits/interface/Menu.cpp +++ b/src/kits/interface/Menu.cpp @@ -96,8 +96,12 @@ public: menu_info BMenu::sMenuInfo; -bool BMenu::sAltAsCommandKey; +uint32 BMenu::sShiftKey; +uint32 BMenu::sControlKey; +uint32 BMenu::sOptionKey; +uint32 BMenu::sCommandKey; +uint32 BMenu::sMenuKey; static property_info sPropList[] = { { "Enabled", { B_GET_PROPERTY, 0 }, @@ -381,8 +385,12 @@ BMenu::AttachedToWindow() { BView::AttachedToWindow(); - _GetIsAltCommandKey(sAltAsCommandKey); - + _GetShiftKey(sShiftKey); + _GetControlKey(sControlKey); + _GetCommandKey(sCommandKey); + _GetOptionKey(sOptionKey); + _GetMenuKey(sMenuKey); + fAttachAborted = _AddDynamicItems(); if (!fAttachAborted) { @@ -2678,25 +2686,72 @@ BMenu::_IsStickyMode() const void -BMenu::_GetIsAltCommandKey(bool &value) const +BMenu::_GetShiftKey(uint32 &value) const { // TODO: Move into init_interface_kit(). - // Currently we can't do that, as get_key_map() blocks forever + // Currently we can't do that, as get_modifier_key() blocks forever // when called on input_server initialization, since it tries // to send a synchronous message to itself (input_server is // a BApplication) - bool altAsCommand = true; - key_map* keys = NULL; - char* chars = NULL; - get_key_map(&keys, &chars); - if (keys == NULL || keys->left_command_key != 0x5d - || keys->left_control_key != 0x5c) - altAsCommand = false; - free(chars); - free(keys); + if (get_modifier_key(B_LEFT_SHIFT_KEY, &value) != B_OK) + value = 0x4b; +} - value = altAsCommand; + +void +BMenu::_GetControlKey(uint32 &value) const +{ + // TODO: Move into init_interface_kit(). + // Currently we can't do that, as get_modifier_key() blocks forever + // when called on input_server initialization, since it tries + // to send a synchronous message to itself (input_server is + // a BApplication) + + if (get_modifier_key(B_LEFT_CONTROL_KEY, &value) != B_OK) + value = 0x5c; +} + + +void +BMenu::_GetCommandKey(uint32 &value) const +{ + // TODO: Move into init_interface_kit(). + // Currently we can't do that, as get_modifier_key() blocks forever + // when called on input_server initialization, since it tries + // to send a synchronous message to itself (input_server is + // a BApplication) + + if (get_modifier_key(B_LEFT_COMMAND_KEY, &value) != B_OK) + value = 0x66; +} + + +void +BMenu::_GetOptionKey(uint32 &value) const +{ + // TODO: Move into init_interface_kit(). + // Currently we can't do that, as get_modifier_key() blocks forever + // when called on input_server initialization, since it tries + // to send a synchronous message to itself (input_server is + // a BApplication) + + if (get_modifier_key(B_LEFT_OPTION_KEY, &value) != B_OK) + value = 0x5d; +} + + +void +BMenu::_GetMenuKey(uint32 &value) const +{ + // TODO: Move into init_interface_kit(). + // Currently we can't do that, as get_modifier_key() blocks forever + // when called on input_server initialization, since it tries + // to send a synchronous message to itself (input_server is + // a BApplication) + + if (get_modifier_key(B_MENU_KEY, &value) != B_OK) + value = 0x68; } diff --git a/src/kits/interface/MenuPrivate.cpp b/src/kits/interface/MenuPrivate.cpp index d9297bea84..41303e6277 100644 --- a/src/kits/interface/MenuPrivate.cpp +++ b/src/kits/interface/MenuPrivate.cpp @@ -11,15 +11,46 @@ #include #include + +const unsigned char kShiftBits[] = { + 0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x14, + 0x1d,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x17,0x14, + 0x1d,0x1a,0x1a,0x17,0x04,0x04,0x17,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x17,0x14, + 0x1d,0x1a,0x1a,0x04,0x17,0x17,0x04,0x1a,0x04,0x1a,0x04,0x1a,0x04,0x1a,0x04,0x04,0x04,0x1a,0x04,0x04,0x04,0x1a,0x17,0x14, + 0x1d,0x1a,0x1a,0x17,0x04,0x04,0x1a,0x1a,0x04,0x1a,0x04,0x1a,0x04,0x1a,0x04,0x1a,0x1a,0x1a,0x1a,0x04,0x1a,0x1a,0x17,0x14, + 0x1d,0x1a,0x1a,0x1a,0x1a,0x1a,0x04,0x1a,0x04,0x04,0x04,0x1a,0x04,0x1a,0x04,0x04,0x1a,0x1a,0x1a,0x04,0x1a,0x1a,0x17,0x14, + 0x1d,0x1a,0x1a,0x04,0x17,0x17,0x04,0x1a,0x04,0x1a,0x04,0x1a,0x04,0x1a,0x04,0x1a,0x1a,0x1a,0x1a,0x04,0x1a,0x1a,0x17,0x14, + 0x1d,0x1a,0x1a,0x17,0x04,0x04,0x17,0x1a,0x04,0x1a,0x04,0x1a,0x04,0x1a,0x04,0x1a,0x1a,0x1a,0x1a,0x04,0x1a,0x1a,0x17,0x14, + 0x1d,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x17,0x14, + 0x1d,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x14, + 0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14 +}; + + const unsigned char kCtrlBits[] = { + 0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x14, + 0x1d,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x17,0x14, + 0x1d,0x1a,0x1a,0x13,0x04,0x04,0x13,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x17,0x14, + 0x1d,0x1a,0x1a,0x04,0x1a,0x1a,0x04,0x1a,0x04,0x04,0x04,0x1a,0x04,0x04,0x04,0x1a,0x04,0x1a,0x1a,0x1a,0x17,0x14, + 0x1d,0x1a,0x1a,0x04,0x1a,0x1a,0x1a,0x1a,0x1a,0x04,0x1a,0x1a,0x04,0x1a,0x04,0x1a,0x04,0x1a,0x1a,0x1a,0x17,0x14, + 0x1d,0x1a,0x1a,0x04,0x1a,0x1a,0x1a,0x1a,0x1a,0x04,0x1a,0x1a,0x04,0x04,0x04,0x1a,0x04,0x1a,0x1a,0x1a,0x17,0x14, + 0x1d,0x1a,0x1a,0x04,0x1a,0x1a,0x04,0x1a,0x1a,0x04,0x1a,0x1a,0x04,0x04,0x1a,0x1a,0x04,0x1a,0x1a,0x1a,0x17,0x14, + 0x1d,0x1a,0x1a,0x13,0x04,0x04,0x13,0x1a,0x1a,0x04,0x1a,0x1a,0x04,0x13,0x04,0x1a,0x04,0x04,0x04,0x1a,0x17,0x14, + 0x1d,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x17,0x14, + 0x1d,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x14, + 0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14 +}; + + +const unsigned char kOptBits[] = { 0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x14, 0x1d,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x17,0x14, - 0x1d,0x1a,0x13,0x04,0x04,0x13,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x17,0x14, - 0x1d,0x1a,0x04,0x1a,0x1a,0x04,0x1a,0x04,0x04,0x04,0x1a,0x04,0x1a,0x1a,0x1a,0x17,0x14, - 0x1d,0x1a,0x04,0x1a,0x1a,0x1a,0x1a,0x1a,0x04,0x1a,0x1a,0x04,0x1a,0x1a,0x1a,0x17,0x14, - 0x1d,0x1a,0x04,0x1a,0x1a,0x1a,0x1a,0x1a,0x04,0x1a,0x1a,0x04,0x1a,0x1a,0x1a,0x17,0x14, - 0x1d,0x1a,0x04,0x1a,0x1a,0x04,0x1a,0x1a,0x04,0x1a,0x1a,0x04,0x1a,0x1a,0x1a,0x17,0x14, - 0x1d,0x1a,0x13,0x04,0x04,0x13,0x1a,0x1a,0x04,0x1a,0x1a,0x04,0x04,0x04,0x1a,0x17,0x14, + 0x1d,0x1a,0x1a,0x13,0x04,0x04,0x13,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x17,0x14, + 0x1d,0x1a,0x1a,0x04,0x1a,0x1a,0x04,0x1a,0x04,0x04,0x1a,0x04,0x04,0x04,0x1a,0x17,0x14, + 0x1d,0x1a,0x1a,0x04,0x1a,0x1a,0x04,0x1a,0x04,0x1a,0x04,0x1a,0x04,0x1a,0x1a,0x17,0x14, + 0x1d,0x1a,0x1a,0x04,0x1a,0x1a,0x04,0x1a,0x04,0x04,0x1a,0x1a,0x04,0x1a,0x1a,0x17,0x14, + 0x1d,0x1a,0x1a,0x04,0x1a,0x1a,0x04,0x1a,0x04,0x1a,0x1a,0x1a,0x04,0x1a,0x1a,0x17,0x14, + 0x1d,0x1a,0x1a,0x13,0x04,0x04,0x13,0x1a,0x04,0x1a,0x1a,0x1a,0x04,0x1a,0x1a,0x17,0x14, 0x1d,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x17,0x14, 0x1d,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x14, 0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14 @@ -41,42 +72,29 @@ const unsigned char kAltBits[] = { }; -const unsigned char kOptBits[] = { - 0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x14, - 0x1d,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x17,0x14, - 0x1d,0x1a,0x1a,0x13,0x04,0x04,0x13,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x17,0x14, - 0x1d,0x1a,0x1a,0x04,0x1a,0x1a,0x04,0x1a,0x04,0x04,0x1a,0x04,0x04,0x04,0x1a,0x17,0x14, - 0x1d,0x1a,0x1a,0x04,0x1a,0x1a,0x04,0x1a,0x04,0x1a,0x04,0x1a,0x04,0x1a,0x1a,0x17,0x14, - 0x1d,0x1a,0x1a,0x04,0x1a,0x1a,0x04,0x1a,0x04,0x04,0x1a,0x1a,0x04,0x1a,0x1a,0x17,0x14, - 0x1d,0x1a,0x1a,0x04,0x1a,0x1a,0x04,0x1a,0x04,0x1a,0x1a,0x1a,0x04,0x1a,0x1a,0x17,0x14, - 0x1d,0x1a,0x1a,0x13,0x04,0x04,0x13,0x1a,0x04,0x1a,0x1a,0x1a,0x04,0x1a,0x1a,0x17,0x14, - 0x1d,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x17,0x14, - 0x1d,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x14, - 0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14 +const unsigned char kMenuBits[] = { + 0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x14, + 0x1d,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x17,0x14, + 0x1d,0x1a,0x1a,0x04,0x04,0x1a,0x04,0x04,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x17,0x14, + 0x1d,0x1a,0x1a,0x04,0x04,0x04,0x04,0x04,0x1a,0x04,0x04,0x1a,0x04,0x1a,0x1a,0x04,0x1a,0x04,0x1a,0x04,0x1a,0x17,0x14, + 0x1d,0x1a,0x1a,0x04,0x1a,0x04,0x1a,0x04,0x1a,0x04,0x1a,0x1a,0x04,0x04,0x1a,0x04,0x1a,0x04,0x1a,0x04,0x1a,0x17,0x14, + 0x1d,0x1a,0x1a,0x04,0x1a,0x1a,0x1a,0x04,0x1a,0x04,0x04,0x1a,0x04,0x04,0x04,0x04,0x1a,0x04,0x1a,0x04,0x1a,0x17,0x14, + 0x1d,0x1a,0x1a,0x04,0x1a,0x1a,0x1a,0x04,0x1a,0x04,0x1a,0x1a,0x04,0x1a,0x04,0x04,0x1a,0x04,0x1a,0x04,0x1a,0x17,0x14, + 0x1d,0x1a,0x1a,0x04,0x1a,0x1a,0x1a,0x04,0x1a,0x04,0x04,0x1a,0x04,0x1a,0x1a,0x04,0x1a,0x04,0x04,0x04,0x1a,0x17,0x14, + 0x1d,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x17,0x14, + 0x1d,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x14, + 0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14 }; -const unsigned char kShiftBits[] = { - 0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x14, - 0x1d,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x17,0x14, - 0x1d,0x1a,0x1a,0x17,0x04,0x04,0x17,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x17,0x14, - 0x1d,0x1a,0x1a,0x04,0x17,0x17,0x04,0x1a,0x04,0x1a,0x04,0x1a,0x04,0x04,0x04,0x1a,0x04,0x04,0x04,0x1a,0x17,0x14, - 0x1d,0x1a,0x1a,0x17,0x04,0x04,0x17,0x1a,0x04,0x1a,0x04,0x1a,0x04,0x1a,0x1a,0x1a,0x1a,0x04,0x1a,0x1a,0x17,0x14, - 0x1d,0x1a,0x1a,0x1a,0x1a,0x1a,0x04,0x1a,0x04,0x04,0x04,0x1a,0x04,0x04,0x1a,0x1a,0x1a,0x04,0x1a,0x1a,0x17,0x14, - 0x1d,0x1a,0x1a,0x04,0x17,0x17,0x04,0x1a,0x04,0x1a,0x04,0x1a,0x04,0x1a,0x1a,0x1a,0x1a,0x04,0x1a,0x1a,0x17,0x14, - 0x1d,0x1a,0x1a,0x17,0x04,0x04,0x17,0x1a,0x04,0x1a,0x04,0x1a,0x04,0x1a,0x1a,0x1a,0x1a,0x04,0x1a,0x1a,0x17,0x14, - 0x1d,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x17,0x14, - 0x1d,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x14, - 0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14 -}; - namespace BPrivate { -BBitmap* MenuPrivate::sMenuItemAlt; +BBitmap* MenuPrivate::sMenuItemShift; BBitmap* MenuPrivate::sMenuItemControl; BBitmap* MenuPrivate::sMenuItemOption; -BBitmap* MenuPrivate::sMenuItemShift; +BBitmap* MenuPrivate::sMenuItemAlt; +BBitmap* MenuPrivate::sMenuItemMenu; MenuPrivate::MenuPrivate(BMenu *menu) @@ -136,14 +154,6 @@ MenuPrivate::GetItemMargins(float *left, float *top, } -/* static */ -bool -MenuPrivate::IsAltCommandKey() -{ - return BMenu::sAltAsCommandKey; -} - - int MenuPrivate::State(BMenuItem **item) const { @@ -198,24 +208,27 @@ status_t MenuPrivate::CreateBitmaps() { BRect smallRect(0, 0, 16, 10); - BRect largeRect(0, 0, 21, 10); + try { + sMenuItemShift = new BBitmap(BRect(0, 0, 23, 10), B_CMAP8); + sMenuItemControl = new BBitmap(BRect(0, 0, 21, 10), B_CMAP8); + sMenuItemOption = new BBitmap(smallRect, B_CMAP8); sMenuItemAlt = new BBitmap(smallRect, B_CMAP8); - sMenuItemControl = new BBitmap(smallRect, B_CMAP8); - sMenuItemOption = new BBitmap(smallRect, B_CMAP8); - sMenuItemShift = new BBitmap(largeRect, B_CMAP8); + sMenuItemMenu = new BBitmap(BRect(0, 0, 22, 10), B_CMAP8); } catch (...) { return B_NO_MEMORY; } - - sMenuItemAlt->ImportBits(kAltBits, sizeof(kAltBits), - 17, 0, B_CMAP8); + + sMenuItemShift->ImportBits(kShiftBits, sizeof(kShiftBits), + 24, 0, B_CMAP8); sMenuItemControl->ImportBits(kCtrlBits, sizeof(kCtrlBits), - 17, 0, B_CMAP8); + 22, 0, B_CMAP8); sMenuItemOption->ImportBits(kOptBits, sizeof(kOptBits), 17, 0, B_CMAP8); - sMenuItemShift->ImportBits(kShiftBits, sizeof(kShiftBits), - 22, 0, B_CMAP8); + sMenuItemAlt->ImportBits(kAltBits, sizeof(kAltBits), + 17, 0, B_CMAP8); + sMenuItemMenu->ImportBits(kMenuBits, sizeof(kMenuBits), + 23, 0, B_CMAP8); return B_OK; } @@ -225,49 +238,79 @@ MenuPrivate::CreateBitmaps() void MenuPrivate::DeleteBitmaps() { - delete sMenuItemAlt; + delete sMenuItemShift; delete sMenuItemControl; delete sMenuItemOption; - delete sMenuItemShift; + delete sMenuItemAlt; + delete sMenuItemMenu; } /* static */ -const BBitmap * -MenuPrivate::MenuItemCommand() -{ - if (BMenu::sAltAsCommandKey) - return sMenuItemAlt; - - return sMenuItemControl; -} - - -/* static */ -const BBitmap * -MenuPrivate::MenuItemControl() -{ - if (BMenu::sAltAsCommandKey) - return sMenuItemControl; - - return sMenuItemAlt; -} - - -/* static */ -const BBitmap * -MenuPrivate::MenuItemOption() -{ - return sMenuItemOption; -} - - -/* static */ -const BBitmap * +const BBitmap* MenuPrivate::MenuItemShift() { return sMenuItemShift; } +/* static */ +const BBitmap* +MenuPrivate::MenuItemControl() +{ + switch (BMenu::sControlKey) { + case 0x5d: + case 0x5f: + return sMenuItemAlt; + case 0x66: + case 0x67: + return sMenuItemOption; + } + + return sMenuItemControl; +} + + +/* static */ +const BBitmap* +MenuPrivate::MenuItemOption() +{ + switch (BMenu::sOptionKey) { + case 0x5c: + case 0x60: + return sMenuItemControl; + case 0x66: + case 0x67: + return sMenuItemOption; + } + + return sMenuItemAlt; +} + + +/* static */ +const BBitmap* +MenuPrivate::MenuItemCommand() +{ + switch (BMenu::sCommandKey) { + case 0x5c: + case 0x60: + return sMenuItemControl; + case 0x66: + case 0x67: + return sMenuItemOption; + } + + return sMenuItemAlt; +} + + +/* static */ +const BBitmap* +MenuPrivate::MenuItemMenu() +{ + return sMenuItemMenu; +} + + } // namespace BPrivate