[gnome-settings-daemon] background: stop pending fades if new ones initiated



commit 5cb80995b6899c6ed185797333b709ea9342de42
Author: Ray Strode <rstrode redhat com>
Date:   Mon Feb 7 15:11:39 2011 -0500

    background: stop pending fades if new ones initiated
    
    This prevents some strange flicker when quickly selecting
    multiple backgrounds in the background capplet.

 plugins/background/gsd-background-manager.c |   21 +++++++++++++++++----
 1 files changed, 17 insertions(+), 4 deletions(-)
---
diff --git a/plugins/background/gsd-background-manager.c b/plugins/background/gsd-background-manager.c
index 9c2a575..ef57cfe 100644
--- a/plugins/background/gsd-background-manager.c
+++ b/plugins/background/gsd-background-manager.c
@@ -53,6 +53,8 @@ struct GsdBackgroundManagerPrivate
         GnomeBG     *bg;
         guint        timeout_id;
 
+        GnomeBGCrossfade *fade;
+
         GDBusProxy  *proxy;
         guint        proxy_signal_id;
 };
@@ -167,6 +169,13 @@ nautilus_is_drawing_background (GsdBackgroundManager *manager)
 }
 
 static void
+on_crossfade_finished (GsdBackgroundManager *manager)
+{
+        g_object_unref (manager->priv->fade);
+        manager->priv->fade = NULL;
+}
+
+static void
 draw_background (GsdBackgroundManager *manager,
                  gboolean              use_crossfade)
 {
@@ -200,11 +209,15 @@ draw_background (GsdBackgroundManager *manager,
                                                    TRUE);
 
                 if (use_crossfade) {
-                        GnomeBGCrossfade *fade;
 
-                        fade = gnome_bg_set_surface_as_root_with_crossfade (screen, surface);
-                        g_signal_connect (fade, "finished",
-                                          G_CALLBACK (g_object_unref), NULL);
+                        if (manager->priv->fade != NULL) {
+                                g_object_unref (manager->priv->fade);
+                        }
+
+                        manager->priv->fade = gnome_bg_set_surface_as_root_with_crossfade (screen, surface);
+                        g_signal_connect_swapped (manager->priv->fade, "finished",
+                                                  G_CALLBACK (on_crossfade_finished),
+                                                  manager);
                 } else {
                         gnome_bg_set_surface_as_root (screen, surface);
                 }



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]