f6c39c7
diff -up gnome-settings-daemon-2.28.1/plugins/background/gsd-background-manager.c.screen-change gnome-settings-daemon-2.28.1/plugins/background/gsd-background-manager.c
f6c39c7
--- gnome-settings-daemon-2.28.1/plugins/background/gsd-background-manager.c.screen-change	2009-05-03 14:15:30.000000000 -0400
f6c39c7
+++ gnome-settings-daemon-2.28.1/plugins/background/gsd-background-manager.c	2009-11-09 15:38:32.005583997 -0500
f6c39c7
@@ -47,6 +47,8 @@
f6c39c7
 #include "gnome-settings-profile.h"
f6c39c7
 #include "gsd-background-manager.h"
f6c39c7
 
f6c39c7
+#define NAUTILUS_SHOW_DESKTOP_KEY "/apps/nautilus/preferences/show_desktop"
f6c39c7
+
f6c39c7
 #define GSD_BACKGROUND_MANAGER_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), GSD_TYPE_BACKGROUND_MANAGER, GsdBackgroundManagerPrivate))
f6c39c7
 
f6c39c7
 struct GsdBackgroundManagerPrivate
f6c39c7
@@ -330,6 +332,67 @@ draw_background_after_session_loads (Gsd
f6c39c7
         manager->priv->dbus_connection = connection;
f6c39c7
 }
f6c39c7
 
f6c39c7
+static void
f6c39c7
+on_screen_size_changed (GdkScreen            *screen,
f6c39c7
+                        GsdBackgroundManager *manager)
f6c39c7
+{
f6c39c7
+        gboolean nautilus_show_desktop;
f6c39c7
+
f6c39c7
+        nautilus_show_desktop = gconf_client_get_bool (manager->priv->client,
f6c39c7
+                                                       NAUTILUS_SHOW_DESKTOP_KEY,
f6c39c7
+                                                       NULL);
f6c39c7
+
f6c39c7
+        if (!nautilus_is_running () || !nautilus_show_desktop) {
f6c39c7
+                if (manager->priv->bg == NULL) {
f6c39c7
+                        setup_bg (manager);
f6c39c7
+                }
f6c39c7
+                draw_background (manager, FALSE);
f6c39c7
+        }
f6c39c7
+}
f6c39c7
+
f6c39c7
+static void
f6c39c7
+disconnect_screen_signals (GsdBackgroundManager *manager)
f6c39c7
+{
f6c39c7
+        GdkDisplay *display;
f6c39c7
+        int         i;
f6c39c7
+        int         n_screens;
f6c39c7
+
f6c39c7
+        display = gdk_display_get_default ();
f6c39c7
+        n_screens = gdk_display_get_n_screens (display);
f6c39c7
+
f6c39c7
+        for (i = 0; i < n_screens; ++i) {
f6c39c7
+                GdkScreen *screen;
f6c39c7
+                screen = gdk_display_get_screen (display, i);
f6c39c7
+                g_signal_handlers_disconnect_by_func (screen,
f6c39c7
+                                                      G_CALLBACK (on_screen_size_changed),
f6c39c7
+                                                      manager);
f6c39c7
+        }
f6c39c7
+}
f6c39c7
+
f6c39c7
+static void
f6c39c7
+connect_screen_signals (GsdBackgroundManager *manager)
f6c39c7
+{
f6c39c7
+        GdkDisplay *display;
f6c39c7
+        int         i;
f6c39c7
+        int         n_screens;
f6c39c7
+
f6c39c7
+        display = gdk_display_get_default ();
f6c39c7
+        n_screens = gdk_display_get_n_screens (display);
f6c39c7
+
f6c39c7
+        for (i = 0; i < n_screens; ++i) {
f6c39c7
+                GdkScreen *screen;
f6c39c7
+                screen = gdk_display_get_screen (display, i);
f6c39c7
+                g_signal_connect (screen,
f6c39c7
+                                  "monitors-changed",
f6c39c7
+                                  G_CALLBACK (on_screen_size_changed),
f6c39c7
+                                  manager);
f6c39c7
+                g_signal_connect (screen,
f6c39c7
+                                  "size-changed",
f6c39c7
+                                  G_CALLBACK (on_screen_size_changed),
f6c39c7
+                                  manager);
f6c39c7
+        }
f6c39c7
+}
f6c39c7
+
f6c39c7
 gboolean
f6c39c7
 gsd_background_manager_start (GsdBackgroundManager *manager,
f6c39c7
                               GError              **error)
f6c39c7
@@ -349,7 +412,7 @@ gsd_background_manager_start (GsdBackgro
f6c39c7
 	 * nautilus overwrite it.
f6c39c7
 	 */
f6c39c7
         nautilus_show_desktop = gconf_client_get_bool (manager->priv->client,
f6c39c7
-                                                       "/apps/nautilus/preferences/show_desktop",
f6c39c7
+                                                       NAUTILUS_SHOW_DESKTOP_KEY,
f6c39c7
                                                        NULL);
f6c39c7
 
f6c39c7
         if (!nautilus_show_desktop) {
f6c39c7
@@ -358,6 +421,8 @@ gsd_background_manager_start (GsdBackgro
f6c39c7
                 draw_background_after_session_loads (manager);
f6c39c7
         }
f6c39c7
 
f6c39c7
+        connect_screen_signals (manager);
f6c39c7
+
f6c39c7
         gnome_settings_profile_end (NULL);
f6c39c7
 
f6c39c7
         return TRUE;
f6c39c7
@@ -370,6 +435,8 @@ gsd_background_manager_stop (GsdBackgrou
f6c39c7
 
f6c39c7
         g_debug ("Stopping background manager");
f6c39c7
 
f6c39c7
+        disconnect_screen_signals (manager);
f6c39c7
+
f6c39c7
         if (manager->priv->dbus_connection != NULL) {
f6c39c7
                 dbus_connection_remove_filter (manager->priv->dbus_connection,
f6c39c7
                                                on_bus_message,