[gnome-bluetooth/wip/hadess/default-adapter-work: 5/5] lib: Sort adapters before inserting them
- From: Bastien Nocera <hadess src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-bluetooth/wip/hadess/default-adapter-work: 5/5] lib: Sort adapters before inserting them
- Date: Wed, 15 Dec 2021 10:17:03 +0000 (UTC)
commit 8e3645e1448dbdfef7cc41b2de692d2d569952bd
Author: Bastien Nocera <hadess hadess net>
Date: Wed Dec 15 11:14:19 2021 +0100
lib: Sort adapters before inserting them
This would prefer hci1 as the default adapter, but that's already the
order in which g_dbus_object_manager_get_objects() returns the objects,
so it's more complicated code for the sake of clarity.
lib/bluetooth-client.c | 55 ++++++++++++++++++++++++++++++++------------------
1 file changed, 35 insertions(+), 20 deletions(-)
---
diff --git a/lib/bluetooth-client.c b/lib/bluetooth-client.c
index 41cfcc69..dd9de6ab 100644
--- a/lib/bluetooth-client.c
+++ b/lib/bluetooth-client.c
@@ -680,6 +680,34 @@ object_removed (GDBusObjectManager *manager,
g_list_free_full (interfaces, g_object_unref);
}
+static int
+sort_adapters (gconstpointer a,
+ gconstpointer b)
+{
+ GDBusProxy *adapter_a = (GDBusProxy *) a;
+ GDBusProxy *adapter_b = (GDBusProxy *) b;
+
+ /* we want reverse order, so... */
+ return g_strcmp0 (g_dbus_proxy_get_object_path (adapter_b),
+ g_dbus_proxy_get_object_path (adapter_a));
+}
+
+static GList *
+filter_adapter_list (GList *object_list)
+{
+ GList *l, *out = NULL;
+
+ for (l = object_list; l != NULL; l = l->next) {
+ GDBusObject *object = l->data;
+ GDBusInterface *iface;
+
+ iface = g_dbus_object_get_interface (object, BLUEZ_ADAPTER_INTERFACE);
+ if (iface)
+ out = g_list_prepend (out, iface);
+ }
+ return out;
+}
+
static void
object_manager_new_callback(GObject *source_object,
GAsyncResult *res,
@@ -688,6 +716,7 @@ object_manager_new_callback(GObject *source_object,
BluetoothClient *client;
GDBusObjectManager *manager;
g_autolist(GDBusObject) object_list = NULL;
+ g_autolist(GDBusProxy) adapter_list = NULL;
GList *l;
GError *error = NULL;
@@ -708,29 +737,15 @@ object_manager_new_callback(GObject *source_object,
g_signal_connect_object (G_OBJECT (client->manager), "object-added", (GCallback) object_added,
client, 0);
g_signal_connect_object (G_OBJECT (client->manager), "object-removed", (GCallback) object_removed,
client, 0);
- /* NOTE: Since 2013, in 68852faa5a957d14480e72e8e63bc8e1196d19cf, the default
- * adapter has been dependent on the order objects are returned from
- * g_dbus_object_manager_client_get_objects(), which has never not been
- * tested to have the highest numbered device as the default one.
- *
- * It's 2021, and there are no reasons for that to be changed this late. */
- object_list = g_dbus_object_manager_get_objects (client->manager);
-
/* We need to add the adapters first, otherwise the devices will
* be dropped to the floor, as they wouldn't have a default adapter */
- g_debug ("Adding adapters from ObjectManager");
- for (l = object_list; l != NULL; l = l->next) {
- GDBusObject *object = l->data;
- GDBusInterface *iface;
-
- iface = g_dbus_object_get_interface (object, BLUEZ_ADAPTER_INTERFACE);
- if (!iface)
- continue;
+ object_list = g_dbus_object_manager_get_objects (client->manager);
+ adapter_list = filter_adapter_list (object_list);
+ adapter_list = g_list_sort (adapter_list, sort_adapters);
- adapter_added (client->manager,
- ADAPTER1 (iface),
- client);
- }
+ g_debug ("Adding adapters from ObjectManager");
+ for (l = adapter_list; l != NULL; l = l->next)
+ adapter_added (client->manager, l->data, client);
}
static void bluetooth_client_init(BluetoothClient *client)
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]