X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/387c7b3eefde23a62e20465000dd96d58fc63bcd..450c18313af63d52a01d96ee96cfc45a64b126ac:/src/gtk/menu.cpp diff --git a/src/gtk/menu.cpp b/src/gtk/menu.cpp index 9c8df7c078..a48c4c3b04 100644 --- a/src/gtk/menu.cpp +++ b/src/gtk/menu.cpp @@ -26,14 +26,10 @@ #include "wx/stockitem.h" #include "wx/gtk/private.h" -#ifdef __WXGTK20__ -#include -#endif - // 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_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 @@ -143,14 +139,16 @@ static void DoCommonMenuCallbackCode(wxMenu *menu, wxMenuEvent& event) extern "C" { -static void gtk_menu_open_callback( GtkWidget *widget, wxMenu *menu ) +static void +gtk_menu_open_callback(GtkWidget * WXUNUSED(widget), wxMenu *menu) { wxMenuEvent event(wxEVT_MENU_OPEN, -1, menu); DoCommonMenuCallbackCode(menu, event); } -static void gtk_menu_close_callback( GtkWidget *widget, wxMenuBar *menubar ) +static void +gtk_menu_close_callback(GtkWidget * WXUNUSED(widget), wxMenuBar *menubar) { if ( !menubar->GetMenuCount() ) { @@ -239,6 +237,11 @@ static void wxMenubarUnsetInvokingWindow( wxMenu *menu, wxWindow *win ) while (top_frame->GetParent() && !(top_frame->IsTopLevel())) 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 ); + wxMenuItemList::compatibility_iterator node = menu->GetMenuItems().GetFirst(); while (node) { @@ -383,21 +386,8 @@ bool wxMenuBar::GtkAppend(wxMenu *menu, const wxString& title, int pos) // m_invokingWindow is set after wxFrame::SetMenuBar(). This call enables // addings menu later on. if (m_invokingWindow) - { wxMenubarSetInvokingWindow( menu, m_invokingWindow ); - // OPTIMISE ME: we should probably cache this, or pass it - // directly, but for now this is a minimal - // change to validate the new dynamic sizing. - // see (and refactor :) similar code in Remove - // below. - - wxFrame *frame = wxDynamicCast( m_invokingWindow, wxFrame ); - - if( frame ) - frame->UpdateMenuBarSize(); - } - return true; } @@ -440,13 +430,7 @@ wxMenu *wxMenuBar::Remove(size_t pos) menu->m_owner = NULL; if (m_invokingWindow) - { - // OPTIMISE ME: see comment in GtkAppend - wxFrame *frame = wxDynamicCast( m_invokingWindow, wxFrame ); - - if( frame ) - frame->UpdateMenuBarSize(); - } + wxMenubarUnsetInvokingWindow( menu, m_invokingWindow ); return menu; } @@ -627,7 +611,6 @@ static void gtk_menu_clicked_callback( GtkWidget *widget, wxMenu *menu ) commandEvent.SetEventObject(frame); if (item->IsCheckable()) commandEvent.SetInt(item->IsChecked()); - commandEvent.SetEventObject(menu); frame->GetEventHandler()->ProcessEvent(commandEvent); } @@ -796,7 +779,10 @@ wxString wxMenuItemBase::GetLabelText(const wxString& text) wxString wxMenuItem::GetItemLabel() const { - return wxConvertFromGTKToWXLabel(m_text); + wxString label = wxConvertFromGTKToWXLabel(m_text); + if (!m_hotKey.IsEmpty()) + label = label + wxT("\t") + m_hotKey; + return label; } void wxMenuItem::SetItemLabel( const wxString& str ) @@ -1046,8 +1032,6 @@ void wxMenu::Init() wxMenu::~wxMenu() { - WX_CLEAR_LIST(wxMenuItemList, m_items); - if ( GTK_IS_WIDGET( m_menu )) { // see wxMenu::Init @@ -1059,6 +1043,13 @@ 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)