File gsd-speed-delay-screensaver.patch of Package gnome-settings-daemon

diff -u -r a/plugins/screensaver/gsd-screensaver-manager.c b/plugins/screensaver/gsd-screensaver-manager.c
--- a/plugins/screensaver/gsd-screensaver-manager.c	2008-08-04 15:25:52.000000000 +0100
+++ b/plugins/screensaver/gsd-screensaver-manager.c	2009-01-30 11:40:01.000000000 +0000
@@ -76,34 +76,23 @@
         g_object_unref (client);
 }
 
-gboolean
-gsd_screensaver_manager_start (GsdScreensaverManager *manager,
-                               GError               **error)
+static gboolean
+start_screensaver_cb (GsdScreensaverManager *manager)
 {
+        GError      *error = NULL;
         char        *ss_cmd;
-        GError      *gerr = NULL;
         gboolean     show_error;
         char        *args[3];
         GConfClient *client;
 
-        g_debug ("Starting screensaver manager");
+        g_debug ("Starting screensaver process after timeout");
         gnome_settings_profile_start (NULL);
 
-        /*
-	 * with gnome-screensaver, all settings are loaded internally
-	 * from gconf at startup
-	 *
-	 * with xscreensaver, our settings only apply to startup, and
-	 * the screensaver settings are all in xscreensaver and not
-	 * gconf.
-	 *
-	 * we could have xscreensaver-demo run gconftool-2 directly,
-	 * and start / stop xscreensaver here
-         */
-
         client = gconf_client_get_default ();
 
         manager->priv->start_screensaver = gconf_client_get_bool (client, START_SCREENSAVER_KEY, NULL);
+        if (!manager->priv->start_screensaver)
+                goto done;
 
         if ((ss_cmd = g_find_program_in_path ("gnome-screensaver"))) {
                 manager->priv->have_gscreensaver = TRUE;
@@ -119,10 +108,6 @@
                 manager->priv->have_xscreensaver = FALSE;
         }
 
-        if (!manager->priv->start_screensaver) {
-                return TRUE;
-        }
-
         if (manager->priv->have_gscreensaver) {
                 args[0] = "gnome-screensaver";
                 args[1] = NULL;
@@ -130,15 +115,13 @@
                 args[0] = "xscreensaver";
                 args[1] = "-nosplash";
         } else {
-                g_set_error (error, G_SPAWN_ERROR, G_SPAWN_ERROR_FAILED,
-                             "No screensaver available.");
-                return FALSE;
+                g_warning ("No screensaver available");
+                goto done;
         }
         args[2] = NULL;
 
-        if (g_spawn_async (g_get_home_dir (), args, NULL, G_SPAWN_SEARCH_PATH, NULL, NULL, &manager->priv->screensaver_pid, &gerr)) {
-                g_object_unref (client);
-                return TRUE;
+        if (g_spawn_async (g_get_home_dir (), args, NULL, G_SPAWN_SEARCH_PATH, NULL, NULL, &manager->priv->screensaver_pid, &error)) {
+                goto done;
         }
 
         show_error = gconf_client_get_bool (client, SHOW_STARTUP_ERRORS_KEY, NULL);
@@ -153,7 +136,7 @@
                              _("There was an error starting up the screensaver:\n\n"
                                "%s\n\n"
                                "Screensaver functionality will not work in this session."),
-                             gerr->message);
+                             error->message);
 
                 g_signal_connect (dialog, "response",
                                   G_CALLBACK (gtk_widget_destroy),
@@ -179,8 +162,9 @@
 
                 gtk_widget_show (dialog);
         }
+        g_error_free (error);
 
-        g_propagate_error (error, gerr);
+done:
         g_object_unref (client);
 
         gnome_settings_profile_end (NULL);
@@ -188,6 +172,24 @@
         return FALSE;
 }
 
+gboolean
+gsd_screensaver_manager_start (GsdScreensaverManager *manager,
+                               GError               **error)
+{
+        g_debug ("Starting screensaver manager");
+        gnome_settings_profile_start (NULL);
+
+        /*
+         * We'll start the screensaver after a delay so it doesn't
+         * compete with other processes while the session is starting
+         */
+        g_timeout_add_seconds (30, (GSourceFunc) start_screensaver_cb, manager);
+
+        gnome_settings_profile_end (NULL);
+
+        return TRUE;
+}
+
 void
 gsd_screensaver_manager_stop (GsdScreensaverManager *manager)
 {
openSUSE Build Service is sponsored by