]> git.saurik.com Git - wxWidgets.git/commitdiff
load icons from current icon theme under GTK >= 2.4, too
authorVáclav Slavík <vslavik@fastmail.fm>
Mon, 30 Aug 2004 22:31:41 +0000 (22:31 +0000)
committerVáclav Slavík <vslavik@fastmail.fm>
Mon, 30 Aug 2004 22:31:41 +0000 (22:31 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@28970 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

docs/changes.txt
docs/latex/wx/artprov.tex
src/gtk/artgtk.cpp
src/gtk1/artgtk.cpp

index 8f6c1f714e459f4fb908e91141bd2086760f7366..c721c433f63db81b7fa3373239df8ccd659620fe 100644 (file)
@@ -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:
 
index 6263d306281d1a61a47a254a1f15ecbd2994001e..dcee2933dae7e8cf38a5a6e430caf7068e171581 100644 (file)
@@ -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}
 
index e7aaa2935d5d77b0804648ad1123bac030e1849f..2ae43ddbf822fd362df24607ca72871ec6450a2e 100644 (file)
@@ -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) ||
index e7aaa2935d5d77b0804648ad1123bac030e1849f..2ae43ddbf822fd362df24607ca72871ec6450a2e 100644 (file)
@@ -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) ||