[Xfce4-commits] <xfdesktop:eric/wallpaper-and-settings-improvements> Cache wallpapers when they are loaded

Eric Koegel noreply at xfce.org
Sat Mar 30 11:36:02 CET 2013


Updating branch refs/heads/eric/wallpaper-and-settings-improvements
         to 4e51013473eed4a9879267db7d48986061caddd9 (commit)
       from bcd164f4e460f1cdaff1db4287a1109518f895e5 (commit)

commit 4e51013473eed4a9879267db7d48986061caddd9
Author: Eric Koegel <eric.koegel at gmail.com>
Date:   Sat Mar 30 10:08:50 2013 +0300

    Cache wallpapers when they are loaded
    
    This is to make workspace switching faster. It only cached when drawing the
    wallpaper because the user may have lots of workspaces configured for whatever
    reason and never use all of them, so this would save on the memory overhead.
    This patch also improves the backdrop comparison check and simplifies the
    unbinding of some settings.

 src/xfce-backdrop.c  |   65 +++++++++++++++++++++++++++++++++++++++++++-------
 src/xfce-workspace.c |   52 +--------------------------------------
 2 files changed, 58 insertions(+), 59 deletions(-)

diff --git a/src/xfce-backdrop.c b/src/xfce-backdrop.c
index f209c50..9122682 100644
--- a/src/xfce-backdrop.c
+++ b/src/xfce-backdrop.c
@@ -60,7 +60,9 @@ struct _XfceBackdropPriv
 {
     gint width, height;
     gint bpp;
-    
+
+    GdkPixbuf *pix;
+
     XfceBackdropColorStyle color_style;
     GdkColor color1;
     GdkColor color2;
@@ -179,6 +181,19 @@ create_gradient(GdkColor *color1, GdkColor *color2, gint width, gint height,
     return pix;
 }
 
+static void
+xfce_backdrop_clear_cached_image(XfceBackdrop *backdrop)
+{
+    g_return_if_fail(XFCE_IS_BACKDROP(backdrop));
+
+    if(backdrop->priv->pix == NULL)
+        return;
+
+    g_object_unref(backdrop->priv->pix);
+    backdrop->priv->pix = NULL;
+}
+
+
 /* gobject-related functions */
 
 
@@ -303,6 +318,8 @@ xfce_backdrop_finalize(GObject *object)
         backdrop->priv->cycle_timer_id = 0;
     }
 
+    xfce_backdrop_clear_cached_image(backdrop);
+
     G_OBJECT_CLASS(xfce_backdrop_parent_class)->finalize(object);
 }
 
@@ -474,9 +491,13 @@ void
 xfce_backdrop_set_size(XfceBackdrop *backdrop, gint width, gint height)
 {
     g_return_if_fail(XFCE_IS_BACKDROP(backdrop));
-    
-    backdrop->priv->width = width;
-    backdrop->priv->height = height;
+
+    if(backdrop->priv->width != width ||
+       backdrop->priv->height != height) {
+        xfce_backdrop_clear_cached_image(backdrop);
+        backdrop->priv->width = width;
+        backdrop->priv->height = height;
+    }
 }
 
 /**
@@ -494,6 +515,7 @@ xfce_backdrop_set_color_style(XfceBackdrop *backdrop,
     g_return_if_fail((int)style >= 0 && style <= XFCE_BACKDROP_COLOR_TRANSPARENT);
     
     if(style != backdrop->priv->color_style) {
+        xfce_backdrop_clear_cached_image(backdrop);
         backdrop->priv->color_style = style;
         g_signal_emit(G_OBJECT(backdrop), backdrop_signals[BACKDROP_CHANGED], 0);
     }
@@ -528,6 +550,7 @@ xfce_backdrop_set_first_color(XfceBackdrop *backdrop,
             || color->green != backdrop->priv->color1.green
             || color->blue != backdrop->priv->color1.blue)
     {
+        xfce_backdrop_clear_cached_image(backdrop);
         backdrop->priv->color1.red = color->red;
         backdrop->priv->color1.green = color->green;
         backdrop->priv->color1.blue = color->blue;
@@ -564,6 +587,7 @@ xfce_backdrop_set_second_color(XfceBackdrop *backdrop,
             || color->green != backdrop->priv->color2.green
             || color->blue != backdrop->priv->color2.blue)
     {
+        xfce_backdrop_clear_cached_image(backdrop);
         backdrop->priv->color2.red = color->red;
         backdrop->priv->color2.green = color->green;
         backdrop->priv->color2.blue = color->blue;
@@ -599,6 +623,7 @@ xfce_backdrop_set_image_style(XfceBackdrop *backdrop,
     g_return_if_fail(XFCE_IS_BACKDROP(backdrop));
     
     if(style != backdrop->priv->image_style) {
+        xfce_backdrop_clear_cached_image(backdrop);
         backdrop->priv->image_style = style;
         g_signal_emit(G_OBJECT(backdrop), backdrop_signals[BACKDROP_CHANGED], 0);
     }
@@ -634,7 +659,9 @@ xfce_backdrop_set_image_filename(XfceBackdrop *backdrop, const gchar *filename)
         backdrop->priv->image_path = g_strdup(filename);
     else
         backdrop->priv->image_path = NULL;
-    
+
+    xfce_backdrop_clear_cached_image(backdrop);
+
     g_signal_emit(G_OBJECT(backdrop), backdrop_signals[BACKDROP_CHANGED], 0);
 }
 
@@ -763,9 +790,16 @@ xfce_backdrop_get_pixbuf(XfceBackdrop *backdrop)
     gint dx, dy, xo, yo;
     gdouble xscale, yscale;
     GdkInterpType interp;
-    
+
+    TRACE("entering");
+
     g_return_val_if_fail(XFCE_IS_BACKDROP(backdrop), NULL);
-    
+
+    if(backdrop->priv->pix != NULL) {
+        DBG("pixbuf cached");
+        return g_object_ref(backdrop->priv->pix);
+    }
+
     if(backdrop->priv->image_style != XFCE_BACKDROP_IMAGE_NONE &&
        backdrop->priv->image_path) {
         gdk_pixbuf_get_file_info(backdrop->priv->image_path, &iw, &ih);
@@ -919,7 +953,10 @@ xfce_backdrop_get_pixbuf(XfceBackdrop *backdrop)
     
     if(image)
         g_object_unref(G_OBJECT(image));
-    
+
+    /* cache it */
+    backdrop->priv->pix = g_object_ref(final_image);
+
     return final_image;
 }
 
@@ -942,7 +979,17 @@ gboolean xfce_backdrop_compare_backdrops(XfceBackdrop *backdrop_a,
         return FALSE;
     }
 
-    if(!gdk_color_equal(&backdrop_a->priv->color1, &backdrop_b->priv->color1) ||
+    /* Every color style uses color1 except for transparent which does not need
+     * a color check */
+    if(backdrop_a->priv->color_style != XFCE_BACKDROP_COLOR_TRANSPARENT &&
+       !gdk_color_equal(&backdrop_a->priv->color1, &backdrop_b->priv->color1)) {
+        DBG("colors different");
+        return FALSE;
+    }
+
+    /* When the style is set to gradient then we should check color2 as well */
+    if((backdrop_a->priv->color_style == XFCE_BACKDROP_COLOR_HORIZ_GRADIENT ||
+        backdrop_a->priv->color_style == XFCE_BACKDROP_COLOR_VERT_GRADIENT) &&
        !gdk_color_equal(&backdrop_a->priv->color2, &backdrop_b->priv->color2)) {
         DBG("colors different");
         return FALSE;
diff --git a/src/xfce-workspace.c b/src/xfce-workspace.c
index 4d49400..d6368ea 100644
--- a/src/xfce-workspace.c
+++ b/src/xfce-workspace.c
@@ -383,59 +383,11 @@ xfce_workspace_disconnect_backdrop_settings(XfceWorkspace *workspace,
                                             XfceBackdrop *backdrop,
                                             guint monitor)
 {
-    XfconfChannel *channel = workspace->priv->channel;
-    char buf[1024];
-    gint pp_len;
-    gchar *monitor_name = NULL;
-
     TRACE("entering");
 
-    monitor_name = gdk_screen_get_monitor_plug_name(workspace->priv->gscreen, monitor);
-
-    if(monitor_name == NULL) {
-        g_snprintf(buf, sizeof(buf), "%smonitor%d/workspace%d/",
-                   workspace->priv->property_prefix, monitor, workspace->priv->workspace_num);
-    } else {
-        g_snprintf(buf, sizeof(buf), "%smonitor%s/workspace%d/",
-                   workspace->priv->property_prefix, monitor_name, workspace->priv->workspace_num);
-    }
-    pp_len = strlen(buf);
-
-    DBG("prefix string: %s", buf);
-
-    g_strlcat(buf, "color-style", sizeof(buf));
-    xfconf_g_property_unbind_by_property(channel, buf,
-                               G_OBJECT(backdrop), "color-style");
-
-    xfconf_g_property_unbind(workspace->priv->first_color_id[monitor]);
-    xfconf_g_property_unbind(workspace->priv->second_color_id[monitor]);
-
-    buf[pp_len] = 0;
-    g_strlcat(buf, "image-style", sizeof(buf));
-    xfconf_g_property_unbind_by_property(channel, buf,
-                               G_OBJECT(backdrop), "image-style");
-
-    buf[pp_len] = 0;
-    g_strlcat(buf, "backdrop-cycle-enable", sizeof(buf));
-    xfconf_g_property_unbind_by_property(channel, buf,
-                               G_OBJECT(backdrop), "backdrop-cycle-enable");
-
-    buf[pp_len] = 0;
-    g_strlcat(buf, "backdrop-cycle-timer", sizeof(buf));
-    xfconf_g_property_unbind_by_property(channel, buf,
-                               G_OBJECT(backdrop), "backdrop-cycle-timer");
-
-    buf[pp_len] = 0;
-    g_strlcat(buf, "backdrop-cycle-random-order", sizeof(buf));
-    xfconf_g_property_unbind_by_property(channel, buf,
-                               G_OBJECT(backdrop), "backdrop-cycle-random-order");
-
-    buf[pp_len] = 0;
-    g_strlcat(buf, "last-image", sizeof(buf));
-    xfconf_g_property_unbind_by_property(channel, buf,
-                               G_OBJECT(backdrop), "image-filename");
+    g_return_if_fail(XFCE_IS_BACKDROP(backdrop));
 
-    g_free(monitor_name);
+    xfconf_g_property_unbind_all(G_OBJECT(backdrop));
 }
 
 static void


More information about the Xfce4-commits mailing list