diff options
| author | Victor Kareh <[email protected]> | 2025-10-19 12:07:45 -0400 |
|---|---|---|
| committer | Victor Kareh <[email protected]> | 2025-10-31 14:03:42 -0400 |
| commit | c01fa667a5d1660a579aa04a82ec6e9c26c54b45 (patch) | |
| tree | 8d346241b87bf63b47026519ff82691d6e8104fb /src/gs-job.c | |
| parent | e89ae9d58dc08737a1eb12d0853ac09709db88e3 (diff) | |
| download | mate-screensaver-c01fa667a5d1660a579aa04a82ec6e9c26c54b45.tar.bz2 mate-screensaver-c01fa667a5d1660a579aa04a82ec6e9c26c54b45.tar.xz | |
Screensaver command-line arguments can now be configured via a gsettings
dictionary. It's also compatible with screensavers from XScreenSaver.
A helper script is included:
mate-screensaver-configure starfield --count 500 --speed 10
Fixes #5
Diffstat (limited to 'src/gs-job.c')
| -rw-r--r-- | src/gs-job.c | 53 |
1 files changed, 52 insertions, 1 deletions
diff --git a/src/gs-job.c b/src/gs-job.c index 057fcc9..502006a 100644 --- a/src/gs-job.c +++ b/src/gs-job.c @@ -37,6 +37,7 @@ #include <glib.h> #include <glib/gstdio.h> +#include <gio/gio.h> #include <gdk/gdk.h> #include <gdk/gdkx.h> @@ -485,13 +486,63 @@ gs_job_start (GSJob *job) return FALSE; } + char *final_command = NULL; + GSettings *settings = g_settings_new ("org.mate.screensaver"); + GVariant *args_dict = g_settings_get_value (settings, "screensaver-arguments"); + + if (args_dict) + { + char **argv = NULL; + + /* Get screensaver name from command */ + if (g_shell_parse_argv (job->priv->command, NULL, &argv, NULL)) + { + const char *saved_args = NULL; + char *screensaver_name = NULL; + + screensaver_name = g_path_get_basename (argv[0]); + + /* Lookup arguments in dictionary to see if there's a match */ + g_variant_lookup (args_dict, screensaver_name, "&s", &saved_args); + g_strfreev (argv); + + if (saved_args && saved_args[0] != '\0') + { + /* Add --help to current list of args to catch invalid arguments */ + char *test_cmd = g_strdup_printf ("%s %s --help", job->priv->command, saved_args); + char *stdout_out = NULL, *stderr_out = NULL; + int exit_status = -1; + + /* Only append configured arguments if they are valid */ + if (g_spawn_command_line_sync (test_cmd, &stdout_out, &stderr_out, &exit_status, NULL) && exit_status == 0) + { + final_command = g_strdup_printf ("%s %s", job->priv->command, saved_args); + gs_debug ("Applying saved configuration: %s", saved_args); + } + + g_free (test_cmd); + g_free (stdout_out); + g_free (stderr_out); + } + + g_free (screensaver_name); + } + + g_variant_unref (args_dict); + } + g_object_unref (settings); + + const char *command_to_run = final_command ? final_command : job->priv->command; + result = spawn_on_widget (job->priv->widget, - job->priv->command, + command_to_run, &job->priv->pid, (GIOFunc)command_watch, job, &job->priv->watch_id); + g_free (final_command); + if (result) { job->priv->status = GS_JOB_RUNNING; |
