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)
{