From b5ab476a0f4107b37180e5edd25ac30f8eab1d3b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=A1clav=20Slav=C3=ADk?= Date: Mon, 30 Aug 2004 22:31:41 +0000 Subject: [PATCH] load icons from current icon theme under GTK >= 2.4, too git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@28970 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- docs/changes.txt | 3 +- docs/latex/wx/artprov.tex | 14 +++++++-- src/gtk/artgtk.cpp | 61 ++++++++++++++++++++++++++++----------- src/gtk1/artgtk.cpp | 61 ++++++++++++++++++++++++++++----------- 4 files changed, 102 insertions(+), 37 deletions(-) diff --git a/docs/changes.txt b/docs/changes.txt index 8f6c1f714e..c721c433f6 100644 --- a/docs/changes.txt +++ b/docs/changes.txt @@ -251,7 +251,8 @@ wxGTK: freedesktop.org's wm-spec (Mart Raudsepp) - wxEVT_CONTEXT_MENU is now generated for right mouse press, not release - implemented alpha channel support in wxBitmap -- added native GTK+2 wxArtProvider implementation +- added native GTK+2 wxArtProvider implementation with ability to load + icons from icon theme in addition to recognized stock art wxMotif: diff --git a/docs/latex/wx/artprov.tex b/docs/latex/wx/artprov.tex index 6263d30628..dcee2933da 100644 --- a/docs/latex/wx/artprov.tex +++ b/docs/latex/wx/artprov.tex @@ -76,8 +76,18 @@ constants in the \helpref{artprov}{sampleartprovider} sample): \end{itemize} Additionally, any string recognized by custom art providers registered using -\helpref{PushProvider}{wxartproviderpushprovider} may be used. When running -under GTK+ 2, GTK+ stock item IDs (e.g. {\tt "gtk-cdrom"}) may be used as well. +\helpref{PushProvider}{wxartproviderpushprovider} may be used. + +\wxheading{GTK+ Note} + +When running under GTK+ 2, GTK+ stock item IDs (e.g. {\tt "gtk-cdrom"}) may +be used as well. Additionally, if wxGTK was compiled against GTK+ >= 2.4, then +it is also possible to load icons from current icon theme by specifying their +name (without extension and directory components). Icon themes recognized +by GTK+ follow the +\urlref{freedesktop.org Icon Themes specification}{http://freedesktop.org/Standards/icon-theme-spec}. Note that themes are not guaranteed to contain all +icons, so wxArtProvider may return {\tt wxNullBitmap} or {\tt wxNullIcon}. +Default theme is typically installed in {\tt /usr/share/icons/hicolor}. \membersection{Clients} 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,6 +159,45 @@ static GtkIconSize FindClosestIconSize(const wxSize& size) return best; } +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. + + GtkStyle *style = gtk_widget_get_default_style(); + GtkIconSet *iconset = gtk_style_lookup_icon_set(style, stockid); + + if (!iconset) + return NULL; + + return gtk_icon_set_render_icon(iconset, style, + 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 +211,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); + GdkPixbuf *pixbuf = CreateStockIcon(stockid, stocksize); - if (!iconset) - return wxNullBitmap; - - 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) || diff --git a/src/gtk1/artgtk.cpp b/src/gtk1/artgtk.cpp index e7aaa2935d..2ae43ddbf8 100644 --- a/src/gtk1/artgtk.cpp +++ b/src/gtk1/artgtk.cpp @@ -159,6 +159,45 @@ static GtkIconSize FindClosestIconSize(const wxSize& size) return best; } +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. + + GtkStyle *style = gtk_widget_get_default_style(); + GtkIconSet *iconset = gtk_style_lookup_icon_set(style, stockid); + + if (!iconset) + return NULL; + + return gtk_icon_set_render_icon(iconset, style, + 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 +211,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); + GdkPixbuf *pixbuf = CreateStockIcon(stockid, stocksize); - if (!iconset) - return wxNullBitmap; - - 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) ||