#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
// 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
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]);
// 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);
}
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);
}
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 );
// "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);
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
// instead.
gtk_menu_item_remove_submenu(GTK_MENU_ITEM(mitem));
}
+#endif
gtk_widget_destroy(mitem);
item->SetMenuItem(NULL);
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
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)
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)