diff options
author | Zeeshan Ali (Khattak) <zeeshanak@gnome.org> | 2016-02-17 15:56:21 +0000 |
---|---|---|
committer | Zeeshan Ali (Khattak) <zeeshanak@gnome.org> | 2016-03-03 16:07:58 +0000 |
commit | d77ec8e8212434dac188ae43c16627363c215435 (patch) | |
tree | 6af002b66379d134dfe8d196d5bebe36fbb1bc48 | |
parent | 5ebf3d8ddf454bdb6e62b10bf586fb471a63b626 (diff) | |
download | gnome-control-center-d77ec8e8212434dac188ae43c16627363c215435.tar.gz |
privacy: Indicate location service being used
As per the new mockup, we should indicate when location service is in
use:
https://raw.githubusercontent.com/gnome-design-team/gnome-mockups/master/system-settings/privacy/privacy-3.20.png
https://bugzilla.gnome.org/show_bug.cgi?id=761245
-rw-r--r-- | panels/privacy/cc-privacy-panel.c | 116 |
1 files changed, 111 insertions, 5 deletions
diff --git a/panels/privacy/cc-privacy-panel.c b/panels/privacy/cc-privacy-panel.c index 66689361c..da8516d17 100644 --- a/panels/privacy/cc-privacy-panel.c +++ b/panels/privacy/cc-privacy-panel.c @@ -44,6 +44,7 @@ struct _CcPrivacyPanelPrivate GtkWidget *recent_dialog; GtkWidget *screen_lock_dialog; GtkWidget *location_dialog; + GtkWidget *location_label; GtkWidget *trash_dialog; GtkWidget *software_dialog; GtkWidget *list_box; @@ -57,6 +58,10 @@ struct _CcPrivacyPanelPrivate GtkWidget *abrt_dialog; GtkWidget *abrt_row; guint abrt_watch_id; + + GCancellable *cancellable; + + GDBusProxy *gclue_manager; }; static char * @@ -381,22 +386,119 @@ add_screen_lock (CcPrivacyPanel *self) } static void +update_location_label (CcPrivacyPanel *self) +{ + CcPrivacyPanelPrivate *priv = self->priv; + gboolean in_use = FALSE, on; + const gchar *label; + + if (priv->gclue_manager != NULL) + { + GVariant *variant; + + variant = g_dbus_proxy_get_cached_property (priv->gclue_manager, "InUse"); + if (variant != NULL) + { + in_use = g_variant_get_boolean (variant); + g_variant_unref (variant); + } + } + + if (in_use) + { + gtk_label_set_label (GTK_LABEL (priv->location_label), _("In use")); + return; + } + + on = g_settings_get_boolean (priv->location_settings, LOCATION_ENABLED); + label = on ? C_("Location services status", "On") : + C_("Location services status", "Off"); + gtk_label_set_label (GTK_LABEL (priv->location_label), label); +} + +static void +on_location_setting_changed (GSettings *settings, + gchar *key, + gpointer user_data) +{ + update_location_label (user_data); +} + +static void +on_gclue_manager_props_changed (GDBusProxy *manager, + GVariant *changed_properties, + GStrv invalidated_properties, + gpointer user_data) +{ + update_location_label (user_data); +} + +static void +on_gclue_manager_ready (GObject *source_object, + GAsyncResult *res, + gpointer user_data) +{ + CcPrivacyPanel *self; + GDBusProxy *proxy; + GError *error = NULL; + + proxy = g_dbus_proxy_new_for_bus_finish (res, &error); + if (proxy == NULL) + { + if (!g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) + g_warning ("Failed to connect to Geoclue: %s", error->message); + g_error_free (error); + + return; + } + self = user_data; + self->priv->gclue_manager = proxy; + + g_signal_connect (self->priv->gclue_manager, + "g-properties-changed", + G_CALLBACK (on_gclue_manager_props_changed), + self); + + update_location_label (self); +} + +static void add_location (CcPrivacyPanel *self) { + CcPrivacyPanelPrivate *priv = self->priv; GtkWidget *w; GtkWidget *dialog; - w = get_on_off_label (self->priv->location_settings, LOCATION_ENABLED); - add_row (self, _("Location Services"), "location_dialog", w); + priv->location_label = gtk_label_new (""); + g_signal_connect (priv->location_settings, + "changed::" LOCATION_ENABLED, + G_CALLBACK (on_location_setting_changed), + self); + update_location_label (self); - dialog = self->priv->location_dialog; + add_row (self, + _("Location Services"), + "location_dialog", + priv->location_label); + + dialog = priv->location_dialog; g_signal_connect (dialog, "delete-event", G_CALLBACK (gtk_widget_hide_on_delete), NULL); - w = GTK_WIDGET (gtk_builder_get_object (self->priv->builder, "location_services_switch")); - g_settings_bind (self->priv->location_settings, LOCATION_ENABLED, + w = GTK_WIDGET (gtk_builder_get_object (priv->builder, "location_services_switch")); + g_settings_bind (priv->location_settings, LOCATION_ENABLED, w, "active", G_SETTINGS_BIND_DEFAULT); + + g_dbus_proxy_new_for_bus (G_BUS_TYPE_SYSTEM, + G_DBUS_PROXY_FLAGS_NONE, + NULL, + "org.freedesktop.GeoClue2", + "/org/freedesktop/GeoClue2/Manager", + "org.freedesktop.GeoClue2.Manager", + priv->cancellable, + on_gclue_manager_ready, + self); } static void @@ -785,6 +887,7 @@ cc_privacy_panel_finalize (GObject *object) priv->abrt_watch_id = 0; } + g_cancellable_cancel (priv->cancellable); g_clear_pointer (&priv->recent_dialog, gtk_widget_destroy); g_clear_pointer (&priv->screen_lock_dialog, gtk_widget_destroy); g_clear_pointer (&priv->location_dialog, gtk_widget_destroy); @@ -797,6 +900,8 @@ cc_privacy_panel_finalize (GObject *object) g_clear_object (&priv->privacy_settings); g_clear_object (&priv->notification_settings); g_clear_object (&priv->location_settings); + g_clear_object (&priv->gclue_manager); + g_clear_object (&priv->cancellable); G_OBJECT_CLASS (cc_privacy_panel_parent_class)->finalize (object); } @@ -840,6 +945,7 @@ cc_privacy_panel_init (CcPrivacyPanel *self) self->priv = G_TYPE_INSTANCE_GET_PRIVATE (self, CC_TYPE_PRIVACY_PANEL, CcPrivacyPanelPrivate); g_resources_register (cc_privacy_get_resource ()); + self->priv->cancellable = g_cancellable_new (); self->priv->builder = gtk_builder_new (); error = NULL; |