Skip to content

Commit 65bbebe

Browse files
committed
Implement reduced motion setting
1 parent c14a5c0 commit 65bbebe

2 files changed

Lines changed: 56 additions & 12 deletions

File tree

data/io.elementary.settings-daemon.gschema.xml

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -135,4 +135,17 @@
135135
</description>
136136
</key>
137137
</schema>
138+
139+
<enum id="ReduceMotionPreference">
140+
<value nick='no-preference' value='0'/>
141+
<value nick='reduce' value='1'/>
142+
</enum>
143+
144+
<schema path="/io/elementary/settings-daemon/a11y/" id="io.elementary.settings-daemon.a11y">
145+
<key enum="ReduceMotionPreference" name="reduced-motion">
146+
<default>'no-preference'</default>
147+
<summary>Reduce motion effects</summary>
148+
<description>If enabled, reduces motion effects for the user interface.</description>
149+
</key>
150+
</schema>
138151
</schemalist>

settings-portal/Settings.vala

Lines changed: 43 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,11 @@ private class AccountsServiceMonitor : GLib.Object {
121121

122122
[DBus (name = "org.freedesktop.impl.portal.Settings")]
123123
public class SettingsDaemon.Settings : GLib.Object {
124+
public enum ReduceMotionPreference {
125+
NO_PREFERENCE = 0,
126+
REDUCE = 1,
127+
}
128+
124129
public uint32 version {
125130
get { return 1; }
126131
}
@@ -131,6 +136,7 @@ public class SettingsDaemon.Settings : GLib.Object {
131136
private AccountsServiceMonitor monitor;
132137

133138
private const string[] SUPPORTED_SCHEMAS = {
139+
"io.elementary.settings-daemon.a11y",
134140
"io.elementary.settings-daemon.datetime",
135141
"org.freedesktop.appearance"
136142
};
@@ -148,16 +154,24 @@ public class SettingsDaemon.Settings : GLib.Object {
148154
foreach (unowned var schema in SUPPORTED_SCHEMAS) {
149155
if (SettingsSchemaSource.get_default ().lookup (schema, true) != null) {
150156
settings[schema] = new GLib.Settings (schema);
151-
settings[schema].changed.connect ((key) => {
152-
var @value = settings[schema].get_value (key);
153-
setting_changed (schema, key, value);
154-
});
157+
settings[schema].changed.connect (on_setting_changed);
155158
} else {
156159
warning ("GSettings schema `%s` not found on the system!", schema);
157160
}
158161
}
159162
}
160163

164+
private void on_setting_changed (GLib.Settings settings, string key) {
165+
var new_value = settings.get_value (key);
166+
167+
if (settings.schema_id == "io.elementary.settings-daemon.a11y" && key == "reduced-motion") {
168+
setting_changed ("org.freedesktop.appearance", "reduced-motion", new_value);
169+
return;
170+
}
171+
172+
setting_changed (settings.schema_id, key, new_value);
173+
}
174+
161175
private bool namespace_matches (string namespace, string[] patterns) {
162176
foreach (var pattern in patterns) {
163177
if (pattern[0] == '\0') {
@@ -228,27 +242,40 @@ public class SettingsDaemon.Settings : GLib.Object {
228242
return rgb_to_variant (0);
229243
}
230244

245+
private Variant get_reduced_motion () {
246+
unowned var setting = settings["io.elementary.settings-daemon.a11y"];
247+
if (setting != null && setting.settings_schema.has_key ("reduced-motion")) {
248+
var val = (ReduceMotionPreference) setting.get_enum ("reduced-motion");
249+
return new Variant.uint32 (val);
250+
}
251+
252+
return new Variant.uint32 (ReduceMotionPreference.NO_PREFERENCE);
253+
}
254+
231255
public async GLib.HashTable<string, GLib.HashTable<string, GLib.Variant>> read_all (string[] namespaces) throws GLib.DBusError, GLib.IOError {
232256
var ret = new GLib.HashTable<string, GLib.HashTable<string, GLib.Variant>> (str_hash, str_equal);
233257

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

238-
if (schema == "org.freedesktop.appearance") {
239-
dict.insert ("color-scheme", get_color_scheme ());
240-
dict.insert ("accent-color", get_accent_color ());
241-
} else {
242-
var keys = setting.settings_schema.list_keys ();
243-
foreach (unowned var key in keys) {
244-
dict.insert (key, setting.get_value (key));
245-
}
262+
var keys = setting.settings_schema.list_keys ();
263+
foreach (unowned var key in keys) {
264+
dict.insert (key, setting.get_value (key));
246265
}
247266

248267
ret.insert (schema, dict);
249268
}
250269
});
251270

271+
if (namespace_matches ("org.freedesktop.appearance", namespaces)) {
272+
var dict = new GLib.HashTable<string, GLib.Variant> (str_hash, str_equal);
273+
dict.insert ("color-scheme", get_color_scheme ());
274+
dict.insert ("accent-color", get_accent_color ());
275+
dict.insert ("reduced-motion", get_reduced_motion ());
276+
ret.insert ("org.freedesktop.appearance", dict);
277+
}
278+
252279
return ret;
253280
}
254281

@@ -261,6 +288,10 @@ public class SettingsDaemon.Settings : GLib.Object {
261288
if (key == "accent-color") {
262289
return get_accent_color ();
263290
}
291+
292+
if (key == "reduced-motion") {
293+
return get_reduced_motion ();
294+
}
264295
}
265296

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

0 commit comments

Comments
 (0)