From a2a580954ac6b2c80592be1b0b68a2fe2b4fe625 Mon Sep 17 00:00:00 2001 From: Rui Matos Date: Fri, 29 Mar 2013 02:35:32 +0100 Subject: [PATCH] status/keyboard: Switch input source on special modifiers accelerator This simply mimics the X server's layout switching behavior by advancing to the next input source and wrapping around. https://bugzilla.gnome.org/show_bug.cgi?id=697008 --- js/ui/status/keyboard.js | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/js/ui/status/keyboard.js b/js/ui/status/keyboard.js index 0dbcc4ac4..903afe2dc 100644 --- a/js/ui/status/keyboard.js +++ b/js/ui/status/keyboard.js @@ -398,6 +398,8 @@ const InputSourceIndicator = new Lang.Class({ }); this._keyboardManager.g_default_timeout = MAX_INPUT_SOURCE_ACTIVATION_TIME; + global.display.connect('modifiers-accelerator-activated', Lang.bind(this, this._modifiersSwitcher)); + this.menu.addMenuItem(new PopupMenu.PopupSeparatorMenuItem()); this._showLayoutItem = this.menu.addAction(_("Show Keyboard Layout"), Lang.bind(this, this._showLayout)); @@ -431,6 +433,28 @@ const InputSourceIndicator = new Lang.Class({ this._inputSourcesChanged(); }, + _modifiersSwitcher: function() { + let sourceIndexes = Object.keys(this._inputSources); + if (sourceIndexes.length == 0) { + releaseKeyboard(); + return true; + } + + let is = this._currentSource; + if (!is) + is = this._inputSources[sourceIndexes[0]]; + + let nextIndex = is.index + 1; + if (nextIndex > sourceIndexes[sourceIndexes.length - 1]) + nextIndex = 0; + + while (!(is = this._inputSources[nextIndex])) + nextIndex += 1; + + is.activate(); + return true; + }, + _switchInputSource: function(display, screen, window, binding) { if (this._mruSources.length < 2) return;