diff -up eel-2.23.92/eel/eel-background.c.fade eel-2.23.92/eel/eel-background.c
--- eel-2.23.92/eel/eel-background.c.fade	2008-09-08 17:26:14.000000000 -0400
+++ eel-2.23.92/eel/eel-background.c	2008-09-22 10:27:36.000000000 -0400
@@ -43,6 +43,9 @@
 #include <stdio.h>
 #define GNOME_DESKTOP_USE_UNSTABLE_API
 #include <libgnomeui/gnome-bg.h>
+#include <gdk/gdkx.h>
+
+#include <cairo-xlib.h>
 
 static void       eel_background_class_init                (gpointer       klass);
 static void       eel_background_init                      (gpointer       object,
@@ -78,6 +81,7 @@ struct EelBackgroundDetails {
 	/* Realized data: */
 	gboolean background_changes_with_size;
 	GdkPixmap *background_pixmap;
+	GnomeBGCrossfade *fade;
 	int background_entire_width;
 	int background_entire_height;
 	GdkColor default_color;
@@ -182,6 +186,11 @@ eel_background_finalize (GObject *object
 	background = EEL_BACKGROUND (object);
 
 	g_free (background->details->color);
+	if (background->details->fade != NULL) {
+		gnome_bg_crossfade_stop (background->details->fade);
+		g_object_unref (background->details->fade);
+		background->details->fade = NULL;
+	}
 	eel_background_remove_current_image (background);
 
 	if (background->details->background_pixmap != NULL) {
@@ -610,6 +619,25 @@ eel_background_reset (EelBackground *bac
 	g_signal_emit (GTK_OBJECT (background), signals[RESET], 0);
 }
 
+static gboolean
+fade_to_pixmap (EelBackground *background,
+		 GdkWindow     *window,
+		 GdkPixmap     *pixmap)
+{
+	if (background->details->fade == NULL) {
+		return FALSE;
+	}
+
+	if (!gnome_bg_crossfade_set_end_pixmap (background->details->fade,
+				                pixmap)) {
+		return FALSE;
+	}
+
+	gnome_bg_crossfade_start (background->details->fade, window, NULL);
+
+	return gnome_bg_crossfade_is_started (background->details->fade);
+}
+
 static void
 eel_background_set_up_widget (EelBackground *background, GtkWidget *widget)
 {
@@ -644,14 +672,15 @@ eel_background_set_up_widget (EelBackgro
 	} else {
 		window = widget->window;
 	}
-
-	if (!changes_with_size || background->details->is_desktop) {
-		gdk_window_set_back_pixmap (window, pixmap, FALSE);
-	} else {
-		gdk_window_set_back_pixmap (window, NULL, FALSE);
-		gdk_window_set_background (window, &color);
+	if (background->details->fade == NULL ||
+	    !fade_to_pixmap (background, window, pixmap)) {
+		if (!changes_with_size || background->details->is_desktop) {
+			gdk_window_set_back_pixmap (window, pixmap, FALSE);
+		} else {
+			gdk_window_set_back_pixmap (window, NULL, FALSE);
+			gdk_window_set_background (window, &color);
+		}
 	}
-	
 
 	background->details->background_changes_with_size =
 		gnome_bg_changes_with_size (background->details->bg);
@@ -679,6 +708,18 @@ eel_background_set_up_widget (EelBackgro
 static void
 eel_widget_background_changed (GtkWidget *widget, EelBackground *background)
 {
+	if (GTK_WIDGET_REALIZED (widget)) {
+		int width, height;
+
+		if (background->details->fade != NULL) {
+			gnome_bg_crossfade_stop (background->details->fade);
+			g_object_unref (background->details->fade);
+		}
+		gdk_drawable_get_size (widget->window, &width, &height);
+		background->details->fade = gnome_bg_crossfade_new (width, height);
+		gnome_bg_crossfade_set_start_pixmap (background->details->fade, background->details->background_pixmap);
+	}
+
 	eel_background_unrealize (background);
 	eel_background_set_up_widget (background, widget);
 
@@ -741,11 +782,55 @@ static void
 widget_realize_cb (GtkWidget *widget, gpointer data)
 {
 	EelBackground *background;
+	int width, height;
 	
 	background = EEL_BACKGROUND (data);
 
 	widget_realized_setup (widget, data);
-		
+
+	if (background->details->fade != NULL) {
+		gnome_bg_crossfade_stop (background->details->fade);
+		g_object_unref (background->details->fade);
+	}
+
+	gdk_drawable_get_size (widget->window, &width, &height);
+	background->details->fade = gnome_bg_crossfade_new (width, height);
+
+	if (background->details->is_desktop) {
+		GdkWindow *root_window;
+		GdkScreen *screen;
+		GdkPixmap *pixmap;
+		cairo_surface_t *surface;
+		int x, y;
+		cairo_pattern_t *pattern;
+		cairo_t *cr;
+
+		screen = gtk_widget_get_screen (widget);
+
+		root_window = gdk_screen_get_root_window (screen);
+		gdk_window_get_position (widget->window, &x, &y);
+
+		pixmap = gdk_pixmap_new (widget->window, width, height, -1);
+
+		cr = gdk_cairo_create (pixmap);
+
+		surface = cairo_xlib_surface_create (GDK_DISPLAY_XDISPLAY (gtk_widget_get_display (widget)),
+						     GDK_WINDOW_XWINDOW (root_window),
+						     GDK_VISUAL_XVISUAL (gdk_drawable_get_visual (pixmap)),
+						     gdk_screen_get_width (screen),
+						     gdk_screen_get_height (screen));
+		cairo_set_source_surface (cr, surface, x, y);
+		cairo_paint (cr);
+
+		cairo_surface_destroy (surface);
+		cairo_destroy (cr);
+
+		gnome_bg_crossfade_set_start_pixmap (background->details->fade, pixmap);
+		g_object_unref (pixmap);
+	} else {
+		gnome_bg_crossfade_set_start_pixmap (background->details->fade, NULL);
+	}
+
 	eel_background_set_up_widget (background, widget);
 }
 
