5353#define BUS_INTERFACE_SETTINGS " org.freedesktop.portal.Settings"
5454#define BUS_INTERFACE_FILE_CHOOSER " org.freedesktop.portal.FileChooser"
5555
56- bool FreeDesktopPortalDesktop::try_parse_variant (DBusMessage *p_reply_message, int p_type, void *r_value) {
56+ bool FreeDesktopPortalDesktop::try_parse_variant (DBusMessage *p_reply_message, ReadVariantType p_type, void *r_value) {
5757 DBusMessageIter iter[3 ];
5858
5959 dbus_message_iter_init (p_reply_message, &iter[0 ]);
@@ -67,15 +67,44 @@ bool FreeDesktopPortalDesktop::try_parse_variant(DBusMessage *p_reply_message, i
6767 }
6868
6969 dbus_message_iter_recurse (&iter[1 ], &iter[2 ]);
70- if (dbus_message_iter_get_arg_type (&iter[2 ]) != p_type) {
71- return false ;
70+ if (p_type == VAR_TYPE_COLOR) {
71+ if (dbus_message_iter_get_arg_type (&iter[2 ]) != DBUS_TYPE_STRUCT) {
72+ return false ;
73+ }
74+ DBusMessageIter struct_iter;
75+ dbus_message_iter_recurse (&iter[2 ], &struct_iter);
76+ int idx = 0 ;
77+ while (dbus_message_iter_get_arg_type (&struct_iter) == DBUS_TYPE_DOUBLE) {
78+ double value = 0.0 ;
79+ dbus_message_iter_get_basic (&struct_iter, &value);
80+ if (value < 0.0 || value > 1.0 ) {
81+ return false ;
82+ }
83+ if (idx == 0 ) {
84+ static_cast <Color *>(r_value)->r = value;
85+ } else if (idx == 1 ) {
86+ static_cast <Color *>(r_value)->g = value;
87+ } else if (idx == 2 ) {
88+ static_cast <Color *>(r_value)->b = value;
89+ }
90+ idx++;
91+ if (!dbus_message_iter_next (&struct_iter)) {
92+ break ;
93+ }
94+ }
95+ if (idx != 3 ) {
96+ return false ;
97+ }
98+ } else if (p_type == VAR_TYPE_UINT32) {
99+ if (dbus_message_iter_get_arg_type (&iter[2 ]) != DBUS_TYPE_UINT32) {
100+ return false ;
101+ }
102+ dbus_message_iter_get_basic (&iter[2 ], r_value);
72103 }
73-
74- dbus_message_iter_get_basic (&iter[2 ], r_value);
75104 return true ;
76105}
77106
78- bool FreeDesktopPortalDesktop::read_setting (const char *p_namespace, const char *p_key, int p_type, void *r_value) {
107+ bool FreeDesktopPortalDesktop::read_setting (const char *p_namespace, const char *p_key, ReadVariantType p_type, void *r_value) {
79108 if (unsupported) {
80109 return false ;
81110 }
@@ -127,8 +156,24 @@ uint32_t FreeDesktopPortalDesktop::get_appearance_color_scheme() {
127156 }
128157
129158 uint32_t value = 0 ;
130- read_setting (" org.freedesktop.appearance" , " color-scheme" , DBUS_TYPE_UINT32, &value);
131- return value;
159+ if (read_setting (" org.freedesktop.appearance" , " color-scheme" , VAR_TYPE_UINT32, &value)) {
160+ return value;
161+ } else {
162+ return 0 ;
163+ }
164+ }
165+
166+ Color FreeDesktopPortalDesktop::get_appearance_accent_color () {
167+ if (unsupported) {
168+ return Color (0 , 0 , 0 , 0 );
169+ }
170+
171+ Color value;
172+ if (read_setting (" org.freedesktop.appearance" , " accent-color" , VAR_TYPE_COLOR, &value)) {
173+ return value;
174+ } else {
175+ return Color (0 , 0 , 0 , 0 );
176+ }
132177}
133178
134179static const char *cs_empty = " " ;
@@ -639,7 +684,7 @@ void FreeDesktopPortalDesktop::_thread_monitor(void *p_ud) {
639684 dbus_message_iter_get_basic (&iter, &value);
640685 String key = String::utf8 (value);
641686
642- if (name_space == " org.freedesktop.appearance" && key == " color-scheme" ) {
687+ if (name_space == " org.freedesktop.appearance" && ( key == " color-scheme" || key == " accent-color " ) ) {
643688 callable_mp (portal, &FreeDesktopPortalDesktop::_system_theme_changed_callback).call_deferred ();
644689 }
645690 }
0 commit comments