diff --git a/docs/changes.txt b/docs/changes.txt index fa3decc304..214ed1f1b7 100644 --- a/docs/changes.txt +++ b/docs/changes.txt @@ -50,6 +50,10 @@ wxGTK: - Added support for colour cursors (Pascal Monasse). - Setting foreground colour of single line wxTextCtrl now works +wxMac: + +- Fix duplicate (empty) help menu in non-English programs (Andreas Jacobs) + wxMSW: - Fixed infinite loop in wxThread::Wait() in console applications. diff --git a/include/wx/mac/carbon/uma.h b/include/wx/mac/carbon/uma.h index 6fc10b6120..3d12a552cd 100644 --- a/include/wx/mac/carbon/uma.h +++ b/include/wx/mac/carbon/uma.h @@ -94,10 +94,17 @@ bool UMAIsWindowModal( WindowRef inWindow ) ; void UMAHighlightAndActivateWindow( WindowRef inWindowRef , bool inActivate ) ; +// Retrieves the Help menu handle. Warning: As a side-effect this functions also +// creates the Help menu if it didn't exist yet. OSStatus UMAGetHelpMenu( MenuRef * outHelpMenu, MenuItemIndex * outFirstCustomItemIndex); /* can be NULL */ +// Same as UMAGetHelpMenu, but doesn't create the Help menu if UMAGetHelpMenu hasn't been called yet. +OSStatus UMAGetHelpMenuDontCreate( + MenuRef * outHelpMenu, + MenuItemIndex * outFirstCustomItemIndex); /* can be NULL */ + // Appearance Drawing OSStatus UMADrawThemePlacard( const Rect *inRect , ThemeDrawState inState ) ; diff --git a/src/mac/carbon/app.cpp b/src/mac/carbon/app.cpp index 8e587d2306..ec3b13491d 100644 --- a/src/mac/carbon/app.cpp +++ b/src/mac/carbon/app.cpp @@ -451,16 +451,16 @@ wxMenu* wxFindMenuFromMacCommand( const HICommand &command , wxMenuItem* &item ) id = wxMacCommandToId( command.commandID ) ; // make sure it is one of our own menus, or of the 'synthetic' apple and help menus , otherwise don't touch MenuItemIndex firstUserHelpMenuItem ; - static MenuHandle mh = NULL ; - if ( mh == NULL ) + static MenuHandle helpMenuHandle = NULL ; + if ( helpMenuHandle == NULL ) { - if ( UMAGetHelpMenu( &mh , &firstUserHelpMenuItem) != noErr ) - mh = NULL ; + if ( UMAGetHelpMenuDontCreate( &helpMenuHandle , &firstUserHelpMenuItem) != noErr ) + helpMenuHandle = NULL ; } // is it part of the application or the Help menu, then look for the id directly if ( ( GetMenuHandle( kwxMacAppleMenuId ) != NULL && command.menu.menuRef == GetMenuHandle( kwxMacAppleMenuId ) ) || - ( mh != NULL && command.menu.menuRef == mh ) ) + ( helpMenuHandle != NULL && command.menu.menuRef == helpMenuHandle ) ) { wxMenuBar* mbar = wxMenuBar::MacGetInstalledMenuBar() ; if ( mbar ) diff --git a/src/mac/carbon/menu.cpp b/src/mac/carbon/menu.cpp index 09cf4450c1..74f31353f2 100644 --- a/src/mac/carbon/menu.cpp +++ b/src/mac/carbon/menu.cpp @@ -613,21 +613,18 @@ void wxMenuBar::MacInstallMenuBar() CFSTR("About..."), 0, 0, 0); MacInsertMenu( appleMenu , 0 ) ; - // clean-up the help menu before adding new items - static MenuHandle mh = NULL ; + // if we have a mac help menu, clean it up before adding new items + MenuHandle helpMenuHandle ; + MenuItemIndex firstUserHelpMenuItem ; - if ( mh != NULL ) + if ( UMAGetHelpMenuDontCreate( &helpMenuHandle , &firstUserHelpMenuItem) == noErr ) { - MenuItemIndex firstUserHelpMenuItem ; - if ( UMAGetHelpMenu( &mh , &firstUserHelpMenuItem) == noErr ) - { - for ( int i = CountMenuItems( mh ) ; i >= firstUserHelpMenuItem ; --i ) - DeleteMenuItem( mh , i ) ; - } - else - { - mh = NULL ; - } + for ( int i = CountMenuItems( helpMenuHandle ) ; i >= firstUserHelpMenuItem ; --i ) + DeleteMenuItem( helpMenuHandle , i ) ; + } + else + { + helpMenuHandle = NULL ; } #if TARGET_CARBON @@ -654,14 +651,17 @@ void wxMenuBar::MacInstallMenuBar() } #endif + wxString strippedHelpMenuTitle = wxStripMenuCodes( wxApp::s_macHelpMenuTitleName ) ; + wxString strippedTranslatedHelpMenuTitle = wxStripMenuCodes( wxString( _("&Help") ) ) ; wxMenuList::compatibility_iterator menuIter = m_menus.GetFirst(); for (size_t i = 0; i < m_menus.GetCount(); i++, menuIter = menuIter->GetNext()) { wxMenuItemList::compatibility_iterator node; wxMenuItem *item; wxMenu* menu = menuIter->GetData() , *subMenu = NULL ; + wxString strippedMenuTitle = wxStripMenuCodes(m_titles[i]); - if ( m_titles[i] == wxT("?") || m_titles[i] == wxT("&?") || m_titles[i] == wxApp::s_macHelpMenuTitleName ) + if ( strippedMenuTitle == wxT("?") || strippedMenuTitle == strippedHelpMenuTitle || strippedMenuTitle == strippedTranslatedHelpMenuTitle ) { for (node = menu->GetMenuItems().GetFirst(); node; node = node->GetNext()) { @@ -675,12 +675,13 @@ void wxMenuBar::MacInstallMenuBar() { if ( item->GetId() != wxApp::s_macAboutMenuItemId ) { - if ( mh == NULL ) + // we have found a user help menu and an item other than the about item, + // so we can create the mac help menu now, if we haven't created it yet + if ( helpMenuHandle == NULL ) { - MenuItemIndex firstUserHelpMenuItem ; - if ( UMAGetHelpMenu( &mh , &firstUserHelpMenuItem) != noErr ) + if ( UMAGetHelpMenu( &helpMenuHandle , &firstUserHelpMenuItem) != noErr ) { - mh = NULL ; + helpMenuHandle = NULL ; break ; } } @@ -688,8 +689,8 @@ void wxMenuBar::MacInstallMenuBar() if ( item->IsSeparator() ) { - if ( mh ) - AppendMenuItemTextWithCFString( mh, + if ( helpMenuHandle ) + AppendMenuItemTextWithCFString( helpMenuHandle, CFSTR(""), kMenuItemAttrSeparator, 0,NULL); } else @@ -703,11 +704,11 @@ void wxMenuBar::MacInstallMenuBar() } else { - if ( mh ) + if ( helpMenuHandle ) { - UMAAppendMenuItem(mh, wxStripMenuCodes(item->GetText()) , wxFont::GetDefaultEncoding(), entry); - SetMenuItemCommandID( mh , CountMenuItems(mh) , wxIdToMacCommand ( item->GetId() ) ) ; - SetMenuItemRefCon( mh , CountMenuItems(mh) , (URefCon) item ) ; + UMAAppendMenuItem(helpMenuHandle, wxStripMenuCodes(item->GetText()) , wxFont::GetDefaultEncoding(), entry); + SetMenuItemCommandID( helpMenuHandle , CountMenuItems(helpMenuHandle) , wxIdToMacCommand ( item->GetId() ) ) ; + SetMenuItemRefCon( helpMenuHandle , CountMenuItems(helpMenuHandle) , (URefCon) item ) ; } } diff --git a/src/mac/carbon/uma.cpp b/src/mac/carbon/uma.cpp index 161708406b..0857a2411d 100644 --- a/src/mac/carbon/uma.cpp +++ b/src/mac/carbon/uma.cpp @@ -645,14 +645,29 @@ static OSStatus helpMenuStatus = noErr ; static MenuItemIndex firstCustomItemIndex = 0 ; #endif -OSStatus UMAGetHelpMenu( +static OSStatus UMAGetHelpMenu( MenuRef * outHelpMenu, - MenuItemIndex * outFirstCustomItemIndex) + MenuItemIndex * outFirstCustomItemIndex, + bool allowHelpMenuCreation); + +static OSStatus UMAGetHelpMenu( + MenuRef * outHelpMenu, + MenuItemIndex * outFirstCustomItemIndex, + bool allowHelpMenuCreation) { #if TARGET_CARBON - return HMGetHelpMenu( outHelpMenu , outFirstCustomItemIndex ) ; + static bool s_createdHelpMenu = false ; + if ( !s_createdHelpMenu && !allowHelpMenuCreation ) + { + return paramErr ; + } + + OSStatus status = HMGetHelpMenu( outHelpMenu , outFirstCustomItemIndex ) ; + s_createdHelpMenu = ( status == noErr ) ; + return status ; #else + wxUnusedVar( allowHelpMenuCreation ) ; MenuRef helpMenuHandle ; helpMenuStatus = HMGetHelpMenuHandle( &helpMenuHandle ) ; @@ -668,6 +683,20 @@ OSStatus UMAGetHelpMenu( #endif } +OSStatus UMAGetHelpMenu( + MenuRef * outHelpMenu, + MenuItemIndex * outFirstCustomItemIndex) +{ + return UMAGetHelpMenu( outHelpMenu , outFirstCustomItemIndex , true ); +} + +OSStatus UMAGetHelpMenuDontCreate( + MenuRef * outHelpMenu, + MenuItemIndex * outFirstCustomItemIndex) +{ + return UMAGetHelpMenu( outHelpMenu , outFirstCustomItemIndex , false ); +} + #ifndef __LP64__ wxMacPortStateHelper::wxMacPortStateHelper( GrafPtr newport )