core/context: Use Settings portal for 24h setting
Closes: https://gitlab.gnome.org/GNOME/gnome-calendar/-/issues/1105
This commit is contained in:
+87
-15
@@ -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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
Reference in New Issue
Block a user