]> git.saurik.com Git - wxWidgets.git/blobdiff - src/gtk/menu.cpp
Avoid useless iteration on all pages in wxBookCtrlBase::DoGetBestSize().
[wxWidgets.git] / src / gtk / menu.cpp
index f0dbd471f767bdb18be9e2e8107fbf926f22f6aa..b04089376b12fbab8f93c0f676bcbc8bad29bb47 100644 (file)
 
 #include "wx/accel.h"
 #include "wx/stockitem.h"
+
+#include <gtk/gtk.h>
 #include "wx/gtk/private.h"
+#include "wx/gtk/private/gtk2-compat.h"
 #include "wx/gtk/private/mnemonics.h"
 
 // we use normal item but with a special id for the menu title
@@ -60,11 +63,12 @@ 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;
         g_object_unref(widget);
     }
@@ -138,7 +142,7 @@ DetachFromFrame(wxMenu* menu, wxFrame* frame)
         // Note that wxGetTopLevelParent() is really needed because this frame
         // can be an MDI child frame which is a fake frame and not a TLW at all
         GtkWindow * const tlw = GTK_WINDOW(wxGetTopLevelParent(frame)->m_widget);
-        if (g_slist_find(menu->m_accel->acceleratables, tlw))
+        if (g_slist_find(gtk_accel_groups_from_object(G_OBJECT(tlw)), menu->m_accel))
             gtk_window_remove_accel_group(tlw, menu->m_accel);
     }
 
@@ -159,7 +163,7 @@ AttachToFrame(wxMenu* menu, wxFrame* frame)
     if (menu->m_accel)
     {
         GtkWindow * const tlw = GTK_WINDOW(wxGetTopLevelParent(frame)->m_widget);
-        if (!g_slist_find(menu->m_accel->acceleratables, tlw))
+        if (!g_slist_find(gtk_accel_groups_from_object(G_OBJECT(tlw)), menu->m_accel))
             gtk_window_add_accel_group(tlw, menu->m_accel);
     }
 
@@ -336,7 +340,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;
 }
@@ -434,7 +439,7 @@ bool wxMenuBar::IsEnabledTop(size_t pos) const
     wxCHECK_MSG( node, false, wxS("invalid index in IsEnabledTop") );
     wxMenu* const menu = node->GetData();
     wxCHECK_MSG( menu->m_owner, true, wxS("no menu owner?") );
-    return gtk_widget_get_sensitive( menu->m_owner );
+    return gtk_widget_get_sensitive( menu->m_owner ) != 0;
 }
 
 wxString wxMenuBar::GetMenuLabel( size_t pos ) const
@@ -681,6 +686,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);
@@ -899,6 +911,9 @@ wxMenuItem *wxMenu::DoRemove(wxMenuItem *item)
         return NULL;
 
     GtkWidget * const mitem = item->GetMenuItem();
+#ifdef __WXGTK3__
+    gtk_menu_item_set_submenu(GTK_MENU_ITEM(mitem), NULL);
+#else
     if (!gtk_check_version(2,12,0))
     {
         // gtk_menu_item_remove_submenu() is deprecated since 2.12, but
@@ -913,6 +928,7 @@ wxMenuItem *wxMenu::DoRemove(wxMenuItem *item)
         // instead.
         gtk_menu_item_remove_submenu(GTK_MENU_ITEM(mitem));
     }
+#endif
 
     gtk_widget_destroy(mitem);
     item->SetMenuItem(NULL);
@@ -1224,12 +1240,6 @@ const char *wxGetStockGtkID(wxWindowID id)
         case wx:                   \
             return gtk;
 
-    #if GTK_CHECK_VERSION(2,6,0)
-        #define STOCKITEM_26(wx,gtk) STOCKITEM(wx,gtk)
-    #else
-        #define STOCKITEM_26(wx,gtk)
-    #endif
-
     #if GTK_CHECK_VERSION(2,8,0)
         #define STOCKITEM_28(wx,gtk) STOCKITEM(wx,gtk)
     #else
@@ -1245,7 +1255,7 @@ const char *wxGetStockGtkID(wxWindowID id)
 
     switch (id)
     {
-        STOCKITEM_26(wxID_ABOUT,         GTK_STOCK_ABOUT)
+        STOCKITEM(wxID_ABOUT,            GTK_STOCK_ABOUT)
         STOCKITEM(wxID_ADD,              GTK_STOCK_ADD)
         STOCKITEM(wxID_APPLY,            GTK_STOCK_APPLY)
         STOCKITEM(wxID_BACKWARD,         GTK_STOCK_GO_BACK)
@@ -1260,10 +1270,10 @@ const char *wxGetStockGtkID(wxWindowID id)
         STOCKITEM(wxID_CUT,              GTK_STOCK_CUT)
         STOCKITEM(wxID_DELETE,           GTK_STOCK_DELETE)
         STOCKITEM(wxID_DOWN,             GTK_STOCK_GO_DOWN)
-        STOCKITEM_26(wxID_EDIT,          GTK_STOCK_EDIT)
+        STOCKITEM(wxID_EDIT,             GTK_STOCK_EDIT)
         STOCKITEM(wxID_EXECUTE,          GTK_STOCK_EXECUTE)
         STOCKITEM(wxID_EXIT,             GTK_STOCK_QUIT)
-        STOCKITEM_26(wxID_FILE,          GTK_STOCK_FILE)
+        STOCKITEM(wxID_FILE,             GTK_STOCK_FILE)
         STOCKITEM(wxID_FIND,             GTK_STOCK_FIND)
         STOCKITEM(wxID_FIRST,            GTK_STOCK_GOTO_FIRST)
         STOCKITEM(wxID_FLOPPY,           GTK_STOCK_FLOPPY)