summaryrefslogtreecommitdiff
path: root/panels/common/cc-permission-infobar.c
diff options
context:
space:
mode:
Diffstat (limited to 'panels/common/cc-permission-infobar.c')
-rw-r--r--panels/common/cc-permission-infobar.c111
1 files changed, 98 insertions, 13 deletions
diff --git a/panels/common/cc-permission-infobar.c b/panels/common/cc-permission-infobar.c
index 78e2b0711..836c14e03 100644
--- a/panels/common/cc-permission-infobar.c
+++ b/panels/common/cc-permission-infobar.c
@@ -28,6 +28,7 @@
#endif
#include <glib/gi18n.h>
+#include <adwaita.h>
#include "cc-permission-infobar.h"
@@ -35,9 +36,10 @@ struct _CcPermissionInfobar
{
AdwBin parent_instance;
- GtkRevealer *revealer;
- GtkLabel *title;
- GtkLockButton *lock_button;
+ AdwBanner *banner;
+ GPermission *permission;
+
+ GCancellable *cancellable;
};
G_DEFINE_TYPE (CcPermissionInfobar, cc_permission_infobar, ADW_TYPE_BIN)
@@ -45,27 +47,109 @@ G_DEFINE_TYPE (CcPermissionInfobar, cc_permission_infobar, ADW_TYPE_BIN)
static void
on_permission_changed (CcPermissionInfobar *self)
{
- GPermission *permission;
- gboolean is_authorized;
+ gboolean is_authorized = g_permission_get_allowed (self->permission);
+
+ adw_banner_set_revealed (self->banner, !is_authorized);
+}
+
+static void
+acquire_cb (GObject *source,
+ GAsyncResult *result,
+ gpointer user_data)
+{
+ CcPermissionInfobar *self = CC_PERMISSION_INFOBAR (user_data);
+ g_autoptr (GError) error = NULL;
+
+ if (!g_permission_acquire_finish (self->permission, result, &error))
+ {
+ g_warning ("Error acquiring permission: %s", error->message);
+ }
+
+ g_clear_object (&self->cancellable);
+}
+
+static void
+release_cb (GObject *source,
+ GAsyncResult *result,
+ gpointer user_data)
+{
+ CcPermissionInfobar *self = CC_PERMISSION_INFOBAR (user_data);
+ g_autoptr (GError) error = NULL;
- permission = gtk_lock_button_get_permission (self->lock_button);
- is_authorized = g_permission_get_allowed (permission);
+ if (!g_permission_release_finish (self->permission, result, &error))
+ {
+ g_warning ("Error releasing permission: %s", error->message);
+ g_error_free (error);
+ }
- gtk_revealer_set_reveal_child (self->revealer, !is_authorized);
+ g_clear_object (&self->cancellable);
+}
+
+static void
+banner_button_clicked_cb (CcPermissionInfobar *self)
+{
+ /* if we already have a pending interactive check or permission is not set,
+ * then do nothing
+ */
+ if (self->cancellable != NULL || self->permission == NULL)
+ return;
+
+ if (g_permission_get_allowed (self->permission))
+ {
+ if (g_permission_get_can_release (self->permission))
+ {
+ self->cancellable = g_cancellable_new ();
+
+ g_permission_release_async (self->permission,
+ self->cancellable,
+ release_cb,
+ self);
+ }
+ }
+ else
+ {
+ if (g_permission_get_can_acquire (self->permission))
+ {
+ self->cancellable = g_cancellable_new ();
+
+ g_permission_acquire_async (self->permission,
+ self->cancellable,
+ acquire_cb,
+ self);
+ }
+ }
+}
+
+static void
+cc_permission_infobar_dispose (GObject *object)
+{
+ CcPermissionInfobar *self = CC_PERMISSION_INFOBAR (object);
+
+ if (self->cancellable != NULL)
+ {
+ g_cancellable_cancel (self->cancellable);
+ }
+
+ g_clear_object (&self->cancellable);
+
+ G_OBJECT_CLASS (cc_permission_infobar_parent_class)->dispose (object);
}
static void
cc_permission_infobar_class_init (CcPermissionInfobarClass *klass)
{
+ GObjectClass *object_class = G_OBJECT_CLASS (klass);
GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
+ object_class->dispose = cc_permission_infobar_dispose;
+
gtk_widget_class_set_template_from_resource (widget_class,
"/org/gnome/control-center/"
"common/cc-permission-infobar.ui");
- gtk_widget_class_bind_template_child (widget_class, CcPermissionInfobar, revealer);
- gtk_widget_class_bind_template_child (widget_class, CcPermissionInfobar, title);
- gtk_widget_class_bind_template_child (widget_class, CcPermissionInfobar, lock_button);
+ gtk_widget_class_bind_template_child (widget_class, CcPermissionInfobar, banner);
+ gtk_widget_class_bind_template_callback (widget_class,
+ banner_button_clicked_cb);
}
static void
@@ -82,8 +166,9 @@ cc_permission_infobar_set_permission (CcPermissionInfobar *self,
GPermission *permission)
{
g_return_if_fail (CC_IS_PERMISSION_INFOBAR (self));
+ g_return_if_fail (G_IS_PERMISSION (permission));
- gtk_lock_button_set_permission (self->lock_button, permission);
+ self->permission = permission;
g_signal_connect_object (permission, "notify",
G_CALLBACK (on_permission_changed),
@@ -108,5 +193,5 @@ cc_permission_infobar_set_title (CcPermissionInfobar *self,
if (title == NULL)
title = _("Unlock to Change Settings");
- gtk_label_set_text (self->title, title);
+ adw_banner_set_title (self->banner, title);
}