Change m_windowCurrent to m_currentNSWindow such that m_currentNSWindow is

never used directly but only to look up the associated wxCocoaNSWindow.
If the wxCocoaNSWindow cannot be found later in UpdateMenuBar then it's
likely been destroyed but no crash will result as before.


git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@26720 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
David Elliott
2004-04-12 04:58:32 +00:00
parent 37c2a8dab0
commit af8491078d
2 changed files with 12 additions and 6 deletions

View File

@@ -64,7 +64,7 @@ protected:
// Main menu (if app provides one)
wxMenuBar *m_mainMenuBar;
wxMenuBarManagerObserver *m_observer;
wxCocoaNSWindow *m_windowCurrent;
WX_NSWindow m_currentNSWindow;
};
#endif // wxUSE_MENUS

View File

@@ -127,7 +127,7 @@ wxMenuBarManager::wxMenuBarManager()
m_menuMain = nil;
m_mainMenuBarInstalled = true;
m_mainMenuBar = NULL;
m_windowCurrent = NULL;
m_currentNSWindow = nil;
NSApplication *theNSApplication = wxTheApp->GetNSApplication();
// Create the services menu.
@@ -243,7 +243,10 @@ void wxMenuBarManager::InstallMainMenu()
void wxMenuBarManager::WindowDidBecomeKey(NSNotification *notification)
{
wxCocoaNSWindow *win = wxCocoaNSWindow::GetFromCocoa([notification object]);
/* NOTE: m_currentNSWindow might be destroyed but we only ever use it
to look it up in the hash table. Do not send messages to it. */
m_currentNSWindow = [notification object];
wxCocoaNSWindow *win = wxCocoaNSWindow::GetFromCocoa(m_currentNSWindow);
if(win)
InstallMenuBarForWindow(win);
else
@@ -271,7 +274,6 @@ void wxMenuBarManager::WindowWillClose(NSNotification *notification)
void wxMenuBarManager::InstallMenuBarForWindow(wxCocoaNSWindow *win)
{
wxASSERT(win);
m_windowCurrent = win;
wxMenuBar *menubar = win->GetAppMenuBar(win);
wxLogTrace(wxTRACE_COCOA,wxT("Found menubar=%p for window=%p."),menubar,win);
SetMenuBar(menubar);
@@ -279,8 +281,12 @@ void wxMenuBarManager::InstallMenuBarForWindow(wxCocoaNSWindow *win)
void wxMenuBarManager::UpdateMenuBar()
{
if(m_windowCurrent)
InstallMenuBarForWindow(m_windowCurrent);
if(m_currentNSWindow)
{
wxCocoaNSWindow *win = wxCocoaNSWindow::GetFromCocoa(m_currentNSWindow);
if(win)
InstallMenuBarForWindow(win);
}
}
#endif // wxUSE_MENUS