Compare commits
	
		
			4 Commits
		
	
	
		
			wip/carlos
			...
			wip/is-swi
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|   | 11bf65e2b4 | ||
|   | a8b7e559aa | ||
|   | b733e30a4a | ||
|   | b607958134 | 
| @@ -33,6 +33,36 @@ const KEY_INPUT_SOURCES = 'sources'; | ||||
| const INPUT_SOURCE_TYPE_XKB = 'xkb'; | ||||
| const INPUT_SOURCE_TYPE_IBUS = 'ibus'; | ||||
|  | ||||
| // This is longest we'll keep the keyboard frozen until an input | ||||
| // source is active. | ||||
| const MAX_INPUT_SOURCE_ACTIVATION_TIME = 2000; // ms | ||||
|  | ||||
| const BUS_NAME = 'org.gnome.SettingsDaemon.Keyboard'; | ||||
| const OBJECT_PATH = '/org/gnome/SettingsDaemon/Keyboard'; | ||||
|  | ||||
| const KeyboardManagerInterface = | ||||
| <interface name="org.gnome.SettingsDaemon.Keyboard"> | ||||
| <method name="SetInputSource"> | ||||
|     <arg type="u" direction="in" /> | ||||
| </method> | ||||
| </interface>; | ||||
|  | ||||
| const KeyboardManagerProxy = Gio.DBusProxy.makeProxyWrapper(KeyboardManagerInterface); | ||||
|  | ||||
| function releaseKeyboard() { | ||||
|     if (Main.modalCount > 0) | ||||
|         global.display.unfreeze_keyboard(global.get_current_time()); | ||||
|     else | ||||
|         global.display.ungrab_keyboard(global.get_current_time()); | ||||
| } | ||||
|  | ||||
| function holdKeyboard() { | ||||
|     if (Main.modalCount > 0) | ||||
|         global.display.freeze_keyboard(global.get_current_time()); | ||||
|     else | ||||
|         global.display.grab_keyboard(global.get_current_time()); | ||||
| } | ||||
|  | ||||
| const IBusManager = new Lang.Class({ | ||||
|     Name: 'IBusManager', | ||||
|  | ||||
| @@ -230,6 +260,7 @@ const InputSource = new Lang.Class({ | ||||
|     }, | ||||
|  | ||||
|     activate: function() { | ||||
|         holdKeyboard(); | ||||
|         this.emit('activate'); | ||||
|     }, | ||||
| }); | ||||
| @@ -262,11 +293,11 @@ const InputSourcePopup = new Lang.Class({ | ||||
|         this._select(this._selectedIndex); | ||||
|     }, | ||||
|  | ||||
|     _keyPressHandler: function(keysym, backwards, action) { | ||||
|     _keyPressHandler: function(keysym, _ignored, action) { | ||||
|         if (action == this._action) | ||||
|             this._select(backwards ? this._previous() : this._next()); | ||||
|             this._select(this._next()); | ||||
|         else if (action == this._actionBackward) | ||||
|             this._select(backwards ? this._next() : this._previous()); | ||||
|             this._select(this._previous()); | ||||
|         else if (keysym == Clutter.Left) | ||||
|             this._select(this._previous()); | ||||
|         else if (keysym == Clutter.Right) | ||||
| @@ -336,15 +367,14 @@ const InputSourceIndicator = new Lang.Class({ | ||||
|         this._keybindingAction = | ||||
|             Main.wm.addKeybinding('switch-input-source', | ||||
|                                   new Gio.Settings({ schema: "org.gnome.desktop.wm.keybindings" }), | ||||
|                                   Meta.KeyBindingFlags.REVERSES, | ||||
|                                   Shell.KeyBindingMode.ALL & ~Shell.KeyBindingMode.MESSAGE_TRAY, | ||||
|                                   Meta.KeyBindingFlags.NONE, | ||||
|                                   Shell.KeyBindingMode.ALL, | ||||
|                                   Lang.bind(this, this._switchInputSource)); | ||||
|         this._keybindingActionBackward = | ||||
|             Main.wm.addKeybinding('switch-input-source-backward', | ||||
|                                   new Gio.Settings({ schema: "org.gnome.desktop.wm.keybindings" }), | ||||
|                                   Meta.KeyBindingFlags.REVERSES | | ||||
|                                   Meta.KeyBindingFlags.REVERSED, | ||||
|                                   Shell.KeyBindingMode.ALL & ~Shell.KeyBindingMode.MESSAGE_TRAY, | ||||
|                                   Meta.KeyBindingFlags.NONE, | ||||
|                                   Shell.KeyBindingMode.ALL, | ||||
|                                   Lang.bind(this, this._switchInputSource)); | ||||
|         this._settings = new Gio.Settings({ schema: DESKTOP_INPUT_SOURCES_SCHEMA }); | ||||
|         this._settings.connect('changed::' + KEY_CURRENT_INPUT_SOURCE, Lang.bind(this, this._currentInputSourceChanged)); | ||||
| @@ -364,6 +394,13 @@ const InputSourceIndicator = new Lang.Class({ | ||||
|         this._ibusManager.connect('property-updated', Lang.bind(this, this._ibusPropertyUpdated)); | ||||
|         this._inputSourcesChanged(); | ||||
|  | ||||
|         this._keyboardManager = new KeyboardManagerProxy(Gio.DBus.session, BUS_NAME, OBJECT_PATH, | ||||
|                                                          function(proxy, error) { | ||||
|                                                              if (error) | ||||
|                                                                  log(error.message); | ||||
|                                                          }); | ||||
|         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)); | ||||
|  | ||||
| @@ -397,13 +434,44 @@ const InputSourceIndicator = new Lang.Class({ | ||||
|         this._inputSourcesChanged(); | ||||
|     }, | ||||
|  | ||||
|     _modifiersSwitcher: function() { | ||||
|         let sourceIndexes = Object.keys(this._inputSources); | ||||
|         if (sourceIndexes.length == 0) { | ||||
|             releaseKeyboard(); | ||||
|             return; | ||||
|         } | ||||
|  | ||||
|         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(); | ||||
|     }, | ||||
|  | ||||
|     _switchInputSource: function(display, screen, window, binding) { | ||||
|         if (this._mruSources.length < 2) | ||||
|             return; | ||||
|  | ||||
|         // HACK: Fall back on simple input source switching since we | ||||
|         // can't show a popup switcher while the message tray is up | ||||
|         // without considerable work to consolidate the usage of | ||||
|         // pushModal/popModal and grabHelper. See | ||||
|         // https://bugzilla.gnome.org/show_bug.cgi?id=695143 . | ||||
|         if (Main.keybindingMode == Shell.KeyBindingMode.MESSAGE_TRAY) { | ||||
|             this._modifiersSwitcher(); | ||||
|             return; | ||||
|         } | ||||
|  | ||||
|         let popup = new InputSourcePopup(this._mruSources, this._keybindingAction, this._keybindingActionBackward); | ||||
|         let modifiers = binding.get_modifiers(); | ||||
|         let backwards = modifiers & Meta.VirtualModifier.SHIFT_MASK; | ||||
|         let backwards = false;  // Not using this | ||||
|         if (!popup.show(backwards, binding.get_name(), binding.get_mask())) | ||||
|             popup.destroy(); | ||||
|     }, | ||||
| @@ -487,10 +555,10 @@ const InputSourceIndicator = new Lang.Class({ | ||||
|             let is = new InputSource(type, id, displayName, shortName, i); | ||||
|  | ||||
|             is.connect('activate', Lang.bind(this, function() { | ||||
|                 if (this._currentSource && this._currentSource.index == is.index) | ||||
|                     return; | ||||
|                 this._settings.set_value(KEY_CURRENT_INPUT_SOURCE, | ||||
|                                          GLib.Variant.new_uint32(is.index)); | ||||
|                 let inVariant = new GLib.Variant('(u)', [is.index]); | ||||
|                 this._keyboardManager.call('SetInputSource', inVariant, 0, | ||||
|                                            MAX_INPUT_SOURCE_ACTIVATION_TIME, | ||||
|                                            null, releaseKeyboard); | ||||
|             })); | ||||
|  | ||||
|             if (!(is.shortName in inputSourcesByShortName)) | ||||
|   | ||||
		Reference in New Issue
	
	Block a user