1dee568
diff -up gnome-settings-daemon-2.24.0/plugins/background/gsd-background-manager.c.fade gnome-settings-daemon-2.24.0/plugins/background/gsd-background-manager.c
1dee568
--- gnome-settings-daemon-2.24.0/plugins/background/gsd-background-manager.c.fade	2008-08-04 10:25:52.000000000 -0400
d55b97e
+++ gnome-settings-daemon-2.24.0/plugins/background/gsd-background-manager.c	2008-10-14 15:50:08.000000000 -0400
1dee568
@@ -155,7 +155,8 @@ nautilus_is_running (void)
1dee568
 }
1dee568
 
1dee568
 static void
1dee568
-draw_background (GsdBackgroundManager *manager)
1dee568
+draw_background (GsdBackgroundManager *manager,
1dee568
+                 gboolean              use_crossfade)
1dee568
 {
1dee568
         GdkDisplay *display;
1dee568
         int         n_screens;
1dee568
@@ -185,7 +186,15 @@ draw_background (GsdBackgroundManager *m
1dee568
                                                  gdk_screen_get_height (screen),
1dee568
                                                  TRUE);
1dee568
 
1dee568
-                gnome_bg_set_pixmap_as_root (screen, pixmap);
1dee568
+                if (use_crossfade) {
1dee568
+                        GnomeBGCrossfade *fade;
1dee568
+
1dee568
+                        fade = gnome_bg_set_pixmap_as_root_with_crossfade (screen, pixmap, NULL);
1dee568
+                        g_signal_connect (fade, "finished",
1dee568
+                                          G_CALLBACK (g_object_unref), NULL);
1dee568
+                } else {
1dee568
+                        gnome_bg_set_pixmap_as_root (screen, pixmap);
1dee568
+                }
1dee568
 
1dee568
                 g_object_unref (pixmap);
1dee568
         }
1dee568
@@ -197,7 +206,7 @@ static gboolean
1dee568
 queue_draw_background (GsdBackgroundManager *manager)
1dee568
 {
1dee568
         manager->priv->timeout_id = 0;
1dee568
-        draw_background (manager);
1dee568
+        draw_background (manager, TRUE);
1dee568
         return FALSE;
1dee568
 }
1dee568
 
1dee568
@@ -205,7 +214,14 @@ static void
1dee568
 on_bg_changed (GnomeBG              *bg,
1dee568
                GsdBackgroundManager *manager)
1dee568
 {
1dee568
-        draw_background (manager);
1dee568
+        draw_background (manager, TRUE);
1dee568
+}
1dee568
+
1dee568
+static void
1dee568
+on_bg_transitioned (GnomeBG              *bg,
1dee568
+                    GsdBackgroundManager *manager)
1dee568
+{
1dee568
+        draw_background (manager, FALSE);
1dee568
 }
1dee568
 
1dee568
 static void
d55b97e
@@ -252,9 +268,12 @@ gsd_background_manager_start (GsdBackgro
1dee568
                           G_CALLBACK (on_bg_changed),
1dee568
                           manager);
1dee568
 
1dee568
+        g_signal_connect (manager->priv->bg,
1dee568
+                          "transitioned",
1dee568
+                          G_CALLBACK (on_bg_transitioned),
1dee568
+                          manager);
1dee568
+
1dee568
         watch_bg_preferences (manager);
d55b97e
-        gnome_bg_load_from_preferences (manager->priv->bg,
d55b97e
-                                        manager->priv->client);
d55b97e
 
d55b97e
         /* If this is set, nautilus will draw the background and is
d55b97e
 	 * almost definitely in our session.  however, it may not be
d55b97e
@@ -266,14 +285,22 @@ gsd_background_manager_start (GsdBackgro
d55b97e
         nautilus_show_desktop = gconf_client_get_bool (manager->priv->client,
1dee568
                                                        "/apps/nautilus/preferences/show_desktop",
1dee568
                                                        NULL);
d55b97e
+        if (nautilus_show_desktop) {
d55b97e
+
d55b97e
+                gnome_bg_ignore_changes (manager->priv->bg, TRUE);
d55b97e
+
d55b97e
+                gnome_bg_load_from_preferences (manager->priv->bg,
d55b97e
+                                                manager->priv->client);
d55b97e
+
d55b97e
+                gnome_bg_ignore_changes (manager->priv->bg, FALSE);
1dee568
 
1dee568
-        if (!nautilus_show_desktop) {
1dee568
-                draw_background (manager);
1dee568
-        } else {
1dee568
                 /* even when nautilus is supposedly handling the
1dee568
                  * background, apply the settings eventually to make
1dee568
                  * people running a nautilus-less session happy */
d55b97e
                 manager->priv->timeout_id = g_timeout_add_seconds (8, (GSourceFunc)queue_draw_background, manager);
d55b97e
+        } else {
d55b97e
+                gnome_bg_load_from_preferences (manager->priv->bg,
d55b97e
+                                                manager->priv->client);
d55b97e
         }
d55b97e
 
d55b97e
         gnome_settings_profile_end (NULL);