File gnome-control-center-follow-polkit-permissions-for-tz.patch of Package gnome-control-center.10840

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,