[gnome-control-center/rhel/8.4.0: 11/32] info: Update registration state in panel when it happens on disk




commit 6426ba63ee9e7d86314494d182296296cdaa8836
Author: Ray Strode <rstrode redhat com>
Date:   Sun Jan 24 13:03:03 2021 -0500

    info: Update registration state in panel when it happens on disk
    
    The code was failing to listen for change notifications, so if the
    panel was open while the system got registered, it wouldn't update.
    
    This commit fixes that.

 panels/info/cc-info-overview-panel.c          | 33 +++++++++++++++++++++++----
 panels/info/cc-subscription-details-dialog.c  | 17 ++++++++++++--
 panels/info/cc-subscription-details-dialog.h  |  3 ++-
 panels/info/cc-subscription-register-dialog.c | 17 ++++++++++++--
 panels/info/cc-subscription-register-dialog.h |  3 ++-
 5 files changed, 63 insertions(+), 10 deletions(-)
---
diff --git a/panels/info/cc-info-overview-panel.c b/panels/info/cc-info-overview-panel.c
index b2cbefb25..65246758e 100644
--- a/panels/info/cc-info-overview-panel.c
+++ b/panels/info/cc-info-overview-panel.c
@@ -87,6 +87,7 @@ typedef struct
   char           *gnome_date;
 
   GCancellable   *cancellable;
+  GCancellable   *subscription_cancellable;
 
   /* Free space */
   GList          *primary_mounts;
@@ -848,14 +849,13 @@ on_details_button_clicked (GtkWidget           *widget,
   CcSubscriptionDetailsDialog *dialog;
   GtkWindow *toplevel;
 
-  dialog = cc_subscription_details_dialog_new (priv->subscription_proxy);
+  dialog = cc_subscription_details_dialog_new (priv->subscription_proxy,
+                                               priv->subscription_cancellable);
   toplevel = GTK_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (self)));
   gtk_window_set_transient_for (GTK_WINDOW (dialog), toplevel);
 
   gtk_dialog_run (GTK_DIALOG (dialog));
   gtk_widget_destroy (GTK_WIDGET (dialog));
-
-  reload_subscription_status (self);
 }
 
 static void
@@ -866,12 +866,27 @@ on_register_button_clicked (GtkWidget           *widget,
   CcSubscriptionRegisterDialog *dialog;
   GtkWindow *toplevel;
 
-  dialog = cc_subscription_register_dialog_new (priv->subscription_proxy);
+  dialog = cc_subscription_register_dialog_new (priv->subscription_proxy,
+                                                priv->subscription_cancellable);
   toplevel = GTK_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (self)));
   gtk_window_set_transient_for (GTK_WINDOW (dialog), toplevel);
 
   gtk_dialog_run (GTK_DIALOG (dialog));
   gtk_widget_destroy (GTK_WIDGET (dialog));
+}
+
+static void
+on_subscription_status_changed (GDBusProxy *proxy,
+                                GVariant *changed_properties,
+                                GStrv invalidated_properties,
+                                CcInfoOverviewPanel *self)
+{
+  CcInfoOverviewPanelPrivate *priv = cc_info_overview_panel_get_instance_private (self);
+
+  g_cancellable_cancel (priv->subscription_cancellable);
+  g_object_unref (priv->subscription_cancellable);
+
+  priv->subscription_cancellable = g_cancellable_new ();
 
   reload_subscription_status (self);
 }
@@ -897,6 +912,9 @@ info_overview_panel_setup_subscriptions (CcInfoOverviewPanel *self)
       return;
     }
 
+  g_signal_connect (priv->subscription_proxy, "g-properties-changed",
+                    G_CALLBACK (on_subscription_status_changed), self);
+
   g_signal_connect (priv->details_button, "clicked", G_CALLBACK (on_details_button_clicked), self);
   g_signal_connect (priv->register_button, "clicked", G_CALLBACK (on_register_button_clicked), self);
 
@@ -953,6 +971,12 @@ cc_info_overview_panel_finalize (GObject *object)
 {
   CcInfoOverviewPanelPrivate *priv = cc_info_overview_panel_get_instance_private (CC_INFO_OVERVIEW_PANEL 
(object));
 
+  if (priv->subscription_cancellable)
+    {
+      g_cancellable_cancel (priv->subscription_cancellable);
+      g_clear_object (&priv->subscription_cancellable);
+    }
+
   if (priv->cancellable)
     {
       g_cancellable_cancel (priv->cancellable);
@@ -1014,6 +1038,7 @@ cc_info_overview_panel_init (CcInfoOverviewPanel *self)
   g_resources_register (cc_info_get_resource ());
 
   priv->cancellable = g_cancellable_new ();
+  priv->subscription_cancellable = g_cancellable_new ();
 
   priv->graphics_data = get_graphics_data ();
 
diff --git a/panels/info/cc-subscription-details-dialog.c b/panels/info/cc-subscription-details-dialog.c
index 1931ced81..3d77e6c48 100644
--- a/panels/info/cc-subscription-details-dialog.c
+++ b/panels/info/cc-subscription-details-dialog.c
@@ -338,7 +338,6 @@ cc_subscription_details_dialog_init (CcSubscriptionDetailsDialog *self)
 {
   gtk_widget_init_template (GTK_WIDGET (self));
 
-  self->cancellable = g_cancellable_new ();
   self->products = g_ptr_array_new_with_free_func ((GDestroyNotify) product_data_free);
   self->state = DIALOG_STATE_SHOW_DETAILS;
 }
@@ -392,13 +391,27 @@ cc_subscription_details_dialog_class_init (CcSubscriptionDetailsDialogClass *kla
   gtk_widget_class_bind_template_callback (widget_class, dismiss_notification);
 }
 
+static void
+on_dialog_cancelled (CcSubscriptionDetailsDialog *self)
+{
+  gtk_dialog_response (GTK_DIALOG (self), GTK_RESPONSE_CLOSE);
+}
+
 CcSubscriptionDetailsDialog *
-cc_subscription_details_dialog_new (GDBusProxy *subscription_proxy)
+cc_subscription_details_dialog_new (GDBusProxy *subscription_proxy,
+                                    GCancellable *cancellable)
 {
   CcSubscriptionDetailsDialog *self;
 
   self = g_object_new (CC_TYPE_SUBSCRIPTION_DETAILS_DIALOG, "use-header-bar", TRUE, NULL);
   self->subscription_proxy = g_object_ref (subscription_proxy);
+  self->cancellable = g_object_ref (cancellable);
+
+  g_signal_connect_object (G_OBJECT (self->cancellable),
+                           "cancelled",
+                           G_CALLBACK (on_dialog_cancelled),
+                           self,
+                           G_CONNECT_SWAPPED);
 
   load_installed_products (self);
   dialog_reload (self);
diff --git a/panels/info/cc-subscription-details-dialog.h b/panels/info/cc-subscription-details-dialog.h
index a61a22838..f14dd157b 100644
--- a/panels/info/cc-subscription-details-dialog.h
+++ b/panels/info/cc-subscription-details-dialog.h
@@ -27,6 +27,7 @@ G_BEGIN_DECLS
 #define CC_TYPE_SUBSCRIPTION_DETAILS_DIALOG (cc_subscription_details_dialog_get_type ())
 G_DECLARE_FINAL_TYPE (CcSubscriptionDetailsDialog, cc_subscription_details_dialog, CC, 
SUBSCRIPTION_DETAILS_DIALOG, GtkDialog)
 
-CcSubscriptionDetailsDialog *cc_subscription_details_dialog_new (GDBusProxy *subscription_proxy);
+CcSubscriptionDetailsDialog *cc_subscription_details_dialog_new (GDBusProxy   *subscription_proxy,
+                                                                 GCancellable *cancellable);
 
 G_END_DECLS
diff --git a/panels/info/cc-subscription-register-dialog.c b/panels/info/cc-subscription-register-dialog.c
index d7a17cc99..e8c2f581c 100644
--- a/panels/info/cc-subscription-register-dialog.c
+++ b/panels/info/cc-subscription-register-dialog.c
@@ -326,7 +326,6 @@ cc_subscription_register_dialog_init (CcSubscriptionRegisterDialog *self)
 {
   gtk_widget_init_template (GTK_WIDGET (self));
 
-  self->cancellable = g_cancellable_new ();
   self->state = DIALOG_STATE_REGISTER;
 
   gtk_entry_set_text (self->url_entry, SERVER_URL);
@@ -391,13 +390,27 @@ cc_subscription_register_dialog_class_init (CcSubscriptionRegisterDialogClass *k
   gtk_widget_class_bind_template_callback (widget_class, register_with_activation_keys_radio_toggled_cb);
 }
 
+static void
+on_dialog_cancelled (CcSubscriptionRegisterDialog *self)
+{
+  gtk_dialog_response (GTK_DIALOG (self), GTK_RESPONSE_CLOSE);
+}
+
 CcSubscriptionRegisterDialog *
-cc_subscription_register_dialog_new (GDBusProxy *subscription_proxy)
+cc_subscription_register_dialog_new (GDBusProxy *subscription_proxy,
+                                     GCancellable *cancellable)
 {
   CcSubscriptionRegisterDialog *self;
 
   self = g_object_new (CC_TYPE_SUBSCRIPTION_REGISTER_DIALOG, "use-header-bar", TRUE, NULL);
   self->subscription_proxy = g_object_ref (subscription_proxy);
+  self->cancellable = g_object_ref (cancellable);
+
+  g_signal_connect_object (G_OBJECT (self->cancellable),
+                           "cancelled",
+                           G_CALLBACK (on_dialog_cancelled),
+                           self,
+                           G_CONNECT_SWAPPED);
 
   return self;
 }
diff --git a/panels/info/cc-subscription-register-dialog.h b/panels/info/cc-subscription-register-dialog.h
index c5918df9f..31c254084 100644
--- a/panels/info/cc-subscription-register-dialog.h
+++ b/panels/info/cc-subscription-register-dialog.h
@@ -27,6 +27,7 @@ G_BEGIN_DECLS
 #define CC_TYPE_SUBSCRIPTION_REGISTER_DIALOG (cc_subscription_register_dialog_get_type ())
 G_DECLARE_FINAL_TYPE (CcSubscriptionRegisterDialog, cc_subscription_register_dialog, CC, 
SUBSCRIPTION_REGISTER_DIALOG, GtkDialog)
 
-CcSubscriptionRegisterDialog *cc_subscription_register_dialog_new (GDBusProxy *subscription_proxy);
+CcSubscriptionRegisterDialog *cc_subscription_register_dialog_new (GDBusProxy *subscription_proxy,
+                                                                   GCancellable *cancellable);
 
 G_END_DECLS


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