X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/9959e2b6aa19b1f113a0355e60aa53ad3d6b5fdf..d35dce3a2e3ca417093eaa192f1e9e54e55a22ba:/src/gtk1/menu.cpp diff --git a/src/gtk1/menu.cpp b/src/gtk1/menu.cpp index ed7a91f67f..82956da0a6 100644 --- a/src/gtk1/menu.cpp +++ b/src/gtk1/menu.cpp @@ -15,11 +15,11 @@ // For compilers that support precompilation, includes "wx.h". #include "wx/wxprec.h" +#include "wx/menu.h" #include "wx/log.h" #include "wx/intl.h" #include "wx/app.h" #include "wx/bitmap.h" -#include "wx/menu.h" #if wxUSE_ACCEL #include "wx/accel.h" @@ -421,53 +421,17 @@ wxMenu *wxMenuBar::Replace(size_t pos, wxMenu *menu, const wxString& title) return menuOld; } -static wxMenu *CopyMenu (wxMenu *menu) -{ - wxMenu *menucopy = new wxMenu (); - wxMenuItemList::compatibility_iterator node = menu->GetMenuItems().GetFirst(); - while (node) - { - wxMenuItem *item = node->GetData(); - int itemid = item->GetId(); - wxString text = item->GetText(); - text.Replace(wxT("_"), wxT("&")); - wxMenu *submenu = item->GetSubMenu(); - if (!submenu) - { - wxMenuItem* itemcopy = new wxMenuItem(menucopy, - itemid, text, - menu->GetHelpString(itemid)); - itemcopy->SetBitmap(item->GetBitmap()); - itemcopy->SetCheckable(item->IsCheckable()); - menucopy->Append(itemcopy); - } - else - menucopy->Append (itemid, text, CopyMenu(submenu), - menu->GetHelpString(itemid)); - - node = node->GetNext(); - } - - return menucopy; -} - wxMenu *wxMenuBar::Remove(size_t pos) { wxMenu *menu = wxMenuBarBase::Remove(pos); if ( !menu ) return (wxMenu*) NULL; - wxMenu *menucopy = CopyMenu( menu ); - - // unparent calls unref() and that would delete the widget so we raise - // the ref count to 2 artificially before invoking unparent. - gtk_widget_ref( menu->m_menu ); - gtk_widget_unparent( menu->m_menu ); + gtk_menu_item_remove_submenu( GTK_MENU_ITEM(menu->m_owner) ); + gtk_container_remove(GTK_CONTAINER(m_menubar), menu->m_owner); gtk_widget_destroy( menu->m_owner ); - delete menu; - - menu = menucopy; + menu->m_owner = NULL; if (m_invokingWindow) { @@ -986,6 +950,9 @@ void wxMenu::Init() { m_accel = gtk_accel_group_new(); 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); m_owner = (GtkWidget*) NULL; @@ -1014,7 +981,14 @@ wxMenu::~wxMenu() WX_CLEAR_LIST(wxMenuItemList, m_items); if ( GTK_IS_WIDGET( m_menu )) - gtk_widget_destroy( m_menu ); + { + // see wxMenu::Init + gtk_widget_unref( m_menu ); + // if the menu is inserted in another menu at this time, there was + // one more reference to it: + if ( m_owner ) + gtk_widget_destroy( m_menu ); + } } bool wxMenu::GtkAppend(wxMenuItem *mitem, int pos) @@ -1079,13 +1053,24 @@ bool wxMenu::GtkAppend(wxMenuItem *mitem, int pos) { wxString text = mitem->GetText(); const wxBitmap *bitmap = &mitem->GetBitmap(); - GdkPixmap *gdk_pixmap = bitmap->GetPixmap(); - GdkBitmap *gdk_bitmap = bitmap->GetMask() ? bitmap->GetMask()->GetBitmap() : (GdkBitmap*) NULL; #ifdef __WXGTK20__ menuItem = gtk_image_menu_item_new_with_mnemonic( wxGTK_CONV( text ) ); - GtkWidget *image = gtk_image_new_from_pixmap( gdk_pixmap, gdk_bitmap ); + GtkWidget *image; + if (bitmap->HasPixbuf()) + { + image = gtk_image_new_from_pixbuf(bitmap->GetPixbuf()); + } + else + { + GdkPixmap *gdk_pixmap = bitmap->GetPixmap(); + GdkBitmap *gdk_bitmap = bitmap->GetMask() ? + bitmap->GetMask()->GetBitmap() : + (GdkBitmap*) NULL; + image = gtk_image_new_from_pixmap( gdk_pixmap, gdk_bitmap ); + } + gtk_widget_show(image); gtk_image_menu_item_set_image( GTK_IMAGE_MENU_ITEM(menuItem), image ); @@ -1099,6 +1084,8 @@ bool wxMenu::GtkAppend(wxMenuItem *mitem, int pos) else gtk_menu_shell_insert(GTK_MENU_SHELL(m_menu), menuItem, pos); #else + GdkPixmap *gdk_pixmap = bitmap->GetPixmap(); + GdkBitmap *gdk_bitmap = bitmap->GetMask() ? bitmap->GetMask()->GetBitmap() : (GdkBitmap*) NULL; menuItem = gtk_pixmap_menu_item_new (); GtkWidget *label = gtk_accel_label_new ( wxGTK_CONV( text ) ); @@ -1405,7 +1392,7 @@ static wxString GetHotKey( const wxMenuItem& item ) case WXK_F10: case WXK_F11: case WXK_F12: - hotkey << wxT('F') << code - WXK_F1 + 1; + hotkey += wxString::Format(wxT("F%d"), code - WXK_F1 + 1); break; // TODO: we should use gdk_keyval_name() (a.k.a.