diff --git a/data/io.elementary.settings-daemon.gschema.xml b/data/io.elementary.settings-daemon.gschema.xml
index 3fe07084..4323e977 100644
--- a/data/io.elementary.settings-daemon.gschema.xml
+++ b/data/io.elementary.settings-daemon.gschema.xml
@@ -141,11 +141,23 @@
+
+
+
+
+
+
+
'no-preference'
Reduce motion effects
If enabled, reduces motion effects for the user interface.
+
+ 'no-preference'
+ Contrast
+ Indicates the preferred level of contrast for the user interface.
+
diff --git a/meson.build b/meson.build
index 13c19c88..a684431f 100644
--- a/meson.build
+++ b/meson.build
@@ -11,6 +11,7 @@ fwupd_dep = dependency('fwupd')
gio_dep = dependency ('gio-2.0')
glib_dep = dependency('glib-2.0')
granite_dep = dependency('granite-7', version: '>= 7.0.0')
+gtk_dep = dependency('gtk4', version: '>=4.20')
gdk_pixbuf_dep = dependency('gdk-pixbuf-2.0')
gexiv2_dep = dependency('gexiv2')
pk_dep = dependency('packagekit-glib2')
diff --git a/settings-portal/Settings.vala b/settings-portal/Settings.vala
index 9926c704..eb6a5046 100644
--- a/settings-portal/Settings.vala
+++ b/settings-portal/Settings.vala
@@ -162,9 +162,15 @@ public class SettingsDaemon.Settings : GLib.Object {
}
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;
+ if (settings.schema_id == "io.elementary.settings-daemon.a11y") {
+ switch (key) {
+ case "contrast":
+ setting_changed ("org.freedesktop.appearance", "contrast", get_contrast ());
+ return;
+ case "reduced-motion":
+ setting_changed ("org.freedesktop.appearance", "reduced-motion", get_reduced_motion ());
+ return;
+ }
}
setting_changed (settings.schema_id, key, settings.get_value (key));
@@ -240,6 +246,16 @@ public class SettingsDaemon.Settings : GLib.Object {
return rgb_to_variant (0);
}
+ private Variant get_contrast () {
+ unowned var setting = settings["io.elementary.settings-daemon.a11y"];
+ if (setting != null && setting.settings_schema.has_key ("contrast")) {
+ var val = (Gtk.InterfaceContrast) setting.get_enum ("contrast");
+ return new Variant.uint32 (val);
+ }
+
+ return new Variant.uint32 (Gtk.InterfaceContrast.UNSUPPORTED);
+ }
+
private Variant get_reduced_motion () {
unowned var setting = settings["io.elementary.settings-daemon.a11y"];
if (setting != null && setting.settings_schema.has_key ("reduced-motion")) {
@@ -271,6 +287,7 @@ public class SettingsDaemon.Settings : GLib.Object {
dict.insert ("color-scheme", get_color_scheme ());
dict.insert ("accent-color", get_accent_color ());
dict.insert ("reduced-motion", get_reduced_motion ());
+ dict.insert ("contrast", get_contrast ());
ret.insert ("org.freedesktop.appearance", dict);
}
@@ -279,16 +296,15 @@ public class SettingsDaemon.Settings : GLib.Object {
public async GLib.Variant read (string namespace, string key) throws GLib.DBusError, GLib.Error {
if (namespace == "org.freedesktop.appearance") {
- if (key == "color-scheme") {
- return get_color_scheme ();
- }
-
- if (key == "accent-color") {
- return get_accent_color ();
- }
-
- if (key == "reduced-motion") {
- return get_reduced_motion ();
+ switch (key) {
+ case "color-scheme":
+ return get_color_scheme ();
+ case "accent-color":
+ return get_accent_color ();
+ case "reduced-motion":
+ return get_reduced_motion ();
+ case "contrast":
+ return get_contrast ();
}
}
diff --git a/settings-portal/meson.build b/settings-portal/meson.build
index a79dd147..0edc5150 100644
--- a/settings-portal/meson.build
+++ b/settings-portal/meson.build
@@ -11,6 +11,7 @@ executable(
dependencies: [
config_dep,
glib_dep,
+ gtk_dep,
gio_dep,
],
install: true,