X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/7dae41b9f788c737749ea1c2b3b16627ab6fbd6c..bb996f289574defb0ae4339ae8e46ff3cf6fa54c:/src/gtk/menu.cpp diff --git a/src/gtk/menu.cpp b/src/gtk/menu.cpp index a9e1627ec7..54856e2c7d 100644 --- a/src/gtk/menu.cpp +++ b/src/gtk/menu.cpp @@ -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