From: Václav Slavík Date: Mon, 30 Aug 2004 22:31:41 +0000 (+0000) Subject: load icons from current icon theme under GTK >= 2.4, too X-Git-Url: https://git.saurik.com/wxWidgets.git/commitdiff_plain/b5ab476a0f4107b37180e5edd25ac30f8eab1d3b 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 --- 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,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) || 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,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) ||