X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/d04995b3a6d56d610d0eb7af9c07ba91eaf4884d..89c831801467203372b6964a785823f19e8063dd:/src/cocoa/menuitem.mm diff --git a/src/cocoa/menuitem.mm b/src/cocoa/menuitem.mm index 5a12767e06..c1248355e8 100644 --- a/src/cocoa/menuitem.mm +++ b/src/cocoa/menuitem.mm @@ -34,6 +34,7 @@ #import #import #import // NSOnState, NSOffState +#import // modifier key masks #if wxUSE_MENUS @@ -101,6 +102,44 @@ wxString wxMenuItemBase::GetLabelFromText(const wxString& text) return wxStripMenuCodes(text); } +void wxMenuItemCocoa::CocoaSetKeyEquivalent() +{ + wxAcceleratorEntry *accel = GetAccel(); + if(!accel) + return; + + int accelFlags = accel->GetFlags(); + int keyModifierMask = 0; + if(accelFlags & wxACCEL_ALT) + keyModifierMask |= NSAlternateKeyMask; + if(accelFlags & wxACCEL_CTRL) + keyModifierMask |= NSCommandKeyMask; + int keyCode = accel->GetKeyCode(); + if(isalpha(keyCode)) + { // For alpha characters use upper/lower rather than NSShiftKeyMask + char alphaChar; + if(accelFlags & wxACCEL_SHIFT) + alphaChar = toupper(keyCode); + else + alphaChar = tolower(keyCode); + [m_cocoaNSMenuItem setKeyEquivalent:[NSString stringWithCString:&alphaChar length:1]]; + [m_cocoaNSMenuItem setKeyEquivalentModifierMask:keyModifierMask]; + } + else + { + if(accelFlags & wxACCEL_SHIFT) + keyModifierMask |= NSShiftKeyMask; + if(keyCode < 128) // low ASCII includes backspace/tab/etc. + { char alphaChar = keyCode; + [m_cocoaNSMenuItem setKeyEquivalent:[NSString stringWithCString:&alphaChar length:1]]; + } + else + { // TODO + } + [m_cocoaNSMenuItem setKeyEquivalentModifierMask:keyModifierMask]; + } +} + // ---------------------------------------------------------------------------- // ctor & dtor // ---------------------------------------------------------------------------- @@ -134,6 +173,7 @@ wxMenuItemCocoa::wxMenuItemCocoa(wxMenu *pParentMenu, else [m_cocoaNSMenuItem setTarget: sm_cocoaTarget]; [menuTitle release]; + CocoaSetKeyEquivalent(); } } @@ -245,6 +285,7 @@ void wxMenuItem::SetText(const wxString& label) wxMenuItemBase::SetText(label); wxCHECK_RET(m_kind != wxITEM_SEPARATOR, wxT("Separator items do not have titles.")); [m_cocoaNSMenuItem setTitle: wxNSStringWithWxString(wxStripMenuCodes(label))]; + CocoaSetKeyEquivalent(); } void wxMenuItem::SetCheckable(bool checkable)