core/context: Use Settings portal for 24h setting

Closes: https://gitlab.gnome.org/GNOME/gnome-calendar/-/issues/1105
This commit is contained in:
Georges Basile Stavracas Neto
2023-09-23 02:54:09 -03:00
parent b26f33ea10
commit 750c62d4f2
+87 -15
View File
@@ -27,7 +27,7 @@ struct _GcalContext
{ {
GObject parent; GObject parent;
GSettings *desktop_settings; GDBusProxy *settings_portal;
GcalClock *clock; GcalClock *clock;
GcalManager *manager; GcalManager *manager;
@@ -62,17 +62,23 @@ static GParamSpec *properties [N_PROPS];
*/ */
static void static void
load_time_format (GcalContext *self) set_time_format_from_variant (GcalContext *self,
GVariant *variant)
{ {
g_autofree gchar *clock_format = NULL;
g_autofree gchar *enum_format = NULL; g_autofree gchar *enum_format = NULL;
GcalTimeFormat time_format;
clock_format = g_settings_get_string (self->desktop_settings, "clock-format"); g_assert (g_variant_type_equal (g_variant_get_type (variant), "s"));
if (g_strcmp0 (clock_format, "12h") == 0) if (g_strcmp0 (g_variant_get_string (variant, NULL), "12h") == 0)
self->time_format = GCAL_TIME_FORMAT_12H; time_format = GCAL_TIME_FORMAT_12H;
else else
self->time_format = GCAL_TIME_FORMAT_24H; time_format = GCAL_TIME_FORMAT_24H;
if (self->time_format == time_format)
return;
self->time_format = time_format;
enum_format = g_enum_to_string (GCAL_TYPE_TIME_FORMAT, self->time_format); enum_format = g_enum_to_string (GCAL_TYPE_TIME_FORMAT, self->time_format);
g_debug ("Setting time format to %s", enum_format); g_debug ("Setting time format to %s", enum_format);
@@ -80,11 +86,63 @@ load_time_format (GcalContext *self)
g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_TIME_FORMAT]); g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_TIME_FORMAT]);
} }
static gboolean
read_time_format (GcalContext *self)
{
g_autoptr (GVariant) other_child = NULL;
g_autoptr (GVariant) child = NULL;
g_autoptr (GVariant) ret = NULL;
g_autoptr (GError) error = NULL;
ret = g_dbus_proxy_call_sync (self->settings_portal,
"Read",
g_variant_new ("(ss)", "org.gnome.desktop.interface", "clock-format"),
G_DBUS_CALL_FLAGS_NONE,
G_MAXINT,
NULL,
&error);
if (error)
{
return FALSE;
}
g_variant_get (ret, "(v)", &child);
g_variant_get (child, "v", &other_child);
set_time_format_from_variant (self, other_child);
return TRUE;
}
/* /*
* Callbacks * Callbacks
*/ */
static void
on_portal_proxy_signal_cb (GDBusProxy *proxy,
const gchar *sender_name,
const gchar *signal_name,
GVariant *parameters,
GcalContext *self)
{
g_autoptr (GVariant) value = NULL;
const char *namespace;
const char *name;
if (g_strcmp0 (signal_name, "SettingChanged") != 0)
return;
g_variant_get (parameters, "(&s&sv)", &namespace, &name, &value);
if (g_strcmp0 (namespace, "org.gnome.desktop.interface") == 0 &&
g_strcmp0 (name, "clock-format") == 0)
{
set_time_format_from_variant (self, value);
}
}
static void static void
on_timezone_changed_cb (GcalTimeZoneMonitor *timezone_monitor, on_timezone_changed_cb (GcalTimeZoneMonitor *timezone_monitor,
GParamSpec *pspec, GParamSpec *pspec,
@@ -117,7 +175,7 @@ gcal_context_finalize (GObject *object)
gcal_weather_service_stop (self->weather_service); gcal_weather_service_stop (self->weather_service);
g_clear_object (&self->clock); g_clear_object (&self->clock);
g_clear_object (&self->desktop_settings); g_clear_object (&self->settings_portal);
g_clear_object (&self->manager); g_clear_object (&self->manager);
g_clear_object (&self->timezone_monitor); g_clear_object (&self->timezone_monitor);
g_clear_object (&self->weather_service); g_clear_object (&self->weather_service);
@@ -247,6 +305,8 @@ gcal_context_class_init (GcalContextClass *klass)
static void static void
gcal_context_init (GcalContext *self) gcal_context_init (GcalContext *self)
{ {
g_autoptr (GError) error = NULL;
self->clock = gcal_clock_new (); self->clock = gcal_clock_new ();
self->settings = g_settings_new ("org.gnome.calendar"); self->settings = g_settings_new ("org.gnome.calendar");
self->weather_service = gcal_weather_service_new (); self->weather_service = gcal_weather_service_new ();
@@ -259,13 +319,25 @@ gcal_context_init (GcalContext *self)
0); 0);
/* Time format */ /* Time format */
self->desktop_settings = g_settings_new ("org.gnome.desktop.interface"); self->settings_portal = g_dbus_proxy_new_for_bus_sync (G_BUS_TYPE_SESSION,
g_signal_connect_object (self->desktop_settings, G_DBUS_PROXY_FLAGS_NONE,
"changed::clock-format", NULL,
G_CALLBACK (load_time_format), "org.freedesktop.portal.Desktop",
self, "/org/freedesktop/portal/desktop",
G_CONNECT_SWAPPED); "org.freedesktop.portal.Settings",
load_time_format (self); NULL,
&error);
if (error)
g_error ("Failed to load portals: %s. Aborting...", error->message);
if (read_time_format (self))
{
g_signal_connect (self->settings_portal,
"g-signal",
G_CALLBACK (on_portal_proxy_signal_cb),
self);
}
} }
/** /**