[gnome-shell-extensions] WindowList: allow switching windows with mouse scroll



commit a42dcee6ecae73dba077d33744874418bea7fc27
Author: Giovanni Campagna <gcampagna src gnome org>
Date:   Wed Feb 5 17:25:43 2014 +0100

    WindowList: allow switching windows with mouse scroll
    
    This is something that gnome-panel supported, and apparently
    some users would like to have it back, so restore this feature
    on our window list too.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=723693

 extensions/window-list/extension.js |   49 +++++++++++++++++++++++++++++++++++
 1 files changed, 49 insertions(+), 0 deletions(-)
---
diff --git a/extensions/window-list/extension.js b/extensions/window-list/extension.js
index a0f9a9f..714142c 100644
--- a/extensions/window-list/extension.js
+++ b/extensions/window-list/extension.js
@@ -219,6 +219,17 @@ const WindowButton = new Lang.Class({
         this._updateStyle();
     },
 
+    get active() {
+        return this.actor.has_style_class_name('focused');
+    },
+
+    activate: function() {
+        if (this.active)
+            return;
+
+        this._onClicked(this.actor, 1);
+    },
+
     _onClicked: function(actor, button) {
         if (this._contextMenu.isOpen) {
             this._contextMenu.close();
@@ -485,6 +496,17 @@ const AppButton = new Lang.Class({
 
     },
 
+    get active() {
+        return this.actor.has_style_class_name('focused');
+    },
+
+    activate: function() {
+        if (this.active)
+            return;
+
+        this._onClicked(this.actor, 1);
+    },
+
     _onClicked: function(actor, button) {
         let menuWasOpen = this._menu.isOpen;
         if (menuWasOpen)
@@ -724,6 +746,7 @@ const WindowList = new Lang.Class({
 
         let layout = new Clutter.BoxLayout({ homogeneous: true });
         this._windowList = new St.Widget({ style_class: 'window-list',
+                                           reactive: true,
                                            layout_manager: layout,
                                            x_align: Clutter.ActorAlign.START,
                                            x_expand: true,
@@ -750,6 +773,7 @@ const WindowList = new Lang.Class({
                                    Lang.bind(this, this._populateWindowList));
                 }
             }));
+        this._windowList.connect('scroll-event', Lang.bind(this, this._onScrollEvent));
 
        let indicatorsBox = new St.BoxLayout({ x_align: Clutter.ActorAlign.END });
        box.add(indicatorsBox);
@@ -833,6 +857,31 @@ const WindowList = new Lang.Class({
         this._groupingModeChanged();
     },
 
+    _onScrollEvent: function(actor, event) {
+        let direction = event.get_scroll_direction();
+        let diff = 0;
+        if (direction == Clutter.ScrollDirection.DOWN)
+            diff = 1;
+        else if (direction == Clutter.ScrollDirection.UP)
+            diff = -1;
+        else
+            return;
+
+        let children = this._windowList.get_children().map(function(actor) {
+            return actor._delegate;
+        });
+        let active = 0;
+        for (let i = 0; i < children.length; i++) {
+            if (children[i].active) {
+                active = i;
+                break;
+            }
+        }
+
+        active = Math.max(0, Math.min(active + diff, children.length-1));
+        children[active].activate();
+    },
+
     _groupingModeChanged: function() {
         this._groupingMode = this._settings.get_enum('grouping-mode');
         this._grouped = this._groupingMode == GroupingMode.ALWAYS;


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