]> git.saurik.com Git - wxWidgets.git/commitdiff
Use idle time menu updating when using global menu bar in wxGTK.
authorVadim Zeitlin <vadim@wxwidgets.org>
Sun, 25 Nov 2012 00:15:49 +0000 (00:15 +0000)
committerVadim Zeitlin <vadim@wxwidgets.org>
Sun, 25 Nov 2012 00:15:49 +0000 (00:15 +0000)
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

include/wx/frame.h
src/common/framecmn.cpp

index f32a20d70ab567bca942da274305f8f101581d01..d4624663b43cf590be82cf592ade9f0e13415f99 100644 (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
 
index b303b53a366942bb8715c1acf13fddfec971bfb6..edb60fb2c9a647fb85ea4911dcd5fab54d307415 100644 (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
 }