[gnome-shell] altTab: fix app ordering in certain edge cases
- From: Owen Taylor <otaylor src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-shell] altTab: fix app ordering in certain edge cases
- Date: Mon, 17 Oct 2011 16:56:34 +0000 (UTC)
commit 928fbee15b7197b4257cb2ffec6e461a31471320
Author: Dan Winship <danw gnome org>
Date: Thu Jul 14 17:23:16 2011 -0400
altTab: fix app ordering in certain edge cases
Because we were sorting the Alt+Tab list by user_time rather than
stacking order / MRU, it was possible for the currently-focused window
to sometimes not be the first app in the list. Fix this by using
meta_display_get_tab_list() to get the proper MRU ordering of windows
on the current workspace, and then convert that to an ordered list of
apps.
https://bugzilla.gnome.org/show_bug.cgi?id=645026
js/ui/altTab.js | 75 +++++++++++++++++++++++++++++++++----------------------
1 files changed, 45 insertions(+), 30 deletions(-)
---
diff --git a/js/ui/altTab.js b/js/ui/altTab.js
index 09ffcbb..e17344f 100644
--- a/js/ui/altTab.js
+++ b/js/ui/altTab.js
@@ -134,11 +134,40 @@ AltTabPopup.prototype = {
}
},
- show : function(backward, binding, mask) {
+ _getAppLists: function() {
+ let tracker = Shell.WindowTracker.get_default();
let appSys = Shell.AppSystem.get_default();
- let apps = appSys.get_running ();
+ let allApps = appSys.get_running ();
+
+ let screen = global.screen;
+ let display = screen.get_display();
+ let windows = display.get_tab_list(Meta.TabList.NORMAL, screen,
+ screen.get_active_workspace());
+
+ // windows is only the windows on the current workspace. For
+ // each one, if it corresponds to an app we know, move that
+ // app from allApps to apps.
+ let apps = [];
+ for (let i = 0; i < windows.length && allApps.length != 0; i++) {
+ let app = tracker.get_window_app(windows[i]);
+ let index = allApps.indexOf(app);
+ if (index != -1) {
+ apps.push(app);
+ allApps.splice(index, 1);
+ }
+ }
+
+ // Now @apps is a list of apps on the current workspace, in
+ // standard Alt+Tab order (MRU except for minimized windows),
+ // and allApps is a list of apps that only appear on other
+ // workspaces, sorted by user_time, which is good enough.
+ return [apps, allApps];
+ },
- if (!apps.length)
+ show : function(backward, binding, mask) {
+ let [localApps, otherApps] = this._getAppLists();
+
+ if (localApps.length == 0 && otherApps.length == 0)
return false;
if (!Main.pushModal(this.actor))
@@ -152,7 +181,7 @@ AltTabPopup.prototype = {
this.actor.connect('button-press-event', Lang.bind(this, this._clickedOutside));
this.actor.connect('scroll-event', Lang.bind(this, this._onScroll));
- this._appSwitcher = new AppSwitcher(apps, this);
+ this._appSwitcher = new AppSwitcher(localApps, otherApps, this);
this.actor.add_actor(this._appSwitcher.actor);
this._appSwitcher.connect('item-activated', Lang.bind(this, this._appActivated));
this._appSwitcher.connect('item-entered', Lang.bind(this, this._appEntered));
@@ -846,33 +875,32 @@ AppIcon.prototype = {
}
};
-function AppSwitcher(apps, altTabPopup) {
- this._init(apps, altTabPopup);
+function AppSwitcher() {
+ this._init.apply(this, arguments);
}
AppSwitcher.prototype = {
__proto__ : SwitcherList.prototype,
- _init : function(apps, altTabPopup) {
+ _init : function(localApps, otherApps, altTabPopup) {
SwitcherList.prototype._init.call(this, true);
- // Construct the AppIcons, sort by time, add to the popup
+ // Construct the AppIcons, add to the popup
let activeWorkspace = global.screen.get_active_workspace();
let workspaceIcons = [];
let otherIcons = [];
- for (let i = 0; i < apps.length; i++) {
- let appIcon = new AppIcon(apps[i]);
+ for (let i = 0; i < localApps.length; i++) {
+ let appIcon = new AppIcon(localApps[i]);
// Cache the window list now; we don't handle dynamic changes here,
// and we don't want to be continually retrieving it
appIcon.cachedWindows = appIcon.app.get_windows();
- if (this._hasWindowsOnWorkspace(appIcon, activeWorkspace))
- workspaceIcons.push(appIcon);
- else
- otherIcons.push(appIcon);
+ workspaceIcons.push(appIcon);
+ }
+ for (let i = 0; i < otherApps.length; i++) {
+ let appIcon = new AppIcon(otherApps[i]);
+ appIcon.cachedWindows = appIcon.app.get_windows();
+ otherIcons.push(appIcon);
}
-
- workspaceIcons.sort(Lang.bind(this, this._sortAppIcon));
- otherIcons.sort(Lang.bind(this, this._sortAppIcon));
this.icons = [];
this._arrows = [];
@@ -1012,19 +1040,6 @@ AppSwitcher.prototype = {
if (appIcon.cachedWindows.length == 1)
arrow.hide();
- },
-
- _hasWindowsOnWorkspace: function(appIcon, workspace) {
- let windows = appIcon.cachedWindows;
- for (let i = 0; i < windows.length; i++) {
- if (windows[i].get_workspace() == workspace)
- return true;
- }
- return false;
- },
-
- _sortAppIcon : function(appIcon1, appIcon2) {
- return appIcon1.app.compare(appIcon2.app);
}
};
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]