============================================================ Don't draw_background immediately when nautilus is disabled gnome_bg_load_from_preferences forces a "changed" signal to get emitted which will queue a draw anyway diff --git a/plugins/background/gsd-background-manager.c b/plugins/background/gsd-background-manager.c --- a/plugins/background/gsd-background-manager.c +++ b/plugins/background/gsd-background-manager.c @@ -277,7 +277,6 @@ gsd_background_manager_start (GsdBackgroundManager *manager, if (!nautilus_show_desktop) { setup_bg (manager); - draw_background (manager); } else { /* even when nautilus is supposedly handling the * background, apply the settings eventually to make ============================================================ Add crossfade transition when switching bgs This uses the new gnome-desktop api for doing crossfades between backgrounds. This only matters if nautilus isn't running, since otherwise, it would manage the crossfade. diff --git a/plugins/background/gsd-background-manager.c b/plugins/background/gsd-background-manager.c --- a/plugins/background/gsd-background-manager.c +++ b/plugins/background/gsd-background-manager.c @@ -155,7 +155,8 @@ nautilus_is_running (void) } static void -draw_background (GsdBackgroundManager *manager) +draw_background (GsdBackgroundManager *manager, + gboolean use_crossfade) { GdkDisplay *display; int n_screens; @@ -185,7 +186,15 @@ draw_background (GsdBackgroundManager *manager) gdk_screen_get_height (screen), TRUE); - gnome_bg_set_pixmap_as_root (screen, pixmap); + if (use_crossfade) { + GnomeBGCrossfade *fade; + + fade = gnome_bg_set_pixmap_as_root_with_crossfade (screen, pixmap, NULL); + g_signal_connect (fade, "finished", + G_CALLBACK (g_object_unref), NULL); + } else { + gnome_bg_set_pixmap_as_root (screen, pixmap); + } g_object_unref (pixmap); } @@ -197,7 +206,14 @@ static void on_bg_changed (GnomeBG *bg, GsdBackgroundManager *manager) { - draw_background (manager); + draw_background (manager, TRUE); +} + +static void +on_bg_transitioned (GnomeBG *bg, + GsdBackgroundManager *manager) +{ + draw_background (manager, FALSE); } static void @@ -239,6 +255,11 @@ setup_bg (GsdBackgroundManager *manager) G_CALLBACK (on_bg_changed), manager); + g_signal_connect (manager->priv->bg, + "transitioned", + G_CALLBACK (on_bg_transitioned), + manager); + watch_bg_preferences (manager); gnome_bg_load_from_preferences (manager->priv->bg, manager->priv->client); @@ -249,7 +270,7 @@ queue_draw_background (GsdBackgroundManager *manager) { manager->priv->timeout_id = 0; setup_bg (manager); - draw_background (manager); + draw_background (manager, FALSE); return FALSE; }