Blob Blame History Raw
--- a/plugins/background/csd-background-manager.c	2013-10-24 11:08:13.000000000 +0100
+++ b/plugins/background/csd-background-manager.c	2013-10-18 17:40:33.000000000 +0100
@@ -52,6 +52,8 @@ struct CsdBackgroundManagerPrivate
         GSettings   *settings;
         GnomeBG     *bg;
 
+        GnomeBGCrossfade *fade;
+
         guint        watch_id;
 };
 
@@ -67,7 +69,15 @@ G_DEFINE_TYPE (CsdBackgroundManager, csd
 static gpointer manager_object = NULL;
 
 static void
-draw_background (CsdBackgroundManager *manager)
+on_crossfade_finished (CsdBackgroundManager *manager)
+{
+        g_object_unref (manager->priv->fade);
+        manager->priv->fade = NULL;
+}
+
+static void
+draw_background (CsdBackgroundManager *manager,
+                 gboolean              use_crossfade)
 {
         GdkDisplay *display;
         int         n_screens;
@@ -93,7 +103,19 @@ draw_background (CsdBackgroundManager *m
                                                    gdk_screen_get_height (screen),
                                                    TRUE);
 
-                gnome_bg_set_surface_as_root (screen, surface);
+                if (use_crossfade) {
+
+                        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);
+                }
 
                 cairo_surface_destroy (surface);
         }
@@ -101,12 +123,11 @@ draw_background (CsdBackgroundManager *m
         cinnamon_settings_profile_end (NULL);
 }
 
-
 static void
 on_bg_transitioned (GnomeBG              *bg,
                     CsdBackgroundManager *manager)
 {
-        draw_background (manager);
+        draw_background (manager, FALSE);
 }
 
 static gboolean
@@ -124,7 +145,7 @@ static void
 on_screen_size_changed (GdkScreen            *screen,
                         CsdBackgroundManager *manager)
 {
-        draw_background (manager);
+        draw_background (manager, FALSE);
 }
 
 static void
@@ -140,7 +161,7 @@ static void
 on_bg_changed (GnomeBG              *bg,
                CsdBackgroundManager *manager)
 {
-        draw_background (manager);
+        draw_background (manager, TRUE);
 }
 
 static void
@@ -167,12 +188,11 @@ setup_bg (CsdBackgroundManager *manager)
                                         manager->priv->settings);
 }
 
-static gboolean
+static void
 setup_bg_and_draw_background (CsdBackgroundManager *manager)
 {
         setup_bg (manager);
-        draw_background (manager);
-        return FALSE;
+        draw_background (manager, FALSE);
 }
 
 static void
@@ -183,14 +203,14 @@ on_dbus_appeared (GDBusConnection *conne
 {
     CsdBackgroundManager *manager = CSD_BACKGROUND_MANAGER (user_data);
 
-    g_timeout_add(3000, (GSourceFunc) setup_bg_and_draw_background, manager);
+    setup_bg_and_draw_background (manager);
 }
 
 static void
 draw_background_after_cinnamon_loads (CsdBackgroundManager *manager)
 {
         manager->priv->watch_id = g_bus_watch_name (G_BUS_TYPE_SESSION,
-                                                    "org.Nemo",
+                                                    "org.Cinnamon",
                                                     0,
                                                     on_dbus_appeared,
                                                     NULL,