[gnome-shell] NetworkMenu: rework multiple NIC support



commit 490206b5b23649017859b9cb6d534cce1855d6dd
Author: Giovanni Campagna <gcampagna src gnome org>
Date:   Wed Aug 29 19:42:11 2012 +0200

    NetworkMenu: rework multiple NIC support
    
    Remove section titles for ethernet and mobile broadband, and replace
    them with device status items that recognize if multiple devices are
    installed in the same section, and if so automatically disambiguate.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=677142

 configure.ac            |    6 ++-
 js/misc/util.js         |   80 ----------------------------
 js/ui/status/network.js |  132 +++++++++++++++++-----------------------------
 3 files changed, 53 insertions(+), 165 deletions(-)
---
diff --git a/configure.ac b/configure.ac
index d3755cf..7427370 100644
--- a/configure.ac
+++ b/configure.ac
@@ -78,6 +78,7 @@ STARTUP_NOTIFICATION_MIN_VERSION=0.11
 GCR_MIN_VERSION=3.3.90
 GNOME_DESKTOP_REQUIRED_VERSION=3.7.1
 GNOME_MENUS_REQUIRED_VERSION=3.5.3
+NETWORKMANAGER_MIN_VERSION=0.9.7
 
 # Collect more than 20 libraries for a prize!
 PKG_CHECK_MODULES(GNOME_SHELL, gio-unix-2.0 >= $GIO_MIN_VERSION
@@ -98,8 +99,9 @@ PKG_CHECK_MODULES(GNOME_SHELL, gio-unix-2.0 >= $GIO_MIN_VERSION
                                telepathy-glib >= $TELEPATHY_GLIB_MIN_VERSION
                                telepathy-logger-0.2 >= $TELEPATHY_LOGGER_MIN_VERSION
                                polkit-agent-1 >= $POLKIT_MIN_VERSION xfixes
-                               libnm-glib libnm-util gnome-keyring-1
-                               gcr-3 >= $GCR_MIN_VERSION)
+                               libnm-glib libnm-util >= $NETWORKMANAGER_MIN_VERSION
+                               libnm-gtk >= $NETWORKMANAGER_MIN_VERSION
+                               gnome-keyring-1 gcr-3 >= $GCR_MIN_VERSION)
 
 PKG_CHECK_MODULES(SHELL_PERF_HELPER, gtk+-3.0 gio-2.0)
 
diff --git a/js/misc/util.js b/js/misc/util.js
index fb936c9..98c2310 100644
--- a/js/misc/util.js
+++ b/js/misc/util.js
@@ -159,86 +159,6 @@ function killall(processName) {
     }
 }
 
-// This was ported from network-manager-applet
-// Copyright 2007 - 2011 Red Hat, Inc.
-// Author: Dan Williams <dcbw redhat com>
-
-const _IGNORED_WORDS = [
-        'Semiconductor',
-        'Components',
-        'Corporation',
-        'Communications',
-        'Company',
-        'Corp.',
-        'Corp',
-        'Co.',
-        'Inc.',
-        'Inc',
-        'Incorporated',
-        'Ltd.',
-        'Limited.',
-        'Intel',
-        'chipset',
-        'adapter',
-        '[hex]',
-        'NDIS',
-        'Module'
-];
-
-const _IGNORED_PHRASES = [
-        'Multiprotocol MAC/baseband processor',
-        'Wireless LAN Controller',
-        'Wireless LAN Adapter',
-        'Wireless Adapter',
-        'Network Connection',
-        'Wireless Cardbus Adapter',
-        'Wireless CardBus Adapter',
-        '54 Mbps Wireless PC Card',
-        'Wireless PC Card',
-        'Wireless PC',
-        'PC Card with XJACK(r) Antenna',
-        'Wireless cardbus',
-        'Wireless LAN PC Card',
-        'Technology Group Ltd.',
-        'Communication S.p.A.',
-        'Business Mobile Networks BV',
-        'Mobile Broadband Minicard Composite Device',
-        'Mobile Communications AB',
-        '(PC-Suite Mode)'
-];
-
-function fixupPCIDescription(desc) {
-    desc = desc.replace(/[_,]/, ' ');
-
-    /* Attempt to shorten ID by ignoring certain phrases */
-    for (let i = 0; i < _IGNORED_PHRASES.length; i++) {
-        let item = _IGNORED_PHRASES[i];
-        let pos = desc.indexOf(item);
-        if (pos != -1) {
-            let before = desc.substring(0, pos);
-            let after = desc.substring(pos + item.length, desc.length);
-            desc = before + after;
-        }
-    }
-
-    /* Attmept to shorten ID by ignoring certain individual words */
-    let words = desc.split(' ');
-    let out = [ ];
-    for (let i = 0; i < words.length; i++) {
-        let item = words[i];
-
-        // skip empty items (that come out from consecutive spaces)
-        if (item.length == 0)
-            continue;
-
-        if (_IGNORED_WORDS.indexOf(item) == -1) {
-            out.push(item);
-        }
-    }
-
-    return out.join(' ');
-}
-
 // lowerBound:
 // @array: an array or array-like object, already sorted
 //         according to @cmp
diff --git a/js/ui/status/network.js b/js/ui/status/network.js
index 5e4c472..9da066d 100644
--- a/js/ui/status/network.js
+++ b/js/ui/status/network.js
@@ -5,6 +5,7 @@ const Gio = imports.gi.Gio;
 const Lang = imports.lang;
 const NetworkManager = imports.gi.NetworkManager;
 const NMClient = imports.gi.NMClient;
+const NMGtk = imports.gi.NMGtk;
 const Signals = imports.signals;
 const St = imports.gi.St;
 
@@ -139,46 +140,6 @@ const NMNetworkMenuItem = new Lang.Class({
     }
 });
 
-const NMWiredSectionTitleMenuItem = new Lang.Class({
-    Name: 'NMWiredSectionTitleMenuItem',
-    Extends: PopupMenu.PopupSwitchMenuItem,
-
-    _init: function(label, params) {
-        params = params || { };
-        params.style_class = 'popup-subtitle-menu-item';
-        this.parent(label, false, params);
-    },
-
-    updateForDevice: function(device) {
-        if (device) {
-            this._device = device;
-            this.setStatus(device.getStatusLabel());
-            this.setToggleState(device.connected);
-        } else
-            this.setStatus('');
-    },
-
-    activate: function(event) {
-        this.parent(event);
-
-        if (!this._device) {
-            log('Section title activated when there is more than one device, should be non reactive');
-            return;
-        }
-
-        let newState = this._switch.state;
-
-        let ok;
-        if (newState)
-            ok = this._device.activate();
-        else
-            ok = this._device.deactivate();
-
-        if (!ok)
-            this._switch.setToggleState(false);
-    }
-});
-
 const NMWirelessSectionTitleMenuItem = new Lang.Class({
     Name: 'NMWirelessSectionTitleMenuItem',
     Extends: PopupMenu.PopupSwitchMenuItem,
@@ -351,7 +312,7 @@ const NMDevice = new Lang.Class({
         this._autoConnectionItem = null;
         this._overflowItem = null;
 
-        this.statusItem = new PopupMenu.PopupSwitchMenuItem(this._getDescription(), this.connected, { style_class: 'popup-subtitle-menu-item' });
+        this.statusItem = new PopupMenu.PopupSwitchMenuItem('', this.connected, { style_class: 'popup-subtitle-menu-item' });
         this._statusChanged = this.statusItem.connect('toggled', Lang.bind(this, function(item, state) {
             let ok;
             if (state)
@@ -512,6 +473,10 @@ const NMDevice = new Lang.Class({
         }
     },
 
+    syncDescription: function() {
+        this.statusItem.label.text = this.device._description;
+    },
+
     // protected
     _createAutomaticConnection: function() {
         throw new TypeError('Invoking pure virtual function NMDevice.createAutomaticConnection');
@@ -639,25 +604,6 @@ const NMDevice = new Lang.Class({
         this.statusItem.setStatus(this.getStatusLabel());
 
         this.emit('state-changed');
-    },
-
-    _getDescription: function() {
-        let dev_product = this.device.get_product();
-        let dev_vendor = this.device.get_vendor();
-        if (!dev_product || !dev_vendor)
-	    return '';
-
-        let product = Util.fixupPCIDescription(dev_product);
-        let vendor = Util.fixupPCIDescription(dev_vendor);
-        let out = '';
-
-        // Another quick hack; if all of the fixed up vendor string
-        // is found in product, ignore the vendor.
-        if (product.indexOf(vendor) == -1)
-            out += vendor + ' ';
-        out += product;
-
-        return out;
     }
 });
 
@@ -867,10 +813,6 @@ const NMDeviceBluetooth = new Lang.Class({
         this._clearSection();
         this._queueCreateSection();
         this._updateStatusItem();
-    },
-
-    _getDescription: function() {
-        return this.device.name || _("Bluetooth");
     }
 });
 
@@ -1651,15 +1593,14 @@ const NMApplet = new Lang.Class({
         this._mobileUpdateId = 0;
         this._mobileUpdateDevice = null;
 
+        this._nmDevices = [];
         this._devices = { };
 
         this._devices.wired = {
             section: new PopupMenu.PopupMenuSection(),
             devices: [ ],
-            item: new NMWiredSectionTitleMenuItem(_("Wired"))
         };
 
-        this._devices.wired.section.addMenuItem(this._devices.wired.item);
         this._devices.wired.section.actor.hide();
         this.menu.addMenuItem(this._devices.wired.section);
         this.menu.addMenuItem(new PopupMenu.PopupSeparatorMenuItem());
@@ -1667,7 +1608,7 @@ const NMApplet = new Lang.Class({
         this._devices.wireless = {
             section: new PopupMenu.PopupMenuSection(),
             devices: [ ],
-            item: this._makeToggleItem('wireless', _("Wireless"))
+            item: this._makeToggleItem('wireless', _("Wi-Fi"))
         };
         this._devices.wireless.section.addMenuItem(this._devices.wireless.item);
         this._devices.wireless.section.actor.hide();
@@ -1677,9 +1618,7 @@ const NMApplet = new Lang.Class({
         this._devices.wwan = {
             section: new PopupMenu.PopupMenuSection(),
             devices: [ ],
-            item: this._makeToggleItem('wwan', _("Mobile broadband"))
         };
-        this._devices.wwan.section.addMenuItem(this._devices.wwan.item);
         this._devices.wwan.section.actor.hide();
         this.menu.addMenuItem(this._devices.wwan.section);
         this.menu.addMenuItem(new PopupMenu.PopupSeparatorMenuItem());
@@ -1762,16 +1701,23 @@ const NMApplet = new Lang.Class({
             section.actor.hide();
         else {
             section.actor.show();
-            if (devices.length == 1) {
-                let dev = devices[0];
-                dev.statusItem.actor.hide();
-                item.updateForDevice(dev);
-            } else {
-                devices.forEach(function(dev) {
-                    dev.statusItem.actor.show();
-                });
-                // remove status text from the section title item
-                item.updateForDevice(null);
+
+            // Sync the relation between the section title
+            // item (the one with the airplane mode switch)
+            // and the individual device switches
+            if (item) {
+                if (devices.length == 1) {
+                    let dev = devices[0];
+                    dev.statusItem.actor.hide();
+                    item.updateForDevice(dev);
+                } else {
+                    devices.forEach(function(dev) {
+                        dev.statusItem.actor.show();
+                    });
+
+                    // remove status text from the section title item
+                    item.updateForDevice(null);
+                }
             }
         }
     },
@@ -1779,8 +1725,9 @@ const NMApplet = new Lang.Class({
     _readDevices: function() {
         let devices = this._client.get_devices() || [ ];
         for (let i = 0; i < devices.length; ++i) {
-            this._deviceAdded(this._client, devices[i]);
+            this._deviceAdded(this._client, devices[i], true);
         }
+        this._syncDeviceNames();
     },
 
     _notifyForDevice: function(device, iconName, title, text, urgency) {
@@ -1828,7 +1775,18 @@ const NMApplet = new Lang.Class({
         return wrapper;
     },
 
-    _deviceAdded: function(client, device) {
+    _syncDeviceNames: function() {
+        let names = NMGtk.utils_disambiguate_device_names(this._nmDevices);
+        for (let i = 0; i < this._nmDevices.length; i++) {
+            let device = this._nmDevices[i];
+            if (device._description != names[i]) {
+                device._description = names[i];
+                device._delegate.syncDescription();
+            }
+        }
+    },
+
+    _deviceAdded: function(client, device, skipSyncDeviceNames) {
         if (device._delegate) {
             // already seen, not adding again
             return;
@@ -1839,10 +1797,14 @@ const NMApplet = new Lang.Class({
             let section = this._devices[wrapper.category].section;
             let devices = this._devices[wrapper.category].devices;
 
-            section.addMenuItem(wrapper.section, 1);
-            section.addMenuItem(wrapper.statusItem, 1);
+            section.addMenuItem(wrapper.statusItem);
+            section.addMenuItem(wrapper.section);
             devices.push(wrapper);
 
+            this._nmDevices.push(device);
+            if (!skipSyncDeviceNames)
+                this._syncDeviceNames();
+
             this._syncSectionTitle(wrapper.category);
         }
     },
@@ -1860,6 +1822,10 @@ const NMApplet = new Lang.Class({
         let pos = devices.indexOf(wrapper);
         devices.splice(pos, 1);
 
+        pos = this._nmDevices.indexOf(device);
+        this._nmDevices.splice(pos, 1);
+        this._syncDeviceNames();
+
         this._syncSectionTitle(wrapper.category)
     },
 



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]