File gnome-control-center-follow-polkit-permissions-for-tz.patch of Package gnome-control-center.9274
Index: gnome-control-center-3.18.2/panels/datetime/cc-datetime-panel.c
===================================================================
--- gnome-control-center-3.18.2.orig/panels/datetime/cc-datetime-panel.c
+++ gnome-control-center-3.18.2/panels/datetime/cc-datetime-panel.c
@@ -59,6 +59,7 @@ enum {
#define W(x) (GtkWidget*) gtk_builder_get_object (priv->builder, x)
#define DATETIME_PERMISSION "org.gnome.controlcenter.datetime.configure"
+#define DATETIME_TZ_PERMISSION "org.freedesktop.timedate1.set-timezone"
#define CLOCK_SCHEMA "org.gnome.desktop.interface"
#define CLOCK_FORMAT_KEY "clock-format"
@@ -99,6 +100,7 @@ struct _CcDateTimePanelPrivate
GCancellable *cancellable;
GPermission *permission;
+ GPermission *tz_permission;
};
static void update_time (CcDateTimePanel *self);
@@ -133,6 +135,7 @@ cc_date_time_panel_dispose (GObject *obj
g_clear_object (&priv->clock_tracker);
g_clear_object (&priv->dtm);
g_clear_object (&priv->permission);
+ g_clear_object (&priv->tz_permission);
g_clear_object (&priv->clock_settings);
g_clear_object (&priv->datetime_settings);
g_clear_object (&priv->filechooser_settings);
@@ -777,24 +780,24 @@ on_permission_changed (GPermission *perm
gpointer data)
{
CcDateTimePanelPrivate *priv = CC_DATE_TIME_PANEL (data)->priv;
- gboolean allowed, auto_timezone, using_ntp;
+ gboolean allowed, tz_allowed, auto_timezone, using_ntp;
allowed = (priv->permission != NULL && g_permission_get_allowed (priv->permission));
+ tz_allowed = (priv->tz_permission != NULL && g_permission_get_allowed (priv->tz_permission));
using_ntp = gtk_switch_get_active (GTK_SWITCH (W("network_time_switch")));
auto_timezone = gtk_switch_get_active (GTK_SWITCH (W("auto_timezone_switch")));
/* All the widgets but the lock button and the 24h setting */
gtk_widget_set_sensitive (W("auto-datetime-row"), allowed);
- gtk_widget_set_sensitive (W("auto-timezone-row"), allowed);
+ gtk_widget_set_sensitive (W("auto-timezone-row"), allowed || tz_allowed);
gtk_widget_set_sensitive (W("datetime-button"), allowed && !using_ntp);
- gtk_widget_set_sensitive (W("timezone-button"), allowed && !auto_timezone);
+ gtk_widget_set_sensitive (W("timezone-button"), (allowed || tz_allowed) && !auto_timezone);
/* Hide the subdialogs if we no longer have permissions */
if (!allowed)
- {
gtk_widget_hide (GTK_WIDGET (W ("datetime-dialog")));
+ if (!allowed && !tz_allowed)
gtk_widget_hide (GTK_WIDGET (W ("timezone-dialog")));
- }
}
static void
@@ -886,6 +889,25 @@ run_dialog (CcDateTimePanel *self,
}
static gboolean
+tz_switch_to_row_transform_func (GBinding *binding,
+ const GValue *source_value,
+ GValue *target_value,
+ CcDateTimePanel *self)
+{
+ CcDateTimePanelPrivate *priv = self->priv;
+ gboolean active;
+ gboolean allowed;
+
+ active = g_value_get_boolean (source_value);
+ allowed = (priv->permission != NULL && g_permission_get_allowed (priv->permission)) ||
+ (priv->tz_permission != NULL && g_permission_get_allowed (priv->tz_permission));
+
+ g_value_set_boolean (target_value, !active && allowed);
+
+ return TRUE;
+}
+
+static gboolean
switch_to_row_transform_func (GBinding *binding,
const GValue *source_value,
GValue *target_value,
@@ -1266,6 +1288,7 @@ cc_date_time_panel_init (CcDateTimePanel
/* add the lock button */
priv->permission = polkit_permission_new_sync (DATETIME_PERMISSION, NULL, NULL, NULL);
+ priv->tz_permission = polkit_permission_new_sync (DATETIME_TZ_PERMISSION, NULL, NULL, NULL);
if (priv->permission != NULL)
{
g_signal_connect (priv->permission, "notify",
@@ -1303,9 +1326,11 @@ cc_date_time_panel_init (CcDateTimePanel
gtk_widget_set_visible (W ("auto-datetime-row"), is_ntp_available (self));
/* Timezone settings */
- bind_switch_to_row (self,
- W ("auto_timezone_switch"),
- W ("timezone-button"));
+ g_object_bind_property_full (W ("auto_timezone_switch"), "active",
+ W ("timezone-button"), "sensitive",
+ G_BINDING_SYNC_CREATE,
+ (GBindingTransformFunc) tz_switch_to_row_transform_func,
+ NULL, self, NULL);
priv->datetime_settings = g_settings_new (DATETIME_SCHEMA);
g_settings_bind (priv->datetime_settings, AUTO_TIMEZONE_KEY,