Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 13 additions & 0 deletions data/io.elementary.settings-daemon.gschema.xml
Original file line number Diff line number Diff line change
Expand Up @@ -135,4 +135,17 @@
</description>
</key>
</schema>

<enum id="ReduceMotionPreference">
<value nick='no-preference' value='0'/>
<value nick='reduce' value='1'/>
</enum>

<schema path="/io/elementary/settings-daemon/a11y/" id="io.elementary.settings-daemon.a11y">
<key enum="ReduceMotionPreference" name="reduced-motion">
<default>'no-preference'</default>
<summary>Reduce motion effects</summary>
<description>If enabled, reduces motion effects for the user interface.</description>
</key>
</schema>
</schemalist>
53 changes: 41 additions & 12 deletions settings-portal/Settings.vala
Original file line number Diff line number Diff line change
Expand Up @@ -121,6 +121,11 @@ private class AccountsServiceMonitor : GLib.Object {

[DBus (name = "org.freedesktop.impl.portal.Settings")]
public class SettingsDaemon.Settings : GLib.Object {
public enum ReduceMotionPreference {
NO_PREFERENCE = 0,
REDUCE = 1,
}

public uint32 version {
get { return 1; }
}
Expand All @@ -131,6 +136,7 @@ public class SettingsDaemon.Settings : GLib.Object {
private AccountsServiceMonitor monitor;

private const string[] SUPPORTED_SCHEMAS = {
"io.elementary.settings-daemon.a11y",
"io.elementary.settings-daemon.datetime",
"org.freedesktop.appearance"
};
Expand All @@ -148,16 +154,22 @@ public class SettingsDaemon.Settings : GLib.Object {
foreach (unowned var schema in SUPPORTED_SCHEMAS) {
if (SettingsSchemaSource.get_default ().lookup (schema, true) != null) {
settings[schema] = new GLib.Settings (schema);
settings[schema].changed.connect ((key) => {
var @value = settings[schema].get_value (key);
setting_changed (schema, key, value);
});
settings[schema].changed.connect (on_setting_changed);
} else {
warning ("GSettings schema `%s` not found on the system!", schema);
}
}
}

private void on_setting_changed (GLib.Settings settings, string key) {
if (settings.schema_id == "io.elementary.settings-daemon.a11y" && key == "reduced-motion") {
setting_changed ("org.freedesktop.appearance", "reduced-motion", get_reduced_motion ());
return;
}

setting_changed (settings.schema_id, key, settings.get_value (key));
}

private bool namespace_matches (string namespace, string[] patterns) {
foreach (var pattern in patterns) {
if (pattern[0] == '\0') {
Expand Down Expand Up @@ -228,27 +240,40 @@ public class SettingsDaemon.Settings : GLib.Object {
return rgb_to_variant (0);
}

private Variant get_reduced_motion () {
unowned var setting = settings["io.elementary.settings-daemon.a11y"];
if (setting != null && setting.settings_schema.has_key ("reduced-motion")) {
var val = (ReduceMotionPreference) setting.get_enum ("reduced-motion");
return new Variant.uint32 (val);
}

return new Variant.uint32 (ReduceMotionPreference.NO_PREFERENCE);
}

public async GLib.HashTable<string, GLib.HashTable<string, GLib.Variant>> read_all (string[] namespaces) throws GLib.DBusError, GLib.IOError {
var ret = new GLib.HashTable<string, GLib.HashTable<string, GLib.Variant>> (str_hash, str_equal);

settings.foreach ((schema, setting) => {
if (namespace_matches (schema, namespaces)) {
var dict = new GLib.HashTable<string, GLib.Variant> (str_hash, str_equal);

if (schema == "org.freedesktop.appearance") {
dict.insert ("color-scheme", get_color_scheme ());
dict.insert ("accent-color", get_accent_color ());
} else {
var keys = setting.settings_schema.list_keys ();
foreach (unowned var key in keys) {
dict.insert (key, setting.get_value (key));
}
var keys = setting.settings_schema.list_keys ();
foreach (unowned var key in keys) {
dict.insert (key, setting.get_value (key));
}

ret.insert (schema, dict);
}
});

if (namespace_matches ("org.freedesktop.appearance", namespaces)) {
var dict = new GLib.HashTable<string, GLib.Variant> (str_hash, str_equal);
dict.insert ("color-scheme", get_color_scheme ());
dict.insert ("accent-color", get_accent_color ());
dict.insert ("reduced-motion", get_reduced_motion ());
ret.insert ("org.freedesktop.appearance", dict);
}

return ret;
}

Expand All @@ -261,6 +286,10 @@ public class SettingsDaemon.Settings : GLib.Object {
if (key == "accent-color") {
return get_accent_color ();
}

if (key == "reduced-motion") {
return get_reduced_motion ();
}
}

unowned GLib.Settings? setting = settings[namespace];
Expand Down