X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/b1f17bf00ff1480a50a657674b974c40da82eda1..e3507dd8517e922f499cddc30693dcb284815c0a:/src/gtk/menu.cpp?ds=sidebyside diff --git a/src/gtk/menu.cpp b/src/gtk/menu.cpp index 7f04189b92..c89d45db0f 100644 --- a/src/gtk/menu.cpp +++ b/src/gtk/menu.cpp @@ -40,11 +40,14 @@ // we use normal item but with a special id for the menu title static const int wxGTK_TITLE_ID = -3; -//----------------------------------------------------------------------------- -// idle system -//----------------------------------------------------------------------------- +// 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); +} #if wxUSE_ACCEL +static bool wxGetStockGtkAccelerator(const char *id, GdkModifierType *mod, guint *key); static wxString GetGtkHotKey( const wxMenuItem& item ); #endif @@ -57,12 +60,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" { @@ -295,18 +298,42 @@ bool wxMenuBar::Append( wxMenu *menu, const wxString &title ) bool wxMenuBar::GtkAppend(wxMenu *menu, const wxString& title, int pos) { - const wxString str(wxConvertMnemonicsToGTK(title)); + menu->SetLayoutDirection(GetLayoutDirection()); - // This doesn't have much effect right now. - menu->SetTitle( str ); +#if wxUSE_LIBHILDON + // if the menu has only one item, append it directly to the top level menu + // instead of inserting a useless submenu + if ( menu->GetMenuItemCount() == 1 ) + { + wxMenuItem * const item = menu->FindItemByPosition(0); - // The "m_owner" is the "menu item" - menu->m_owner = gtk_menu_item_new_with_mnemonic( wxGTK_CONV( str ) ); - menu->SetLayoutDirection(GetLayoutDirection()); + // remove both mnemonics and accelerator: neither is useful under Maemo + const wxString str(wxStripMenuCodes(item->GetItemLabel())); - gtk_widget_show( menu->m_owner ); + if ( item->IsSubMenu() ) + return GtkAppend(item->GetSubMenu(), str, 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); + item->SetMenuItem(menu->m_owner); + } + else +#endif // wxUSE_LIBHILDON/!wxUSE_LIBHILDON + { + const wxString str(wxConvertMnemonicsToGTK(title)); - gtk_menu_item_set_submenu( GTK_MENU_ITEM(menu->m_owner), menu->m_menu ); + // This doesn't have much effect right now. + menu->SetTitle( str ); + + // The "m_owner" is the "menu item" + menu->m_owner = gtk_menu_item_new_with_mnemonic( wxGTK_CONV( str ) ); + + gtk_menu_item_set_submenu( GTK_MENU_ITEM(menu->m_owner), menu->m_menu ); + } + + gtk_widget_show( menu->m_owner ); if (pos == -1) gtk_menu_shell_append( GTK_MENU_SHELL(m_menubar), menu->m_owner ); @@ -546,7 +573,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 { @@ -574,11 +601,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 ); } } @@ -600,12 +627,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 ); } } @@ -814,7 +841,7 @@ void wxMenuItem::SetItemLabel( const wxString& str ) accel_key, accel_mods ); } -#endif // wxUSE_FILECTRL +#endif // wxUSE_ACCEL } // NOTE: this function is different from the similar functions GTKProcessMnemonics() @@ -1027,6 +1054,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) ) @@ -1146,7 +1174,7 @@ bool wxMenu::GtkAppend(wxMenuItem *mitem, int pos) accel_mods, GTK_ACCEL_VISIBLE); } -#endif // wxUSE_FILECTRL +#endif // wxUSE_ACCEL if (pos == -1) gtk_menu_shell_append(GTK_MENU_SHELL(m_menu), menuItem); @@ -1218,11 +1246,19 @@ wxMenuItem* wxMenu::DoInsert(size_t pos, wxMenuItem *item) wxMenuItem *wxMenu::DoRemove(wxMenuItem *item) { if ( !wxMenuBase::DoRemove(item) ) - return (wxMenuItem *)NULL; + return NULL; + + GtkWidget * const mitem = item->GetMenuItem(); + if ( m_prevRadio == mitem ) + { + // deleting an item starts a new radio group (has to as we shouldn't + // keep a deleted pointer anyhow) + m_prevRadio = NULL; + } // TODO: this code doesn't delete the item factory item and this seems // impossible as of GTK 1.2.6. - gtk_widget_destroy( item->GetMenuItem() ); + gtk_widget_destroy( mitem ); return item; } @@ -1732,6 +1768,8 @@ const char *wxGetStockGtkID(wxWindowID id) return NULL; } +#if wxUSE_ACCEL +static bool wxGetStockGtkAccelerator(const char *id, GdkModifierType *mod, guint *key) { if (!id) @@ -1751,5 +1789,6 @@ bool wxGetStockGtkAccelerator(const char *id, GdkModifierType *mod, guint *key) return false; } +#endif // wxUSE_ACCEL #endif // wxUSE_MENUS