diff --git a/client/pk-monitor.c b/client/pk-monitor.c index 60788ecc4..b768bcc68 100644 --- a/client/pk-monitor.c +++ b/client/pk-monitor.c @@ -29,6 +29,12 @@ static PkClient *client = NULL; +static void +pk_monitor_installed_changed_cb (PkControl *control, gpointer data) +{ + g_print ("installed-changed\n"); +} + static void pk_monitor_repo_list_changed_cb (PkControl *control, gpointer data) { @@ -368,6 +374,8 @@ main (int argc, char *argv[]) loop = g_main_loop_new (NULL, FALSE); control = pk_control_new (); + g_signal_connect (control, "installed-changed", + G_CALLBACK (pk_monitor_installed_changed_cb), NULL); g_signal_connect (control, "repo-list-changed", G_CALLBACK (pk_monitor_repo_list_changed_cb), NULL); g_signal_connect (control, "updates-changed", diff --git a/lib/packagekit-glib2/pk-control.c b/lib/packagekit-glib2/pk-control.c index 8c7b989e3..64901ea2c 100644 --- a/lib/packagekit-glib2/pk-control.c +++ b/lib/packagekit-glib2/pk-control.c @@ -75,6 +75,7 @@ struct _PkControlPrivate enum { SIGNAL_TRANSACTION_LIST_CHANGED, SIGNAL_RESTART_SCHEDULE, + SIGNAL_INSTALLED_CHANGED, SIGNAL_UPDATES_CHANGED, SIGNAL_REPO_LIST_CHANGED, SIGNAL_LAST @@ -340,6 +341,11 @@ pk_control_signal_cb (GDBusProxy *proxy, signals[SIGNAL_TRANSACTION_LIST_CHANGED], 0, ids); } + if (g_strcmp0 (signal_name, "InstalledChanged") == 0) { + g_debug ("emit installed-changed"); + g_signal_emit (control, signals[SIGNAL_INSTALLED_CHANGED], 0); + return; + } if (g_strcmp0 (signal_name, "UpdatesChanged") == 0) { g_debug ("emit updates-changed"); g_signal_emit (control, signals[SIGNAL_UPDATES_CHANGED], 0); @@ -1896,6 +1902,21 @@ pk_control_class_init (PkControlClass *klass) G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS); g_object_class_install_property (object_class, PROP_CONNECTED, pspec); + /** + * PkControl::installed-changed: + * @control: the #PkControl instance that emitted the signal + * + * The ::installed-changed signal is emitted when the list of installed apps may have + * changed and the control program may have to update some UI. + * + * Since: 1.2.9 + **/ + signals[SIGNAL_INSTALLED_CHANGED] = + g_signal_new ("installed-changed", + G_TYPE_FROM_CLASS (object_class), G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (PkControlClass, installed_changed), + NULL, NULL, g_cclosure_marshal_VOID__VOID, + G_TYPE_NONE, 0); /** * PkControl::updates-changed: * @control: the #PkControl instance that emitted the signal diff --git a/lib/packagekit-glib2/pk-control.h b/lib/packagekit-glib2/pk-control.h index acbb7537d..5c94792e9 100644 --- a/lib/packagekit-glib2/pk-control.h +++ b/lib/packagekit-glib2/pk-control.h @@ -84,12 +84,12 @@ struct _PkControlClass gboolean is_locked); void (* connection_changed) (PkControl *control, gboolean connected); + void (* installed_changed) (PkControl *control); /* padding for future expansion */ void (*_pk_reserved1) (void); void (*_pk_reserved2) (void); void (*_pk_reserved3) (void); void (*_pk_reserved4) (void); - void (*_pk_reserved5) (void); }; GQuark pk_control_error_quark (void); diff --git a/src/org.freedesktop.PackageKit.xml b/src/org.freedesktop.PackageKit.xml index 3fa109015..ba1cae14f 100644 --- a/src/org.freedesktop.PackageKit.xml +++ b/src/org.freedesktop.PackageKit.xml @@ -476,6 +476,17 @@ + + + + + + This signal is emitted when the set of installed apps has potentially changed. + + + + + diff --git a/src/pk-backend.c b/src/pk-backend.c index 8b49d090f..b9c867018 100644 --- a/src/pk-backend.c +++ b/src/pk-backend.c @@ -208,6 +208,7 @@ struct PkBackendPrivate G_DEFINE_TYPE (PkBackend, pk_backend, G_TYPE_OBJECT) enum { + SIGNAL_INSTALLED_CHANGED, SIGNAL_REPO_LIST_CHANGED, SIGNAL_UPDATES_CHANGED, SIGNAL_LAST @@ -680,6 +681,8 @@ pk_backend_installed_db_changed_cb (gpointer user_data) g_warning ("failed to invalidate: %s", error->message); } backend->priv->installed_db_changed_id = 0; + g_debug ("emitting installed-changed"); + g_signal_emit (backend, signals [SIGNAL_INSTALLED_CHANGED], 0); return FALSE; } @@ -1094,6 +1097,11 @@ pk_backend_class_init (PkBackendClass *klass) GObjectClass *object_class = G_OBJECT_CLASS (klass); object_class->finalize = pk_backend_finalize; + signals [SIGNAL_INSTALLED_CHANGED] = + g_signal_new ("installed-changed", + G_TYPE_FROM_CLASS (object_class), G_SIGNAL_RUN_LAST, + 0, NULL, NULL, g_cclosure_marshal_VOID__VOID, + G_TYPE_NONE, 0); signals [SIGNAL_REPO_LIST_CHANGED] = g_signal_new ("repo-list-changed", G_TYPE_FROM_CLASS (object_class), G_SIGNAL_RUN_LAST, diff --git a/src/pk-engine.c b/src/pk-engine.c index f5e7c78d8..05411a06a 100644 --- a/src/pk-engine.c +++ b/src/pk-engine.c @@ -328,6 +328,21 @@ pk_engine_set_locked (PkEngine *engine, gboolean is_locked) g_variant_new_boolean (is_locked)); } +static void +pk_engine_backend_installed_changed_cb (PkBackend *backend, PkEngine *engine) +{ + g_return_if_fail (PK_IS_ENGINE (engine)); + + g_debug ("emitting InstalledChanged"); + g_dbus_connection_emit_signal (engine->priv->connection, + NULL, + PK_DBUS_PATH, + PK_DBUS_INTERFACE, + "InstalledChanged", + NULL, + NULL); +} + static void pk_engine_backend_repo_list_changed_cb (PkBackend *backend, PkEngine *engine) { @@ -1942,6 +1957,8 @@ pk_engine_new (GKeyFile *conf) engine = g_object_new (PK_TYPE_ENGINE, NULL); engine->priv->conf = g_key_file_ref (conf); engine->priv->backend = pk_backend_new (engine->priv->conf); + g_signal_connect (engine->priv->backend, "installed-changed", + G_CALLBACK (pk_engine_backend_installed_changed_cb), engine); g_signal_connect (engine->priv->backend, "repo-list-changed", G_CALLBACK (pk_engine_backend_repo_list_changed_cb), engine); g_signal_connect (engine->priv->backend, "updates-changed",