mirror of
https://git.proxmox.com/git/fwupd
synced 2025-05-23 21:26:58 +00:00
Connect the progress and status callbacks on the new FuDevice on replug
This ensures we get progress events when replugging a device. Also, remove the callbacks on the 'old' device to avoid causing multiple events on a 2nd-replug.
This commit is contained in:
parent
9934fb514c
commit
fbcebe096b
@ -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)
|
||||
{
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user