X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/670f9935630beb2123a5ca62894ae92a3f0efa4f..e87f080a8809a36b9fd05f5f9b3d8436dac017c3:/src/gtk/menu.cpp diff --git a/src/gtk/menu.cpp b/src/gtk/menu.cpp index 66ea1d2293..ff08f83f5a 100644 --- a/src/gtk/menu.cpp +++ b/src/gtk/menu.cpp @@ -15,35 +15,23 @@ #ifndef WX_PRECOMP #include "wx/intl.h" #include "wx/log.h" - #include "wx/app.h" + #include "wx/frame.h" + #include "wx/bitmap.h" #endif -#include "wx/bitmap.h" - -#if wxUSE_ACCEL - #include "wx/accel.h" -#endif // wxUSE_ACCEL - +#include "wx/accel.h" +#include "wx/stockitem.h" #include "wx/gtk/private.h" -#include - // FIXME: is this right? somehow I don't think so (VZ) -#ifdef __WXGTK20__ - #include - - #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) -#else // GTK+ 1.x - #define ACCEL_OBJECT GtkObject - #define ACCEL_OBJECTS(a) (a)->attach_objects - #define ACCEL_OBJ_CAST(obj) GTK_OBJECT(obj) -#endif + +#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; @@ -953,37 +941,56 @@ bool wxMenu::GtkAppend(wxMenuItem *mitem, int pos) { menuItem = gtk_separator_menu_item_new(); } - else if (mitem->GetBitmap().Ok()) + else if ( mitem->GetBitmap().Ok() || + (mitem->GetKind() == wxITEM_NORMAL && + wxIsStockID(mitem->GetId())) ) { text = mitem->GetText(); - const wxBitmap *bitmap = &mitem->GetBitmap(); + wxBitmap bitmap(mitem->GetBitmap()); menuItem = gtk_image_menu_item_new_with_mnemonic( wxGTK_CONV_SYS( text ) ); GtkWidget *image; - if (bitmap->HasPixbuf()) + if ( !bitmap.Ok() ) { - image = gtk_image_new_from_pixbuf(bitmap->GetPixbuf()); + // use stock bitmap for this item if available on the assumption + // that it never hurts to follow GTK+ conventions more closely + const char *stock = wxGetStockGtkID(mitem->GetId()); + image = stock ? gtk_image_new_from_stock(stock, GTK_ICON_SIZE_MENU) + : NULL; } - else + else // we have a custom bitmap { - 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 ); + wxASSERT_MSG( mitem->GetKind() == wxITEM_NORMAL, + _T("only normal menu items can have bitmaps") ); + + 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); + if ( image ) + { + gtk_widget_show(image); - gtk_image_menu_item_set_image( GTK_IMAGE_MENU_ITEM(menuItem), image ); + gtk_image_menu_item_set_image( GTK_IMAGE_MENU_ITEM(menuItem), image ); + } m_prevRadio = NULL; } else // a normal item { // text has "_" instead of "&" after mitem->SetText() so don't use it - text = mitem->GetText() ; + text = mitem->GetText() ; switch ( mitem->GetKind() ) {