Friday, November 25, 2011

[hackpatch] Single workspace Alt+Tab / Alt+~ in Gnome3

The default alt+tab functionality in GNOME3 displays all apps and windows from all workspace. This probably is cool for non-power user who just use workspace to keep their current view uncluttered.

However for people like me who launch tens of windows and apps, and work with multiple project at once, and rely on the workspace to keep us in context with the project, the all workspace alt+tab is one heck of a confusing feature. This is especially true when I have multiple reference documents, and several browser windows opened, where some are meant for ProjectA, and some are meant for ProjectB. Any mistakes in alt+tab will cause me to get lost trying to go back to the right workspace, and the automatic reordering of alt+tab app icons based on last focus added the confusion even more, forcing me to stop for a while to find my bearing.

Anyway created a patch to make alt+tab showing only windows of current workspace.  Its quite rough, but good enough to keep my sanity.

WARNING: Things might break, use at your own risk, you have been warned.

--- /usr/share/gnome-shell/js/ui/altTab.js.old 2011-11-25 10:21:14.161993561 +0800
+++ /usr/share/gnome-shell/js/ui/altTab.js 2011-11-25 21:12:04.178685966 +0800
@@ -161,7 +161,7 @@
         // 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];
+        return [apps, []]; //allApps];
     },
 
     show : function(backward, binding, mask) {
@@ -893,7 +893,14 @@
             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();
+            let appWindows = appIcon.app.get_windows();
+            let cachedWindows = [];
+            for (let w = 0; w < appWindows.length; w++) {
+                if (appWindows[w].get_workspace() == activeWorkspace){
+                   cachedWindows.push(appWindows[w]);
+                }
+            }
+            appIcon.cachedWindows = cachedWindows;
             workspaceIcons.push(appIcon);
         }
         for (let i = 0; i < otherApps.length; i++) {
@@ -1066,6 +1073,9 @@
         this._windows = windows;
 
         for (let i = 0; i < windows.length; i++) {
+            if (windows[i].get_workspace() != activeWorkspace) {
+              continue;
+            }
             if (!separatorAdded && windows[i].get_workspace() != activeWorkspace) {
               this.addSeparator();
               separatorAdded = true;

Pastebin: http://pastebin.ca/2095832

Probably its better to turn this into an extension, but the modification is too little to justify that at the moment.

Update : Dont display dropdown arrow if theres only 1 window of app in current workspace
Post a Comment
Locations of visitors to this page