From 463757569a9c235d6dd19492f533cd8cbc89b6ed Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20M=C3=BCllner?= Date: Fri, 29 Jul 2022 12:57:50 +0200 Subject: [PATCH] status/bluetooth: Use promise to initialize proxy There's no good reason for waiting for the proxy to be initialized to connect signals. In fact, connecting the signal beforehand ensures that the handler is in place when the proxy fetches the properties, so we don't have to call the handler explicitly. That in turn allows us to rely on the signal parameters to only process changed properties. To achieve that, construct the proxy manually, and then initialize it asynchronously in a Promise. Part-of: --- js/ui/status/bluetooth.js | 25 ++++++++++++++----------- 1 file changed, 14 insertions(+), 11 deletions(-) diff --git a/js/ui/status/bluetooth.js b/js/ui/status/bluetooth.js index 5e985dd1a..93dde6a76 100644 --- a/js/ui/status/bluetooth.js +++ b/js/ui/status/bluetooth.js @@ -13,7 +13,7 @@ const BUS_NAME = 'org.gnome.SettingsDaemon.Rfkill'; const OBJECT_PATH = '/org/gnome/SettingsDaemon/Rfkill'; const RfkillManagerInterface = loadInterfaceXML('org.gnome.SettingsDaemon.Rfkill'); -const RfkillManagerProxy = Gio.DBusProxy.makeProxyWrapper(RfkillManagerInterface); +const rfkillManagerInfo = Gio.DBusInterfaceInfo.new_for_xml(RfkillManagerInterface); const HAD_BLUETOOTH_DEVICES_SETUP = 'had-bluetooth-devices-setup'; @@ -40,16 +40,19 @@ class Indicator extends PanelMenu.SystemIndicator { }); this._client.connect('notify::default-adapter-powered', this._sync.bind(this)); - this._proxy = new RfkillManagerProxy(Gio.DBus.session, BUS_NAME, OBJECT_PATH, - (proxy, error) => { - if (error) { - log(error.message); - return; - } - - this._sync(); - }); - this._proxy.connect('g-properties-changed', this._queueSync.bind(this)); + this._proxy = new Gio.DBusProxy({ + g_connection: Gio.DBus.session, + g_name: BUS_NAME, + g_object_path: OBJECT_PATH, + g_interface_name: rfkillManagerInfo.name, + g_interface_info: rfkillManagerInfo, + }); + this._proxy.connect('g-properties-changed', (p, properties) => { + if ('BluetoothHardwareAirplaneMode' in properties.unpack()) + this._sync(); + }); + this._proxy.init_async(GLib.PRIORITY_DEFAULT, null) + .catch(e => console.error(e.message)); this._item = new PopupMenu.PopupSubMenuMenuItem(_("Bluetooth"), true);