X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/7bebedd82651a0fc6cf002497956c467375362f7..1b135c93edeadeb3b8ba636e7e03bfe2f4a0b7de:/src/gtk/artgtk.cpp diff --git a/src/gtk/artgtk.cpp b/src/gtk/artgtk.cpp index e7aaa2935d..2ae43ddbf8 100644 --- a/src/gtk/artgtk.cpp +++ b/src/gtk/artgtk.cpp @@ -159,19 +159,8 @@ static GtkIconSize FindClosestIconSize(const wxSize& size) return best; } -wxBitmap wxGTK2ArtProvider::CreateBitmap(const wxArtID& id, - const wxArtClient& client, - const wxSize& size) +static GdkPixbuf *CreateStockIcon(const char *stockid, GtkIconSize size) { - wxCharBuffer stockid = wxArtIDToStock(id); - GtkIconSize stocksize = (size == wxDefaultSize) ? - wxArtClientToIconSize(client) : - FindClosestIconSize(size); - - // allow passing GTK+ stock IDs to wxArtProvider: - 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. @@ -184,12 +173,50 @@ wxBitmap wxGTK2ArtProvider::CreateBitmap(const wxArtID& id, GtkIconSet *iconset = gtk_style_lookup_icon_set(style, stockid); if (!iconset) - return wxNullBitmap; + return NULL; + + return gtk_icon_set_render_icon(iconset, style, + gtk_widget_get_default_direction(), + GTK_STATE_NORMAL, size, NULL, NULL); +} - 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) +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) +{ + wxCharBuffer stockid = wxArtIDToStock(id); + GtkIconSize stocksize = (size == wxDefaultSize) ? + wxArtClientToIconSize(client) : + FindClosestIconSize(size); + + // allow passing GTK+ stock IDs to wxArtProvider: + if (!stockid) + stockid = id.ToAscii(); + + GdkPixbuf *pixbuf = CreateStockIcon(stockid, stocksize); + +#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) ||