Flutter Linux Embedder
fl_settings_portal.cc File Reference
#include "flutter/shell/platform/linux/fl_settings_portal.h"
#include <gio/gio.h>
#include <glib.h>

Go to the source code of this file.

Classes

struct  FlSetting
 
struct  _FlSettingsPortal
 

Enumerations

enum  ColorScheme {
  kDefault,
  kPreferDark,
  kPreferLight
}
 

Functions

static void fl_settings_portal_iface_init (FlSettingsInterface *iface)
 
 G_DEFINE_TYPE_WITH_CODE (FlSettingsPortal, fl_settings_portal, G_TYPE_OBJECT, G_IMPLEMENT_INTERFACE(fl_settings_get_type(), fl_settings_portal_iface_init)) static gchar *format_key(const FlSetting *setting)
 
static gboolean get_value (FlSettingsPortal *portal, const FlSetting *setting, GVariant **value)
 
static void set_value (FlSettingsPortal *portal, const FlSetting *setting, GVariant *value)
 
static gboolean settings_portal_read (GDBusProxy *proxy, const gchar *ns, const gchar *key, GVariant **out)
 
static void settings_portal_changed_cb (GDBusProxy *proxy, const char *sender_name, const char *signal_name, GVariant *parameters, gpointer user_data)
 
static FlClockFormat fl_settings_portal_get_clock_format (FlSettings *settings)
 
static FlColorScheme fl_settings_portal_get_color_scheme (FlSettings *settings)
 
static gboolean fl_settings_portal_get_enable_animations (FlSettings *settings)
 
static gboolean fl_settings_portal_get_high_contrast (FlSettings *settings)
 
static gdouble fl_settings_portal_get_text_scaling_factor (FlSettings *settings)
 
static void fl_settings_portal_dispose (GObject *object)
 
static void fl_settings_portal_class_init (FlSettingsPortalClass *klass)
 
static void fl_settings_portal_init (FlSettingsPortal *self)
 
FlSettingsPortal * fl_settings_portal_new ()
 
FlSettingsPortal * fl_settings_portal_new_with_values (GVariantDict *values)
 
gboolean fl_settings_portal_start (FlSettingsPortal *self, GError **error)
 

Variables

static constexpr char kPortalName [] = "org.freedesktop.portal.Desktop"
 
static constexpr char kPortalPath [] = "/org/freedesktop/portal/desktop"
 
static constexpr char kPortalSettings [] = "org.freedesktop.portal.Settings"
 
static constexpr char kXdgAppearance [] = "org.freedesktop.appearance"
 
static const FlSetting kColorScheme
 
static constexpr char kGnomeA11yInterface []
 
static const FlSetting kHighContrast
 
static constexpr char kGnomeDesktopInterface [] = "org.gnome.desktop.interface"
 
static const FlSetting kClockFormat
 
static const FlSetting kEnableAnimations
 
static const FlSetting kGtkTheme
 
static const FlSetting kTextScalingFactor
 
static const FlSetting kAllSettings []
 
static constexpr char kClockFormat12Hour [] = "12h"
 
static constexpr char kGtkThemeDarkSuffix [] = "-dark"
 

Enumeration Type Documentation

◆ ColorScheme

Enumerator
kDefault 
kPreferDark 
kPreferLight 

Definition at line 65 of file fl_settings_portal.cc.

Function Documentation

◆ fl_settings_portal_class_init()

static void fl_settings_portal_class_init ( FlSettingsPortalClass *  klass)
static

Definition at line 248 of file fl_settings_portal.cc.

248  {
249  GObjectClass* object_class = G_OBJECT_CLASS(klass);
250  object_class->dispose = fl_settings_portal_dispose;
251 }

References fl_settings_portal_dispose().

◆ fl_settings_portal_dispose()

static void fl_settings_portal_dispose ( GObject *  object)
static

Definition at line 239 of file fl_settings_portal.cc.

239  {
240  FlSettingsPortal* self = FL_SETTINGS_PORTAL(object);
241 
242  g_clear_object(&self->dbus_proxy);
243  g_clear_pointer(&self->values, g_variant_dict_unref);
244 
245  G_OBJECT_CLASS(fl_settings_portal_parent_class)->dispose(object);
246 }

Referenced by fl_settings_portal_class_init().

◆ fl_settings_portal_get_clock_format()

static FlClockFormat fl_settings_portal_get_clock_format ( FlSettings *  settings)
static

Definition at line 163 of file fl_settings_portal.cc.

163  {
164  FlSettingsPortal* self = FL_SETTINGS_PORTAL(settings);
165 
166  FlClockFormat clock_format = FL_CLOCK_FORMAT_24H;
167 
168  g_autoptr(GVariant) value = nullptr;
169  if (get_value(self, &kClockFormat, &value)) {
170  const gchar* clock_format_str = g_variant_get_string(value, nullptr);
171  if (g_strcmp0(clock_format_str, kClockFormat12Hour) == 0) {
172  clock_format = FL_CLOCK_FORMAT_12H;
173  }
174  }
175 
176  return clock_format;
177 }

References FL_CLOCK_FORMAT_12H, FL_CLOCK_FORMAT_24H, get_value(), kClockFormat, kClockFormat12Hour, and value.

Referenced by fl_settings_portal_iface_init().

◆ fl_settings_portal_get_color_scheme()

static FlColorScheme fl_settings_portal_get_color_scheme ( FlSettings *  settings)
static

Definition at line 179 of file fl_settings_portal.cc.

179  {
180  FlSettingsPortal* self = FL_SETTINGS_PORTAL(settings);
181 
182  FlColorScheme color_scheme = FL_COLOR_SCHEME_LIGHT;
183 
184  g_autoptr(GVariant) value = nullptr;
185  if (get_value(self, &kColorScheme, &value)) {
186  if (g_variant_get_uint32(value) == kPreferDark) {
187  color_scheme = FL_COLOR_SCHEME_DARK;
188  }
189  } else if (get_value(self, &kGtkTheme, &value)) {
190  const gchar* gtk_theme_str = g_variant_get_string(value, nullptr);
191  if (g_str_has_suffix(gtk_theme_str, kGtkThemeDarkSuffix)) {
192  color_scheme = FL_COLOR_SCHEME_DARK;
193  }
194  }
195 
196  return color_scheme;
197 }

References FL_COLOR_SCHEME_DARK, FL_COLOR_SCHEME_LIGHT, get_value(), kColorScheme, kGtkTheme, kGtkThemeDarkSuffix, kPreferDark, and value.

Referenced by fl_settings_portal_iface_init().

◆ fl_settings_portal_get_enable_animations()

static gboolean fl_settings_portal_get_enable_animations ( FlSettings *  settings)
static

Definition at line 199 of file fl_settings_portal.cc.

199  {
200  FlSettingsPortal* self = FL_SETTINGS_PORTAL(settings);
201 
202  gboolean enable_animations = true;
203 
204  g_autoptr(GVariant) value = nullptr;
205  if (get_value(self, &kEnableAnimations, &value)) {
206  enable_animations = g_variant_get_boolean(value);
207  }
208 
209  return enable_animations;
210 }

References get_value(), kEnableAnimations, and value.

Referenced by fl_settings_portal_iface_init().

◆ fl_settings_portal_get_high_contrast()

static gboolean fl_settings_portal_get_high_contrast ( FlSettings *  settings)
static

Definition at line 212 of file fl_settings_portal.cc.

212  {
213  FlSettingsPortal* self = FL_SETTINGS_PORTAL(settings);
214 
215  gboolean high_contrast = false;
216 
217  g_autoptr(GVariant) value = nullptr;
218  if (get_value(self, &kHighContrast, &value)) {
219  high_contrast = g_variant_get_boolean(value);
220  }
221 
222  return high_contrast;
223 }

References get_value(), kHighContrast, and value.

Referenced by fl_settings_portal_iface_init().

◆ fl_settings_portal_get_text_scaling_factor()

static gdouble fl_settings_portal_get_text_scaling_factor ( FlSettings *  settings)
static

Definition at line 225 of file fl_settings_portal.cc.

226  {
227  FlSettingsPortal* self = FL_SETTINGS_PORTAL(settings);
228 
229  gdouble scaling_factor = 1.0;
230 
231  g_autoptr(GVariant) value = nullptr;
232  if (get_value(self, &kTextScalingFactor, &value)) {
233  scaling_factor = g_variant_get_double(value);
234  }
235 
236  return scaling_factor;
237 }

References get_value(), kTextScalingFactor, and value.

Referenced by fl_settings_portal_iface_init().

◆ fl_settings_portal_iface_init()

static void fl_settings_portal_iface_init ( FlSettingsInterface *  iface)
static

◆ fl_settings_portal_init()

static void fl_settings_portal_init ( FlSettingsPortal *  self)
static

Definition at line 261 of file fl_settings_portal.cc.

261 {}

◆ fl_settings_portal_new()

FlSettingsPortal* fl_settings_portal_new ( )

FlSettingsPortal: #FlSettingsPortal reads settings from the XDG desktop portal. fl_settings_portal_new:

Creates a new settings portal instance.

Returns: a new #FlSettingsPortal.

Definition at line 263 of file fl_settings_portal.cc.

263  {
264  g_autoptr(GVariantDict) values = g_variant_dict_new(nullptr);
265  return fl_settings_portal_new_with_values(values);
266 }

References fl_settings_portal_new_with_values().

Referenced by fl_settings_new().

◆ fl_settings_portal_new_with_values()

FlSettingsPortal* fl_settings_portal_new_with_values ( GVariantDict *  values)

fl_settings_portal_new_with_values: @values: (nullable): a #GVariantDict.

Creates a new settings portal instance with initial values for testing.

Returns: a new #FlSettingsPortal.

Definition at line 268 of file fl_settings_portal.cc.

268  {
269  g_return_val_if_fail(values != nullptr, nullptr);
270  FlSettingsPortal* portal =
271  FL_SETTINGS_PORTAL(g_object_new(fl_settings_portal_get_type(), nullptr));
272  portal->values = g_variant_dict_ref(values);
273  return portal;
274 }

Referenced by fl_settings_portal_new(), and TEST().

◆ fl_settings_portal_start()

gboolean fl_settings_portal_start ( FlSettingsPortal *  portal,
GError **  error 
)

fl_settings_portal_start: @portal: an #FlSettingsPortal. @error: (allow-none): #GError location to store the error occurring, or NULL

Reads the current settings and starts monitoring for changes in the desktop portal settings.

Returns: TRUE on success, or FALSE if the portal is not available.

Definition at line 276 of file fl_settings_portal.cc.

276  {
277  g_return_val_if_fail(FL_IS_SETTINGS_PORTAL(self), false);
278  g_return_val_if_fail(self->dbus_proxy == nullptr, false);
279 
280  self->dbus_proxy = g_dbus_proxy_new_for_bus_sync(
281  G_BUS_TYPE_SESSION, G_DBUS_PROXY_FLAGS_NONE, nullptr, kPortalName,
282  kPortalPath, kPortalSettings, nullptr, error);
283 
284  if (self->dbus_proxy == nullptr) {
285  return FALSE;
286  }
287 
288  for (const FlSetting setting : kAllSettings) {
289  g_autoptr(GVariant) value = nullptr;
290  if (settings_portal_read(self->dbus_proxy, setting.ns, setting.key,
291  &value)) {
292  set_value(self, &setting, value);
293  }
294  }
295 
296  g_signal_connect_object(self->dbus_proxy, "g-signal",
297  G_CALLBACK(settings_portal_changed_cb), self,
298  static_cast<GConnectFlags>(0));
299 
300  return true;
301 }

References error, kAllSettings, kPortalName, kPortalPath, kPortalSettings, set_value(), settings_portal_changed_cb(), settings_portal_read(), and value.

Referenced by fl_settings_new().

◆ G_DEFINE_TYPE_WITH_CODE()

G_DEFINE_TYPE_WITH_CODE ( FlSettingsPortal  ,
fl_settings_portal  ,
G_TYPE_OBJECT  ,
G_IMPLEMENT_INTERFACE(fl_settings_get_type(), fl_settings_portal_iface_init  
) const

Definition at line 76 of file fl_settings_portal.cc.

82  {
83  return g_strconcat(setting->ns, "::", setting->key, nullptr);
84 }

References FlSetting::key, and FlSetting::ns.

◆ get_value()

static gboolean get_value ( FlSettingsPortal *  portal,
const FlSetting setting,
GVariant **  value 
)
static

Definition at line 86 of file fl_settings_portal.cc.

88  {
89  g_autofree const gchar* key = format_key(setting);
90  *value = g_variant_dict_lookup_value(portal->values, key, setting->type);
91  return *value != nullptr;
92 }

References FlSetting::type, and value.

Referenced by fl_settings_portal_get_clock_format(), fl_settings_portal_get_color_scheme(), fl_settings_portal_get_enable_animations(), fl_settings_portal_get_high_contrast(), and fl_settings_portal_get_text_scaling_factor().

◆ set_value()

static void set_value ( FlSettingsPortal *  portal,
const FlSetting setting,
GVariant *  value 
)
static

Definition at line 94 of file fl_settings_portal.cc.

96  {
97  g_autofree const gchar* key = format_key(setting);
98 
99  // ignore redundant changes from multiple XDG desktop portal backends
100  g_autoptr(GVariant) old_value =
101  g_variant_dict_lookup_value(portal->values, key, nullptr);
102  if (old_value != nullptr && value != nullptr &&
103  g_variant_equal(old_value, value)) {
104  return;
105  }
106 
107  g_variant_dict_insert_value(portal->values, key, value);
108  fl_settings_emit_changed(FL_SETTINGS(portal));
109 }

References fl_settings_emit_changed(), and value.

Referenced by fl_settings_portal_start(), and settings_portal_changed_cb().

◆ settings_portal_changed_cb()

static void settings_portal_changed_cb ( GDBusProxy *  proxy,
const char *  sender_name,
const char *  signal_name,
GVariant *  parameters,
gpointer  user_data 
)
static

Definition at line 147 of file fl_settings_portal.cc.

151  {
152  FlSettingsPortal* portal = FL_SETTINGS_PORTAL(user_data);
153  if (g_strcmp0(signal_name, "SettingChanged")) {
154  return;
155  }
156 
157  FlSetting setting;
158  g_autoptr(GVariant) value = nullptr;
159  g_variant_get(parameters, "(&s&sv)", &setting.ns, &setting.key, &value);
160  set_value(portal, &setting, value);
161 }

References FlSetting::key, FlSetting::ns, set_value(), user_data, and value.

Referenced by fl_settings_portal_start().

◆ settings_portal_read()

static gboolean settings_portal_read ( GDBusProxy *  proxy,
const gchar *  ns,
const gchar *  key,
GVariant **  out 
)
static

Definition at line 113 of file fl_settings_portal.cc.

116  {
117  g_autoptr(GError) error = nullptr;
118  g_autoptr(GVariant) value =
119  g_dbus_proxy_call_sync(proxy, "Read", g_variant_new("(ss)", ns, key),
120  G_DBUS_CALL_FLAGS_NONE, G_MAXINT, nullptr, &error);
121 
122  if (error) {
123  if (error->domain == G_DBUS_ERROR &&
124  error->code == G_DBUS_ERROR_SERVICE_UNKNOWN) {
125  g_debug("XDG desktop portal unavailable: %s", error->message);
126  return FALSE;
127  }
128 
129  if (error->domain == G_DBUS_ERROR &&
130  error->code == G_DBUS_ERROR_UNKNOWN_METHOD) {
131  g_debug("XDG desktop portal settings unavailable: %s", error->message);
132  return FALSE;
133  }
134 
135  g_critical("Failed to read XDG desktop portal settings: %s",
136  error->message);
137  return FALSE;
138  }
139 
140  g_autoptr(GVariant) child = nullptr;
141  g_variant_get(value, "(v)", &child);
142  g_variant_get(child, "v", out);
143 
144  return TRUE;
145 }

References error, TRUE, and value.

Referenced by fl_settings_portal_start().

Variable Documentation

◆ kAllSettings

const FlSetting kAllSettings[]
static

◆ kClockFormat

const FlSetting kClockFormat
static
Initial value:
= {
"clock-format",
G_VARIANT_TYPE_STRING,
}

Definition at line 36 of file fl_settings_portal.cc.

Referenced by fl_settings_portal_get_clock_format().

◆ kClockFormat12Hour

constexpr char kClockFormat12Hour[] = "12h"
staticconstexpr

Definition at line 62 of file fl_settings_portal.cc.

Referenced by fl_settings_portal_get_clock_format().

◆ kColorScheme

const FlSetting kColorScheme
static
Initial value:
= {
"color-scheme",
G_VARIANT_TYPE_UINT32,
}

Definition at line 21 of file fl_settings_portal.cc.

Referenced by fl_settings_portal_get_color_scheme().

◆ kEnableAnimations

const FlSetting kEnableAnimations
static
Initial value:
= {
"enable-animations",
G_VARIANT_TYPE_BOOLEAN,
}

Definition at line 41 of file fl_settings_portal.cc.

Referenced by fl_settings_portal_get_enable_animations().

◆ kGnomeA11yInterface

constexpr char kGnomeA11yInterface[]
staticconstexpr
Initial value:
=
"org.gnome.desktop.a11y.interface"

Definition at line 27 of file fl_settings_portal.cc.

◆ kGnomeDesktopInterface

constexpr char kGnomeDesktopInterface[] = "org.gnome.desktop.interface"
staticconstexpr

Definition at line 35 of file fl_settings_portal.cc.

◆ kGtkTheme

const FlSetting kGtkTheme
static
Initial value:
= {
"gtk-theme",
G_VARIANT_TYPE_STRING,
}

Definition at line 46 of file fl_settings_portal.cc.

Referenced by fl_settings_portal_get_color_scheme().

◆ kGtkThemeDarkSuffix

constexpr char kGtkThemeDarkSuffix[] = "-dark"
staticconstexpr

Definition at line 63 of file fl_settings_portal.cc.

Referenced by fl_settings_portal_get_color_scheme().

◆ kHighContrast

const FlSetting kHighContrast
static
Initial value:
= {
"high-contrast",
G_VARIANT_TYPE_BOOLEAN,
}

Definition at line 29 of file fl_settings_portal.cc.

Referenced by fl_settings_portal_get_high_contrast().

◆ kPortalName

constexpr char kPortalName[] = "org.freedesktop.portal.Desktop"
staticconstexpr

Definition at line 10 of file fl_settings_portal.cc.

Referenced by fl_settings_portal_start().

◆ kPortalPath

constexpr char kPortalPath[] = "/org/freedesktop/portal/desktop"
staticconstexpr

Definition at line 11 of file fl_settings_portal.cc.

Referenced by fl_settings_portal_start().

◆ kPortalSettings

constexpr char kPortalSettings[] = "org.freedesktop.portal.Settings"
staticconstexpr

Definition at line 12 of file fl_settings_portal.cc.

Referenced by fl_settings_portal_start().

◆ kTextScalingFactor

const FlSetting kTextScalingFactor
static
Initial value:
= {
"text-scaling-factor",
G_VARIANT_TYPE_DOUBLE,
}

Definition at line 51 of file fl_settings_portal.cc.

Referenced by fl_settings_portal_get_text_scaling_factor().

◆ kXdgAppearance

constexpr char kXdgAppearance[] = "org.freedesktop.appearance"
staticconstexpr

Definition at line 20 of file fl_settings_portal.cc.

FlSetting::type
const GVariantType * type
Definition: fl_settings_portal.cc:17
kEnableAnimations
static const FlSetting kEnableAnimations
Definition: fl_settings_portal.cc:41
kGtkThemeDarkSuffix
static constexpr char kGtkThemeDarkSuffix[]
Definition: fl_settings_portal.cc:63
fl_settings_portal_get_color_scheme
static FlColorScheme fl_settings_portal_get_color_scheme(FlSettings *settings)
Definition: fl_settings_portal.cc:179
kGnomeA11yInterface
static constexpr char kGnomeA11yInterface[]
Definition: fl_settings_portal.cc:27
FL_CLOCK_FORMAT_12H
@ FL_CLOCK_FORMAT_12H
Definition: fl_settings.h:23
fl_settings_portal_dispose
static void fl_settings_portal_dispose(GObject *object)
Definition: fl_settings_portal.cc:239
FL_CLOCK_FORMAT_24H
@ FL_CLOCK_FORMAT_24H
Definition: fl_settings.h:24
fl_settings_portal_new_with_values
FlSettingsPortal * fl_settings_portal_new_with_values(GVariantDict *values)
Definition: fl_settings_portal.cc:268
user_data
FlKeyEvent uint64_t FlKeyResponderAsyncCallback gpointer user_data
Definition: fl_key_channel_responder.cc:121
kGnomeDesktopInterface
static constexpr char kGnomeDesktopInterface[]
Definition: fl_settings_portal.cc:35
fl_settings_portal_get_text_scaling_factor
static gdouble fl_settings_portal_get_text_scaling_factor(FlSettings *settings)
Definition: fl_settings_portal.cc:225
kPortalPath
static constexpr char kPortalPath[]
Definition: fl_settings_portal.cc:11
get_value
static gboolean get_value(FlSettingsPortal *portal, const FlSetting *setting, GVariant **value)
Definition: fl_settings_portal.cc:86
kColorScheme
static const FlSetting kColorScheme
Definition: fl_settings_portal.cc:21
fl_settings_portal_get_enable_animations
static gboolean fl_settings_portal_get_enable_animations(FlSettings *settings)
Definition: fl_settings_portal.cc:199
FlColorScheme
FlColorScheme
Definition: fl_settings.h:35
fl_settings_portal_get_high_contrast
static gboolean fl_settings_portal_get_high_contrast(FlSettings *settings)
Definition: fl_settings_portal.cc:212
fl_settings_emit_changed
void fl_settings_emit_changed(FlSettings *self)
Definition: fl_settings.cc:50
kTextScalingFactor
static const FlSetting kTextScalingFactor
Definition: fl_settings_portal.cc:51
FlSetting
Definition: fl_settings_portal.cc:14
settings_portal_read
static gboolean settings_portal_read(GDBusProxy *proxy, const gchar *ns, const gchar *key, GVariant **out)
Definition: fl_settings_portal.cc:113
kPreferLight
@ kPreferLight
Definition: fl_settings_portal.cc:65
kPortalName
static constexpr char kPortalName[]
Definition: fl_settings_portal.cc:10
TRUE
return TRUE
Definition: fl_pixel_buffer_texture_test.cc:53
fl_settings_portal_get_clock_format
static FlClockFormat fl_settings_portal_get_clock_format(FlSettings *settings)
Definition: fl_settings_portal.cc:163
kGtkTheme
static const FlSetting kGtkTheme
Definition: fl_settings_portal.cc:46
kClockFormat12Hour
static constexpr char kClockFormat12Hour[]
Definition: fl_settings_portal.cc:62
kDefault
@ kDefault
Definition: fl_settings_portal.cc:65
FL_COLOR_SCHEME_LIGHT
@ FL_COLOR_SCHEME_LIGHT
Definition: fl_settings.h:37
error
const uint8_t uint32_t uint32_t GError ** error
Definition: fl_pixel_buffer_texture_test.cc:40
kPortalSettings
static constexpr char kPortalSettings[]
Definition: fl_settings_portal.cc:12
FL_COLOR_SCHEME_DARK
@ FL_COLOR_SCHEME_DARK
Definition: fl_settings.h:38
set_value
static void set_value(FlSettingsPortal *portal, const FlSetting *setting, GVariant *value)
Definition: fl_settings_portal.cc:94
kXdgAppearance
static constexpr char kXdgAppearance[]
Definition: fl_settings_portal.cc:20
settings_portal_changed_cb
static void settings_portal_changed_cb(GDBusProxy *proxy, const char *sender_name, const char *signal_name, GVariant *parameters, gpointer user_data)
Definition: fl_settings_portal.cc:147
ColorScheme
ColorScheme
Definition: fl_settings_portal.cc:65
kClockFormat
static const FlSetting kClockFormat
Definition: fl_settings_portal.cc:36
FlClockFormat
FlClockFormat
Definition: fl_settings.h:21
value
uint8_t value
Definition: fl_standard_message_codec.cc:36
FlSetting::key
const gchar * key
Definition: fl_settings_portal.cc:16
FlSetting::ns
const gchar * ns
Definition: fl_settings_portal.cc:15
kPreferDark
@ kPreferDark
Definition: fl_settings_portal.cc:65
kHighContrast
static const FlSetting kHighContrast
Definition: fl_settings_portal.cc:29
kAllSettings
static const FlSetting kAllSettings[]
Definition: fl_settings_portal.cc:57