53
53
#define BUS_INTERFACE_SETTINGS " org.freedesktop.portal.Settings"
54
54
#define BUS_INTERFACE_FILE_CHOOSER " org.freedesktop.portal.FileChooser"
55
55
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) {
57
57
DBusMessageIter iter[3 ];
58
58
59
59
dbus_message_iter_init (p_reply_message, &iter[0 ]);
@@ -67,15 +67,44 @@ bool FreeDesktopPortalDesktop::try_parse_variant(DBusMessage *p_reply_message, i
67
67
}
68
68
69
69
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);
72
103
}
73
-
74
- dbus_message_iter_get_basic (&iter[2 ], r_value);
75
104
return true ;
76
105
}
77
106
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) {
79
108
if (unsupported) {
80
109
return false ;
81
110
}
@@ -127,8 +156,24 @@ uint32_t FreeDesktopPortalDesktop::get_appearance_color_scheme() {
127
156
}
128
157
129
158
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
+ }
132
177
}
133
178
134
179
static const char *cs_empty = " " ;
@@ -639,7 +684,7 @@ void FreeDesktopPortalDesktop::_thread_monitor(void *p_ud) {
639
684
dbus_message_iter_get_basic (&iter, &value);
640
685
String key = String::utf8 (value);
641
686
642
- if (name_space == " org.freedesktop.appearance" && key == " color-scheme" ) {
687
+ if (name_space == " org.freedesktop.appearance" && ( key == " color-scheme" || key == " accent-color " ) ) {
643
688
callable_mp (portal, &FreeDesktopPortalDesktop::_system_theme_changed_callback).call_deferred ();
644
689
}
645
690
}
0 commit comments