[gnome-software] Do not use a 'state-changed' signal on GsApp
- From: Richard Hughes <rhughes src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-software] Do not use a 'state-changed' signal on GsApp
- Date: Mon, 28 Oct 2013 13:17:55 +0000 (UTC)
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]