[Xfce4-commits] <xfdesktop:eric/icon-changes> Better icon pixbuf caching

Eric Koegel noreply at xfce.org
Sun Aug 25 13:14:01 CEST 2013


Updating branch refs/heads/eric/icon-changes
         to de26505ba425ca939241e0c51b860c5763850386 (commit)
       from 21fe3ab4185b7eba72b5554f4645c8945be3da27 (commit)

commit de26505ba425ca939241e0c51b860c5763850386
Author: Eric Koegel <eric.koegel at gmail.com>
Date:   Sun Aug 25 14:08:37 2013 +0300

    Better icon pixbuf caching
    
    With the inclusion of tooltip pixbuf previews the icon pixbuf would
    get recreated every time the tooltip pixbuf was generated. So now it
    will cache both the normal size icon pixbuf and the tooltip pixbuf.
    The pixbufs are stored in the base icon so that all the different
    icon types don't have to do the same redundant checks.

 src/xfdesktop-file-icon-manager.c |    1 +
 src/xfdesktop-file-icon.c         |    8 ++--
 src/xfdesktop-file-utils.c        |    2 +-
 src/xfdesktop-icon-view.c         |    6 +--
 src/xfdesktop-icon.c              |   83 +++++++++++++++++++++++++++++++++++--
 src/xfdesktop-icon.h              |   10 ++++-
 src/xfdesktop-regular-file-icon.c |   74 ++++++++++++++-------------------
 src/xfdesktop-special-file-icon.c |   63 ++++++++++++----------------
 src/xfdesktop-volume-icon.c       |   68 ++++++++++++++----------------
 src/xfdesktop-window-icon.c       |   44 +++++---------------
 10 files changed, 196 insertions(+), 163 deletions(-)

diff --git a/src/xfdesktop-file-icon-manager.c b/src/xfdesktop-file-icon-manager.c
index 4ec88b9..45e35ea 100644
--- a/src/xfdesktop-file-icon-manager.c
+++ b/src/xfdesktop-file-icon-manager.c
@@ -2160,6 +2160,7 @@ xfdesktop_file_icon_manager_file_changed(GFileMonitor     *monitor,
     GFileInfo *file_info;
 
     switch(event) {
+        case G_FILE_MONITOR_EVENT_ATTRIBUTE_CHANGED:
         case G_FILE_MONITOR_EVENT_CHANGED:
             DBG("got changed event: %s", g_file_get_path(file));
             
diff --git a/src/xfdesktop-file-icon.c b/src/xfdesktop-file-icon.c
index 1d2ddcc..c4dd11a 100644
--- a/src/xfdesktop-file-icon.c
+++ b/src/xfdesktop-file-icon.c
@@ -269,10 +269,8 @@ xfdesktop_file_icon_add_emblems(XfdesktopFileIcon *icon)
     else
         return NULL;
 
-    icon->priv->gicon = emblemed_icon;
-
     if(!G_IS_FILE_INFO(xfdesktop_file_icon_peek_file_info(icon)))
-        return emblemed_icon;
+        return icon->priv->gicon = emblemed_icon;
 
     /* Get the list of emblems */
     emblem_names = g_file_info_get_attribute_stringv(xfdesktop_file_icon_peek_file_info(icon),
@@ -294,7 +292,7 @@ xfdesktop_file_icon_add_emblems(XfdesktopFileIcon *icon)
 
     /* Clear out the old icon and set the new one */
     xfdesktop_file_icon_invalidate_icon(icon);
-    return emblemed_icon;
+    return icon->priv->gicon = emblemed_icon;
 }
 
 void
@@ -313,5 +311,5 @@ xfdesktop_file_icon_has_gicon(XfdesktopFileIcon *icon)
 {
     g_return_val_if_fail(XFDESKTOP_IS_FILE_ICON(icon), FALSE);
 
-    return icon->priv->gicon != NULL ? TRUE : FALSE;
+    return G_IS_ICON(icon->priv->gicon);
 }
diff --git a/src/xfdesktop-file-utils.c b/src/xfdesktop-file-utils.c
index ba0e753..248df59 100644
--- a/src/xfdesktop-file-utils.c
+++ b/src/xfdesktop-file-utils.c
@@ -584,7 +584,7 @@ xfdesktop_file_utils_add_emblems(GdkPixbuf *pix, GList *emblems)
     pix_width = gdk_pixbuf_get_width(pix);
     pix_height = gdk_pixbuf_get_height(pix);
 
-    emblem_size = MIN(pix_width, pix_height) / 3;
+    emblem_size = MIN(pix_width, pix_height) / 2;
 
     /* render up to four emblems for sizes from 48 onwards, else up to 2 emblems */
     max_emblems = (pix_height < 48 && pix_width < 48) ? 2 : 4;
diff --git a/src/xfdesktop-icon-view.c b/src/xfdesktop-icon-view.c
index 48c5aab..da22d0d 100644
--- a/src/xfdesktop-icon-view.c
+++ b/src/xfdesktop-icon-view.c
@@ -1064,9 +1064,9 @@ xfdesktop_icon_view_show_tooltip(GtkWidget *widget,
 
     if(icon_view->priv->tooltip_size > 0) {
         gtk_tooltip_set_icon(tooltip,
-                xfdesktop_icon_peek_pixbuf(icon_view->priv->item_under_pointer,
-                                           icon_view->priv->tooltip_size * 1.5f,
-                                           icon_view->priv->tooltip_size));
+                xfdesktop_icon_peek_tooltip_pixbuf(icon_view->priv->item_under_pointer,
+                                                   icon_view->priv->tooltip_size * 1.5f,
+                                                   icon_view->priv->tooltip_size));
     }
 
     gtk_tooltip_set_text(tooltip, padded_tip_text);
diff --git a/src/xfdesktop-icon.c b/src/xfdesktop-icon.c
index f78189c..b6c2ce7 100644
--- a/src/xfdesktop-icon.c
+++ b/src/xfdesktop-icon.c
@@ -40,6 +40,10 @@ struct _XfdesktopIconPrivate
     GdkRectangle pixbuf_extents;
     GdkRectangle text_extents;
     GdkRectangle total_extents;
+
+    GdkPixbuf *pix, *tooltip_pix;
+    gint cur_pix_width, cur_pix_height;
+    gint cur_tooltip_pix_width, cur_tooltip_pix_height;
 };
 
 enum {
@@ -54,6 +58,7 @@ enum {
 
 static guint __signals[SIG_N_SIGNALS] = { 0, };
 
+static void xfdesktop_icon_finalize(GObject *obj);
 
 G_DEFINE_ABSTRACT_TYPE(XfdesktopIcon, xfdesktop_icon, G_TYPE_OBJECT)
 
@@ -61,8 +66,12 @@ G_DEFINE_ABSTRACT_TYPE(XfdesktopIcon, xfdesktop_icon, G_TYPE_OBJECT)
 static void
 xfdesktop_icon_class_init(XfdesktopIconClass *klass)
 {
+    GObjectClass *gobject_class = (GObjectClass *)klass;
+
     g_type_class_add_private(klass, sizeof(XfdesktopIconPrivate));
-    
+
+    gobject_class->finalize = xfdesktop_icon_finalize;
+
     __signals[SIG_PIXBUF_CHANGED] = g_signal_new("pixbuf-changed",
                                                  XFDESKTOP_TYPE_ICON,
                                                  G_SIGNAL_RUN_LAST,
@@ -117,6 +126,13 @@ xfdesktop_icon_init(XfdesktopIcon *icon)
                                              XfdesktopIconPrivate);
 }
 
+static void
+xfdesktop_icon_finalize(GObject *obj)
+{
+    XfdesktopIcon *icon = XFDESKTOP_ICON(obj);
+
+    xfdesktop_icon_invalidate_pixbuf(icon);
+}
 
 void
 xfdesktop_icon_set_position(XfdesktopIcon *icon,
@@ -186,8 +202,19 @@ xfdesktop_icon_peek_pixbuf(XfdesktopIcon *icon,
     g_return_val_if_fail(XFDESKTOP_IS_ICON(icon), NULL);
     klass = XFDESKTOP_ICON_GET_CLASS(icon);
     g_return_val_if_fail(klass->peek_pixbuf, NULL);
-    
-    return klass->peek_pixbuf(icon, width, height);
+
+    if(width != icon->priv->cur_pix_width || height != icon->priv->cur_pix_height)
+        xfdesktop_icon_invalidate_regular_pixbuf(icon);
+
+    if(icon->priv->pix == NULL) {
+        icon->priv->cur_pix_width = width;
+        icon->priv->cur_pix_height = height;
+
+        /* Generate a new pixbuf */
+        icon->priv->pix = klass->peek_pixbuf(icon, width, height);
+    }
+
+    return icon->priv->pix;
 }
 
 /*< required >*/
@@ -255,6 +282,31 @@ xfdesktop_icon_do_drop_dest(XfdesktopIcon *icon,
 }
 
 /*< optional >*/
+GdkPixbuf *
+xfdesktop_icon_peek_tooltip_pixbuf(XfdesktopIcon *icon,
+                                   gint width, gint height)
+{
+    XfdesktopIconClass *klass;
+
+    g_return_val_if_fail(XFDESKTOP_IS_ICON(icon), NULL);
+    klass = XFDESKTOP_ICON_GET_CLASS(icon);
+    g_return_val_if_fail(klass->peek_tooltip_pixbuf, NULL);
+
+    if(width != icon->priv->cur_tooltip_pix_width || height != icon->priv->cur_tooltip_pix_height)
+        xfdesktop_icon_invalidate_tooltip_pixbuf(icon);
+
+    if(icon->priv->tooltip_pix == NULL) {
+        icon->priv->cur_tooltip_pix_width = width;
+        icon->priv->cur_tooltip_pix_height = height;
+
+        /* Generate a new pixbuf */
+        icon->priv->tooltip_pix = klass->peek_tooltip_pixbuf(icon, width, height);
+    }
+
+    return icon->priv->tooltip_pix;
+}
+
+/*< optional >*/
 G_CONST_RETURN gchar *
 xfdesktop_icon_peek_tooltip(XfdesktopIcon *icon)
 {
@@ -325,6 +377,31 @@ xfdesktop_icon_peek_icon_view(XfdesktopIcon *icon)
     return g_object_get_data(G_OBJECT(icon), "--xfdesktop-icon-view");
 }
 
+void
+xfdesktop_icon_invalidate_regular_pixbuf(XfdesktopIcon *icon)
+{
+    if(icon->priv->pix) {
+        g_object_unref(G_OBJECT(icon->priv->pix));
+        icon->priv->pix = NULL;
+    }
+}
+
+void
+xfdesktop_icon_invalidate_tooltip_pixbuf(XfdesktopIcon *icon)
+{
+    if(icon->priv->tooltip_pix) {
+        g_object_unref(G_OBJECT(icon->priv->tooltip_pix));
+        icon->priv->tooltip_pix = NULL;
+    }
+}
+
+void
+xfdesktop_icon_invalidate_pixbuf(XfdesktopIcon *icon)
+{
+    xfdesktop_icon_invalidate_regular_pixbuf(icon);
+    xfdesktop_icon_invalidate_tooltip_pixbuf(icon);
+}
+
 /*< signal triggers >*/
 
 void
diff --git a/src/xfdesktop-icon.h b/src/xfdesktop-icon.h
index e69c880..00b3fe2 100644
--- a/src/xfdesktop-icon.h
+++ b/src/xfdesktop-icon.h
@@ -70,7 +70,8 @@ struct _XfdesktopIconClass
     
     GdkDragAction (*get_allowed_drop_actions)(XfdesktopIcon *icon, GdkDragAction *suggested_action);
     gboolean (*do_drop_dest)(XfdesktopIcon *icon, XfdesktopIcon *src_icon, GdkDragAction action);
-    
+
+    GdkPixbuf *(*peek_tooltip_pixbuf)(XfdesktopIcon *icon, gint width, gint height);
     G_CONST_RETURN gchar *(*peek_tooltip)(XfdesktopIcon *icon);
     
     void (*set_thumbnail_file)(XfdesktopIcon *icon, GFile *file);
@@ -88,6 +89,9 @@ GdkPixbuf *xfdesktop_icon_peek_pixbuf(XfdesktopIcon *icon,
                                      gint width,
                                      gint height);
 G_CONST_RETURN gchar *xfdesktop_icon_peek_label(XfdesktopIcon *icon);
+GdkPixbuf *xfdesktop_icon_peek_tooltip_pixbuf(XfdesktopIcon *icon,
+                                              gint width,
+                                              gint height);
 G_CONST_RETURN gchar *xfdesktop_icon_peek_tooltip(XfdesktopIcon *icon);
 
 void xfdesktop_icon_set_position(XfdesktopIcon *icon,
@@ -113,6 +117,10 @@ GtkWidget *xfdesktop_icon_peek_icon_view(XfdesktopIcon *icon);
 void xfdesktop_icon_set_thumbnail_file(XfdesktopIcon *icon, GFile *file);
 void xfdesktop_icon_delete_thumbnail(XfdesktopIcon *icon);
 
+void xfdesktop_icon_invalidate_regular_pixbuf(XfdesktopIcon *icon);
+void xfdesktop_icon_invalidate_tooltip_pixbuf(XfdesktopIcon *icon);
+void xfdesktop_icon_invalidate_pixbuf(XfdesktopIcon *icon);
+
 /*< signal triggers >*/
 
 void xfdesktop_icon_pixbuf_changed(XfdesktopIcon *icon);
diff --git a/src/xfdesktop-regular-file-icon.c b/src/xfdesktop-regular-file-icon.c
index 58b7ba7..342f806 100644
--- a/src/xfdesktop-regular-file-icon.c
+++ b/src/xfdesktop-regular-file-icon.c
@@ -59,11 +59,9 @@
 
 struct _XfdesktopRegularFileIconPrivate
 {
-    GdkPixbuf *pix;
     gchar *display_name;
     gchar *tooltip;
     guint pix_opacity;
-    gint cur_pix_width, cur_pix_height;
     GFileInfo *file_info;
     GFileInfo *filesystem_info;
     GFile *file;
@@ -79,6 +77,8 @@ static void xfdesktop_regular_file_icon_delete_thumbnail_file(XfdesktopIcon *ico
 static GdkPixbuf *xfdesktop_regular_file_icon_peek_pixbuf(XfdesktopIcon *icon,
                                                           gint width, gint height);
 static G_CONST_RETURN gchar *xfdesktop_regular_file_icon_peek_label(XfdesktopIcon *icon);
+static GdkPixbuf *xfdesktop_regular_file_icon_peek_tooltip_pixbuf(XfdesktopIcon *icon,
+                                                                  gint width, gint height);
 static G_CONST_RETURN gchar *xfdesktop_regular_file_icon_peek_tooltip(XfdesktopIcon *icon);
 static GdkDragAction xfdesktop_regular_file_icon_get_allowed_drag_actions(XfdesktopIcon *icon);
 static GdkDragAction xfdesktop_regular_file_icon_get_allowed_drop_actions(XfdesktopIcon *icon,
@@ -96,12 +96,7 @@ static gboolean xfdesktop_regular_file_can_write_parent(XfdesktopFileIcon *icon)
 
 #ifdef HAVE_THUNARX
 static void xfdesktop_regular_file_icon_tfi_init(ThunarxFileInfoIface *iface);
-#endif
-
-static inline void xfdesktop_regular_file_icon_invalidate_pixbuf(XfdesktopRegularFileIcon *icon);
 
-
-#ifdef HAVE_THUNARX
 G_DEFINE_TYPE_EXTENDED(XfdesktopRegularFileIcon, xfdesktop_regular_file_icon,
                        XFDESKTOP_TYPE_FILE_ICON, 0,
                        G_IMPLEMENT_INTERFACE(THUNARX_TYPE_FILE_INFO,
@@ -127,6 +122,7 @@ xfdesktop_regular_file_icon_class_init(XfdesktopRegularFileIconClass *klass)
     
     icon_class->peek_pixbuf = xfdesktop_regular_file_icon_peek_pixbuf;
     icon_class->peek_label = xfdesktop_regular_file_icon_peek_label;
+    icon_class->peek_tooltip_pixbuf = xfdesktop_regular_file_icon_peek_tooltip_pixbuf;
     icon_class->peek_tooltip = xfdesktop_regular_file_icon_peek_tooltip;
     icon_class->get_allowed_drag_actions = xfdesktop_regular_file_icon_get_allowed_drag_actions;
     icon_class->get_allowed_drop_actions = xfdesktop_regular_file_icon_get_allowed_drop_actions;
@@ -159,11 +155,8 @@ xfdesktop_regular_file_icon_finalize(GObject *obj)
     GtkIconTheme *itheme = gtk_icon_theme_get_for_screen(icon->priv->gscreen);
     
     g_signal_handlers_disconnect_by_func(G_OBJECT(itheme),
-                                         G_CALLBACK(xfdesktop_regular_file_icon_invalidate_pixbuf),
+                                         G_CALLBACK(xfdesktop_icon_invalidate_pixbuf),
                                          icon);
-
-    if(icon->priv->pix)
-        g_object_unref(G_OBJECT(icon->priv->pix));
     
     if(icon->priv->file_info)
         g_object_unref(icon->priv->file_info);
@@ -174,7 +167,7 @@ xfdesktop_regular_file_icon_finalize(GObject *obj)
     g_object_unref(icon->priv->file);
     
     g_free(icon->priv->display_name);
-    
+
     if(icon->priv->tooltip)
         g_free(icon->priv->tooltip);
 
@@ -201,15 +194,6 @@ xfdesktop_regular_file_icon_tfi_init(ThunarxFileInfoIface *iface)
 }
 #endif
 
-static inline void
-xfdesktop_regular_file_icon_invalidate_pixbuf(XfdesktopRegularFileIcon *icon)
-{
-    if(icon->priv->pix) {
-        g_object_unref(G_OBJECT(icon->priv->pix));
-        icon->priv->pix = NULL;
-    }
-}
-
 static void
 xfdesktop_regular_file_icon_delete_thumbnail_file(XfdesktopIcon *icon)
 {
@@ -227,8 +211,8 @@ xfdesktop_regular_file_icon_delete_thumbnail_file(XfdesktopIcon *icon)
 
     xfdesktop_file_icon_invalidate_icon(XFDESKTOP_FILE_ICON(icon));
 
-    xfdesktop_regular_file_icon_invalidate_pixbuf(file_icon);
-    xfdesktop_icon_pixbuf_changed(XFDESKTOP_ICON(icon));
+    xfdesktop_icon_invalidate_pixbuf(icon);
+    xfdesktop_icon_pixbuf_changed(icon);
 }
 
 static void
@@ -248,8 +232,8 @@ xfdesktop_regular_file_icon_set_thumbnail_file(XfdesktopIcon *icon, GFile *file)
 
     xfdesktop_file_icon_invalidate_icon(XFDESKTOP_FILE_ICON(icon));
 
-    xfdesktop_regular_file_icon_invalidate_pixbuf(file_icon);
-    xfdesktop_icon_pixbuf_changed(XFDESKTOP_ICON(icon));
+    xfdesktop_icon_invalidate_pixbuf(icon);
+    xfdesktop_icon_pixbuf_changed(icon);
 }
 
 static GIcon *
@@ -295,7 +279,7 @@ xfdesktop_regular_file_icon_load_icon(XfdesktopIcon *icon)
 {
     XfdesktopRegularFileIcon *regular_icon = XFDESKTOP_REGULAR_FILE_ICON(icon);
     XfdesktopFileIcon *file_icon = XFDESKTOP_FILE_ICON(icon);
-    GIcon *gicon;
+    GIcon *gicon = NULL;
 
     TRACE("entering");
 
@@ -366,28 +350,34 @@ xfdesktop_regular_file_icon_peek_pixbuf(XfdesktopIcon *icon,
 {
     XfdesktopRegularFileIcon *regular_icon = XFDESKTOP_REGULAR_FILE_ICON(icon);
     GIcon *gicon = NULL;
+    GdkPixbuf *pix = NULL;
+
+    if(!xfdesktop_file_icon_has_gicon(XFDESKTOP_FILE_ICON(icon)))
+        gicon = xfdesktop_regular_file_icon_load_icon(icon);
+    else
+        g_object_get(XFDESKTOP_FILE_ICON(icon), "gicon", &gicon, NULL);
 
-    if(width != regular_icon->priv->cur_pix_width
-       || height != regular_icon->priv->cur_pix_height)
-        xfdesktop_regular_file_icon_invalidate_pixbuf(regular_icon);
+    pix = xfdesktop_file_utils_get_icon(gicon, width, height,
+                                        regular_icon->priv->pix_opacity);
 
-    /* Still valid */
-    if(regular_icon->priv->pix != NULL)
-        return regular_icon->priv->pix;
+    return pix;
+}
+
+static GdkPixbuf *
+xfdesktop_regular_file_icon_peek_tooltip_pixbuf(XfdesktopIcon *icon,
+                                                gint width, gint height)
+{
+    GIcon *gicon = NULL;
+    GdkPixbuf *tooltip_pix = NULL;
 
     if(!xfdesktop_file_icon_has_gicon(XFDESKTOP_FILE_ICON(icon)))
         gicon = xfdesktop_regular_file_icon_load_icon(icon);
     else
         g_object_get(XFDESKTOP_FILE_ICON(icon), "gicon", &gicon, NULL);
 
-    regular_icon->priv->pix = xfdesktop_file_utils_get_icon(gicon,
-                                                            width, height,
-                                                            regular_icon->priv->pix_opacity);
-
-    regular_icon->priv->cur_pix_width = width;
-    regular_icon->priv->cur_pix_height = height;
+    tooltip_pix = xfdesktop_file_utils_get_icon(gicon, width, height, 100);
 
-    return regular_icon->priv->pix;
+    return tooltip_pix;
 }
 
 static G_CONST_RETURN gchar *
@@ -730,7 +720,7 @@ xfdesktop_regular_file_icon_update_file_info(XfdesktopFileIcon *icon,
     
     /* not really easy to check if this changed or not, so just invalidate it */
     xfdesktop_file_icon_invalidate_icon(XFDESKTOP_FILE_ICON(icon));
-    xfdesktop_regular_file_icon_invalidate_pixbuf(regular_file_icon);
+    xfdesktop_icon_invalidate_pixbuf(XFDESKTOP_ICON(icon));
     xfdesktop_icon_pixbuf_changed(XFDESKTOP_ICON(icon));
 }
 
@@ -772,7 +762,7 @@ xfdesktop_regular_file_icon_new(GFile *file,
 
     g_signal_connect_swapped(G_OBJECT(gtk_icon_theme_get_for_screen(screen)),
                              "changed",
-                             G_CALLBACK(xfdesktop_regular_file_icon_invalidate_pixbuf),
+                             G_CALLBACK(xfdesktop_icon_invalidate_pixbuf),
                              regular_file_icon);
     
     return regular_file_icon;
@@ -789,6 +779,6 @@ xfdesktop_regular_file_icon_set_pixbuf_opacity(XfdesktopRegularFileIcon *icon,
     
     icon->priv->pix_opacity = opacity;
     
-    xfdesktop_regular_file_icon_invalidate_pixbuf(icon);
+    xfdesktop_icon_invalidate_pixbuf(XFDESKTOP_ICON(icon));
     xfdesktop_icon_pixbuf_changed(XFDESKTOP_ICON(icon));
 }
diff --git a/src/xfdesktop-special-file-icon.c b/src/xfdesktop-special-file-icon.c
index 17c3fb5..fb418ad 100644
--- a/src/xfdesktop-special-file-icon.c
+++ b/src/xfdesktop-special-file-icon.c
@@ -55,9 +55,7 @@
 struct _XfdesktopSpecialFileIconPrivate
 {
     XfdesktopSpecialFileIconType type;
-    GdkPixbuf *pix;
     gchar *tooltip;
-    gint cur_pix_height;
     GFileMonitor *monitor;
     GFileInfo *file_info;
     GFileInfo *filesystem_info;
@@ -73,6 +71,8 @@ static void xfdesktop_special_file_icon_finalize(GObject *obj);
 static GdkPixbuf *xfdesktop_special_file_icon_peek_pixbuf(XfdesktopIcon *icon,
                                                           gint width, gint height);
 static G_CONST_RETURN gchar *xfdesktop_special_file_icon_peek_label(XfdesktopIcon *icon);
+static GdkPixbuf *xfdesktop_special_file_icon_peek_tooltip_pixbuf(XfdesktopIcon *icon,
+                                                                  gint width, gint height);
 static G_CONST_RETURN gchar *xfdesktop_special_file_icon_peek_tooltip(XfdesktopIcon *icon);
 static GdkDragAction xfdesktop_special_file_icon_get_allowed_drag_actions(XfdesktopIcon *icon);
 static GdkDragAction xfdesktop_special_file_icon_get_allowed_drop_actions(XfdesktopIcon *icon,
@@ -95,13 +95,7 @@ static void xfdesktop_special_file_icon_update_trash_count(XfdesktopSpecialFileI
 
 #ifdef HAVE_THUNARX
 static void xfdesktop_special_file_icon_tfi_init(ThunarxFileInfoIface *iface);
-#endif
-
-
-static inline void xfdesktop_special_file_icon_invalidate_pixbuf(XfdesktopSpecialFileIcon *icon);
 
-
-#ifdef HAVE_THUNARX
 G_DEFINE_TYPE_EXTENDED(XfdesktopSpecialFileIcon, xfdesktop_special_file_icon,
                        XFDESKTOP_TYPE_FILE_ICON, 0,
                        G_IMPLEMENT_INTERFACE(THUNARX_TYPE_FILE_INFO,
@@ -127,6 +121,7 @@ xfdesktop_special_file_icon_class_init(XfdesktopSpecialFileIconClass *klass)
     
     icon_class->peek_pixbuf = xfdesktop_special_file_icon_peek_pixbuf;
     icon_class->peek_label = xfdesktop_special_file_icon_peek_label;
+    icon_class->peek_tooltip_pixbuf = xfdesktop_special_file_icon_peek_tooltip_pixbuf;
     icon_class->peek_tooltip = xfdesktop_special_file_icon_peek_tooltip;
     icon_class->get_allowed_drag_actions = xfdesktop_special_file_icon_get_allowed_drag_actions;
     icon_class->get_allowed_drop_actions = xfdesktop_special_file_icon_get_allowed_drop_actions;
@@ -155,12 +150,9 @@ xfdesktop_special_file_icon_finalize(GObject *obj)
     GtkIconTheme *itheme = gtk_icon_theme_get_for_screen(icon->priv->gscreen);
     
     g_signal_handlers_disconnect_by_func(G_OBJECT(itheme),
-                                         G_CALLBACK(xfdesktop_special_file_icon_invalidate_pixbuf),
+                                         G_CALLBACK(xfdesktop_icon_invalidate_pixbuf),
                                          icon);
 
-    if(icon->priv->pix)
-        g_object_unref(G_OBJECT(icon->priv->pix));
-
     if(icon->priv->monitor) {
         g_signal_handlers_disconnect_by_func(icon->priv->monitor,
                                              G_CALLBACK(xfdesktop_special_file_icon_changed),
@@ -172,7 +164,7 @@ xfdesktop_special_file_icon_finalize(GObject *obj)
 
     if(icon->priv->file_info)
         g_object_unref(icon->priv->file_info);
-    
+
     if(icon->priv->tooltip)
         g_free(icon->priv->tooltip);
     
@@ -207,14 +199,6 @@ xfdesktop_special_file_icon_tfi_init(ThunarxFileInfoIface *iface)
 }
 #endif  /* HAVE_THUNARX */
 
-static inline void
-xfdesktop_special_file_icon_invalidate_pixbuf(XfdesktopSpecialFileIcon *icon)
-{
-    if(icon->priv->pix) {
-        g_object_unref(G_OBJECT(icon->priv->pix));
-        icon->priv->pix = NULL;
-    }
-}
 
 static GIcon *
 xfdesktop_special_file_icon_load_icon(XfdesktopIcon *icon)
@@ -223,7 +207,7 @@ xfdesktop_special_file_icon_load_icon(XfdesktopIcon *icon)
     XfdesktopFileIcon *file_icon = XFDESKTOP_FILE_ICON(icon);
     gchar *icon_name = NULL;
     GFile *parent = NULL;
-    GIcon *gicon;
+    GIcon *gicon = NULL;
 
     TRACE("entering");
 
@@ -269,29 +253,34 @@ static GdkPixbuf *
 xfdesktop_special_file_icon_peek_pixbuf(XfdesktopIcon *icon,
                                         gint width, gint height)
 {
-    XfdesktopSpecialFileIcon *special_icon = XFDESKTOP_SPECIAL_FILE_ICON(icon);
     GIcon *gicon = NULL;
+    GdkPixbuf *pix = NULL;
+
+    if(!xfdesktop_file_icon_has_gicon(XFDESKTOP_FILE_ICON(icon)))
+        gicon = xfdesktop_special_file_icon_load_icon(icon);
+    else
+        g_object_get(XFDESKTOP_FILE_ICON(icon), "gicon", &gicon, NULL);
 
-    if(height != special_icon->priv->cur_pix_height)
-        xfdesktop_special_file_icon_invalidate_pixbuf(special_icon);
+    pix = xfdesktop_file_utils_get_icon(gicon, height, height, 100);
 
-    /* Still valid */
-    if(special_icon->priv->pix != NULL)
-        return special_icon->priv->pix;
+    return pix;
+}
+
+static GdkPixbuf *
+xfdesktop_special_file_icon_peek_tooltip_pixbuf(XfdesktopIcon *icon,
+                                                gint width, gint height)
+{
+    GIcon *gicon = NULL;
+    GdkPixbuf *tooltip_pix = NULL;
 
     if(!xfdesktop_file_icon_has_gicon(XFDESKTOP_FILE_ICON(icon)))
         gicon = xfdesktop_special_file_icon_load_icon(icon);
     else
         g_object_get(XFDESKTOP_FILE_ICON(icon), "gicon", &gicon, NULL);
 
-    special_icon->priv->pix = xfdesktop_file_utils_get_icon(gicon,
-                                                            height,
-                                                            height,
-                                                            100);
-
-    special_icon->priv->cur_pix_height = height;
+    tooltip_pix = xfdesktop_file_utils_get_icon(gicon, height, height, 100);
 
-    return special_icon->priv->pix;
+    return tooltip_pix;
 }
 
 static G_CONST_RETURN gchar *
@@ -640,7 +629,7 @@ xfdesktop_special_file_icon_changed(GFileMonitor *monitor,
 
     /* update the icon */
     xfdesktop_file_icon_invalidate_icon(XFDESKTOP_FILE_ICON(special_file_icon));
-    xfdesktop_special_file_icon_invalidate_pixbuf(special_file_icon);
+    xfdesktop_icon_invalidate_pixbuf(XFDESKTOP_ICON(special_file_icon));
     xfdesktop_icon_pixbuf_changed(XFDESKTOP_ICON(special_file_icon));
 }
 
@@ -743,7 +732,7 @@ xfdesktop_special_file_icon_new(XfdesktopSpecialFileIconType type,
 
     g_signal_connect_swapped(G_OBJECT(gtk_icon_theme_get_for_screen(screen)),
                              "changed",
-                             G_CALLBACK(xfdesktop_special_file_icon_invalidate_pixbuf),
+                             G_CALLBACK(xfdesktop_icon_invalidate_pixbuf),
                              special_file_icon);
 
     special_file_icon->priv->monitor = g_file_monitor(special_file_icon->priv->file,
diff --git a/src/xfdesktop-volume-icon.c b/src/xfdesktop-volume-icon.c
index f347381..c01b7f2 100644
--- a/src/xfdesktop-volume-icon.c
+++ b/src/xfdesktop-volume-icon.c
@@ -60,9 +60,7 @@
 
 struct _XfdesktopVolumeIconPrivate
 {
-    GdkPixbuf *pix;
     gchar *tooltip;
-    gint cur_pix_height;
     gchar *label;
     GVolume *volume;
     GFileInfo *file_info;
@@ -79,6 +77,8 @@ static void xfdesktop_volume_icon_finalize(GObject *obj);
 static GdkPixbuf *xfdesktop_volume_icon_peek_pixbuf(XfdesktopIcon *icon,
                                                     gint width, gint height);
 static G_CONST_RETURN gchar *xfdesktop_volume_icon_peek_label(XfdesktopIcon *icon);
+static GdkPixbuf *xfdesktop_volume_icon_peek_tooltip_pixbuf(XfdesktopIcon *icon,
+                                                            gint width, gint height);
 static G_CONST_RETURN gchar *xfdesktop_volume_icon_peek_tooltip(XfdesktopIcon *icon);
 static GdkDragAction xfdesktop_volume_icon_get_allowed_drag_actions(XfdesktopIcon *icon);
 static GdkDragAction xfdesktop_volume_icon_get_allowed_drop_actions(XfdesktopIcon *icon,
@@ -101,12 +101,7 @@ static void xfdesktop_volume_icon_changed(GVolume *volume,
 
 #ifdef HAVE_THUNARX
 static void xfdesktop_volume_icon_tfi_init(ThunarxFileInfoIface *iface);
-#endif
-
-static inline void xfdesktop_volume_icon_invalidate_pixbuf(XfdesktopVolumeIcon *icon);
 
-
-#ifdef HAVE_THUNARX
 G_DEFINE_TYPE_EXTENDED(XfdesktopVolumeIcon, xfdesktop_volume_icon,
                        XFDESKTOP_TYPE_FILE_ICON, 0,
                        G_IMPLEMENT_INTERFACE(THUNARX_TYPE_FILE_INFO,
@@ -138,6 +133,7 @@ xfdesktop_volume_icon_class_init(XfdesktopVolumeIconClass *klass)
     
     icon_class->peek_pixbuf = xfdesktop_volume_icon_peek_pixbuf;
     icon_class->peek_label = xfdesktop_volume_icon_peek_label;
+    icon_class->peek_tooltip_pixbuf = xfdesktop_volume_icon_peek_tooltip_pixbuf;
     icon_class->peek_tooltip = xfdesktop_volume_icon_peek_tooltip;
     icon_class->get_allowed_drag_actions = xfdesktop_volume_icon_get_allowed_drag_actions;
     icon_class->get_allowed_drop_actions = xfdesktop_volume_icon_get_allowed_drop_actions;
@@ -171,17 +167,14 @@ xfdesktop_volume_icon_finalize(GObject *obj)
         g_source_remove(icon->priv->changed_timeout_id);
     
     g_signal_handlers_disconnect_by_func(G_OBJECT(itheme),
-                                         G_CALLBACK(xfdesktop_volume_icon_invalidate_pixbuf),
+                                         G_CALLBACK(xfdesktop_icon_invalidate_pixbuf),
                                          icon);
     
     if(icon->priv->label) {
         g_free(icon->priv->label);
         icon->priv->label = NULL;
     }
-    
-    if(icon->priv->pix)
-        g_object_unref(G_OBJECT(icon->priv->pix));
-    
+
     if(icon->priv->file_info)
         g_object_unref(icon->priv->file_info);
 
@@ -193,7 +186,7 @@ xfdesktop_volume_icon_finalize(GObject *obj)
 
     if(icon->priv->volume)
         g_object_unref(G_OBJECT(icon->priv->volume));
-    
+
     if(icon->priv->tooltip)
         g_free(icon->priv->tooltip);
     
@@ -218,15 +211,6 @@ xfdesktop_volume_icon_tfi_init(ThunarxFileInfoIface *iface)
 #endif  /* HAVE_THUNARX */
 
 
-static inline void
-xfdesktop_volume_icon_invalidate_pixbuf(XfdesktopVolumeIcon *icon)
-{
-    if(icon->priv->pix) {
-        g_object_unref(G_OBJECT(icon->priv->pix));
-        icon->priv->pix = NULL;
-    }
-}
-
 static gboolean
 xfdesktop_volume_icon_is_mounted(XfdesktopIcon *icon)
 {
@@ -281,18 +265,11 @@ static GdkPixbuf *
 xfdesktop_volume_icon_peek_pixbuf(XfdesktopIcon *icon,
                                   gint width, gint height)
 {
-    XfdesktopVolumeIcon *volume_icon = XFDESKTOP_VOLUME_ICON(icon);
     gint opacity = 100;
     GIcon *gicon = NULL;
+    GdkPixbuf *pix = NULL;
     
     g_return_val_if_fail(XFDESKTOP_IS_VOLUME_ICON(icon), NULL);
-    
-    if(height != volume_icon->priv->cur_pix_height)
-        xfdesktop_volume_icon_invalidate_pixbuf(volume_icon);
-
-    /* Still valid */
-    if(volume_icon->priv->pix != NULL)
-        return volume_icon->priv->pix;
 
     if(!xfdesktop_file_icon_has_gicon(XFDESKTOP_FILE_ICON(icon)))
         gicon = xfdesktop_volume_icon_load_icon(icon);
@@ -303,13 +280,28 @@ xfdesktop_volume_icon_peek_pixbuf(XfdesktopIcon *icon,
     if(!xfdesktop_volume_icon_is_mounted(icon))
         opacity = 50;
 
-    volume_icon->priv->pix = xfdesktop_file_utils_get_icon(gicon,
-                                                           height, height, 
-                                                           opacity);
+    pix = xfdesktop_file_utils_get_icon(gicon, height, height, opacity);
+
+    return pix;
+}
+
+static GdkPixbuf *
+xfdesktop_volume_icon_peek_tooltip_pixbuf(XfdesktopIcon *icon,
+                                          gint width, gint height)
+{
+    GIcon *gicon = NULL;
+    GdkPixbuf *tooltip_pix = NULL;
+
+    g_return_val_if_fail(XFDESKTOP_IS_VOLUME_ICON(icon), NULL);
+
+    if(!xfdesktop_file_icon_has_gicon(XFDESKTOP_FILE_ICON(icon)))
+        gicon = xfdesktop_volume_icon_load_icon(icon);
+    else
+        g_object_get(XFDESKTOP_FILE_ICON(icon), "gicon", &gicon, NULL);
 
-    volume_icon->priv->cur_pix_height = height;
+    tooltip_pix = xfdesktop_file_utils_get_icon(gicon, height, height, 100);
 
-    return volume_icon->priv->pix;
+    return tooltip_pix;
 }
 
 G_CONST_RETURN gchar *
@@ -915,7 +907,7 @@ xfdesktop_volume_icon_update_file_info(XfdesktopFileIcon *icon,
 
     /* not really easy to check if this changed or not, so just invalidate it */
     xfdesktop_file_icon_invalidate_icon(XFDESKTOP_FILE_ICON(icon));
-    xfdesktop_volume_icon_invalidate_pixbuf(volume_icon);
+    xfdesktop_icon_invalidate_pixbuf(XFDESKTOP_ICON(icon));
     xfdesktop_icon_pixbuf_changed(XFDESKTOP_ICON(icon));
 }
 
@@ -1010,7 +1002,7 @@ volume_icon_changed_timeout(XfdesktopVolumeIcon *volume_icon)
         }
 
         /* not really easy to check if this changed or not, so just invalidate it */
-        xfdesktop_volume_icon_invalidate_pixbuf(volume_icon);
+        xfdesktop_icon_invalidate_pixbuf(XFDESKTOP_ICON(volume_icon));
         xfdesktop_icon_pixbuf_changed(XFDESKTOP_ICON(volume_icon));
 
         /* finalize the timeout source */
@@ -1105,7 +1097,7 @@ xfdesktop_volume_icon_new(GVolume *volume,
 
     g_signal_connect_swapped(G_OBJECT(gtk_icon_theme_get_for_screen(screen)),
                              "changed",
-                             G_CALLBACK(xfdesktop_volume_icon_invalidate_pixbuf),
+                             G_CALLBACK(xfdesktop_icon_invalidate_pixbuf),
                              volume_icon);
 
     g_signal_connect(volume, "changed", 
diff --git a/src/xfdesktop-window-icon.c b/src/xfdesktop-window-icon.c
index feabd4d..adeb2f7 100644
--- a/src/xfdesktop-window-icon.c
+++ b/src/xfdesktop-window-icon.c
@@ -35,8 +35,6 @@
 struct _XfdesktopWindowIconPrivate
 {
     gint workspace;
-    GdkPixbuf *pix;
-    gint cur_pix_height;
     gchar *label;
     WnckWindow *window;
 };
@@ -90,9 +88,6 @@ xfdesktop_window_icon_finalize(GObject *obj)
     gchar data_name[256];
     guint16 row, col;
     
-    if(icon->priv->pix)
-        g_object_unref(G_OBJECT(icon->priv->pix));
-    
     g_free(icon->priv->label);
     
     /* save previous position */
@@ -136,44 +131,27 @@ xfdesktop_window_icon_changed_cb(WnckWindow *window,
                                  gpointer user_data)
 {
     XfdesktopWindowIcon *icon = user_data;
-    
-    if(icon->priv->pix) {
-        g_object_unref(G_OBJECT(icon->priv->pix));
-        icon->priv->pix = NULL;
-    }
-    
+
+    xfdesktop_icon_invalidate_pixbuf(XFDESKTOP_ICON(icon));
     xfdesktop_icon_label_changed(XFDESKTOP_ICON(icon));
 }
 
-
-
-
-
 static GdkPixbuf *
 xfdesktop_window_icon_peek_pixbuf(XfdesktopIcon *icon,
                                  gint width, gint height)
 {
     XfdesktopWindowIcon *window_icon = XFDESKTOP_WINDOW_ICON(icon);
-
-    if(!window_icon->priv->pix || window_icon->priv->cur_pix_height != height) {
-        if(window_icon->priv->pix)
-            g_object_unref(G_OBJECT(window_icon->priv->pix));
-
-        window_icon->priv->pix = wnck_window_get_icon(window_icon->priv->window);
-        if(window_icon->priv->pix) {
-            if(gdk_pixbuf_get_height(window_icon->priv->pix) != height) {
-                window_icon->priv->pix = gdk_pixbuf_scale_simple(window_icon->priv->pix,
-                                                                 height,
-                                                                 height,
-                                                                 GDK_INTERP_BILINEAR);
-            } else
-                g_object_ref(G_OBJECT(window_icon->priv->pix));
-
-            window_icon->priv->cur_pix_height = height;
-        }
+    GdkPixbuf *pix = NULL;
+
+    pix = wnck_window_get_icon(window_icon->priv->window);
+    if(pix) {
+        if(gdk_pixbuf_get_height(pix) != height) {
+            pix = gdk_pixbuf_scale_simple(pix, height, height, GDK_INTERP_BILINEAR);
+        } else
+            g_object_ref(G_OBJECT(pix));
     }
 
-    return window_icon->priv->pix;
+    return pix;
 }
 
 static G_CONST_RETURN gchar *


More information about the Xfce4-commits mailing list