diff options
author | Eric Koegel <eric.koegel@gmail.com> | 2013-03-30 10:08:50 +0300 |
---|---|---|
committer | Eric Koegel <eric.koegel@gmail.com> | 2013-03-30 13:33:48 +0300 |
commit | 4e51013473eed4a9879267db7d48986061caddd9 (patch) | |
tree | df9aa28e79a4db23cfcec3a014d41bd8604cc115 | |
parent | bcd164f4e460f1cdaff1db4287a1109518f895e5 (diff) | |
download | xfdesktop-4e51013473eed4a9879267db7d48986061caddd9.tar.gz |
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.
-rw-r--r-- | src/xfce-backdrop.c | 65 | ||||
-rw-r--r-- | 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 f209c508..91226828 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 4d49400c..d6368eac 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 |