[gnome-control-center/gnome-42] user-accounts: Disconnect fingerprint reading devices when closing dialog



commit 19d95a72fa4fce25042d6091907c5b5f9ff6e528
Author: Felipe Borges <felipeborges gnome org>
Date:   Wed Sep 14 11:47:59 2022 +0200

    user-accounts: Disconnect fingerprint reading devices when closing dialog
    
    Otherwise when users close and reopen the window they will face a
    “Failed to claim fingerprint device Synoptics Sensors: the device is
    already claimed by another process” error message.
    
    Fixes #1983

 panels/user-accounts/cc-fingerprint-dialog.c | 58 +++++++++++++---------------
 1 file changed, 27 insertions(+), 31 deletions(-)
---
diff --git a/panels/user-accounts/cc-fingerprint-dialog.c b/panels/user-accounts/cc-fingerprint-dialog.c
index 401c369f4..b8ebba6a5 100644
--- a/panels/user-accounts/cc-fingerprint-dialog.c
+++ b/panels/user-accounts/cc-fingerprint-dialog.c
@@ -275,32 +275,6 @@ disconnect_device_signals (CcFingerprintDialog *self)
     }
 }
 
-static void
-cc_fingerprint_dialog_dispose (GObject *object)
-{
-  CcFingerprintDialog *self = CC_FINGERPRINT_DIALOG (object);
-
-  g_clear_handle_id (&self->enroll_stage_passed_id, g_source_remove);
-
-  if (self->device && (self->dialog_state & DIALOG_STATE_DEVICE_CLAIMED))
-    {
-      disconnect_device_signals (self);
-
-      if (self->dialog_state & DIALOG_STATE_DEVICE_ENROLLING)
-        cc_fprintd_device_call_enroll_stop_sync (self->device, NULL, NULL);
-      cc_fprintd_device_call_release (self->device, NULL, NULL, NULL);
-    }
-
-  g_clear_object (&self->manager);
-  g_clear_object (&self->device);
-  g_clear_pointer (&self->enrolled_fingers, g_strfreev);
-
-  g_cancellable_cancel (self->cancellable);
-  g_clear_object (&self->cancellable);
-
-  G_OBJECT_CLASS (cc_fingerprint_dialog_parent_class)->dispose (object);
-}
-
 static void
 cc_fingerprint_dialog_get_property (GObject    *object,
                                     guint       prop_id,
@@ -1466,11 +1440,32 @@ done_button_clicked_cb (CcFingerprintDialog *self)
   enroll_stop (self);
 }
 
-static void
-fingerprint_dialog_delete_cb (CcFingerprintDialog *self)
+static gboolean
+cc_fingerprint_dialog_close_request (GtkWindow *window)
 {
+  CcFingerprintDialog *self = CC_FINGERPRINT_DIALOG (window);
+
   cc_fingerprint_manager_update_state (self->manager, NULL, NULL);
-  gtk_window_destroy (GTK_WINDOW (self));
+
+  g_clear_handle_id (&self->enroll_stage_passed_id, g_source_remove);
+
+  if (self->device && (self->dialog_state & DIALOG_STATE_DEVICE_CLAIMED))
+    {
+      disconnect_device_signals (self);
+
+      if (self->dialog_state & DIALOG_STATE_DEVICE_ENROLLING)
+        cc_fprintd_device_call_enroll_stop_sync (self->device, NULL, NULL);
+      cc_fprintd_device_call_release (self->device, NULL, NULL, NULL);
+    }
+
+  g_clear_object (&self->manager);
+  g_clear_object (&self->device);
+  g_clear_pointer (&self->enrolled_fingers, g_strfreev);
+
+  g_cancellable_cancel (self->cancellable);
+  g_clear_object (&self->cancellable);
+
+  return GTK_WINDOW_CLASS (cc_fingerprint_dialog_parent_class)->close_request (window);
 }
 
 static void
@@ -1478,15 +1473,17 @@ cc_fingerprint_dialog_class_init (CcFingerprintDialogClass *klass)
 {
   GObjectClass *object_class = G_OBJECT_CLASS (klass);
   GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
+  GtkWindowClass *window_class = GTK_WINDOW_CLASS (klass);
 
   gtk_widget_class_set_template_from_resource (widget_class,
     "/org/gnome/control-center/user-accounts/cc-fingerprint-dialog.ui");
 
   object_class->constructed = cc_fingerprint_dialog_constructed;
-  object_class->dispose = cc_fingerprint_dialog_dispose;
   object_class->get_property = cc_fingerprint_dialog_get_property;
   object_class->set_property = cc_fingerprint_dialog_set_property;
 
+  window_class->close_request = cc_fingerprint_dialog_close_request;
+
   properties[PROP_MANAGER] =
     g_param_spec_object ("fingerprint-manager",
                          "FingerprintManager",
@@ -1525,7 +1522,6 @@ cc_fingerprint_dialog_class_init (CcFingerprintDialogClass *klass)
   gtk_widget_class_bind_template_callback (widget_class, confirm_deletion_button_clicked_cb);
   gtk_widget_class_bind_template_callback (widget_class, delete_prints_button_clicked_cb);
   gtk_widget_class_bind_template_callback (widget_class, done_button_clicked_cb);
-  gtk_widget_class_bind_template_callback (widget_class, fingerprint_dialog_delete_cb);
   gtk_widget_class_bind_template_callback (widget_class, on_print_activated_cb);
   gtk_widget_class_bind_template_callback (widget_class, select_device_row);
 }


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]