Use idle time menu updating when using global menu bar in wxGTK.

We don't get wxEVT_MENU_OPEN events when using the global menu bar so don't
rely on them for updating the menu items status and fall back to idle time
menu updating if the global menu bar is used.

This required changing wxUSE_IDLEMENUUPDATES tests from compile- to run-time
ones.

Closes #14302.

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@73009 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin 2012-11-25 00:15:49 +00:00
parent 93c609c737
commit e758b8f741
2 changed files with 29 additions and 13 deletions

View File

@ -205,6 +205,10 @@ protected:
// frame
virtual void AttachMenuBar(wxMenuBar *menubar);
// Return true if we should update the menu item state from idle event
// handler or false if we should delay it until the menu is opened.
static bool ShouldUpdateMenuFromIdle();
wxMenuBar *m_frameMenuBar;
#endif // wxUSE_MENUS

View File

@ -41,7 +41,6 @@ extern WXDLLEXPORT_DATA(const char) wxStatusLineNameStr[] = "status_line";
// ----------------------------------------------------------------------------
#if wxUSE_MENUS && wxUSE_STATUSBAR
BEGIN_EVENT_TABLE(wxFrameBase, wxTopLevelWindow)
EVT_MENU_OPEN(wxFrameBase::OnMenuOpen)
EVT_MENU_CLOSE(wxFrameBase::OnMenuClose)
@ -49,7 +48,23 @@ BEGIN_EVENT_TABLE(wxFrameBase, wxTopLevelWindow)
EVT_MENU_HIGHLIGHT_ALL(wxFrameBase::OnMenuHighlight)
END_EVENT_TABLE()
#endif // wxUSE_MENUS && wxUSE_STATUSBAR
#endif // wxUSE_MENUS && wxUSE_IDLEMENUUPDATES
/* static */
bool wxFrameBase::ShouldUpdateMenuFromIdle()
{
// Usually this is determined at compile time and is determined by whether
// the platform supports wxEVT_MENU_OPEN, however in wxGTK we need to also
// check if we're using the global menu bar as we don't get EVT_MENU_OPEN
// for it and need to fall back to idle time updating even if normally
// wxUSE_IDLEMENUUPDATES is set to 0 for wxGTK.
#ifdef __WXGTK__
if ( wxApp::GTKIsUsingGlobalMenu() )
return true;
#endif // !__WXGTK__
return wxUSE_IDLEMENUUPDATES != 0;
}
// ============================================================================
// implementation
@ -300,9 +315,7 @@ void wxFrameBase::UpdateWindowUI(long flags)
// If coming from an idle event, we only want to update the menus if
// we're in the wxUSE_IDLEMENUUPDATES configuration, otherwise they
// will be update when the menu is opened later
#if !wxUSE_IDLEMENUUPDATES
if ( !(flags & wxUPDATE_UI_FROMIDLE) )
#endif // wxUSE_IDLEMENUUPDATES
if ( !(flags & wxUPDATE_UI_FROMIDLE) || ShouldUpdateMenuFromIdle() )
DoMenuUpdates();
}
#endif // wxUSE_MENUS
@ -323,12 +336,11 @@ void wxFrameBase::OnMenuHighlight(wxMenuEvent& event)
void wxFrameBase::OnMenuOpen(wxMenuEvent& event)
{
#if wxUSE_IDLEMENUUPDATES
wxUnusedVar(event);
#else // !wxUSE_IDLEMENUUPDATES
// as we didn't update the menus from idle time, do it now
DoMenuUpdates(event.GetMenu());
#endif // wxUSE_IDLEMENUUPDATES/!wxUSE_IDLEMENUUPDATES
if ( !ShouldUpdateMenuFromIdle() )
{
// as we didn't update the menus from idle time, do it now
DoMenuUpdates(event.GetMenu());
}
}
void wxFrameBase::OnMenuClose(wxMenuEvent& WXUNUSED(event))
@ -343,8 +355,8 @@ void wxFrameBase::OnInternalIdle()
{
wxTopLevelWindow::OnInternalIdle();
#if wxUSE_MENUS && wxUSE_IDLEMENUUPDATES
if (wxUpdateUIEvent::CanUpdate(this))
#if wxUSE_MENUS
if ( ShouldUpdateMenuFromIdle() && wxUpdateUIEvent::CanUpdate(this) )
DoMenuUpdates();
#endif
}