[gnome-software] Do not use a 'state-changed' signal on GsApp



commit ebc2dd895eac1d5501132ebeb7d923c1dedfe548
Author: Richard Hughes <richard hughsie com>
Date:   Mon Oct 28 13:07:14 2013 +0000

    Do not use a 'state-changed' signal on GsApp
    
    We can use the existing property-changed mechanisms in a smarter way.

 src/gs-app-widget.c      |   17 ++++++++++++++---
 src/gs-app.c             |   19 -------------------
 src/gs-app.h             |    1 -
 src/gs-plugin-loader.c   |   15 +++++++++++++++
 src/gs-shell-details.c   |   18 +++++++++++++-----
 src/gs-shell-installed.c |   12 +++++++++---
 6 files changed, 51 insertions(+), 31 deletions(-)
---
diff --git a/src/gs-app-widget.c b/src/gs-app-widget.c
index 2268e2a..e39c8c4 100644
--- a/src/gs-app-widget.c
+++ b/src/gs-app-widget.c
@@ -187,6 +187,17 @@ gs_app_widget_get_app (GsAppWidget *app_widget)
 }
 
 /**
+ * gs_app_widget_notify_props_changed_cb:
+ **/
+static void
+gs_app_widget_notify_props_changed_cb (GsApp *app,
+                                      GParamSpec *pspec,
+                                      GsAppWidget *app_widget)
+{
+       gs_app_widget_refresh (app_widget);
+}
+
+/**
  * gs_app_widget_set_app:
  **/
 void
@@ -195,9 +206,9 @@ gs_app_widget_set_app (GsAppWidget *app_widget, GsApp *app)
        g_return_if_fail (GS_IS_APP_WIDGET (app_widget));
        g_return_if_fail (GS_IS_APP (app));
        app_widget->priv->app = g_object_ref (app);
-       g_signal_connect_object (app_widget->priv->app, "state-changed",
-                                G_CALLBACK (gs_app_widget_refresh),
-                                app_widget, G_CONNECT_SWAPPED);
+       g_signal_connect_object (app_widget->priv->app, "notify::state",
+                                G_CALLBACK (gs_app_widget_notify_props_changed_cb),
+                                app_widget, 0);
        gs_app_widget_refresh (app_widget);
 }
 
diff --git a/src/gs-app.c b/src/gs-app.c
index 2fa8309..2ff212a 100644
--- a/src/gs-app.c
+++ b/src/gs-app.c
@@ -106,13 +106,6 @@ enum {
 
 G_DEFINE_TYPE (GsApp, gs_app, G_TYPE_OBJECT)
 
-enum {
-       SIGNAL_STATE_CHANGED,
-       SIGNAL_LAST
-};
-
-static guint signals [SIGNAL_LAST] = { 0 };
-
 /**
  * gs_app_error_quark:
  * Return value: Our personal error quark.
@@ -438,7 +431,6 @@ gs_app_set_state (GsApp *app, GsAppState state)
                app->priv->install_date = 0;
 
        g_object_notify (G_OBJECT (app), "state");
-       g_signal_emit (app, signals[SIGNAL_STATE_CHANGED], 0);
 }
 
 /**
@@ -512,7 +504,6 @@ gs_app_set_kind (GsApp *app, GsAppKind kind)
 
        priv->kind = kind;
        g_object_notify (G_OBJECT (app), "kind");
-       g_signal_emit (app, signals[SIGNAL_STATE_CHANGED], 0);
 }
 
 /**
@@ -877,7 +868,6 @@ gs_app_ui_versions_populate (GsApp *app)
                priv->update_version_ui = gs_app_get_ui_version (priv->update_version, flags[i]);
                if (g_strcmp0 (priv->version_ui, priv->update_version_ui) != 0) {
                        g_object_notify (G_OBJECT (app), "version");
-                       g_signal_emit (app, signals[SIGNAL_STATE_CHANGED], 0);
                        return;
                }
                gs_app_ui_versions_invalidate (app);
@@ -931,7 +921,6 @@ gs_app_set_version (GsApp *app, const gchar *version)
        app->priv->version = g_strdup (version);
        gs_app_ui_versions_invalidate (app);
        g_object_notify (G_OBJECT (app), "version");
-       g_signal_emit (app, signals[SIGNAL_STATE_CHANGED], 0);
 }
 
 /**
@@ -1125,7 +1114,6 @@ gs_app_set_update_version (GsApp *app, const gchar *update_version)
        app->priv->update_version = g_strdup (update_version);
        gs_app_ui_versions_invalidate (app);
        g_object_notify (G_OBJECT (app), "version");
-       g_signal_emit (app, signals[SIGNAL_STATE_CHANGED], 0);
 }
 
 /**
@@ -1527,13 +1515,6 @@ gs_app_class_init (GsAppClass *klass)
                                     G_PARAM_READWRITE | G_PARAM_CONSTRUCT);
        g_object_class_install_property (object_class, PROP_INSTALL_DATE, pspec);
 
-       signals [SIGNAL_STATE_CHANGED] =
-               g_signal_new ("state-changed",
-                             G_TYPE_FROM_CLASS (object_class), G_SIGNAL_RUN_LAST,
-                             G_STRUCT_OFFSET (GsAppClass, state_changed),
-                             NULL, NULL, g_cclosure_marshal_VOID__VOID,
-                             G_TYPE_NONE, 0);
-
        g_type_class_add_private (klass, sizeof (GsAppPrivate));
 }
 
diff --git a/src/gs-app.h b/src/gs-app.h
index 819c104..274d433 100644
--- a/src/gs-app.h
+++ b/src/gs-app.h
@@ -48,7 +48,6 @@ typedef struct
 typedef struct
 {
        GObjectClass             parent_class;
-       void                    (*state_changed)        (GsApp          *app);
 } GsAppClass;
 
 typedef enum {
diff --git a/src/gs-plugin-loader.c b/src/gs-plugin-loader.c
index 9045203..068547e 100644
--- a/src/gs-plugin-loader.c
+++ b/src/gs-plugin-loader.c
@@ -119,6 +119,9 @@ gs_plugin_loader_dedupe (GsPluginLoader *plugin_loader, GsApp *app)
                goto out;
        }
 
+       /* wait for all the properties to be set */
+       g_object_freeze_notify (G_OBJECT (new_app));
+
        /* an [updatable] installable package is more information than
         * just the fact that something is installed */
        if (gs_app_get_state (app) == GS_APP_STATE_UPDATABLE &&
@@ -147,6 +150,9 @@ gs_plugin_loader_dedupe (GsPluginLoader *plugin_loader, GsApp *app)
        if (gs_app_get_pixbuf (app) != NULL)
                gs_app_set_pixbuf (new_app, gs_app_get_pixbuf (app));
 
+       /* now emit all the changed signals */
+       g_object_thaw_notify (G_OBJECT (new_app));
+
        /* this looks a little odd to unref the method parameter,
         * but it allows us to do:
         * app = gs_plugin_loader_dedupe (cache, app);
@@ -248,10 +254,15 @@ gs_plugin_loader_run_refine (GsPluginLoader *plugin_loader,
                             GCancellable *cancellable,
                             GError **error)
 {
+       GList *l;
        GsPlugin *plugin;
        gboolean ret = TRUE;
        guint i;
 
+       /* freeze all apps */
+       for (l = list; l != NULL; l = l->next)
+               g_object_freeze_notify (G_OBJECT (l->data));
+
        /* run each plugin */
        for (i = 0; i < plugin_loader->priv->plugins->len; i++) {
                plugin = g_ptr_array_index (plugin_loader->priv->plugins, i);
@@ -268,6 +279,10 @@ gs_plugin_loader_run_refine (GsPluginLoader *plugin_loader,
                        goto out;
        }
 
+       /* now emit all the changed signals */
+       for (l = list; l != NULL; l = l->next)
+               g_object_thaw_notify (G_OBJECT (l->data));
+
        /* dedupe applications we already know about */
        gs_plugin_loader_list_dedupe (plugin_loader, list);
 out:
diff --git a/src/gs-shell-details.c b/src/gs-shell-details.c
index 29b4c6e..9f72818 100644
--- a/src/gs-shell-details.c
+++ b/src/gs-shell-details.c
@@ -207,10 +207,12 @@ gs_shell_details_refresh (GsShellDetails *shell_details)
 }
 
 /**
- * gs_shell_details_app_state_changed_cb:
+ * gs_shell_details_notify_state_changed_cb:
  **/
 static void
-gs_shell_details_app_state_changed_cb (GsApp *app, GsShellDetails *shell_details)
+gs_shell_details_notify_state_changed_cb (GsApp *app,
+                                         GParamSpec *pspec,
+                                         GsShellDetails *shell_details)
 {
        gs_shell_details_refresh (shell_details);
 }
@@ -668,9 +670,15 @@ gs_shell_details_set_app (GsShellDetails *shell_details, GsApp *app)
        if (priv->app != NULL)
                g_object_unref (priv->app);
        priv->app = g_object_ref (app);
-       g_signal_connect (priv->app, "state-changed",
-                         G_CALLBACK (gs_shell_details_app_state_changed_cb),
-                         shell_details);
+       g_signal_connect_object (priv->app, "notify::state",
+                                G_CALLBACK (gs_shell_details_notify_state_changed_cb),
+                                shell_details, 0);
+       g_signal_connect_object (priv->app, "notify::size",
+                                G_CALLBACK (gs_shell_details_notify_state_changed_cb),
+                                shell_details, 0);
+       g_signal_connect_object (priv->app, "notify::licence",
+                                G_CALLBACK (gs_shell_details_notify_state_changed_cb),
+                                shell_details, 0);
 
        /* set screenshots */
        gs_shell_details_refresh_screenshots (shell_details);
diff --git a/src/gs-shell-installed.c b/src/gs-shell-installed.c
index 7816fd4..f00ce5a 100644
--- a/src/gs-shell-installed.c
+++ b/src/gs-shell-installed.c
@@ -211,8 +211,13 @@ gs_shell_installed_app_remove_cb (GsAppWidget *app_widget,
        gtk_widget_destroy (dialog);
 }
 
+/**
+ * gs_shell_installed_notify_state_changed_cb:
+ **/
 static void
-gs_shell_installed_app_state_changed_cb (GsApp *app, GsShellInstalled *shell)
+gs_shell_installed_notify_state_changed_cb (GsApp *app,
+                                           GParamSpec *pspec,
+                                           GsShellInstalled *shell)
 {
        gtk_list_box_invalidate_sort (shell->priv->list_box_installed);
 }
@@ -227,8 +232,9 @@ gs_shell_installed_add_app (GsShellInstalled *shell, GsApp *app)
        gs_app_widget_set_colorful (GS_APP_WIDGET (widget), FALSE);
        g_signal_connect (widget, "button-clicked",
                          G_CALLBACK (gs_shell_installed_app_remove_cb), shell);
-       g_signal_connect_object (app, "state-changed",
-                                G_CALLBACK (gs_shell_installed_app_state_changed_cb), shell, 0);
+       g_signal_connect_object (app, "notify::state",
+                                G_CALLBACK (gs_shell_installed_notify_state_changed_cb),
+                                shell, 0);
        gs_app_widget_set_app (GS_APP_WIDGET (widget), app);
        gtk_container_add (GTK_CONTAINER (priv->list_box_installed), widget);
        gs_app_widget_set_size_groups (GS_APP_WIDGET (widget),


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