core/utils: Find the actual 'default' locale start of week day
Use the gcal-utils to find the actual day in case the desktop setting for start of week is set to 'default'. After this commit, all usages of that function have to be changed to use the GcalContext instead. Part-of: <https://gitlab.gnome.org/GNOME/gnome-calendar/-/merge_requests/822>
This commit is contained in:
+11
-3
@@ -26,6 +26,8 @@
|
||||
#include <gdesktop-enums.h>
|
||||
#include "gdesktop-enum-types.h"
|
||||
|
||||
#include "gcal-utils.h"
|
||||
|
||||
#define DESKTOP_SETTINGS_INTERFACE_NAMESPACE "org.gnome.desktop.interface"
|
||||
#define DESKTOP_SETTINGS_CALENDAR_NAMESPACE "org.gnome.desktop.calendar"
|
||||
#define CLOCK_FORMAT_KEY "clock-format"
|
||||
@@ -110,7 +112,13 @@ set_week_start_day_from_variant (GcalContext *self,
|
||||
weekday_nick = g_variant_get_string (variant, NULL);
|
||||
weekday = g_enum_get_value_by_nick (g_type_class_get (G_DESKTOP_TYPE_WEEKDAY), weekday_nick);
|
||||
|
||||
if (!weekday || self->week_start_day == weekday->value)
|
||||
g_assert (weekday != NULL);
|
||||
|
||||
/* find the actual 'default' from locale */
|
||||
if (weekday->value == G_DESKTOP_WEEKDAY_DEFAULT)
|
||||
weekday = g_enum_get_value (g_type_class_get (G_DESKTOP_TYPE_WEEKDAY), gcal_util_get_first_weekday ());
|
||||
|
||||
if (self->week_start_day == weekday->value)
|
||||
return;
|
||||
|
||||
self->week_start_day = weekday->value;
|
||||
@@ -383,7 +391,7 @@ gcal_context_class_init (GcalContextClass *klass)
|
||||
|
||||
properties[PROP_WEEK_START_DAY] =
|
||||
g_param_spec_enum ("week-start-day", NULL, NULL,
|
||||
G_DESKTOP_TYPE_WEEKDAY, get_first_weekday_iso (),
|
||||
G_DESKTOP_TYPE_WEEKDAY, gcal_util_get_first_weekday (),
|
||||
G_PARAM_READABLE | G_PARAM_EXPLICIT_NOTIFY | G_PARAM_STATIC_STRINGS);
|
||||
|
||||
g_object_class_install_properties (object_class, N_PROPS, properties);
|
||||
@@ -527,7 +535,7 @@ gcal_context_get_time_format (GcalContext *self)
|
||||
GDesktopWeekday
|
||||
gcal_context_get_week_start_day (GcalContext *self)
|
||||
{
|
||||
g_return_val_if_fail (GCAL_IS_CONTEXT (self), get_first_weekday ());
|
||||
g_return_val_if_fail (GCAL_IS_CONTEXT (self), gcal_util_get_first_weekday ());
|
||||
|
||||
return self->week_start_day;
|
||||
}
|
||||
|
||||
@@ -210,89 +210,6 @@ gcal_util_get_desc_from_component (ECalComponent *component,
|
||||
return desc != NULL ? g_strstrip (desc) : NULL;
|
||||
}
|
||||
|
||||
static gboolean
|
||||
read_first_weekday_from_portal (gint *out_first_weekday)
|
||||
{
|
||||
static gsize first_weekday_init = FALSE;
|
||||
static gsize first_weekday = G_MAXSIZE;
|
||||
|
||||
if (g_once_init_enter (&first_weekday_init))
|
||||
{
|
||||
g_autoptr (GDBusProxy) settings_portal = NULL;
|
||||
g_autoptr (GVariant) result = NULL;
|
||||
g_autoptr (GVariant) aux2 = NULL;
|
||||
g_autoptr (GVariant) aux = NULL;
|
||||
g_autoptr (GError) error = NULL;
|
||||
const gchar *day;
|
||||
|
||||
/*
|
||||
* If the value is not "default" then there is a user preference
|
||||
* override, in that case skip the autodetection dance.
|
||||
*/
|
||||
static const gchar *portal_weekdays[] = {
|
||||
"sunday",
|
||||
"monday",
|
||||
"tuesday",
|
||||
"wednesday",
|
||||
"thursday",
|
||||
"friday",
|
||||
"saturday",
|
||||
};
|
||||
|
||||
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);
|
||||
|
||||
if (error)
|
||||
{
|
||||
g_warning ("Failed to load portals: %s. Aborting...", error->message);
|
||||
goto out;
|
||||
}
|
||||
|
||||
result = g_dbus_proxy_call_sync (settings_portal,
|
||||
"ReadOne",
|
||||
g_variant_new ("(ss)", "org.gnome.desktop.calendar", "week-start-day"),
|
||||
G_DBUS_CALL_FLAGS_NONE,
|
||||
G_MAXINT,
|
||||
NULL,
|
||||
&error);
|
||||
|
||||
if (error)
|
||||
{
|
||||
g_warning ("Failed to load first weekday settings: %s", error->message);
|
||||
goto out;
|
||||
}
|
||||
|
||||
aux = g_variant_get_child_value (result, 0);
|
||||
aux2 = g_variant_get_variant (aux);
|
||||
day = g_variant_get_string (aux2, NULL);
|
||||
|
||||
g_debug ("Setting 'week-start-day' is currently: %s", day);
|
||||
|
||||
for (int i = 0; i < G_N_ELEMENTS (portal_weekdays); i++)
|
||||
{
|
||||
if (g_strcmp0 (day, portal_weekdays[i]) == 0)
|
||||
{
|
||||
first_weekday = i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
out:
|
||||
g_once_init_leave (&first_weekday_init, TRUE);
|
||||
}
|
||||
|
||||
if (first_weekday != G_MAXSIZE && out_first_weekday)
|
||||
*out_first_weekday = first_weekday;
|
||||
|
||||
return first_weekday != G_MAXSIZE;
|
||||
}
|
||||
|
||||
/**
|
||||
* gcal_util_get_first_weekday:
|
||||
*
|
||||
@@ -306,9 +223,6 @@ gcal_util_get_first_weekday (void)
|
||||
{
|
||||
gint week_start;
|
||||
|
||||
if (read_first_weekday_from_portal (&week_start))
|
||||
return week_start;
|
||||
|
||||
#ifdef HAVE__NL_TIME_FIRST_WEEKDAY
|
||||
|
||||
union { unsigned int word; char *string; } langinfo;
|
||||
|
||||
Reference in New Issue
Block a user