[gnome-shell] status: Add new airplane mode indicator / menu



commit 6bd275669ded9c84a9017bc3f6d982a8d107eedf
Author: Jasper St. Pierre <jstpierre mecheye net>
Date:   Mon May 27 17:54:50 2013 -0400

    status: Add new airplane mode indicator / menu
    
    This is a simple indicator that shows if the user is currently in
    airplane mode, and if they are, offers a way to turn it off. It
    will not be shown if the user is not in airplane mode.
    
    This is a part of the new system status design, see
    https://wiki.gnome.org/GnomeShell/Design/Guidelines/SystemStatus/
    for design details.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=705845

 js/Makefile.am         |    1 +
 js/ui/panel.js         |    3 ++
 js/ui/status/rfkill.js |   58 ++++++++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 62 insertions(+), 0 deletions(-)
---
diff --git a/js/Makefile.am b/js/Makefile.am
index 5184bb2..e750db1 100644
--- a/js/Makefile.am
+++ b/js/Makefile.am
@@ -92,6 +92,7 @@ nobase_dist_js_DATA =         \
        ui/status/keyboard.js   \
        ui/status/network.js    \
        ui/status/power.js      \
+       ui/status/rfkill.js     \
        ui/status/volume.js     \
        ui/status/bluetooth.js  \
        ui/status/system.js     \
diff --git a/js/ui/panel.js b/js/ui/panel.js
index 16e8b6a..2eea063 100644
--- a/js/ui/panel.js
+++ b/js/ui/panel.js
@@ -853,11 +853,13 @@ const AggregateMenu = new Lang.Class({
         this._network = new imports.ui.status.network.NMApplet();
         this._bluetooth = new imports.ui.status.bluetooth.Indicator();
         this._power = new imports.ui.status.power.Indicator();
+        this._rfkill = new imports.ui.status.rfkill.Indicator();
         this._volume = new imports.ui.status.volume.Indicator();
         this._system = new imports.ui.status.system.Indicator();
 
         this._indicators.add_child(this._network.indicators);
         this._indicators.add_child(this._bluetooth.indicators);
+        this._indicators.add_child(this._rfkill.indicators);
         this._indicators.add_child(this._volume.indicators);
         this._indicators.add_child(this._power.indicators);
         this._indicators.add_child(new St.Label({ text: '\u25BE',
@@ -868,6 +870,7 @@ const AggregateMenu = new Lang.Class({
         this.menu.addMenuItem(new PopupMenu.PopupSeparatorMenuItem());
         this.menu.addMenuItem(this._network.menu);
         this.menu.addMenuItem(this._bluetooth.menu);
+        this.menu.addMenuItem(this._rfkill.menu);
         this.menu.addMenuItem(this._power.menu);
         this.menu.addMenuItem(new PopupMenu.PopupSeparatorMenuItem());
         this.menu.addMenuItem(this._system.menu);
diff --git a/js/ui/status/rfkill.js b/js/ui/status/rfkill.js
new file mode 100644
index 0000000..9628f2d
--- /dev/null
+++ b/js/ui/status/rfkill.js
@@ -0,0 +1,58 @@
+// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
+
+const Gio = imports.gi.Gio;
+const Lang = imports.lang;
+
+const PanelMenu = imports.ui.panelMenu;
+const PopupMenu = imports.ui.popupMenu;
+
+const BUS_NAME = 'org.gnome.SettingsDaemon.Rfkill';
+const OBJECT_PATH = '/org/gnome/SettingsDaemon/Rfkill';
+
+const RfkillManagerInterface = <interface name="org.gnome.SettingsDaemon.Rfkill">
+<property name="AirplaneMode" type="b" access="readwrite" />
+</interface>;
+
+const RfkillManagerProxy = Gio.DBusProxy.makeProxyWrapper(RfkillManagerInterface);
+
+const Indicator = new Lang.Class({
+    Name: 'RfkillIndicator',
+    Extends: PanelMenu.SystemIndicator,
+
+    _init: function() {
+        this.parent();
+
+        this._proxy = new RfkillManagerProxy(Gio.DBus.session, BUS_NAME, OBJECT_PATH,
+                                             Lang.bind(this, function(proxy, error) {
+                                                 if (error) {
+                                                     log(error.message);
+                                                     return;
+                                                 }
+                                                 this._proxy.connect('g-properties-changed',
+                                                                     Lang.bind(this, this._sync));
+                                                 this._sync();
+                                             }));
+
+        this._indicator = this._addIndicator();
+        this._indicator.icon_name = 'airplane-mode-symbolic';
+        this._indicator.hide();
+
+        // The menu only appears when airplane mode is on, so just
+        // statically build it as if it was on, rather than dynamically
+        // changing the menu contents.
+        this._item = new PopupMenu.PopupSubMenuMenuItem(_("Airplane Mode"), true);
+        this._item.icon.icon_name = 'airplane-mode-symbolic';
+        this._item.status.text = _("On");
+        this._item.menu.addAction(_("Turn Off"), Lang.bind(this, function() {
+            this._proxy.AirplaneMode = false;
+        }));
+        this._item.menu.addSettingsAction(_("Network Settings"), 'gnome-network-panel.desktop');
+        this.menu.addMenuItem(this._item);
+    },
+
+    _sync: function() {
+        let airplaneMode = this._proxy.AirplaneMode;
+        this._indicator.visible = airplaneMode;
+        this._item.actor.visible = airplaneMode;
+    },
+});


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