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 | |
| 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
| -rw-r--r-- | data/org.mate.screensaver.gschema.xml.in | 5 | ||||
| -rw-r--r-- | src/Makefile.am | 5 | ||||
| -rw-r--r-- | src/gs-job.c | 53 | ||||
| -rw-r--r-- | src/gs-prefs.c | 5 | ||||
| -rwxr-xr-x | src/mate-screensaver-configure | 86 |
5 files changed, 153 insertions, 1 deletions
diff --git a/data/org.mate.screensaver.gschema.xml.in b/data/org.mate.screensaver.gschema.xml.in index 96d390d..e50d918 100644 --- a/data/org.mate.screensaver.gschema.xml.in +++ b/data/org.mate.screensaver.gschema.xml.in @@ -95,5 +95,10 @@ <summary>Picture Filename</summary> <description>File to use for the background image.</description> </key> + <key name="screensaver-arguments" type="a{ss}"> + <default>{}</default> + <summary>Per-screensaver configuration arguments</summary> + <description>Dictionary mapping screensaver names to their command-line arguments. Format: {"screensaver-name": "--args"}. Configure manually using gsettings or dconf-editor. Example: gsettings set org.mate.screensaver screensaver-arguments "{\"starfield\": \"--count 50\"}"</description> + </key> </schema> </schemalist> diff --git a/src/Makefile.am b/src/Makefile.am index df8280c..8f1b3f1 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -43,6 +43,10 @@ bin_PROGRAMS = \ mate-screensaver-preferences \ $(NULL) +bin_SCRIPTS = \ + mate-screensaver-configure \ + $(NULL) + libexec_PROGRAMS = \ mate-screensaver-dialog \ mate-screensaver-gl-helper \ @@ -267,6 +271,7 @@ EXTRA_DIST = \ debug-screensaver.sh \ gs-marshal.list \ mate-screensaver.desktop.in \ + mate-screensaver-configure \ $(NULL) CLEANFILES = \ 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; diff --git a/src/gs-prefs.c b/src/gs-prefs.c index 0d2bea0..f311afa 100644 --- a/src/gs-prefs.c +++ b/src/gs-prefs.c @@ -476,6 +476,11 @@ key_changed_cb (GSettings *settings, _gs_prefs_set_user_switch_enabled (prefs, enabled); } + else if (strcmp (key, "screensaver-arguments") == 0) + { + /* Screensaver arguments are read directly by gs-job + when starting screensavers, no action needed here */ + } else { g_warning ("Config key not handled: %s", key); diff --git a/src/mate-screensaver-configure b/src/mate-screensaver-configure new file mode 100755 index 0000000..513cc56 --- /dev/null +++ b/src/mate-screensaver-configure @@ -0,0 +1,86 @@ +#!/usr/bin/env python3 +""" +mate-screensaver-configure - Configure screensaver command-line arguments + +Usage: + mate-screensaver-configure <screensaver-name> [arguments...] + mate-screensaver-configure --list + mate-screensaver-configure --help + +Examples: + mate-screensaver-configure starfield --count 500 --speed 10 + mate-screensaver-configure slideshow --location ~/Pictures + mate-screensaver-configure starfield "" # Remove arguments + mate-screensaver-configure --list # Show current configuration + +Also works for XScreenSaver: + mate-screensaver-configure fuzzyflakes --speed 25 --random-colors + +To manually view or edit configuration: + gsettings get org.mate.screensaver screensaver-arguments + dconf-editor /org/mate/screensaver/screensaver-arguments +""" + +import sys +import gi +gi.require_version('Gio', '2.0') +from gi.repository import Gio, GLib + +SCHEMA = "org.mate.screensaver" +KEY = "screensaver-arguments" + + +def get_config(settings): + """Load current screensaver arguments as a Python dict""" + current = settings.get_value(KEY) + return {key: current[key] for key in current.keys()} + + +def set_config(settings, config): + """Save screensaver arguments dict to GSettings""" + settings.set_value(KEY, GLib.Variant('a{ss}', config)) + + +def show_config(settings): + """Display current screensaver configuration""" + config = get_config(settings) + if config: + print("Current configuration:") + for name in sorted(config.keys()): + print(f" {name}: {config[name]}") + else: + print("No screensaver arguments configured") + + +def main(): + if len(sys.argv) < 2 or sys.argv[1] in ('-h', '--help'): + print(__doc__) + sys.exit(0 if len(sys.argv) > 1 else 1) + + settings = Gio.Settings.new(SCHEMA) + + # Handle --list option + if sys.argv[1] == '--list': + show_config(settings) + return + + # Configure screensaver arguments + screensaver_name = sys.argv[1] + args = ' '.join(sys.argv[2:]) + + config = get_config(settings) + + if args: + config[screensaver_name] = args + print(f"Configured '{screensaver_name}' with arguments: {args}") + else: + config.pop(screensaver_name, None) + print(f"Removed arguments for '{screensaver_name}'") + + set_config(settings, config) + print() + show_config(settings) + + +if __name__ == '__main__': + main() |
