diff --git a/extensions/alternate-tab/extension.js b/extensions/alternate-tab/extension.js index c872f5c4..09e1d6c2 100644 --- a/extensions/alternate-tab/extension.js +++ b/extensions/alternate-tab/extension.js @@ -23,21 +23,26 @@ const Gettext = imports.gettext.domain('gnome-shell-extensions'); const _ = Gettext.gettext; const N_ = function(e) { return e }; -const POPUP_FADE_TIME = 0.1; // seconds +const POPUP_DELAY_TIMEOUT = 150; // milliseconds const SETTINGS_SCHEMA = 'org.gnome.shell.extensions.alternate-tab'; const SETTINGS_BEHAVIOUR_KEY = 'behaviour'; const SETTINGS_FIRST_TIME_KEY = 'first-time'; const MODES = { - native: function() { - Main.wm._startAppSwitcher(); + native: function(shellwm, binding, mask, window, backwards) { + shellwm._startAppSwitcher(shellwm, binding, mask, window, backwards); }, all_thumbnails: function() { new AltTabPopup2(); }, - workspace_icons: function() { - new AltTabPopupW().show(); + workspace_icons: function(shellwm, binding, mask, window, backwards) { + if (shellwm._workspaceSwitcherPopup != null) + shellwm._workspaceSwitcherPopup.actor.hide(); + + let tabPopup = new AltTabPopupW(); + if (!tabPopup.show(backwards, binding, mask)) + tabPopup.destroy(); } }; @@ -68,7 +73,9 @@ function AltTabPopupW() { AltTabPopupW.prototype = { __proto__ : AltTab.AltTabPopup.prototype, - show : function(backward, switch_group) { + _windowActivated : function(thumbnailList, n) { }, + + show : function(backward, binding, mask) { let appSys = Shell.AppSystem.get_default(); let apps = appSys.get_running (); @@ -78,6 +85,7 @@ AltTabPopupW.prototype = { if (!Main.pushModal(this.actor)) return false; this._haveModal = true; + this._modifierMask = AltTab.primaryModifier(mask); this.actor.connect('key-press-event', Lang.bind(this, this._keyPressEvent)); this.actor.connect('key-release-event', Lang.bind(this, this._keyReleaseEvent)); @@ -92,16 +100,22 @@ AltTabPopupW.prototype = { this._appIcons = this._appSwitcher.icons; + // Need to force an allocation so we can figure out whether we + // need to scroll when selecting + this.actor.opacity = 0; + this.actor.show(); + this.actor.get_allocation_box(); + // Make the initial selection - if (switch_group) { - if (backward) { - this._select(0, this._appIcons[0].cachedWindows.length - 1); - } else { - if (this._appIcons[0].cachedWindows.length > 1) - this._select(0, 1); - else - this._select(0, 0); - } + if (binding == 'switch_group') { + //see AltTab.AltTabPopup.show function + //cached windows are always of length one, so select first app and the window + //the direction doesn't matter, so ignore backward + this._select(0, 0); + } else if (binding == 'switch_group_backward') { + this._select(0, 0); + } else if (binding == 'switch_windows_backward') { + this._select(this._appIcons.length - 1); } else if (this._appIcons.length == 1) { this._select(0); } else if (backward) { @@ -110,24 +124,25 @@ AltTabPopupW.prototype = { this._select(1); } + // There's a race condition; if the user released Alt before // we got the grab, then we won't be notified. (See // https://bugzilla.gnome.org/show_bug.cgi?id=596695 for // details.) So we check now. (Have to do this after updating // selection.) let [x, y, mods] = global.get_pointer(); - if (!(mods & Gdk.ModifierType.MOD1_MASK)) { + if (!(mods & this._modifierMask)) { this._finish(); return false; } - this.actor.opacity = 0; - this.actor.show(); - Tweener.addTween(this.actor, - { opacity: 255, - time: POPUP_FADE_TIME, - transition: 'easeOutQuad' - }); + // We delay showing the popup so that fast Alt+Tab users aren't + // disturbed by the popup briefly flashing. + this._initialDelayTimeoutId = Mainloop.timeout_add(POPUP_DELAY_TIMEOUT, + Lang.bind(this, function () { + this.actor.opacity = 255; + this._initialDelayTimeoutId = 0; + })); return true; }, @@ -545,15 +560,16 @@ function init(metadata) { imports.gettext.bindtextdomain('gnome-shell-extensions', metadata.localedir); } -function doAltTab(shellwm, binding, window, backwards) { +function doAltTab(shellwm, binding, mask, window, backwards) { let settings = new Gio.Settings({ schema: SETTINGS_SCHEMA }); + if(settings.get_boolean(SETTINGS_FIRST_TIME_KEY)) { new AltTabSettingsDialog().open(); } else { let behaviour = settings.get_string(SETTINGS_BEHAVIOUR_KEY); if(behaviour in MODES) { - MODES[behaviour](binding, backwards); + MODES[behaviour](shellwm, binding, mask, window, backwards); } } } @@ -570,4 +586,4 @@ function disable() { Main.wm.setKeybindingHandler('switch_group', Lang.bind(Main.wm, Main.wm._startAppSwitcher)); Main.wm.setKeybindingHandler('switch_windows_backward', Lang.bind(Main.wm, Main.wm._startAppSwitcher)); Main.wm.setKeybindingHandler('switch_group_backward', Lang.bind(Main.wm, Main.wm._startAppSwitcher)); -} \ No newline at end of file +}