http://git.gnome.org/browse/gnome-screensaver/commit/?id=2f597ea9f1f363277fd4dfc109fa41bbc6225aca --- src/gs-manager.c 2008-08-20 21:35:13.000000000 -0400 +++ src/gs-manager.c.oden 2011-05-18 12:06:55.000000000 -0400 @@ -1449,6 +1449,10 @@ gs_manager_create_window_for_monitor (GS connect_window_signals (manager, window); manager->priv->windows = g_slist_append (manager->priv->windows, window); + + if (manager->priv->active && !manager->priv->fading) { + gtk_widget_show (window); + } } static void @@ -1470,21 +1474,25 @@ on_screen_monitors_changed (GdkScreen *s if (n_monitors > n_windows) { /* add more windows */ for (i = n_windows; i < n_monitors; i++) { - gs_manager_create_window_for_monitor (manager, screen, i - 1); + gs_manager_create_window_for_monitor (manager, screen, i); } } else { /* remove the extra windows */ - for (l = manager->priv->windows; l != NULL; l = l->next) { + l = manager->priv->windows; + while (l != NULL) { GdkScreen *this_screen; int this_monitor; + GSList *next = l->next; this_screen = gs_window_get_screen (GS_WINDOW (l->data)); this_monitor = gs_window_get_monitor (GS_WINDOW (l->data)); if (this_screen == screen && this_monitor >= n_monitors) { manager_maybe_stop_job_for_window (manager, GS_WINDOW (l->data)); + g_hash_table_remove (manager->priv->jobs, l->data); gs_window_destroy (GS_WINDOW (l->data)); manager->priv->windows = g_slist_delete_link (manager->priv->windows, l); } + l = next; } } }