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",