diff options
author | Bastien Nocera <hadess@hadess.net> | 2021-12-15 11:14:19 +0100 |
---|---|---|
committer | Bastien Nocera <hadess@hadess.net> | 2022-01-06 11:11:22 +0100 |
commit | 9b52dd97772a900db94b0a1fc8432816d64470b7 (patch) | |
tree | 1c602f47862cfc44f6e0ffacd63ca7a62022b871 | |
parent | bd19f5d151b6d2c4b6df477502f65b996906f20a (diff) | |
download | gnome-bluetooth-9b52dd97772a900db94b0a1fc8432816d64470b7.tar.gz |
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.
-rw-r--r-- | lib/bluetooth-client.c | 54 |
1 files changed, 34 insertions, 20 deletions
diff --git a/lib/bluetooth-client.c b/lib/bluetooth-client.c index 6e5cf140..d258d2be 100644 --- a/lib/bluetooth-client.c +++ b/lib/bluetooth-client.c @@ -762,6 +762,33 @@ object_removed (GDBusObjectManager *manager, g_list_free_full (interfaces, g_object_unref); } +static int +reverse_sort_adapters (gconstpointer a, + gconstpointer b) +{ + GDBusProxy *adapter_a = (GDBusProxy *) a; + GDBusProxy *adapter_b = (GDBusProxy *) b; + + 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, @@ -770,6 +797,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; @@ -790,29 +818,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, reverse_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) |