10 static constexpr
char kPortalName[] =
"org.freedesktop.portal.Desktop";
11 static constexpr
char kPortalPath[] =
"/org/freedesktop/portal/desktop";
24 G_VARIANT_TYPE_UINT32,
28 "org.gnome.desktop.a11y.interface";
32 G_VARIANT_TYPE_BOOLEAN,
39 G_VARIANT_TYPE_STRING,
44 G_VARIANT_TYPE_BOOLEAN,
49 G_VARIANT_TYPE_STRING,
53 "text-scaling-factor",
54 G_VARIANT_TYPE_DOUBLE,
83 G_IMPLEMENT_INTERFACE(fl_settings_get_type(),
86 static gchar* format_key(
const FlSetting* setting) {
87 return g_strconcat(setting->
ns,
"::", setting->
key,
nullptr);
93 g_autofree
const gchar* key = format_key(setting);
94 *
value = g_variant_dict_lookup_value(portal->values, key, setting->
type);
95 return *
value !=
nullptr;
101 g_autofree
const gchar* key = format_key(setting);
104 g_autoptr(GVariant) old_value =
105 g_variant_dict_lookup_value(portal->values, key,
nullptr);
106 if (old_value !=
nullptr &&
value !=
nullptr &&
107 g_variant_equal(old_value,
value)) {
111 g_variant_dict_insert_value(portal->values, key,
value);
121 g_autoptr(GError)
error =
nullptr;
122 g_autoptr(GVariant)
value =
123 g_dbus_proxy_call_sync(proxy,
"Read", g_variant_new(
"(ss)", ns, key),
124 G_DBUS_CALL_FLAGS_NONE, G_MAXINT,
nullptr, &
error);
127 if (
error->domain == G_DBUS_ERROR &&
128 error->code == G_DBUS_ERROR_SERVICE_UNKNOWN) {
129 g_debug(
"XDG desktop portal unavailable: %s",
error->message);
133 if (
error->domain == G_DBUS_ERROR &&
134 error->code == G_DBUS_ERROR_UNKNOWN_METHOD) {
135 g_debug(
"XDG desktop portal settings unavailable: %s",
error->message);
139 g_critical(
"Failed to read XDG desktop portal settings: %s",
144 g_autoptr(GVariant) child =
nullptr;
145 g_variant_get(
value,
"(v)", &child);
146 g_variant_get(child,
"v", out);
152 const char* sender_name,
153 const char* signal_name,
154 GVariant* parameters,
156 FlSettingsPortal* portal = FL_SETTINGS_PORTAL(
user_data);
157 if (g_strcmp0(signal_name,
"SettingChanged")) {
162 g_autoptr(GVariant)
value =
nullptr;
163 g_variant_get(parameters,
"(&s&sv)", &setting.
ns, &setting.
key, &
value);
168 FlSettingsPortal*
self = FL_SETTINGS_PORTAL(settings);
172 g_autoptr(GVariant)
value =
nullptr;
174 const gchar* clock_format_str = g_variant_get_string(
value,
nullptr);
184 FlSettingsPortal*
self = FL_SETTINGS_PORTAL(settings);
188 g_autoptr(GVariant)
value =
nullptr;
194 const gchar* gtk_theme_str = g_variant_get_string(
value,
nullptr);
204 FlSettingsPortal*
self = FL_SETTINGS_PORTAL(settings);
206 gboolean enable_animations =
true;
208 g_autoptr(GVariant)
value =
nullptr;
210 enable_animations = g_variant_get_boolean(
value);
213 return enable_animations;
217 FlSettingsPortal*
self = FL_SETTINGS_PORTAL(settings);
219 gboolean high_contrast =
false;
221 g_autoptr(GVariant)
value =
nullptr;
223 high_contrast = g_variant_get_boolean(
value);
226 return high_contrast;
230 FlSettings* settings) {
231 FlSettingsPortal*
self = FL_SETTINGS_PORTAL(settings);
233 gdouble scaling_factor = 1.0;
235 g_autoptr(GVariant)
value =
nullptr;
237 scaling_factor = g_variant_get_double(
value);
240 return scaling_factor;
244 FlSettingsPortal*
self = FL_SETTINGS_PORTAL(
object);
246 g_clear_object(&self->dbus_proxy);
247 g_clear_pointer(&self->values, g_variant_dict_unref);
249 G_OBJECT_CLASS(fl_settings_portal_parent_class)->dispose(
object);
253 GObjectClass* object_class = G_OBJECT_CLASS(klass);
268 g_autoptr(GVariantDict) values = g_variant_dict_new(
nullptr);
273 g_return_val_if_fail(values !=
nullptr,
nullptr);
274 FlSettingsPortal* portal =
275 FL_SETTINGS_PORTAL(g_object_new(fl_settings_portal_get_type(),
nullptr));
276 portal->values = g_variant_dict_ref(values);
281 g_return_val_if_fail(FL_IS_SETTINGS_PORTAL(
self),
false);
282 g_return_val_if_fail(self->dbus_proxy ==
nullptr,
false);
284 self->dbus_proxy = g_dbus_proxy_new_for_bus_sync(
285 G_BUS_TYPE_SESSION, G_DBUS_PROXY_FLAGS_NONE,
nullptr,
kPortalName,
288 if (self->dbus_proxy ==
nullptr) {
293 g_autoptr(GVariant)
value =
nullptr;
300 g_signal_connect_object(self->dbus_proxy,
"g-signal",
302 static_cast<GConnectFlags
>(0));