From 1af392b5f0a7ddbbafcd31718c503ee0f4620411 Mon Sep 17 00:00:00 2001 From: Colin Walters Date: Thu, 6 May 2010 13:36:01 -0400 Subject: [PATCH] Allow selection of individual windows Per design discussion, change things back so that when choosing an individual window, we raise only that window. However when we select an application, raise all windows. A behavioral change required to clearly differentiate these is that when the window thumbnail list is popped up, it no longer has the first window selected by default. Therefore the user has to explicitly press the down arrow or use the mouse to enter individual window selection mode. https://bugzilla.gnome.org/show_bug.cgi?id=617959 --- js/ui/altTab.js | 60 ++++++++++++++++++++++++++++++++----------------- 1 file changed, 40 insertions(+), 20 deletions(-) diff --git a/js/ui/altTab.js b/js/ui/altTab.js index 5146f50f1..1a0e80a44 100644 --- a/js/ui/altTab.js +++ b/js/ui/altTab.js @@ -46,7 +46,7 @@ AltTabPopup.prototype = { this._haveModal = false; this._currentApp = 0; - this._currentWindow = 0; + this._currentWindow = -1; this._thumbnailTimeoutId = 0; this._motionTimeoutId = 0; @@ -164,8 +164,9 @@ AltTabPopup.prototype = { this._select(0, 1, true); else this._select(1); - } else + } else { this._select(1); + } } // There's a race condition; if the user released Alt before @@ -190,10 +191,16 @@ AltTabPopup.prototype = { }, _nextWindow : function() { + // We actually want the second window if we're in the unset state + if (this._currentWindow == -1) + this._currentWindow = 0; return mod(this._currentWindow + 1, this._appIcons[this._currentApp].cachedWindows.length); }, _previousWindow : function() { + // Also assume second window here + if (this._currentWindow == -1) + this._currentWindow = 1; return mod(this._currentWindow - 1, this._appIcons[this._currentApp].cachedWindows.length); }, @@ -213,7 +220,7 @@ AltTabPopup.prototype = { this.destroy(); else if (this._thumbnailsFocused) { if (keysym == Clutter.Tab) { - if (shift && this._currentWindow == 0) + if (shift && (this._currentWindow == 0 || this._currentWindow == -1)) this._select(this._previousApp()); else if (!shift && this._currentWindow == this._appIcons[this._currentApp].cachedWindows.length - 1) this._select(this._nextApp()); @@ -233,7 +240,7 @@ AltTabPopup.prototype = { else if (keysym == Clutter.Right || keysym == Clutter.d) this._select(this._nextApp()); else if (keysym == Clutter.Down || keysym == Clutter.s) - this._select(this._currentApp, this._currentWindow); + this._select(this._currentApp, 0); } return true; @@ -252,7 +259,7 @@ AltTabPopup.prototype = { let direction = event.get_scroll_direction(); if (direction == Clutter.ScrollDirection.UP) { if (this._thumbnailsFocused) { - if (this._currentWindow == 0) + if (this._currentWindow == 0 || this._currentWindow == -1) this._select(this._previousApp()); else this._select(this._currentApp, this._previousWindow()); @@ -286,12 +293,17 @@ AltTabPopup.prototype = { _appActivated : function(appSwitcher, n) { // If the user clicks on the selected app, activate the // selected window; otherwise (eg, they click on an app while - // !mouseActive) activate the first window of the clicked-on - // app. - let appIcon = this._appIcons[n]; - let windowIndex = (n == this._currentApp) ? this._currentWindow : 0; - let window = appIcon.cachedWindows[windowIndex]; - appIcon.app.activate_window(window, global.get_current_time()); + // !mouseActive) activate the the clicked-on app. + if (n == this._currentApp) { + let window; + if (this._currentWindow >= 0) + window = this._appIcons[this._currentApp].cachedWindows[this._currentWindow]; + else + window = null; + this._appIcons[this._currentApp].app.activate_window(window, global.get_current_time()); + } else { + this._appIcons[n].app.activate_window(null, global.get_current_time()); + } this.destroy(); }, @@ -304,7 +316,7 @@ AltTabPopup.prototype = { _windowActivated : function(thumbnailList, n) { let appIcon = this._appIcons[this._currentApp]; - appIcon.app.activate_window(appIcon.cachedWindows[n]); + Main.activateWindow(appIcon.cachedWindows[n]); this.destroy(); }, @@ -330,9 +342,12 @@ AltTabPopup.prototype = { }, _finish : function() { - let appIcon = this._appIcons[this._currentApp]; - let window = appIcon.cachedWindows[this._currentWindow]; - appIcon.app.activate_window(window, global.get_current_time()); + let app = this._appIcons[this._currentApp]; + if (this._currentWindow >= 0) { + Main.activateWindow(app.cachedWindows[this._currentWindow]); + } else { + app.app.activate_window(null, global.get_current_time()); + } this.destroy(); }, @@ -397,7 +412,7 @@ AltTabPopup.prototype = { this._thumbnailsFocused = (window != null) && !forceAppFocus; this._currentApp = app; - this._currentWindow = window ? window : 0; + this._currentWindow = window ? window : -1; this._appSwitcher.highlight(app, this._thumbnailsFocused); if (window != null) { @@ -409,13 +424,18 @@ AltTabPopup.prototype = { !forceAppFocus) { this._thumbnailTimeoutId = Mainloop.timeout_add ( THUMBNAIL_POPUP_TIME, - Lang.bind(this, function () { - this._select(this._currentApp, 0, true); - return false; - })); + Lang.bind(this, this._timeoutPopupThumbnails)); } }, + _timeoutPopupThumbnails: function() { + if (!this._thumbnails) + this._createThumbnails(); + this._thumbnailTimeoutId = 0; + this._thumbnailsFocused = false; + return false; + }, + _destroyThumbnails : function() { Tweener.addTween(this._thumbnails.actor, { opacity: 0,