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:
\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}
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.
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) ||
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.
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) ||