X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/8d7490018a47f60149a35ced6f880ec834aba471..3ab6b7e64c3f3e0ad945976dad35677fdf41dd35:/src/gtk/menu.cpp diff --git a/src/gtk/menu.cpp b/src/gtk/menu.cpp index 42eb67b220..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; @@ -60,12 +50,12 @@ static void DoCommonMenuCallbackCode(wxMenu *menu, wxMenuEvent& event) event.SetEventObject( menu ); wxEvtHandler* handler = menu->GetEventHandler(); - if (handler && handler->ProcessEvent(event)) + if (handler && handler->SafelyProcessEvent(event)) return; wxWindow *win = menu->GetInvokingWindow(); if (win) - win->GetEventHandler()->ProcessEvent( event ); + win->HandleWindowEvent( event ); } extern "C" { @@ -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 ); @@ -573,7 +560,7 @@ static void gtk_menu_clicked_callback( GtkWidget *widget, wxMenu *menu ) if (item->IsCheckable()) commandEvent.SetInt(item->IsChecked()); - frame->GetEventHandler()->ProcessEvent(commandEvent); + frame->HandleWindowEvent(commandEvent); } else { @@ -601,11 +588,11 @@ static void gtk_menu_hilight_callback( GtkWidget *widget, wxMenu *menu ) event.SetEventObject( menu ); wxEvtHandler* handler = menu->GetEventHandler(); - if (handler && handler->ProcessEvent(event)) + if (handler && handler->SafelyProcessEvent(event)) return; wxWindow *win = menu->GetInvokingWindow(); - if (win) win->GetEventHandler()->ProcessEvent( event ); + if (win) win->HandleWindowEvent( event ); } } @@ -627,12 +614,12 @@ static void gtk_menu_nolight_callback( GtkWidget *widget, wxMenu *menu ) event.SetEventObject( menu ); wxEvtHandler* handler = menu->GetEventHandler(); - if (handler && handler->ProcessEvent(event)) + if (handler && handler->SafelyProcessEvent(event)) return; wxWindow *win = menu->GetInvokingWindow(); if (win) - win->GetEventHandler()->ProcessEvent( event ); + win->HandleWindowEvent( event ); } } @@ -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) @@ -1054,6 +1035,7 @@ bool wxMenu::GtkAppend(wxMenuItem *mitem, int pos) if ( mitem->IsSeparator() ) { menuItem = gtk_separator_menu_item_new(); + m_prevRadio = NULL; } else if ( mitem->GetBitmap().Ok() || (mitem->GetKind() == wxITEM_NORMAL && isstock) )