[gnome-shell] KeyboardStatus: handle modifier key indicators



commit 20f49e8c8917bff0d6e17ba6218fcbaec3b016e9
Author: Giovanni Campagna <gcampagna src gnome org>
Date:   Wed Jan 12 16:00:54 2011 +0100

    KeyboardStatus: handle modifier key indicators
    
    Introduce a generic framework for on/off indicators that are shown
    in the panel, next to the system status area, and use it for
    showing the status of modifier keys.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=600771

 js/ui/panel.js           |   28 ++++++++++++++++------
 js/ui/status/keyboard.js |   55 +++++++++++++++++++++++++++++++++++++++++++--
 2 files changed, 72 insertions(+), 11 deletions(-)
---
diff --git a/js/ui/panel.js b/js/ui/panel.js
index 97789d8..c1baf2c 100644
--- a/js/ui/panel.js
+++ b/js/ui/panel.js
@@ -43,6 +43,10 @@ const STANDARD_TRAY_ICON_SHELL_IMPLEMENTATION = {
 if (Config.HAVE_BLUETOOTH)
     STANDARD_TRAY_ICON_SHELL_IMPLEMENTATION['bluetooth'] = imports.ui.status.bluetooth.Indicator;
 
+const STANDARD_TRAY_INDICATOR_FACTORIES = [
+    imports.ui.status.keyboard.ModifierIndicatorFactory
+];
+
 // in org.gnome.desktop.interface
 const CLOCK_FORMAT_KEY        = 'clock-format';
 
@@ -809,17 +813,18 @@ Panel.prototype = {
 
         /* right */
 
-        // System status applets live in statusBox, while legacy tray icons
+        // On-off indicators (for keyboard leds and accessx) are in indicatorBox
+        // System status applets live in statusBox, and legacy tray icons
         // live in trayBox
         // The trayBox is hidden when there are no tray icons.
-        let statusBox = new St.BoxLayout({ name: 'statusTray' });
-        let trayBox = new St.BoxLayout({ name: 'legacyTray' });
-        this._trayBox = trayBox;
-        this._statusBox = statusBox;
+        this._indicatorBox = new St.BoxLayout({ name: 'indicatorBox' });
+        this._trayBox = new St.BoxLayout({ name: 'legacyTray' });
+        this._statusBox = new St.BoxLayout({ name: 'statusTray' });
 
-        trayBox.hide();
-        this._rightBox.add(trayBox);
-        this._rightBox.add(statusBox);
+        this._trayBox.hide();
+        this._rightBox.add(this._indicatorBox);
+        this._rightBox.add(this._trayBox);
+        this._rightBox.add(this._statusBox);
 
         Main.statusIconDispatcher.connect('status-icon-added', Lang.bind(this, this._onTrayIconAdded));
         Main.statusIconDispatcher.connect('status-icon-removed', Lang.bind(this, this._onTrayIconRemoved));
@@ -869,6 +874,13 @@ Panel.prototype = {
     },
 
     startStatusArea: function() {
+        for (let i = 0; i < STANDARD_TRAY_INDICATOR_FACTORIES.length; i++) {
+            let factory = new STANDARD_TRAY_INDICATOR_FACTORIES[i];
+            let indicators = factory.getIndicators();
+            for (let j = 0; j < indicators.length; j++)
+                this._indicatorBox.add(indicators[j]);
+        }
+
         for (let i = 0; i < STANDARD_TRAY_ICON_ORDER.length; i++) {
             let role = STANDARD_TRAY_ICON_ORDER[i];
             let constructor = STANDARD_TRAY_ICON_SHELL_IMPLEMENTATION[role];
diff --git a/js/ui/status/keyboard.js b/js/ui/status/keyboard.js
index 404a766..3813c62 100644
--- a/js/ui/status/keyboard.js
+++ b/js/ui/status/keyboard.js
@@ -42,7 +42,7 @@ LayoutMenuItem.prototype = {
 };
 
 function XKBIndicator() {
-    this._init.apply(this, arguments);
+    this._init.call(this);
 }
 
 XKBIndicator.prototype = {
@@ -75,7 +75,7 @@ XKBIndicator.prototype = {
         this._sync_config();
 
         this.menu.addMenuItem(new PopupMenu.PopupSeparatorMenuItem());
-        this.menu.addAction(_("Keyboard Settings"), function() {
+        this.menu.addAction(_("Localization Settings"), function() {
             GLib.spawn_command_line_async('gnome-control-center region');
         });
     },
@@ -203,4 +203,53 @@ XKBIndicator.prototype = {
         for (let i = 0; i < this._labelActors.length; i++)
             this._labelActors[i].allocate_align_fill(box, 0.5, 0, false, false, flags);
     }
-};
\ No newline at end of file
+};
+
+function ModifierIndicatorFactory() {
+    this._init.call(this);
+}
+
+ModifierIndicatorFactory.prototype = {
+    _init: function() {
+        this._settings = new Gio.Settings({ schema: INDICATOR_SCHEMA });
+        this._settings.connect('changed::show-keyboard-leds-indicator', Lang.bind(this, this._changed));
+
+        this._config = Gkbd.Configuration.get();
+        this._config.connect('indicators-changed', Lang.bind(this, this._changed));
+
+        this._scrollLock = new St.Icon({ icon_name: 'kbdled-scroll-lock', icon_type: St.IconType.SYMBOLIC, style_class: 'system-status-icon' });
+        this._numLock = new St.Icon({ icon_name: 'kbdled-num-lock', icon_type: St.IconType.SYMBOLIC, style_class: 'system-status-icon' });
+        this._capsLock = new St.Icon({ icon_name: 'kbdled-caps-lock', icon_type: St.IconType.SYMBOLIC, style_class: 'system-status-icon' });
+
+        this._changed();
+    },
+
+    getIndicators: function() {
+        return [this._scrollLock, this._numLock, this._capsLock];
+    },
+
+    _changed: function() {
+        let enable = this._settings.get_boolean('show-keyboard-leds-indicator');
+
+        if (enable) {
+            if (this._config.get_scroll_lock_state())
+                this._scrollLock.show();
+            else
+                this._scrollLock.hide();
+
+            if (this._config.get_num_lock_state())
+                this._numLock.show();
+            else
+                this._numLock.hide();
+
+            if (this._config.get_caps_lock_state())
+                this._capsLock.show();
+            else
+                this._capsLock.hide();
+        } else {
+            this._scrollLock.hide();
+            this._numLock.hide();
+            this._capsLock.hide();
+        }
+    }
+};



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