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
This commit is contained in:
parent
d6a6e6220a
commit
20f49e8c89
@ -43,6 +43,10 @@ const STANDARD_TRAY_ICON_SHELL_IMPLEMENTATION = {
|
|||||||
if (Config.HAVE_BLUETOOTH)
|
if (Config.HAVE_BLUETOOTH)
|
||||||
STANDARD_TRAY_ICON_SHELL_IMPLEMENTATION['bluetooth'] = imports.ui.status.bluetooth.Indicator;
|
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
|
// in org.gnome.desktop.interface
|
||||||
const CLOCK_FORMAT_KEY = 'clock-format';
|
const CLOCK_FORMAT_KEY = 'clock-format';
|
||||||
|
|
||||||
@ -809,17 +813,18 @@ Panel.prototype = {
|
|||||||
|
|
||||||
/* right */
|
/* 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
|
// live in trayBox
|
||||||
// The trayBox is hidden when there are no tray icons.
|
// The trayBox is hidden when there are no tray icons.
|
||||||
let statusBox = new St.BoxLayout({ name: 'statusTray' });
|
this._indicatorBox = new St.BoxLayout({ name: 'indicatorBox' });
|
||||||
let trayBox = new St.BoxLayout({ name: 'legacyTray' });
|
this._trayBox = new St.BoxLayout({ name: 'legacyTray' });
|
||||||
this._trayBox = trayBox;
|
this._statusBox = new St.BoxLayout({ name: 'statusTray' });
|
||||||
this._statusBox = statusBox;
|
|
||||||
|
|
||||||
trayBox.hide();
|
this._trayBox.hide();
|
||||||
this._rightBox.add(trayBox);
|
this._rightBox.add(this._indicatorBox);
|
||||||
this._rightBox.add(statusBox);
|
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-added', Lang.bind(this, this._onTrayIconAdded));
|
||||||
Main.statusIconDispatcher.connect('status-icon-removed', Lang.bind(this, this._onTrayIconRemoved));
|
Main.statusIconDispatcher.connect('status-icon-removed', Lang.bind(this, this._onTrayIconRemoved));
|
||||||
@ -869,6 +874,13 @@ Panel.prototype = {
|
|||||||
},
|
},
|
||||||
|
|
||||||
startStatusArea: function() {
|
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++) {
|
for (let i = 0; i < STANDARD_TRAY_ICON_ORDER.length; i++) {
|
||||||
let role = STANDARD_TRAY_ICON_ORDER[i];
|
let role = STANDARD_TRAY_ICON_ORDER[i];
|
||||||
let constructor = STANDARD_TRAY_ICON_SHELL_IMPLEMENTATION[role];
|
let constructor = STANDARD_TRAY_ICON_SHELL_IMPLEMENTATION[role];
|
||||||
|
@ -42,7 +42,7 @@ LayoutMenuItem.prototype = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
function XKBIndicator() {
|
function XKBIndicator() {
|
||||||
this._init.apply(this, arguments);
|
this._init.call(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
XKBIndicator.prototype = {
|
XKBIndicator.prototype = {
|
||||||
@ -75,7 +75,7 @@ XKBIndicator.prototype = {
|
|||||||
this._sync_config();
|
this._sync_config();
|
||||||
|
|
||||||
this.menu.addMenuItem(new PopupMenu.PopupSeparatorMenuItem());
|
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');
|
GLib.spawn_command_line_async('gnome-control-center region');
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
@ -204,3 +204,52 @@ XKBIndicator.prototype = {
|
|||||||
this._labelActors[i].allocate_align_fill(box, 0.5, 0, false, false, flags);
|
this._labelActors[i].allocate_align_fill(box, 0.5, 0, false, false, flags);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
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();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
Loading…
Reference in New Issue
Block a user