From 2231fce157a6fdbaf057bff084009942a18a2f29 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20M=C3=BCllner?= Date: Wed, 3 Aug 2022 04:33:48 +0200 Subject: [PATCH] status/network: Use binding for updating primary indicator The primary indicator is a bit tricker than the VPN one: The source of the binding can change depending on the connection, and we still want to show it when there is a network connection we don't know about (either because we don't handle the device type, or the device isn't managed by NetworkManager). Bindings still make the whole thing a lot nicer though. Part-of: --- js/ui/status/network.js | 72 ++++++++++++----------------------------- 1 file changed, 20 insertions(+), 52 deletions(-) diff --git a/js/ui/status/network.js b/js/ui/status/network.js index e9ea5c05e..39a89e93d 100644 --- a/js/ui/status/network.js +++ b/js/ui/status/network.js @@ -50,17 +50,6 @@ function ssidToLabel(ssid) { return label; } -function ensureActiveConnectionProps(active) { - if (!active._primaryDevice) { - let devices = active.get_devices(); - if (devices.length > 0) { - // This list is guaranteed to have at most one device in it. - let device = devices[0]._delegate; - active._primaryDevice = device; - } - } -} - function launchSettingsPanel(panel, ...args) { const param = new GLib.Variant('(sav)', [panel, args.map(s => new GLib.Variant('s', s))]); @@ -1764,7 +1753,6 @@ class Indicator extends PanelMenu.SystemIndicator { this._allSections.forEach(section => { section.connectObject( 'activation-failed', () => this._onActivationFailed(), - 'notify::icon-name', () => this._updateIcon(), this); this.menu.addMenuItem(section.menu); }); @@ -1772,6 +1760,11 @@ class Indicator extends PanelMenu.SystemIndicator { this._primaryIndicator = this._addIndicator(); this._vpnIndicator = this._addIndicator(); + this._primaryIndicatorBinding = new GObject.BindingGroup(); + this._primaryIndicatorBinding.bind('icon-name', + this._primaryIndicator, 'icon-name', + GObject.BindingFlags.DEFAULT); + this._vpnSection.bind_property('checked', this._vpnIndicator, 'visible', GObject.BindingFlags.SYNC_CREATE); @@ -1796,7 +1789,6 @@ class Indicator extends PanelMenu.SystemIndicator { GObject.BindingFlags.SYNC_CREATE); this._client.connectObject( - 'notify::state', () => this._updateIcon(), 'notify::primary-connection', () => this._syncMainConnection(), 'notify::activating-connection', () => this._syncMainConnection(), 'notify::connectivity', () => this._syncConnectivity(), @@ -1842,33 +1834,14 @@ class Indicator extends PanelMenu.SystemIndicator { source.showNotification(this._notification); } - _getMainConnection() { - let connection; - - connection = this._client.get_primary_connection(); - if (connection) { - ensureActiveConnectionProps(connection); - return connection; - } - - connection = this._client.get_activating_connection(); - if (connection) { - ensureActiveConnectionProps(connection); - return connection; - } - - return null; - } - _syncMainConnection() { - this._mainConnection?._primaryDevice?.disconnectObject(this); this._mainConnection?.disconnectObject(this); - this._mainConnection = this._getMainConnection(); + this._mainConnection = + this._client.get_primary_connection() || + this._client.get_activating_connection(); if (this._mainConnection) { - this._mainConnection._primaryDevice?.connectObject('notify::icon-name', - this._updateIcon.bind(this), this); this._mainConnection.connectObject('notify::state', this._mainConnectionStateChanged.bind(this), this); this._mainConnectionStateChanged(); @@ -1963,24 +1936,19 @@ class Indicator extends PanelMenu.SystemIndicator { } _updateIcon() { - if (!this._client.networking_enabled) { - this._primaryIndicator.visible = false; - } else { - let dev = null; - if (this._mainConnection) - dev = this._mainConnection._primaryDevice; + const [dev] = this._mainConnection?.get_devices() ?? []; + const primarySection = this._deviceSections.get(dev?.device_type) ?? null; + this._primaryIndicatorBinding.source = primarySection; - let state = this._client.get_state(); - let connected = state == NM.State.CONNECTED_GLOBAL; - this._primaryIndicator.visible = (dev != null) || connected; - if (dev) { - this._primaryIndicator.icon_name = dev.icon_name; - } else if (connected) { - if (this._client.connectivity == NM.ConnectivityState.FULL) - this._primaryIndicator.icon_name = 'network-wired-symbolic'; - else - this._primaryIndicator.icon_name = 'network-wired-no-route-symbolic'; - } + if (!primarySection) { + if (this._client.connectivity === NM.ConnectivityState.FULL) + this._primaryIndicator.icon_name = 'network-wired-symbolic'; + else + this._primaryIndicator.icon_name = 'network-wired-no-route-symbolic'; } + + const state = this._client.get_state(); + const connected = state === NM.State.CONNECTED_GLOBAL; + this._primaryIndicator.visible = (primarySection != null) || connected; } });