diff --git a/src/fu-device-list.c b/src/fu-device-list.c index 391b498e9..e68849ef3 100644 --- a/src/fu-device-list.c +++ b/src/fu-device-list.c @@ -161,6 +161,26 @@ fu_device_list_find_by_device (FuDeviceList *self, FuDevice *device) return NULL; } +/** + * fu_device_list_get_old: + * @self: A #FuDeviceList + * @device: A #FuDevice + * + * Returns the old device associated with the currently active device. + * + * Returns: (transfer none): the device, or %NULL if not found + * + * Since: 1.0.3 + **/ +FuDevice * +fu_device_list_get_old (FuDeviceList *self, FuDevice *device) +{ + FuDeviceItem *item = fu_device_list_find_by_device (self, device); + if (item == NULL) + return NULL; + return item->device_old; +} + static FuDeviceItem * fu_device_list_find_by_guids (FuDeviceList *self, GPtrArray *guids) { diff --git a/src/fu-device-list.h b/src/fu-device-list.h index ce42af107..157bda129 100644 --- a/src/fu-device-list.h +++ b/src/fu-device-list.h @@ -38,6 +38,8 @@ void fu_device_list_remove (FuDeviceList *self, FuDevice *device); GPtrArray *fu_device_list_get_all (FuDeviceList *self); GPtrArray *fu_device_list_get_active (FuDeviceList *self); +FuDevice *fu_device_list_get_old (FuDeviceList *self, + FuDevice *device); FuDevice *fu_device_list_find_by_id (FuDeviceList *self, const gchar *device_id, GError **error); diff --git a/src/fu-engine.c b/src/fu-engine.c index f522419c3..118ddfdbf 100644 --- a/src/fu-engine.c +++ b/src/fu-engine.c @@ -176,12 +176,27 @@ fu_engine_status_notify_cb (FuDevice *device, GParamSpec *pspec, FuEngine *self) } static void -fu_engine_device_added_cb (FuDeviceList *device_list, FuDevice *device, FuEngine *self) +fu_engine_watch_device (FuEngine *self, FuDevice *device) { + FuDevice *device_old = fu_device_list_get_old (self->device_list, device); + if (device_old != NULL) { + g_signal_handlers_disconnect_by_func (device_old, + fu_engine_progress_notify_cb, + self); + g_signal_handlers_disconnect_by_func (device_old, + fu_engine_status_notify_cb, + self); + } g_signal_connect (device, "notify::progress", G_CALLBACK (fu_engine_progress_notify_cb), self); g_signal_connect (device, "notify::status", G_CALLBACK (fu_engine_status_notify_cb), self); +} + +static void +fu_engine_device_added_cb (FuDeviceList *device_list, FuDevice *device, FuEngine *self) +{ + fu_engine_watch_device (self, device); g_signal_emit (self, signals[SIGNAL_DEVICE_ADDED], 0, device); } @@ -195,6 +210,7 @@ fu_engine_device_removed_cb (FuDeviceList *device_list, FuDevice *device, FuEngi static void fu_engine_device_changed_cb (FuDeviceList *device_list, FuDevice *device, FuEngine *self) { + fu_engine_watch_device (self, device); fu_engine_emit_device_changed (self, device); } diff --git a/src/fu-self-test.c b/src/fu-self-test.c index 48d86c73a..c7a44adc4 100644 --- a/src/fu-self-test.c +++ b/src/fu-self-test.c @@ -422,6 +422,10 @@ fu_device_list_compatible_func (void) device = g_ptr_array_index (devices_all, 1); g_assert_cmpstr (fu_device_get_id (device), ==, "99249eb1bd9ef0b6e192b271a8cb6a3090cfec7a"); + + /* verify we can get the old device from the new device */ + device = fu_device_list_get_old (device_list, device2); + g_assert (device == device1); } static void