X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/cabb286d303c74eab6bce88675007eaaa8049b80..bec76e18352b3b0a94b0b54c8d66159722651e8b:/src/gtk/menu.cpp diff --git a/src/gtk/menu.cpp b/src/gtk/menu.cpp index 8d5b2098ec..782c17ce7b 100644 --- a/src/gtk/menu.cpp +++ b/src/gtk/menu.cpp @@ -33,7 +33,7 @@ static const int wxGTK_TITLE_ID = -3; // forward declare it as it's used by wxMenuBar too when using Hildon extern "C" { - static void gtk_menu_clicked_callback(GtkWidget *widget, wxMenu *menu); + static void menuitem_activate(GtkWidget*, wxMenuItem* item); } #if wxUSE_ACCEL @@ -263,7 +263,7 @@ bool wxMenuBar::GtkAppend(wxMenu *menu, const wxString& title, int pos) menu->m_owner = gtk_menu_item_new_with_mnemonic( wxGTK_CONV( str ) ); g_signal_connect(menu->m_owner, "activate", - G_CALLBACK(gtk_menu_clicked_callback), menu); + G_CALLBACK(menuitem_activate), item); item->SetMenuItem(menu->m_owner); } else @@ -458,21 +458,13 @@ void wxMenuBar::SetMenuLabel( size_t pos, const wxString& label ) //----------------------------------------------------------------------------- extern "C" { -static void gtk_menu_clicked_callback( GtkWidget *widget, wxMenu *menu ) +static void menuitem_activate(GtkWidget*, wxMenuItem* item) { - int id = menu->FindMenuIdByMenuItem(widget); - - /* should find it for normal (not popup) menu */ - wxASSERT_MSG( (id != -1) || (menu->GetInvokingWindow() != NULL), - _T("menu item not found in gtk_menu_clicked_callback") ); - - if (!menu->IsEnabled(id)) + if (!item->IsEnabled()) return; - wxMenuItem* item = menu->FindChildItem( id ); - wxCHECK_RET( item, wxT("error in menu item callback") ); - - if ( item->GetId() == wxGTK_TITLE_ID ) + int id = item->GetId(); + if (id == wxGTK_TITLE_ID) { // ignore events from the menu title return; @@ -496,33 +488,8 @@ static void gtk_menu_clicked_callback( GtkWidget *widget, wxMenu *menu ) } } - - // Is this menu on a menubar? (possibly nested) - wxFrame* frame = NULL; - if(menu->IsAttached()) - frame = menu->GetMenuBar()->GetFrame(); - - // FIXME: why do we have to call wxFrame::GetEventHandler() directly here? - // normally wxMenu::SendEvent() should be enough, if it doesn't work - // in wxGTK then we have a bug in wxMenu::GetInvokingWindow() which - // should be fixed instead of working around it here... - if (frame) - { - // If it is attached then let the frame send the event. - // Don't call frame->ProcessCommand(id) because it toggles - // checkable items and we've already done that above. - wxCommandEvent commandEvent(wxEVT_COMMAND_MENU_SELECTED, id); - commandEvent.SetEventObject(frame); - if (item->IsCheckable()) - commandEvent.SetInt(item->IsChecked()); - - frame->HandleWindowEvent(commandEvent); - } - else - { - // otherwise let the menu have it - menu->SendEvent(id, item->IsCheckable() ? item->IsChecked() : -1); - } + wxMenu* menu = item->GetMenu(); + menu->SendEvent(id, item->IsCheckable() ? item->IsChecked() : -1); } } @@ -531,16 +498,13 @@ static void gtk_menu_clicked_callback( GtkWidget *widget, wxMenu *menu ) //----------------------------------------------------------------------------- extern "C" { -static void gtk_menu_hilight_callback( GtkWidget *widget, wxMenu *menu ) +static void menuitem_select(GtkWidget*, wxMenuItem* item) { - int id = menu->FindMenuIdByMenuItem(widget); - - wxASSERT( id != -1 ); // should find it! - - if (!menu->IsEnabled(id)) + if (!item->IsEnabled()) return; - wxMenuEvent event( wxEVT_MENU_HIGHLIGHT, id ); + wxMenu* menu = item->GetMenu(); + wxMenuEvent event(wxEVT_MENU_HIGHLIGHT, item->GetId()); event.SetEventObject( menu ); wxEvtHandler* handler = menu->GetEventHandler(); @@ -557,15 +521,12 @@ static void gtk_menu_hilight_callback( GtkWidget *widget, wxMenu *menu ) //----------------------------------------------------------------------------- extern "C" { -static void gtk_menu_nolight_callback( GtkWidget *widget, wxMenu *menu ) +static void menuitem_deselect(GtkWidget*, wxMenuItem* item) { - int id = menu->FindMenuIdByMenuItem(widget); - - wxASSERT( id != -1 ); // should find it! - - if (!menu->IsEnabled(id)) + if (!item->IsEnabled()) return; + wxMenu* menu = item->GetMenu(); wxMenuEvent event( wxEVT_MENU_HIGHLIGHT, -1 ); event.SetEventObject( menu ); @@ -858,9 +819,9 @@ bool wxMenu::GtkAppend(wxMenuItem *mitem, int pos) { mitem->SetGtkLabel(); g_signal_connect (menuItem, "select", - G_CALLBACK (gtk_menu_hilight_callback), this); + G_CALLBACK(menuitem_select), mitem); g_signal_connect (menuItem, "deselect", - G_CALLBACK (gtk_menu_nolight_callback), this); + G_CALLBACK(menuitem_deselect), mitem); if ( mitem->IsSubMenu() && mitem->GetKind() != wxITEM_RADIO && mitem->GetKind() != wxITEM_CHECK ) { @@ -877,8 +838,8 @@ bool wxMenu::GtkAppend(wxMenuItem *mitem, int pos) else { g_signal_connect (menuItem, "activate", - G_CALLBACK (gtk_menu_clicked_callback), - this); + G_CALLBACK(menuitem_activate), + mitem); } } @@ -925,20 +886,6 @@ wxMenuItem *wxMenu::DoRemove(wxMenuItem *item) return item; } -int wxMenu::FindMenuIdByMenuItem( GtkWidget *menuItem ) const -{ - wxMenuItemList::compatibility_iterator node = m_items.GetFirst(); - while (node) - { - wxMenuItem *item = node->GetData(); - if (item->GetMenuItem() == menuItem) - return item->GetId(); - node = node->GetNext(); - } - - return wxNOT_FOUND; -} - void wxMenu::Attach(wxMenuBarBase *menubar) { wxMenuBase::Attach(menubar);