summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBastien Nocera <hadess@hadess.net>2023-07-05 12:30:11 +0200
committerBastien Nocera <hadess@hadess.net>2023-07-05 17:39:19 +0200
commit38576a9bd733c3d576af7959e6f8b6a7929d9fa6 (patch)
tree04bccd29b30d4d696b9c8b7c267cc7370f6c70e5
parent53ccc01be9a512f560ac899566a43e6b727ed383 (diff)
linux: Emit added/removed signals when duplicates change
-rw-r--r--src/linux/up-backend.c30
1 files changed, 19 insertions, 11 deletions
diff --git a/src/linux/up-backend.c b/src/linux/up-backend.c
index 443e070..2aac74d 100644
--- a/src/linux/up-backend.c
+++ b/src/linux/up-backend.c
@@ -148,7 +148,8 @@ find_duplicate_device (UpBackend *backend,
return ret;
}
-static void
+/* Returns TRUE if the added_device should be visible */
+static gboolean
update_added_duplicate_device (UpBackend *backend,
UpDevice *added_device)
{
@@ -159,7 +160,7 @@ update_added_duplicate_device (UpBackend *backend,
other_device = find_duplicate_device (backend, added_device);
if (!other_device)
- return;
+ return TRUE;
if (UP_IS_DEVICE_BLUEZ (added_device))
bluez_device = added_device;
@@ -189,15 +190,19 @@ update_added_duplicate_device (UpBackend *backend,
g_object_get (G_OBJECT (added_device), "serial", &serial, NULL);
g_debug ("Device %s is a duplicate, but we don't know if most interesting",
serial);
- return;
+ return TRUE;
}
unreg_device = tested_device;
}
g_object_get (G_OBJECT (unreg_device), "serial", &serial, NULL);
- up_device_unregister (unreg_device);
+ if (up_device_is_registered (unreg_device)) {
+ g_signal_emit (backend, signals[SIGNAL_DEVICE_REMOVED], 0, unreg_device);
+ up_device_unregister (unreg_device);
+ }
g_debug ("Hiding duplicate device %s", serial);
+ return unreg_device != added_device;
}
static void
@@ -211,7 +216,8 @@ update_removed_duplicate_device (UpBackend *backend,
return;
/* Re-add the old duplicate device that got hidden */
- up_device_register (other_device);
+ if (up_device_register (other_device))
+ g_signal_emit (backend, signals[SIGNAL_DEVICE_ADDED], 0, other_device);
}
static gboolean
@@ -278,7 +284,8 @@ bluez_interface_removed (GDBusObjectManager *manager,
return;
g_debug ("emitting device-removed: %s", g_dbus_object_get_object_path (bus_object));
- g_signal_emit (backend, signals[SIGNAL_DEVICE_REMOVED], 0, UP_DEVICE (object));
+ if (up_device_is_registered (UP_DEVICE (object)))
+ g_signal_emit (backend, signals[SIGNAL_DEVICE_REMOVED], 0, UP_DEVICE (object));
g_object_unref (object);
}
@@ -308,8 +315,8 @@ bluez_interface_added (GDBusObjectManager *manager,
NULL);
if (device) {
g_debug ("emitting device-added: %s", g_dbus_object_get_object_path (bus_object));
- update_added_duplicate_device (backend, device);
- g_signal_emit (backend, signals[SIGNAL_DEVICE_ADDED], 0, device);
+ if (update_added_duplicate_device (backend, device))
+ g_signal_emit (backend, signals[SIGNAL_DEVICE_ADDED], 0, device);
}
}
@@ -389,7 +396,8 @@ bluez_vanished (GDBusConnection *connection,
object = G_DBUS_OBJECT (up_device_get_native (device));
g_debug ("emitting device-removed: %s", g_dbus_object_get_object_path (object));
- g_signal_emit (backend, signals[SIGNAL_DEVICE_REMOVED], 0, device);
+ if (up_device_is_registered (device))
+ g_signal_emit (backend, signals[SIGNAL_DEVICE_REMOVED], 0, device);
}
}
@@ -428,10 +436,10 @@ static void
udev_device_added_cb (UpBackend *backend, UpDevice *device)
{
g_debug ("Got new device from udev enumerator: %p", device);
- update_added_duplicate_device (backend, device);
g_signal_connect (device, "notify::disconnected",
G_CALLBACK (up_device_disconnected_cb), backend);
- g_signal_emit (backend, signals[SIGNAL_DEVICE_ADDED], 0, device);
+ if (update_added_duplicate_device (backend, device))
+ g_signal_emit (backend, signals[SIGNAL_DEVICE_ADDED], 0, device);
}
static void