From 20f49e8c8917bff0d6e17ba6218fcbaec3b016e9 Mon Sep 17 00:00:00 2001 From: Giovanni Campagna Date: Wed, 12 Jan 2011 16:00:54 +0100 Subject: [PATCH] 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 97789d802..c1baf2c8a 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 404a766cc..3813c62de 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(); + } + } +};