event-editor/date-selector: Use portal for week dates
Closes: https://gitlab.gnome.org/GNOME/gnome-calendar/-/issues/1022
This commit is contained in:
@@ -35,7 +35,7 @@ struct _GcalDateSelector
|
|||||||
GtkWidget *date_chooser;
|
GtkWidget *date_chooser;
|
||||||
GtkWidget *date_selector_popover;
|
GtkWidget *date_selector_popover;
|
||||||
|
|
||||||
GSettings *settings;
|
GDBusProxy *settings_portal;
|
||||||
};
|
};
|
||||||
|
|
||||||
G_DEFINE_TYPE (GcalDateSelector, gcal_date_selector, GTK_TYPE_ENTRY);
|
G_DEFINE_TYPE (GcalDateSelector, gcal_date_selector, GTK_TYPE_ENTRY);
|
||||||
@@ -49,6 +49,46 @@ enum
|
|||||||
|
|
||||||
static GParamSpec* properties[N_PROPS] = { NULL, };
|
static GParamSpec* properties[N_PROPS] = { NULL, };
|
||||||
|
|
||||||
|
|
||||||
|
static void
|
||||||
|
set_show_weekdate_from_variant (GcalDateSelector *self,
|
||||||
|
GVariant *variant)
|
||||||
|
{
|
||||||
|
g_assert (g_variant_type_equal (g_variant_get_type (variant), "b"));
|
||||||
|
|
||||||
|
gcal_date_chooser_set_show_week_numbers (GCAL_DATE_CHOOSER (self->date_chooser),
|
||||||
|
g_variant_get_boolean (variant));
|
||||||
|
}
|
||||||
|
|
||||||
|
static gboolean
|
||||||
|
read_show_weekdate (GcalDateSelector *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.calendar", "show-weekdate"),
|
||||||
|
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_show_weekdate_from_variant (self, other_child);
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
update_text (GcalDateSelector *self)
|
update_text (GcalDateSelector *self)
|
||||||
{
|
{
|
||||||
@@ -97,6 +137,29 @@ parse_date (GcalDateSelector *self)
|
|||||||
g_clear_pointer (&new_date, g_date_time_unref);
|
g_clear_pointer (&new_date, g_date_time_unref);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
on_portal_proxy_signal_cb (GDBusProxy *proxy,
|
||||||
|
const gchar *sender_name,
|
||||||
|
const gchar *signal_name,
|
||||||
|
GVariant *parameters,
|
||||||
|
GcalDateSelector *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.calendar") == 0 &&
|
||||||
|
g_strcmp0 (name, "show-weekdate") == 0)
|
||||||
|
{
|
||||||
|
set_show_weekdate_from_variant (self, value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
icon_pressed_cb (GcalDateSelector *self,
|
icon_pressed_cb (GcalDateSelector *self,
|
||||||
GtkEntryIconPosition position,
|
GtkEntryIconPosition position,
|
||||||
@@ -161,7 +224,7 @@ gcal_date_selector_dispose (GObject *object)
|
|||||||
GcalDateSelector *self = GCAL_DATE_SELECTOR (object);
|
GcalDateSelector *self = GCAL_DATE_SELECTOR (object);
|
||||||
|
|
||||||
g_clear_pointer (&self->date_selector_popover, gtk_widget_unparent);
|
g_clear_pointer (&self->date_selector_popover, gtk_widget_unparent);
|
||||||
g_clear_object (&self->settings);
|
g_clear_object (&self->settings_portal);
|
||||||
|
|
||||||
G_OBJECT_CLASS (gcal_date_selector_parent_class)->dispose (object);
|
G_OBJECT_CLASS (gcal_date_selector_parent_class)->dispose (object);
|
||||||
}
|
}
|
||||||
@@ -254,15 +317,29 @@ gcal_date_selector_class_init (GcalDateSelectorClass *klass)
|
|||||||
static void
|
static void
|
||||||
gcal_date_selector_init (GcalDateSelector *self)
|
gcal_date_selector_init (GcalDateSelector *self)
|
||||||
{
|
{
|
||||||
|
g_autoptr (GError) error = NULL;
|
||||||
|
|
||||||
gtk_widget_init_template (GTK_WIDGET (self));
|
gtk_widget_init_template (GTK_WIDGET (self));
|
||||||
|
|
||||||
self->settings = g_settings_new ("org.gnome.desktop.calendar");
|
self->settings_portal = g_dbus_proxy_new_for_bus_sync (G_BUS_TYPE_SESSION,
|
||||||
|
G_DBUS_PROXY_FLAGS_NONE,
|
||||||
|
NULL,
|
||||||
|
"org.freedesktop.portal.Desktop",
|
||||||
|
"/org/freedesktop/portal/desktop",
|
||||||
|
"org.freedesktop.portal.Settings",
|
||||||
|
NULL,
|
||||||
|
&error);
|
||||||
|
|
||||||
g_settings_bind (self->settings,
|
if (error)
|
||||||
"show-weekdate",
|
g_error ("Failed to load portals: %s. Aborting...", error->message);
|
||||||
self->date_chooser,
|
|
||||||
"show-week-numbers",
|
if (read_show_weekdate (self))
|
||||||
G_SETTINGS_BIND_DEFAULT);
|
{
|
||||||
|
g_signal_connect (self->settings_portal,
|
||||||
|
"g-signal",
|
||||||
|
G_CALLBACK (on_portal_proxy_signal_cb),
|
||||||
|
self);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Public API */
|
/* Public API */
|
||||||
|
|||||||
Reference in New Issue
Block a user