]> git.saurik.com Git - wxWidgets.git/blobdiff - src/gtk/menu.cpp
Fix crash in wxDC::GetMultiLineTextExtent() after last commit.
[wxWidgets.git] / src / gtk / menu.cpp
index a9e1627ec77c4f1dbdcfddbe2e36514d502a69d7..54856e2c7d39bb846e3068efc6f90b74cc303801 100644 (file)
@@ -63,12 +63,14 @@ static void DoCommonMenuCallbackCode(wxMenu *menu, wxMenuEvent& event)
 
 wxMenuBar::~wxMenuBar()
 {
-    if (m_widget)
+    if (m_widget && IsAttached())
     {
         // Work around a probable bug in Ubuntu 12.04 which causes a warning if
         // gtk_widget_destroy() is called on a wxMenuBar attached to a frame
         GtkWidget* widget = m_widget;
+        m_focusWidget =
         m_widget = NULL;
+        GTKDisconnect(widget);
         g_object_unref(widget);
     }
 }
@@ -339,7 +341,8 @@ wxMenu *wxMenuBar::Remove(size_t pos)
     gtk_widget_destroy( menu->m_owner );
     menu->m_owner = NULL;
 
-    DetachFromFrame( menu, m_menuBarFrame );
+    if ( m_menuBarFrame )
+        DetachFromFrame( menu, m_menuBarFrame );
 
     return menu;
 }
@@ -684,6 +687,13 @@ static void menu_map(GtkWidget*, wxMenu* menu)
 // "hide" from m_menu
 static void menu_hide(GtkWidget*, wxMenu* menu)
 {
+    // When using Ubuntu Unity desktop environment we get "hide" signal even
+    // when the window is not shown yet because Unity hides all the menus to
+    // show them only in the global menu bar. Just ignore this even instead of
+    // crashing in DoCommonMenuCallbackCode().
+    if ( !menu->GetWindow() )
+        return;
+
     wxMenuEvent event(wxEVT_MENU_CLOSE, menu->m_popupShown ? -1 : 0, menu);
     menu->m_popupShown = false;
     DoCommonMenuCallbackCode(menu, event);
@@ -739,7 +749,8 @@ wxMenu::~wxMenu()
     // Destroying a menu generates a "hide" signal even if it's not shown
     // currently, so disconnect it to avoid dummy wxEVT_MENU_CLOSE events
     // generation.
-    g_signal_handlers_disconnect_by_func(m_menu, (gpointer)menu_hide, this);
+    g_signal_handlers_disconnect_matched(m_menu,
+        GSignalMatchType(G_SIGNAL_MATCH_DATA), 0, 0, NULL, NULL, this);
 
     // see wxMenu::Init
     g_object_unref(m_menu);
@@ -902,6 +913,10 @@ wxMenuItem *wxMenu::DoRemove(wxMenuItem *item)
         return NULL;
 
     GtkWidget * const mitem = item->GetMenuItem();
+
+    g_signal_handlers_disconnect_matched(mitem,
+        GSignalMatchType(G_SIGNAL_MATCH_DATA), 0, 0, NULL, NULL, item);
+
 #ifdef __WXGTK3__
     gtk_menu_item_set_submenu(GTK_MENU_ITEM(mitem), NULL);
 #else