]> git.saurik.com Git - wxWidgets.git/blobdiff - src/gtk/menu.cpp
Only use Unix/X11-specific files under Unix in wxGTK.
[wxWidgets.git] / src / gtk / menu.cpp
index ae2d4df83251e92bc0204b262bad096c996e3284..b19352d17ce4bd9c5dc7c8d470f02ffe20c2d1b1 100644 (file)
@@ -58,6 +58,18 @@ static void DoCommonMenuCallbackCode(wxMenu *menu, wxMenuEvent& event)
 // wxMenuBar
 //-----------------------------------------------------------------------------
 
+wxMenuBar::~wxMenuBar()
+{
+    if (m_widget)
+    {
+        // 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_widget = NULL;
+        g_object_unref(widget);
+    }
+}
+
 void wxMenuBar::Init(size_t n, wxMenu *menus[], const wxString titles[], long style)
 {
 #if wxUSE_LIBHILDON || wxUSE_LIBHILDON2
@@ -91,7 +103,7 @@ void wxMenuBar::Init(size_t n, wxMenu *menus[], const wxString titles[], long st
     GTKApplyWidgetStyle();
 #endif // wxUSE_LIBHILDON || wxUSE_LIBHILDON2/!wxUSE_LIBHILDON && !wxUSE_LIBHILDON2
 
-    g_object_ref(m_widget);
+    g_object_ref_sink(m_widget);
 
     for (size_t i = 0; i < n; ++i )
         Append(menus[i], titles[i]);
@@ -416,6 +428,15 @@ void wxMenuBar::EnableTop( size_t pos, bool flag )
         gtk_widget_set_sensitive( menu->m_owner, flag );
 }
 
+bool wxMenuBar::IsEnabledTop(size_t pos) const
+{
+    wxMenuList::compatibility_iterator node = m_menus.Item( pos );
+    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 ) != 0;
+}
+
 wxString wxMenuBar::GetMenuLabel( size_t pos ) const
 {
     wxMenuList::compatibility_iterator node = m_menus.Item( pos );
@@ -878,7 +899,21 @@ wxMenuItem *wxMenu::DoRemove(wxMenuItem *item)
         return NULL;
 
     GtkWidget * const mitem = item->GetMenuItem();
-    gtk_menu_item_set_submenu(GTK_MENU_ITEM(mitem), NULL);
+    if (!gtk_check_version(2,12,0))
+    {
+        // gtk_menu_item_remove_submenu() is deprecated since 2.12, but
+        // gtk_menu_item_set_submenu() can now be used with NULL submenu now so
+        // just do use it.
+        gtk_menu_item_set_submenu(GTK_MENU_ITEM(mitem), NULL);
+    }
+    else // GTK+ < 2.12
+    {
+        // In 2.10 calling gtk_menu_item_set_submenu() with NULL submenu
+        // results in critical GTK+ error messages so use the old function
+        // instead.
+        gtk_menu_item_remove_submenu(GTK_MENU_ITEM(mitem));
+    }
+
     gtk_widget_destroy(mitem);
     item->SetMenuItem(NULL);