Skip to content

Commit cf506d6

Browse files
committed
Implement reduced motion setting
1 parent c14a5c0 commit cf506d6

2 files changed

Lines changed: 54 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: 41 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,22 @@ 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+
if (settings.schema_id == "io.elementary.settings-daemon.a11y" && key == "reduced-motion") {
166+
setting_changed ("org.freedesktop.appearance", "reduced-motion", get_reduced_motion ());
167+
return;
168+
}
169+
170+
setting_changed (settings.schema_id, key, settings.get_value (key));
171+
}
172+
161173
private bool namespace_matches (string namespace, string[] patterns) {
162174
foreach (var pattern in patterns) {
163175
if (pattern[0] == '\0') {
@@ -228,27 +240,40 @@ public class SettingsDaemon.Settings : GLib.Object {
228240
return rgb_to_variant (0);
229241
}
230242

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

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

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-
}
260+
var keys = setting.settings_schema.list_keys ();
261+
foreach (unowned var key in keys) {
262+
dict.insert (key, setting.get_value (key));
246263
}
247264

248265
ret.insert (schema, dict);
249266
}
250267
});
251268

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

@@ -261,6 +286,10 @@ public class SettingsDaemon.Settings : GLib.Object {
261286
if (key == "accent-color") {
262287
return get_accent_color ();
263288
}
289+
290+
if (key == "reduced-motion") {
291+
return get_reduced_motion ();
292+
}
264293
}
265294

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

0 commit comments

Comments
 (0)