Compare commits
	
		
			4 Commits
		
	
	
		
			3.25.2
			...
			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