X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/7bebedd82651a0fc6cf002497956c467375362f7..82a16d7e5e5c83e95a4caa7314de2dbfbd1debdc:/src/gtk1/artgtk.cpp?ds=sidebyside diff --git a/src/gtk1/artgtk.cpp b/src/gtk1/artgtk.cpp index e7aaa2935d..6302fbb37a 100644 --- a/src/gtk1/artgtk.cpp +++ b/src/gtk1/artgtk.cpp @@ -23,6 +23,7 @@ #if defined(__WXGTK20__) && !defined(__WXUNIVERSAL__) #include "wx/artprov.h" +#include "wx/module.h" #include @@ -159,6 +160,56 @@ static GtkIconSize FindClosestIconSize(const wxSize& size) return best; } + +static GtkStyle *gs_gtkStyle = NULL; + +static GdkPixbuf *CreateStockIcon(const char *stockid, GtkIconSize size) +{ + // FIXME: This code is not 100% correct, because stock pixmap are + // context-dependent and may be affected by theme engine, the + // correct value can only be obtained for given GtkWidget object. + // + // Fool-proof implementation of stock bitmaps would extend wxBitmap + // with "stock-id" representation (in addition to pixmap and pixbuf + // ones) and would convert it to pixbuf when rendered. + + if (gs_gtkStyle == NULL) + { + GtkWidget *widget = gtk_button_new(); + gs_gtkStyle = gtk_rc_get_style(widget); + wxASSERT( gs_gtkStyle != NULL ); + g_object_ref(G_OBJECT(gs_gtkStyle)); + gtk_widget_destroy(widget); + } + + GtkIconSet *iconset = gtk_style_lookup_icon_set(gs_gtkStyle, stockid); + + if (!iconset) + return NULL; + + return gtk_icon_set_render_icon(iconset, gs_gtkStyle, + gtk_widget_get_default_direction(), + GTK_STATE_NORMAL, size, NULL, NULL); +} + +#if GTK_CHECK_VERSION(2,4,0) +static GdkPixbuf *CreateThemeIcon(const char *iconname, + GtkIconSize iconsize, const wxSize& sz) +{ + wxSize size(sz); + if (size == wxDefaultSize) + { + gtk_icon_size_lookup(iconsize, &size.x, &size.y); + } + + return gtk_icon_theme_load_icon( + gtk_icon_theme_get_default(), + iconname, + size.x, + (GtkIconLookupFlags)0, NULL); +} +#endif // GTK+ >= 2.4.0 + wxBitmap wxGTK2ArtProvider::CreateBitmap(const wxArtID& id, const wxArtClient& client, const wxSize& size) @@ -172,24 +223,12 @@ wxBitmap wxGTK2ArtProvider::CreateBitmap(const wxArtID& id, if (!stockid) stockid = id.ToAscii(); - // FIXME: This code is not 100% correct, because stock pixmap are - // context-dependent and may be affected by theme engine, the - // correct value can only be obtained for given GtkWidget object. - // - // Fool-proof implementation of stock bitmaps would extend wxBitmap - // with "stock-id" representation (in addition to pixmap and pixbuf - // ones) and would convert it to pixbuf when rendered. - - GtkStyle *style = gtk_widget_get_default_style(); - GtkIconSet *iconset = gtk_style_lookup_icon_set(style, stockid); - - if (!iconset) - return wxNullBitmap; + GdkPixbuf *pixbuf = CreateStockIcon(stockid, stocksize); - GdkPixbuf *pixbuf = - gtk_icon_set_render_icon(iconset, style, - gtk_widget_get_default_direction(), - GTK_STATE_NORMAL, stocksize, NULL, NULL); +#if GTK_CHECK_VERSION(2,4,0) + if (!pixbuf) + pixbuf = CreateThemeIcon(stockid, stocksize, size); +#endif if (pixbuf && size != wxDefaultSize && (size.x != gdk_pixbuf_get_width(pixbuf) || @@ -215,4 +254,26 @@ wxBitmap wxGTK2ArtProvider::CreateBitmap(const wxArtID& id, return bmp; } +// ---------------------------------------------------------------------------- +// Cleanup +// ---------------------------------------------------------------------------- + +class wxArtGtkModule: public wxModule +{ +public: + bool OnInit() { return true; } + void OnExit() + { + if (gs_gtkStyle) + { + g_object_unref(G_OBJECT(gs_gtkStyle)); + gs_gtkStyle = NULL; + } + } + + DECLARE_DYNAMIC_CLASS(wxArtGtkModule) +}; + +IMPLEMENT_DYNAMIC_CLASS(wxArtGtkModule, wxModule) + #endif // defined(__WXGTK20__) && !defined(__WXUNIVERSAL__)