X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/45813bada24a38ffdd057e9c88cc9bd3e284f488..a9efc294a979fb4ae801f7dc37af35677301212d:/src/gtk/menu.cpp diff --git a/src/gtk/menu.cpp b/src/gtk/menu.cpp index c89d45db0f..6f385bf71f 100644 --- a/src/gtk/menu.cpp +++ b/src/gtk/menu.cpp @@ -27,16 +27,6 @@ #include "wx/gtk/private.h" #include "wx/gtk/private/mnemonics.h" -// FIXME: is this right? somehow I don't think so (VZ) - -#define gtk_accel_group_attach(g, o) gtk_window_add_accel_group((o), (g)) -#define gtk_accel_group_detach(g, o) gtk_window_remove_accel_group((o), (g)) -//#define gtk_menu_ensure_uline_accel_group(m) gtk_menu_get_accel_group(m) - -#define ACCEL_OBJECT GtkWindow -#define ACCEL_OBJECTS(a) (a)->acceleratables -#define ACCEL_OBJ_CAST(obj) ((GtkWindow*) obj) - // we use normal item but with a special id for the menu title static const int wxGTK_TITLE_ID = -3; @@ -102,7 +92,6 @@ IMPLEMENT_DYNAMIC_CLASS(wxMenuBar,wxWindow) void wxMenuBar::Init(size_t n, wxMenu *menus[], const wxString titles[], long style) { - m_style = style; m_invokingWindow = NULL; #if wxUSE_LIBHILDON @@ -175,9 +164,8 @@ static void wxMenubarUnsetInvokingWindow( wxMenu *menu, wxWindow *win ) top_frame = top_frame->GetParent(); // support for native hot keys - ACCEL_OBJECT *obj = ACCEL_OBJ_CAST(top_frame->m_widget); - if ( menu->m_accel && g_slist_find( ACCEL_OBJECTS(menu->m_accel), obj ) ) - gtk_accel_group_detach( menu->m_accel, obj ); + if (menu->m_accel && g_slist_find(menu->m_accel->acceleratables, top_frame->m_widget)) + gtk_window_remove_accel_group(GTK_WINDOW(top_frame->m_widget), menu->m_accel); wxMenuItemList::compatibility_iterator node = menu->GetMenuItems().GetFirst(); while (node) @@ -198,9 +186,8 @@ static void wxMenubarSetInvokingWindow( wxMenu *menu, wxWindow *win ) top_frame = top_frame->GetParent(); // support for native hot keys - ACCEL_OBJECT *obj = ACCEL_OBJ_CAST(top_frame->m_widget); - if ( !g_slist_find( ACCEL_OBJECTS(menu->m_accel), obj ) ) - gtk_accel_group_attach( menu->m_accel, obj ); + if (menu->m_accel && !g_slist_find(menu->m_accel->acceleratables, top_frame->m_widget)) + gtk_window_add_accel_group(GTK_WINDOW(top_frame->m_widget), menu->m_accel); wxMenuItemList::compatibility_iterator node = menu->GetMenuItems().GetFirst(); while (node) @@ -384,7 +371,7 @@ wxMenu *wxMenuBar::Remove(size_t pos) if ( !menu ) return (wxMenu*) NULL; - gtk_menu_item_remove_submenu( GTK_MENU_ITEM(menu->m_owner) ); + gtk_menu_item_set_submenu(GTK_MENU_ITEM(menu->m_owner), NULL); gtk_container_remove(GTK_CONTAINER(m_menubar), menu->m_owner); gtk_widget_destroy( menu->m_owner ); @@ -971,7 +958,8 @@ void wxMenu::Init() m_menu = gtk_menu_new(); // NB: keep reference to the menu so that it is not destroyed behind // our back by GTK+ e.g. when it is removed from menubar: - gtk_widget_ref(m_menu); + g_object_ref(m_menu); + gtk_object_sink(GTK_OBJECT(m_menu)); m_owner = (GtkWidget*) NULL; @@ -1000,7 +988,7 @@ wxMenu::~wxMenu() if ( GTK_IS_WIDGET( m_menu )) { // see wxMenu::Init - gtk_widget_unref( m_menu ); + g_object_unref(m_menu); g_object_unref( m_accel ); // if the menu is inserted in another menu at this time, there was @@ -1008,13 +996,6 @@ wxMenu::~wxMenu() if ( m_owner ) gtk_widget_destroy( m_menu ); } - - // This must come after we release GTK resources above. Otherwise, GTK will - // give warnings/errors when attempting to free accelerator resources from - // child items that just were destroyed (the m_menu widget can contain - // references to accelerators in child items. Problem detected when removing - // a menu from a wxMenuBar, and the removed menu had submenus with accelerators.) - WX_CLEAR_LIST(wxMenuItemList, m_items); } void wxMenu::SetLayoutDirection(const wxLayoutDirection dir)