[gnome-shell] altTab: Take over cycle-windows/cycle-group keybindings



commit bd6e7f14d17b945cc6ae43fff859a4ee3bca934b
Author: Florian Müllner <fmuellner gnome org>
Date:   Thu May 19 14:41:24 2016 +0200

    altTab: Take over cycle-windows/cycle-group keybindings
    
    The code to handle cycling through windows without showing a popup
    was removed from mutter a while ago, which left the corresponding
    keybindings mostly broken (i.e. they now only switch between two
    windows). With the various switch-foo keybindings handled by the
    shell, it is now easier to take over the cycle-foo keybindings as
    well.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=730739

 js/ui/altTab.js        |   79 ++++++++++++++++++++++++++++++++++++++++++++++++
 js/ui/windowManager.js |   34 ++++++++++++++++++++
 2 files changed, 113 insertions(+), 0 deletions(-)
---
diff --git a/js/ui/altTab.js b/js/ui/altTab.js
index 7029bf7..cf1174b 100644
--- a/js/ui/altTab.js
+++ b/js/ui/altTab.js
@@ -354,6 +354,59 @@ const AppSwitcherPopup = new Lang.Class({
     }
 });
 
+const CyclerPopup = new Lang.Class({
+    Name: 'CyclerPopup',
+    Extends: SwitcherPopup.SwitcherPopup,
+    Abstract: true,
+
+    _init : function() {
+        this.parent();
+
+        this._items = this._getWindows();
+
+        if (this._items.length == 0)
+            return;
+
+        // We don't show an actual popup, so just provide what SwitcherPopup
+        // expects instead of inheriting from SwitcherList
+        this._switcherList = { actor: new St.Widget(),
+                               highlight: Lang.bind(this, this._highlightItem),
+                               connect: function() {} };
+    },
+
+    _highlightItem: function(index, justOutline) {
+        Main.activateWindow(this._items[index]);
+    },
+
+    _finish: function() {
+        this._highlightItem(this._selectedIndex);
+
+        this.parent();
+    }
+});
+
+
+const GroupCyclerPopup = new Lang.Class({
+    Name: 'GroupCyclerPopup',
+    Extends: CyclerPopup,
+
+    _getWindows: function() {
+        let app = Shell.WindowTracker.get_default().focus_app;
+        return app ? app.get_windows() : [];
+    },
+
+    _keyPressHandler: function(keysym, action) {
+        if (action == Meta.KeyBindingAction.CYCLE_GROUP)
+            this._select(this._next());
+        else if (action == Meta.KeyBindingAction.CYCLE_GROUP_BACKWARD)
+            this._select(this._previous());
+        else
+            return Clutter.EVENT_PROPAGATE;
+
+        return Clutter.EVENT_STOP;
+    }
+});
+
 const WindowSwitcherPopup = new Lang.Class({
     Name: 'WindowSwitcherPopup',
     Extends: SwitcherPopup.SwitcherPopup,
@@ -401,6 +454,32 @@ const WindowSwitcherPopup = new Lang.Class({
     }
 });
 
+const WindowCyclerPopup = new Lang.Class({
+    Name: 'WindowCyclerPopup',
+    Extends: CyclerPopup,
+
+    _init: function() {
+        this._settings = new Gio.Settings({ schema_id: 'org.gnome.shell.window-switcher' });
+        this.parent();
+    },
+
+    _getWindows: function() {
+        let workspace = this._settings.get_boolean('current-workspace-only') ? 
global.screen.get_active_workspace() : null;
+        return global.display.get_tab_list(Meta.TabList.NORMAL, workspace);
+    },
+
+    _keyPressHandler: function(keysym, action) {
+        if (action == Meta.KeyBindingAction.CYCLE_WINDOWS)
+            this._select(this._next());
+        else if (action == Meta.KeyBindingAction.CYCLE_WINDOWS_BACKWARD)
+            this._select(this._previous());
+        else
+            return Clutter.EVENT_PROPAGATE;
+
+        return Clutter.EVENT_STOP;
+    }
+});
+
 const AppIcon = new Lang.Class({
     Name: 'AppIcon',
 
diff --git a/js/ui/windowManager.js b/js/ui/windowManager.js
index bb54d83..f8aef2d 100644
--- a/js/ui/windowManager.js
+++ b/js/ui/windowManager.js
@@ -866,6 +866,18 @@ const WindowManager = new Lang.Class({
         this.setCustomKeybindingHandler('switch-windows-backward',
                                         Shell.ActionMode.NORMAL,
                                         Lang.bind(this, this._startWindowSwitcher));
+        this.setCustomKeybindingHandler('cycle-windows',
+                                        Shell.ActionMode.NORMAL,
+                                        Lang.bind(this, this._startWindowCycler));
+        this.setCustomKeybindingHandler('cycle-windows-backward',
+                                        Shell.ActionMode.NORMAL,
+                                        Lang.bind(this, this._startWindowCycler));
+        this.setCustomKeybindingHandler('cycle-group',
+                                        Shell.ActionMode.NORMAL,
+                                        Lang.bind(this, this._startGroupCycler));
+        this.setCustomKeybindingHandler('cycle-group-backward',
+                                        Shell.ActionMode.NORMAL,
+                                        Lang.bind(this, this._startGroupCycler));
         this.setCustomKeybindingHandler('switch-panels',
                                         Shell.ActionMode.NORMAL |
                                         Shell.ActionMode.OVERVIEW |
@@ -1766,6 +1778,28 @@ const WindowManager = new Lang.Class({
             tabPopup.destroy();
     },
 
+    _startWindowCycler : function(display, screen, window, binding) {
+        /* prevent a corner case where both popups show up at once */
+        if (this._workspaceSwitcherPopup != null)
+            this._workspaceSwitcherPopup.destroy();
+
+        let tabPopup = new AltTab.WindowCyclerPopup();
+
+        if (!tabPopup.show(binding.is_reversed(), binding.get_name(), binding.get_mask()))
+            tabPopup.destroy();
+    },
+
+    _startGroupCycler : function(display, screen, window, binding) {
+        /* prevent a corner case where both popups show up at once */
+        if (this._workspaceSwitcherPopup != null)
+            this._workspaceSwitcherPopup.destroy();
+
+        let tabPopup = new AltTab.GroupCyclerPopup();
+
+        if (!tabPopup.show(binding.is_reversed(), binding.get_name(), binding.get_mask()))
+            tabPopup.destroy();
+    },
+
     _startA11ySwitcher : function(display, screen, window, binding) {
         Main.ctrlAltTabManager.popup(binding.is_reversed(), binding.get_name(), binding.get_mask());
     },


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]