Blame SOURCES/0003-info-Update-registration-state-in-panel-when-it-happ.patch

06e1d8
From 8bd1e37f59f3b4ec617d6d0bccf7fd77a9d03ca5 Mon Sep 17 00:00:00 2001
06e1d8
From: Ray Strode <rstrode@redhat.com>
06e1d8
Date: Sun, 24 Jan 2021 13:03:03 -0500
06e1d8
Subject: [PATCH 3/4] info: Update registration state in panel when it happens
06e1d8
 on disk
06e1d8
06e1d8
The code was failing to listen for change notifications, so if the
06e1d8
panel was open while the system got registered, it wouldn't update.
06e1d8
06e1d8
This commit fixes that.
06e1d8
---
06e1d8
 panels/info/cc-info-overview-panel.c          | 33 ++++++++++++++++---
06e1d8
 panels/info/cc-subscription-details-dialog.c  | 17 ++++++++--
06e1d8
 panels/info/cc-subscription-details-dialog.h  |  3 +-
06e1d8
 panels/info/cc-subscription-register-dialog.c | 17 ++++++++--
06e1d8
 panels/info/cc-subscription-register-dialog.h |  3 +-
06e1d8
 5 files changed, 63 insertions(+), 10 deletions(-)
06e1d8
06e1d8
diff --git a/panels/info/cc-info-overview-panel.c b/panels/info/cc-info-overview-panel.c
06e1d8
index b2cbefb25..65246758e 100644
06e1d8
--- a/panels/info/cc-info-overview-panel.c
06e1d8
+++ b/panels/info/cc-info-overview-panel.c
06e1d8
@@ -60,60 +60,61 @@ typedef struct {
06e1d8
 } GraphicsData;
06e1d8
 
06e1d8
 typedef struct
06e1d8
 {
06e1d8
   GtkWidget      *system_image;
06e1d8
   GtkWidget      *version_label;
06e1d8
   GtkWidget      *name_entry;
06e1d8
   GtkWidget      *memory_label;
06e1d8
   GtkWidget      *processor_label;
06e1d8
   GtkWidget      *os_name_label;
06e1d8
   GtkWidget      *os_type_label;
06e1d8
   GtkWidget      *disk_label;
06e1d8
   GtkWidget      *graphics_label;
06e1d8
   GtkWidget      *virt_type_label;
06e1d8
   GtkWidget      *subscription_stack;
06e1d8
   GtkWidget      *details_button;
06e1d8
   GtkWidget      *register_button;
06e1d8
   GtkWidget      *updates_separator;
06e1d8
   GtkWidget      *updates_button;
06e1d8
 
06e1d8
   /* Virtualisation labels */
06e1d8
   GtkWidget      *label8;
06e1d8
   GtkWidget      *grid1;
06e1d8
   GtkWidget      *label18;
06e1d8
 
06e1d8
   char           *gnome_version;
06e1d8
   char           *gnome_distributor;
06e1d8
   char           *gnome_date;
06e1d8
 
06e1d8
   GCancellable   *cancellable;
06e1d8
+  GCancellable   *subscription_cancellable;
06e1d8
 
06e1d8
   /* Free space */
06e1d8
   GList          *primary_mounts;
06e1d8
   guint64         total_bytes;
06e1d8
 
06e1d8
   GraphicsData   *graphics_data;
06e1d8
 
06e1d8
   GDBusProxy     *subscription_proxy;
06e1d8
 } CcInfoOverviewPanelPrivate;
06e1d8
 
06e1d8
 struct _CcInfoOverviewPanel
06e1d8
 {
06e1d8
  CcPanel parent_instance;
06e1d8
 
06e1d8
   /*< private >*/
06e1d8
  CcInfoOverviewPanelPrivate *priv;
06e1d8
 };
06e1d8
 
06e1d8
 static void get_primary_disc_info_start (CcInfoOverviewPanel *self);
06e1d8
 
06e1d8
 typedef struct
06e1d8
 {
06e1d8
   char *major;
06e1d8
   char *minor;
06e1d8
   char *micro;
06e1d8
   char *distributor;
06e1d8
   char *date;
06e1d8
   char **current;
06e1d8
 } VersionData;
06e1d8
 
06e1d8
@@ -821,165 +822,188 @@ reload_subscription_status (CcInfoOverviewPanel *self)
06e1d8
 
06e1d8
   switch (status)
06e1d8
     {
06e1d8
     case GSD_SUBMAN_SUBSCRIPTION_STATUS_UNKNOWN:
06e1d8
     case GSD_SUBMAN_SUBSCRIPTION_STATUS_INVALID:
06e1d8
     case GSD_SUBMAN_SUBSCRIPTION_STATUS_DISABLED:
06e1d8
     case GSD_SUBMAN_SUBSCRIPTION_STATUS_PARTIALLY_VALID:
06e1d8
       gtk_stack_set_visible_child_name (GTK_STACK (priv->subscription_stack), "not-registered");
06e1d8
       gtk_widget_set_sensitive (priv->updates_button, FALSE);
06e1d8
       break;
06e1d8
 
06e1d8
     case GSD_SUBMAN_SUBSCRIPTION_STATUS_VALID:
06e1d8
       gtk_stack_set_visible_child_name (GTK_STACK (priv->subscription_stack), "registered");
06e1d8
       gtk_widget_set_sensitive (priv->updates_button, TRUE);
06e1d8
       break;
06e1d8
 
06e1d8
     default:
06e1d8
       g_assert_not_reached ();
06e1d8
       break;
06e1d8
     }
06e1d8
 }
06e1d8
 
06e1d8
 static void
06e1d8
 on_details_button_clicked (GtkWidget           *widget,
06e1d8
                            CcInfoOverviewPanel *self)
06e1d8
 {
06e1d8
   CcInfoOverviewPanelPrivate *priv = cc_info_overview_panel_get_instance_private (self);
06e1d8
   CcSubscriptionDetailsDialog *dialog;
06e1d8
   GtkWindow *toplevel;
06e1d8
 
06e1d8
-  dialog = cc_subscription_details_dialog_new (priv->subscription_proxy);
06e1d8
+  dialog = cc_subscription_details_dialog_new (priv->subscription_proxy,
06e1d8
+                                               priv->subscription_cancellable);
06e1d8
   toplevel = GTK_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (self)));
06e1d8
   gtk_window_set_transient_for (GTK_WINDOW (dialog), toplevel);
06e1d8
 
06e1d8
   gtk_dialog_run (GTK_DIALOG (dialog));
06e1d8
   gtk_widget_destroy (GTK_WIDGET (dialog));
06e1d8
-
06e1d8
-  reload_subscription_status (self);
06e1d8
 }
06e1d8
 
06e1d8
 static void
06e1d8
 on_register_button_clicked (GtkWidget           *widget,
06e1d8
                             CcInfoOverviewPanel *self)
06e1d8
 {
06e1d8
   CcInfoOverviewPanelPrivate *priv = cc_info_overview_panel_get_instance_private (self);
06e1d8
   CcSubscriptionRegisterDialog *dialog;
06e1d8
   GtkWindow *toplevel;
06e1d8
 
06e1d8
-  dialog = cc_subscription_register_dialog_new (priv->subscription_proxy);
06e1d8
+  dialog = cc_subscription_register_dialog_new (priv->subscription_proxy,
06e1d8
+                                                priv->subscription_cancellable);
06e1d8
   toplevel = GTK_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (self)));
06e1d8
   gtk_window_set_transient_for (GTK_WINDOW (dialog), toplevel);
06e1d8
 
06e1d8
   gtk_dialog_run (GTK_DIALOG (dialog));
06e1d8
   gtk_widget_destroy (GTK_WIDGET (dialog));
06e1d8
+}
06e1d8
+
06e1d8
+static void
06e1d8
+on_subscription_status_changed (GDBusProxy *proxy,
06e1d8
+                                GVariant *changed_properties,
06e1d8
+                                GStrv invalidated_properties,
06e1d8
+                                CcInfoOverviewPanel *self)
06e1d8
+{
06e1d8
+  CcInfoOverviewPanelPrivate *priv = cc_info_overview_panel_get_instance_private (self);
06e1d8
+
06e1d8
+  g_cancellable_cancel (priv->subscription_cancellable);
06e1d8
+  g_object_unref (priv->subscription_cancellable);
06e1d8
+
06e1d8
+  priv->subscription_cancellable = g_cancellable_new ();
06e1d8
 
06e1d8
   reload_subscription_status (self);
06e1d8
 }
06e1d8
 
06e1d8
 static void
06e1d8
 info_overview_panel_setup_subscriptions (CcInfoOverviewPanel *self)
06e1d8
 {
06e1d8
   CcInfoOverviewPanelPrivate *priv = cc_info_overview_panel_get_instance_private (self);
06e1d8
   g_autoptr(GError) error = NULL;
06e1d8
 
06e1d8
   priv->subscription_proxy = g_dbus_proxy_new_for_bus_sync (G_BUS_TYPE_SESSION,
06e1d8
                                                             G_DBUS_PROXY_FLAGS_NONE,
06e1d8
                                                             NULL,
06e1d8
                                                             "org.gnome.SettingsDaemon.Subscription",
06e1d8
                                                             "/org/gnome/SettingsDaemon/Subscription",
06e1d8
                                                             "org.gnome.SettingsDaemon.Subscription",
06e1d8
                                                             NULL, &error);
06e1d8
   if (error != NULL)
06e1d8
     {
06e1d8
       g_debug ("Unable to create a proxy for org.gnome.SettingsDaemon.Subscription: %s",
06e1d8
                error->message);
06e1d8
       reload_subscription_status (self);
06e1d8
       return;
06e1d8
     }
06e1d8
 
06e1d8
+  g_signal_connect (priv->subscription_proxy, "g-properties-changed",
06e1d8
+                    G_CALLBACK (on_subscription_status_changed), self);
06e1d8
+
06e1d8
   g_signal_connect (priv->details_button, "clicked", G_CALLBACK (on_details_button_clicked), self);
06e1d8
   g_signal_connect (priv->register_button, "clicked", G_CALLBACK (on_register_button_clicked), self);
06e1d8
 
06e1d8
   reload_subscription_status (self);
06e1d8
 }
06e1d8
 
06e1d8
 static gboolean
06e1d8
 does_gnome_software_exist (void)
06e1d8
 {
06e1d8
   return g_file_test (BINDIR "/gnome-software", G_FILE_TEST_EXISTS);
06e1d8
 }
06e1d8
 
06e1d8
 static gboolean
06e1d8
 does_gpk_update_viewer_exist (void)
06e1d8
 {
06e1d8
   return g_file_test (BINDIR "/gpk-update-viewer", G_FILE_TEST_EXISTS);
06e1d8
 }
06e1d8
 
06e1d8
 static void
06e1d8
 on_updates_button_clicked (GtkWidget           *widget,
06e1d8
                            CcInfoOverviewPanel *self)
06e1d8
 {
06e1d8
   g_autoptr(GError) error = NULL;
06e1d8
   gboolean ret;
06e1d8
   g_auto(GStrv) argv = NULL;
06e1d8
 
06e1d8
   argv = g_new0 (gchar *, 3);
06e1d8
   if (does_gnome_software_exist ())
06e1d8
     {
06e1d8
       argv[0] = g_build_filename (BINDIR, "gnome-software", NULL);
06e1d8
       argv[1] = g_strdup_printf ("--mode=updates");
06e1d8
     }
06e1d8
   else
06e1d8
     {
06e1d8
       argv[0] = g_build_filename (BINDIR, "gpk-update-viewer", NULL);
06e1d8
     }
06e1d8
   ret = g_spawn_async (NULL, argv, NULL, 0, NULL, NULL, NULL, &error);
06e1d8
   if (!ret)
06e1d8
       g_warning ("Failed to spawn %s: %s", argv[0], error->message);
06e1d8
 }
06e1d8
 
06e1d8
 static void
06e1d8
 cc_info_overview_panel_dispose (GObject *object)
06e1d8
 {
06e1d8
   CcInfoOverviewPanelPrivate *priv = cc_info_overview_panel_get_instance_private (CC_INFO_OVERVIEW_PANEL (object));
06e1d8
 
06e1d8
   g_clear_pointer (&priv->graphics_data, graphics_data_free);
06e1d8
 
06e1d8
   G_OBJECT_CLASS (cc_info_overview_panel_parent_class)->dispose (object);
06e1d8
 }
06e1d8
 
06e1d8
 static void
06e1d8
 cc_info_overview_panel_finalize (GObject *object)
06e1d8
 {
06e1d8
   CcInfoOverviewPanelPrivate *priv = cc_info_overview_panel_get_instance_private (CC_INFO_OVERVIEW_PANEL (object));
06e1d8
 
06e1d8
+  if (priv->subscription_cancellable)
06e1d8
+    {
06e1d8
+      g_cancellable_cancel (priv->subscription_cancellable);
06e1d8
+      g_clear_object (&priv->subscription_cancellable);
06e1d8
+    }
06e1d8
+
06e1d8
   if (priv->cancellable)
06e1d8
     {
06e1d8
       g_cancellable_cancel (priv->cancellable);
06e1d8
       g_clear_object (&priv->cancellable);
06e1d8
     }
06e1d8
 
06e1d8
   if (priv->primary_mounts)
06e1d8
     g_list_free_full (priv->primary_mounts, (GDestroyNotify) g_unix_mount_free);
06e1d8
 
06e1d8
   g_free (priv->gnome_version);
06e1d8
   g_free (priv->gnome_date);
06e1d8
   g_free (priv->gnome_distributor);
06e1d8
 
06e1d8
   g_clear_object (&priv->subscription_proxy);
06e1d8
 
06e1d8
   G_OBJECT_CLASS (cc_info_overview_panel_parent_class)->finalize (object);
06e1d8
 }
06e1d8
 
06e1d8
 static void
06e1d8
 cc_info_overview_panel_class_init (CcInfoOverviewPanelClass *klass)
06e1d8
 {
06e1d8
   GObjectClass *object_class = G_OBJECT_CLASS (klass);
06e1d8
   GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
06e1d8
 
06e1d8
   object_class->finalize = cc_info_overview_panel_finalize;
06e1d8
   object_class->dispose = cc_info_overview_panel_dispose;
06e1d8
 
06e1d8
   gtk_widget_class_set_template_from_resource (widget_class, "/org/gnome/control-center/info/info-overview.ui");
06e1d8
 
06e1d8
   gtk_widget_class_bind_template_child_private (widget_class, CcInfoOverviewPanel, system_image);
06e1d8
@@ -987,55 +1011,56 @@ cc_info_overview_panel_class_init (CcInfoOverviewPanelClass *klass)
06e1d8
   gtk_widget_class_bind_template_child_private (widget_class, CcInfoOverviewPanel, name_entry);
06e1d8
   gtk_widget_class_bind_template_child_private (widget_class, CcInfoOverviewPanel, memory_label);
06e1d8
   gtk_widget_class_bind_template_child_private (widget_class, CcInfoOverviewPanel, processor_label);
06e1d8
   gtk_widget_class_bind_template_child_private (widget_class, CcInfoOverviewPanel, os_name_label);
06e1d8
   gtk_widget_class_bind_template_child_private (widget_class, CcInfoOverviewPanel, os_type_label);
06e1d8
   gtk_widget_class_bind_template_child_private (widget_class, CcInfoOverviewPanel, disk_label);
06e1d8
   gtk_widget_class_bind_template_child_private (widget_class, CcInfoOverviewPanel, graphics_label);
06e1d8
   gtk_widget_class_bind_template_child_private (widget_class, CcInfoOverviewPanel, virt_type_label);
06e1d8
   gtk_widget_class_bind_template_child_private (widget_class, CcInfoOverviewPanel, subscription_stack);
06e1d8
   gtk_widget_class_bind_template_child_private (widget_class, CcInfoOverviewPanel, details_button);
06e1d8
   gtk_widget_class_bind_template_child_private (widget_class, CcInfoOverviewPanel, register_button);
06e1d8
   gtk_widget_class_bind_template_child_private (widget_class, CcInfoOverviewPanel, updates_separator);
06e1d8
   gtk_widget_class_bind_template_child_private (widget_class, CcInfoOverviewPanel, updates_button);
06e1d8
   gtk_widget_class_bind_template_child_private (widget_class, CcInfoOverviewPanel, label8);
06e1d8
   gtk_widget_class_bind_template_child_private (widget_class, CcInfoOverviewPanel, grid1);
06e1d8
   gtk_widget_class_bind_template_child_private (widget_class, CcInfoOverviewPanel, label18);
06e1d8
 
06e1d8
   g_type_ensure (CC_TYPE_HOSTNAME_ENTRY);
06e1d8
 }
06e1d8
 
06e1d8
 static void
06e1d8
 cc_info_overview_panel_init (CcInfoOverviewPanel *self)
06e1d8
 {
06e1d8
   CcInfoOverviewPanelPrivate *priv = cc_info_overview_panel_get_instance_private (self);
06e1d8
 
06e1d8
   gtk_widget_init_template (GTK_WIDGET (self));
06e1d8
 
06e1d8
   g_resources_register (cc_info_get_resource ());
06e1d8
 
06e1d8
   priv->cancellable = g_cancellable_new ();
06e1d8
+  priv->subscription_cancellable = g_cancellable_new ();
06e1d8
 
06e1d8
   priv->graphics_data = get_graphics_data ();
06e1d8
 
06e1d8
   if (does_gnome_software_exist () || does_gpk_update_viewer_exist ())
06e1d8
     g_signal_connect (priv->updates_button, "clicked", G_CALLBACK (on_updates_button_clicked), self);
06e1d8
   else
06e1d8
     gtk_widget_hide (priv->updates_button);
06e1d8
 
06e1d8
   info_overview_panel_setup_overview (self);
06e1d8
   info_overview_panel_setup_virt (self);
06e1d8
   info_overview_panel_setup_subscriptions (self);
06e1d8
 
06e1d8
   /* show separator when both items are visible */
06e1d8
   if (gtk_widget_get_visible (priv->subscription_stack) && gtk_widget_get_visible (priv->updates_button))
06e1d8
     gtk_widget_show (priv->updates_separator);
06e1d8
   else
06e1d8
     gtk_widget_hide (priv->updates_separator);
06e1d8
 }
06e1d8
 
06e1d8
 GtkWidget *
06e1d8
 cc_info_overview_panel_new (void)
06e1d8
 {
06e1d8
   return g_object_new (CC_TYPE_INFO_OVERVIEW_PANEL,
06e1d8
                        NULL);
06e1d8
 }
06e1d8
diff --git a/panels/info/cc-subscription-details-dialog.c b/panels/info/cc-subscription-details-dialog.c
06e1d8
index 1931ced81..3d77e6c48 100644
06e1d8
--- a/panels/info/cc-subscription-details-dialog.c
06e1d8
+++ b/panels/info/cc-subscription-details-dialog.c
06e1d8
@@ -311,97 +311,110 @@ header_unregister_button_clicked_cb (CcSubscriptionDetailsDialog *self)
06e1d8
                      self);
06e1d8
 }
06e1d8
 
06e1d8
 static void
06e1d8
 back_button_clicked_cb (CcSubscriptionDetailsDialog *self)
06e1d8
 {
06e1d8
   gtk_spinner_stop (self->spinner);
06e1d8
 
06e1d8
   self->state = DIALOG_STATE_SHOW_DETAILS;
06e1d8
   dialog_reload (self);
06e1d8
 }
06e1d8
 
06e1d8
 static void
06e1d8
 unregister_button_clicked_cb (CcSubscriptionDetailsDialog *self)
06e1d8
 {
06e1d8
   self->state = DIALOG_STATE_UNREGISTER;
06e1d8
   dialog_reload (self);
06e1d8
 }
06e1d8
 
06e1d8
 static void
06e1d8
 dismiss_notification (CcSubscriptionDetailsDialog *self)
06e1d8
 {
06e1d8
   gtk_revealer_set_reveal_child (self->notification_revealer, FALSE);
06e1d8
 }
06e1d8
 
06e1d8
 static void
06e1d8
 cc_subscription_details_dialog_init (CcSubscriptionDetailsDialog *self)
06e1d8
 {
06e1d8
   gtk_widget_init_template (GTK_WIDGET (self));
06e1d8
 
06e1d8
-  self->cancellable = g_cancellable_new ();
06e1d8
   self->products = g_ptr_array_new_with_free_func ((GDestroyNotify) product_data_free);
06e1d8
   self->state = DIALOG_STATE_SHOW_DETAILS;
06e1d8
 }
06e1d8
 
06e1d8
 static void
06e1d8
 cc_subscription_details_dialog_dispose (GObject *obj)
06e1d8
 {
06e1d8
   CcSubscriptionDetailsDialog *self = (CcSubscriptionDetailsDialog *) obj;
06e1d8
 
06e1d8
   g_cancellable_cancel (self->cancellable);
06e1d8
   g_clear_object (&self->cancellable);
06e1d8
   g_clear_object (&self->subscription_proxy);
06e1d8
 
06e1d8
   G_OBJECT_CLASS (cc_subscription_details_dialog_parent_class)->dispose (obj);
06e1d8
 }
06e1d8
 
06e1d8
 static void
06e1d8
 cc_subscription_details_dialog_finalize (GObject *obj)
06e1d8
 {
06e1d8
   CcSubscriptionDetailsDialog *self = (CcSubscriptionDetailsDialog *) obj;
06e1d8
 
06e1d8
   g_clear_pointer (&self->products, g_ptr_array_unref);
06e1d8
 
06e1d8
   G_OBJECT_CLASS (cc_subscription_details_dialog_parent_class)->finalize (obj);
06e1d8
 }
06e1d8
 
06e1d8
 static void
06e1d8
 cc_subscription_details_dialog_class_init (CcSubscriptionDetailsDialogClass *klass)
06e1d8
 {
06e1d8
   GObjectClass *object_class = G_OBJECT_CLASS (klass);
06e1d8
   GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
06e1d8
 
06e1d8
   object_class->dispose = cc_subscription_details_dialog_dispose;
06e1d8
   object_class->finalize = cc_subscription_details_dialog_finalize;
06e1d8
 
06e1d8
   gtk_widget_class_set_template_from_resource (widget_class, "/org/gnome/control-center/info/cc-subscription-details-dialog.ui");
06e1d8
 
06e1d8
   gtk_widget_class_bind_template_child (widget_class, CcSubscriptionDetailsDialog, back_button);
06e1d8
   gtk_widget_class_bind_template_child (widget_class, CcSubscriptionDetailsDialog, spinner);
06e1d8
   gtk_widget_class_bind_template_child (widget_class, CcSubscriptionDetailsDialog, header_unregister_button);
06e1d8
   gtk_widget_class_bind_template_child (widget_class, CcSubscriptionDetailsDialog, notification_revealer);
06e1d8
   gtk_widget_class_bind_template_child (widget_class, CcSubscriptionDetailsDialog, error_label);
06e1d8
   gtk_widget_class_bind_template_child (widget_class, CcSubscriptionDetailsDialog, stack);
06e1d8
   gtk_widget_class_bind_template_child (widget_class, CcSubscriptionDetailsDialog, products_box1);
06e1d8
   gtk_widget_class_bind_template_child (widget_class, CcSubscriptionDetailsDialog, products_box2);
06e1d8
   gtk_widget_class_bind_template_child (widget_class, CcSubscriptionDetailsDialog, unregister_button);
06e1d8
 
06e1d8
   gtk_widget_class_bind_template_callback (widget_class, back_button_clicked_cb);
06e1d8
   gtk_widget_class_bind_template_callback (widget_class, header_unregister_button_clicked_cb);
06e1d8
   gtk_widget_class_bind_template_callback (widget_class, unregister_button_clicked_cb);
06e1d8
   gtk_widget_class_bind_template_callback (widget_class, dismiss_notification);
06e1d8
 }
06e1d8
 
06e1d8
+static void
06e1d8
+on_dialog_cancelled (CcSubscriptionDetailsDialog *self)
06e1d8
+{
06e1d8
+  gtk_dialog_response (GTK_DIALOG (self), GTK_RESPONSE_CLOSE);
06e1d8
+}
06e1d8
+
06e1d8
 CcSubscriptionDetailsDialog *
06e1d8
-cc_subscription_details_dialog_new (GDBusProxy *subscription_proxy)
06e1d8
+cc_subscription_details_dialog_new (GDBusProxy *subscription_proxy,
06e1d8
+                                    GCancellable *cancellable)
06e1d8
 {
06e1d8
   CcSubscriptionDetailsDialog *self;
06e1d8
 
06e1d8
   self = g_object_new (CC_TYPE_SUBSCRIPTION_DETAILS_DIALOG, "use-header-bar", TRUE, NULL);
06e1d8
   self->subscription_proxy = g_object_ref (subscription_proxy);
06e1d8
+  self->cancellable = g_object_ref (cancellable);
06e1d8
+
06e1d8
+  g_signal_connect_object (G_OBJECT (self->cancellable),
06e1d8
+                           "cancelled",
06e1d8
+                           G_CALLBACK (on_dialog_cancelled),
06e1d8
+                           self,
06e1d8
+                           G_CONNECT_SWAPPED);
06e1d8
 
06e1d8
   load_installed_products (self);
06e1d8
   dialog_reload (self);
06e1d8
 
06e1d8
   return self;
06e1d8
 }
06e1d8
diff --git a/panels/info/cc-subscription-details-dialog.h b/panels/info/cc-subscription-details-dialog.h
06e1d8
index a61a22838..f14dd157b 100644
06e1d8
--- a/panels/info/cc-subscription-details-dialog.h
06e1d8
+++ b/panels/info/cc-subscription-details-dialog.h
06e1d8
@@ -1,32 +1,33 @@
06e1d8
 /* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*-
06e1d8
  *
06e1d8
  * Copyright 2019  Red Hat, Inc,
06e1d8
  *
06e1d8
  * This program is free software; you can redistribute it and/or modify
06e1d8
  * it under the terms of the GNU General Public License as published by
06e1d8
  * the Free Software Foundation; either version 2 of the License, or
06e1d8
  * (at your option) any later version.
06e1d8
  *
06e1d8
  * This program is distributed in the hope that it will be useful,
06e1d8
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
06e1d8
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
06e1d8
  * GNU General Public License for more details.
06e1d8
  *
06e1d8
  * You should have received a copy of the GNU General Public License
06e1d8
  * along with this program; if not, see <http://www.gnu.org/licenses/>.
06e1d8
  *
06e1d8
  * Written by: Kalev Lember <klember@redhat.com>
06e1d8
  */
06e1d8
 
06e1d8
 #pragma once
06e1d8
 
06e1d8
 #include <gtk/gtk.h>
06e1d8
 
06e1d8
 G_BEGIN_DECLS
06e1d8
 
06e1d8
 #define CC_TYPE_SUBSCRIPTION_DETAILS_DIALOG (cc_subscription_details_dialog_get_type ())
06e1d8
 G_DECLARE_FINAL_TYPE (CcSubscriptionDetailsDialog, cc_subscription_details_dialog, CC, SUBSCRIPTION_DETAILS_DIALOG, GtkDialog)
06e1d8
 
06e1d8
-CcSubscriptionDetailsDialog *cc_subscription_details_dialog_new (GDBusProxy *subscription_proxy);
06e1d8
+CcSubscriptionDetailsDialog *cc_subscription_details_dialog_new (GDBusProxy   *subscription_proxy,
06e1d8
+                                                                 GCancellable *cancellable);
06e1d8
 
06e1d8
 G_END_DECLS
06e1d8
diff --git a/panels/info/cc-subscription-register-dialog.c b/panels/info/cc-subscription-register-dialog.c
06e1d8
index d7a17cc99..e8c2f581c 100644
06e1d8
--- a/panels/info/cc-subscription-register-dialog.c
06e1d8
+++ b/panels/info/cc-subscription-register-dialog.c
06e1d8
@@ -299,61 +299,60 @@ subscription_register_with_username (CcSubscriptionRegisterDialog *self)
06e1d8
                      self->cancellable,
06e1d8
                      registration_done_cb,
06e1d8
                      self);
06e1d8
 }
06e1d8
 
06e1d8
 static void
06e1d8
 register_button_clicked_cb (CcSubscriptionRegisterDialog *self)
06e1d8
 {
06e1d8
   if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (self->register_with_activation_keys_radio)))
06e1d8
     subscription_register_with_activation_keys (self);
06e1d8
   else
06e1d8
     subscription_register_with_username (self);
06e1d8
 
06e1d8
   gtk_spinner_start (self->spinner);
06e1d8
 
06e1d8
   self->state = DIALOG_STATE_REGISTERING;
06e1d8
   dialog_reload (self);
06e1d8
 }
06e1d8
 
06e1d8
 static void
06e1d8
 dismiss_notification (CcSubscriptionRegisterDialog *self)
06e1d8
 {
06e1d8
   gtk_revealer_set_reveal_child (self->notification_revealer, FALSE);
06e1d8
 }
06e1d8
 
06e1d8
 static void
06e1d8
 cc_subscription_register_dialog_init (CcSubscriptionRegisterDialog *self)
06e1d8
 {
06e1d8
   gtk_widget_init_template (GTK_WIDGET (self));
06e1d8
 
06e1d8
-  self->cancellable = g_cancellable_new ();
06e1d8
   self->state = DIALOG_STATE_REGISTER;
06e1d8
 
06e1d8
   gtk_entry_set_text (self->url_entry, SERVER_URL);
06e1d8
   gtk_widget_grab_focus (GTK_WIDGET (self->login_entry));
06e1d8
   dialog_validate (self);
06e1d8
   dialog_reload (self);
06e1d8
 }
06e1d8
 
06e1d8
 static void
06e1d8
 cc_subscription_register_dialog_dispose (GObject *obj)
06e1d8
 {
06e1d8
   CcSubscriptionRegisterDialog *self = (CcSubscriptionRegisterDialog *) obj;
06e1d8
 
06e1d8
   g_cancellable_cancel (self->cancellable);
06e1d8
   g_clear_object (&self->cancellable);
06e1d8
   g_clear_object (&self->subscription_proxy);
06e1d8
 
06e1d8
   G_OBJECT_CLASS (cc_subscription_register_dialog_parent_class)->dispose (obj);
06e1d8
 }
06e1d8
 
06e1d8
 static void
06e1d8
 cc_subscription_register_dialog_finalize (GObject *obj)
06e1d8
 {
06e1d8
   G_OBJECT_CLASS (cc_subscription_register_dialog_parent_class)->finalize (obj);
06e1d8
 }
06e1d8
 
06e1d8
 static void
06e1d8
 cc_subscription_register_dialog_class_init (CcSubscriptionRegisterDialogClass *klass)
06e1d8
 {
06e1d8
   GObjectClass *object_class = G_OBJECT_CLASS (klass);
06e1d8
@@ -364,40 +363,54 @@ cc_subscription_register_dialog_class_init (CcSubscriptionRegisterDialogClass *k
06e1d8
 
06e1d8
   gtk_widget_class_set_template_from_resource (widget_class, "/org/gnome/control-center/info/cc-subscription-register-dialog.ui");
06e1d8
 
06e1d8
   gtk_widget_class_bind_template_child (widget_class, CcSubscriptionRegisterDialog, spinner);
06e1d8
   gtk_widget_class_bind_template_child (widget_class, CcSubscriptionRegisterDialog, register_button);
06e1d8
   gtk_widget_class_bind_template_child (widget_class, CcSubscriptionRegisterDialog, notification_revealer);
06e1d8
   gtk_widget_class_bind_template_child (widget_class, CcSubscriptionRegisterDialog, error_label);
06e1d8
   gtk_widget_class_bind_template_child (widget_class, CcSubscriptionRegisterDialog, default_url_radio);
06e1d8
   gtk_widget_class_bind_template_child (widget_class, CcSubscriptionRegisterDialog, custom_url_radio);
06e1d8
   gtk_widget_class_bind_template_child (widget_class, CcSubscriptionRegisterDialog, register_radio);
06e1d8
   gtk_widget_class_bind_template_child (widget_class, CcSubscriptionRegisterDialog, register_with_activation_keys_radio);
06e1d8
   gtk_widget_class_bind_template_child (widget_class, CcSubscriptionRegisterDialog, stack);
06e1d8
   gtk_widget_class_bind_template_child (widget_class, CcSubscriptionRegisterDialog, register_grid);
06e1d8
   gtk_widget_class_bind_template_child (widget_class, CcSubscriptionRegisterDialog, register_with_activation_keys_grid);
06e1d8
   gtk_widget_class_bind_template_child (widget_class, CcSubscriptionRegisterDialog, url_label);
06e1d8
   gtk_widget_class_bind_template_child (widget_class, CcSubscriptionRegisterDialog, url_entry);
06e1d8
   gtk_widget_class_bind_template_child (widget_class, CcSubscriptionRegisterDialog, login_entry);
06e1d8
   gtk_widget_class_bind_template_child (widget_class, CcSubscriptionRegisterDialog, password_entry);
06e1d8
   gtk_widget_class_bind_template_child (widget_class, CcSubscriptionRegisterDialog, activation_keys_entry);
06e1d8
   gtk_widget_class_bind_template_child (widget_class, CcSubscriptionRegisterDialog, organization_label);
06e1d8
   gtk_widget_class_bind_template_child (widget_class, CcSubscriptionRegisterDialog, organization_entry);
06e1d8
   gtk_widget_class_bind_template_child (widget_class, CcSubscriptionRegisterDialog, organization_entry_with_activation_keys);
06e1d8
 
06e1d8
   gtk_widget_class_bind_template_callback (widget_class, dialog_validate);
06e1d8
   gtk_widget_class_bind_template_callback (widget_class, register_button_clicked_cb);
06e1d8
   gtk_widget_class_bind_template_callback (widget_class, dismiss_notification);
06e1d8
   gtk_widget_class_bind_template_callback (widget_class, custom_url_radio_toggled_cb);
06e1d8
   gtk_widget_class_bind_template_callback (widget_class, register_with_activation_keys_radio_toggled_cb);
06e1d8
 }
06e1d8
 
06e1d8
+static void
06e1d8
+on_dialog_cancelled (CcSubscriptionRegisterDialog *self)
06e1d8
+{
06e1d8
+  gtk_dialog_response (GTK_DIALOG (self), GTK_RESPONSE_CLOSE);
06e1d8
+}
06e1d8
+
06e1d8
 CcSubscriptionRegisterDialog *
06e1d8
-cc_subscription_register_dialog_new (GDBusProxy *subscription_proxy)
06e1d8
+cc_subscription_register_dialog_new (GDBusProxy *subscription_proxy,
06e1d8
+                                     GCancellable *cancellable)
06e1d8
 {
06e1d8
   CcSubscriptionRegisterDialog *self;
06e1d8
 
06e1d8
   self = g_object_new (CC_TYPE_SUBSCRIPTION_REGISTER_DIALOG, "use-header-bar", TRUE, NULL);
06e1d8
   self->subscription_proxy = g_object_ref (subscription_proxy);
06e1d8
+  self->cancellable = g_object_ref (cancellable);
06e1d8
+
06e1d8
+  g_signal_connect_object (G_OBJECT (self->cancellable),
06e1d8
+                           "cancelled",
06e1d8
+                           G_CALLBACK (on_dialog_cancelled),
06e1d8
+                           self,
06e1d8
+                           G_CONNECT_SWAPPED);
06e1d8
 
06e1d8
   return self;
06e1d8
 }
06e1d8
diff --git a/panels/info/cc-subscription-register-dialog.h b/panels/info/cc-subscription-register-dialog.h
06e1d8
index c5918df9f..31c254084 100644
06e1d8
--- a/panels/info/cc-subscription-register-dialog.h
06e1d8
+++ b/panels/info/cc-subscription-register-dialog.h
06e1d8
@@ -1,32 +1,33 @@
06e1d8
 /* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*-
06e1d8
  *
06e1d8
  * Copyright 2019  Red Hat, Inc,
06e1d8
  *
06e1d8
  * This program is free software; you can redistribute it and/or modify
06e1d8
  * it under the terms of the GNU General Public License as published by
06e1d8
  * the Free Software Foundation; either version 2 of the License, or
06e1d8
  * (at your option) any later version.
06e1d8
  *
06e1d8
  * This program is distributed in the hope that it will be useful,
06e1d8
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
06e1d8
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
06e1d8
  * GNU General Public License for more details.
06e1d8
  *
06e1d8
  * You should have received a copy of the GNU General Public License
06e1d8
  * along with this program; if not, see <http://www.gnu.org/licenses/>.
06e1d8
  *
06e1d8
  * Written by: Kalev Lember <klember@redhat.com>
06e1d8
  */
06e1d8
 
06e1d8
 #pragma once
06e1d8
 
06e1d8
 #include <gtk/gtk.h>
06e1d8
 
06e1d8
 G_BEGIN_DECLS
06e1d8
 
06e1d8
 #define CC_TYPE_SUBSCRIPTION_REGISTER_DIALOG (cc_subscription_register_dialog_get_type ())
06e1d8
 G_DECLARE_FINAL_TYPE (CcSubscriptionRegisterDialog, cc_subscription_register_dialog, CC, SUBSCRIPTION_REGISTER_DIALOG, GtkDialog)
06e1d8
 
06e1d8
-CcSubscriptionRegisterDialog *cc_subscription_register_dialog_new (GDBusProxy *subscription_proxy);
06e1d8
+CcSubscriptionRegisterDialog *cc_subscription_register_dialog_new (GDBusProxy *subscription_proxy,
06e1d8
+                                                                   GCancellable *cancellable);
06e1d8
 
06e1d8
 G_END_DECLS
06e1d8
-- 
06e1d8
2.28.0
06e1d8