summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVictor Kareh <[email protected]>2025-10-19 12:07:45 -0400
committerVictor Kareh <[email protected]>2025-10-31 14:03:42 -0400
commitc01fa667a5d1660a579aa04a82ec6e9c26c54b45 (patch)
tree8d346241b87bf63b47026519ff82691d6e8104fb
parente89ae9d58dc08737a1eb12d0853ac09709db88e3 (diff)
downloadmate-screensaver-c01fa667a5d1660a579aa04a82ec6e9c26c54b45.tar.bz2
mate-screensaver-c01fa667a5d1660a579aa04a82ec6e9c26c54b45.tar.xz
Add screensaver configurations in GSettingsHEADmaster
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.in5
-rw-r--r--src/Makefile.am5
-rw-r--r--src/gs-job.c53
-rw-r--r--src/gs-prefs.c5
-rwxr-xr-xsrc/mate-screensaver-configure86
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()