[gnome-shell] workspaces-view: Handle swipe scolling in workspacesDisplay



commit a634f25d30b18edda7aef77ea45952575948aff2
Author: Florian MÃllner <fmuellner gnome org>
Date:   Mon Nov 28 17:51:53 2011 +0100

    workspaces-view: Handle swipe scolling in workspacesDisplay
    
    If workspaces-only-on-primary is false, swipe scrolling is now
    broken with multiple monitors. To fix, let workspacesDisplay
    handle swipe scrolling for all views.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=652580

 js/ui/workspacesView.js |  103 +++++++++++++++++++++++++++++++---------------
 1 files changed, 69 insertions(+), 34 deletions(-)
---
diff --git a/js/ui/workspacesView.js b/js/ui/workspacesView.js
index c314b25..91565fd 100644
--- a/js/ui/workspacesView.js
+++ b/js/ui/workspacesView.js
@@ -42,8 +42,6 @@ const WorkspacesView = new Lang.Class({
                 this._spacing = node.get_length('spacing');
                 this._updateWorkspaceActors(false);
             }));
-        this.actor.connect('notify::mapped',
-                           Lang.bind(this, this._onMappedChanged));
 
         this._width = 0;
         this._height = 0;
@@ -97,14 +95,14 @@ const WorkspacesView = new Lang.Class({
                                     this._clipWidth, this._clipHeight);
         }));
 
-        this._scrollAdjustment = new St.Adjustment({ value: activeWorkspaceIndex,
-                                                     lower: 0,
-                                                     page_increment: 1,
-                                                     page_size: 1,
-                                                     step_increment: 0,
-                                                     upper: this._workspaces.length });
-        this._scrollAdjustment.connect('notify::value',
-                                       Lang.bind(this, this._onScroll));
+        this.scrollAdjustment = new St.Adjustment({ value: activeWorkspaceIndex,
+                                                    lower: 0,
+                                                    page_increment: 1,
+                                                    page_size: 1,
+                                                    step_increment: 0,
+                                                    upper: this._workspaces.length });
+        this.scrollAdjustment.connect('notify::value',
+                                      Lang.bind(this, this._onScroll));
 
         this._switchWorkspaceNotifyId =
             global.window_manager.connect('switch-workspace',
@@ -118,8 +116,6 @@ const WorkspacesView = new Lang.Class({
                                                         Lang.bind(this, this._dragBegin));
         this._windowDragEndId = Main.overview.connect('window-drag-end',
                                                       Lang.bind(this, this._dragEnd));
-        this._swipeScrollBeginId = 0;
-        this._swipeScrollEndId = 0;
     },
 
     _updateExtraWorkspaces: function() {
@@ -290,7 +286,7 @@ const WorkspacesView = new Lang.Class({
         this._animatingScroll = true;
 
         if (showAnimation) {
-            Tweener.addTween(this._scrollAdjustment, {
+            Tweener.addTween(this.scrollAdjustment, {
                value: index,
                time: WORKSPACE_SWITCH_TIME,
                transition: 'easeOutQuad',
@@ -300,7 +296,7 @@ const WorkspacesView = new Lang.Class({
                    })
             });
         } else {
-            this._scrollAdjustment.value = index;
+            this.scrollAdjustment.value = index;
             this._animatingScroll = false;
         }
     },
@@ -308,7 +304,7 @@ const WorkspacesView = new Lang.Class({
     updateWorkspaces: function(oldNumWorkspaces, newNumWorkspaces) {
         let active = global.screen.get_active_workspace_index();
 
-        Tweener.addTween(this._scrollAdjustment,
+        Tweener.addTween(this.scrollAdjustment,
                          { upper: newNumWorkspaces,
                            time: WORKSPACE_SWITCH_TIME,
                            transition: 'easeOutQuad'
@@ -336,7 +332,7 @@ const WorkspacesView = new Lang.Class({
 
     _onDestroy: function() {
         this._destroyExtraWorkspaces();
-        this._scrollAdjustment.run_dispose();
+        this.scrollAdjustment.run_dispose();
         Main.overview.disconnect(this._overviewShowingId);
         Main.overview.disconnect(this._overviewShownId);
         global.window_manager.disconnect(this._switchWorkspaceNotifyId);
@@ -363,21 +359,6 @@ const WorkspacesView = new Lang.Class({
         }
     },
 
-    _onMappedChanged: function() {
-        if (this.actor.mapped) {
-            let direction = Overview.SwipeScrollDirection.VERTICAL;
-            Main.overview.setScrollAdjustment(this._scrollAdjustment,
-                                              direction);
-            this._swipeScrollBeginId = Main.overview.connect('swipe-scroll-begin',
-                                                             Lang.bind(this, this._swipeScrollBegin));
-            this._swipeScrollEndId = Main.overview.connect('swipe-scroll-end',
-                                                           Lang.bind(this, this._swipeScrollEnd));
-        } else {
-            Main.overview.disconnect(this._swipeScrollBeginId);
-            Main.overview.disconnect(this._swipeScrollEndId);
-        }
-    },
-
     _dragBegin: function() {
         if (this._scrolling)
             return;
@@ -422,11 +403,11 @@ const WorkspacesView = new Lang.Class({
             this._extraWorkspaces[i].setReservedSlot(null);
     },
 
-    _swipeScrollBegin: function() {
+    startSwipeScroll: function() {
         this._scrolling = true;
     },
 
-    _swipeScrollEnd: function(overview, result) {
+    endSwipeScroll: function(result) {
         this._scrolling = false;
 
         if (result == Overview.SwipeScrollResult.CLICK) {
@@ -496,6 +477,7 @@ const WorkspacesDisplay = new Lang.Class({
         this.actor.connect('get-preferred-width', Lang.bind(this, this._getPreferredWidth));
         this.actor.connect('get-preferred-height', Lang.bind(this, this._getPreferredHeight));
         this.actor.connect('allocate', Lang.bind(this, this._allocate));
+        this.actor.connect('notify::mapped', Lang.bind(this, this._setupSwipeScrolling));
         this.actor.connect('parent-set', Lang.bind(this, this._parentSet));
         this.actor.set_clip_to_allocation(true);
 
@@ -519,6 +501,7 @@ const WorkspacesDisplay = new Lang.Class({
         controls.add_actor(this._thumbnailsBox.actor);
 
         this._workspacesViews = null;
+        this._primaryScrollAdjustment = null;
 
         this._settings = new Gio.Settings({ schema: OVERRIDE_SCHEMA });
         this._settings.connect('changed::workspaces-only-on-primary',
@@ -558,6 +541,8 @@ const WorkspacesDisplay = new Lang.Class({
         this._windowDragCancelledId = 0;
         this._windowDragEndId = 0;
         this._notifyOpacityId = 0;
+        this._swipeScrollBeginId = 0;
+        this._swipeScrollEndId = 0;
     },
 
     show: function() {
@@ -649,6 +634,33 @@ const WorkspacesDisplay = new Lang.Class({
             }
     },
 
+    _setupSwipeScrolling: function() {
+        if (this._swipeScrollBeginId)
+            Main.overview.disconnect(this._swipeScrollBeginId);
+        this._swipeScrollBeginId = 0;
+
+        if (this._swipeScrollEndId)
+            Main.overview.disconnect(this._swipeScrollEndId);
+        this._swipeScrollEndId = 0;
+
+        if (!this.actor.mapped)
+            return;
+
+        let direction = Overview.SwipeScrollDirection.VERTICAL;
+        Main.overview.setScrollAdjustment(this._scrollAdjustment,
+                                          direction);
+        this._swipeScrollBeginId = Main.overview.connect('swipe-scroll-begin',
+            Lang.bind(this, function() {
+                for (let i = 0; i < this._workspacesViews.length; i++)
+                    this._workspacesViews[i].startSwipeScroll();
+            }));
+        this._swipeScrollEndId = Main.overview.connect('swipe-scroll-end',
+           Lang.bind(this, function(overview, result) {
+                for (let i = 0; i < this._workspacesViews.length; i++)
+                    this._workspacesViews[i].endSwipeScroll(result);
+           }));
+    },
+
     _workspacesOnlyOnPrimaryChanged: function() {
         this._workspacesOnlyOnPrimary = this._settings.get_boolean('workspaces-only-on-primary');
 
@@ -682,7 +694,15 @@ const WorkspacesDisplay = new Lang.Class({
             }
 
             this._workspaces.push(monitorWorkspaces);
-            this._workspacesViews.push(new WorkspacesView(monitorWorkspaces));
+
+            let view = new WorkspacesView(monitorWorkspaces);
+            if (this._workspacesOnlyOnPrimary || i == this._primaryIndex) {
+                this._scrollAdjustment = view.scrollAdjustment;
+                this._scrollAdjustment.connect('notify::value',
+                                               Lang.bind(this, this._scrollValueChanged));
+                this._setupSwipeScrolling();
+            }
+            this._workspacesViews.push(view);
         }
 
         this._updateWorkspacesGeometry();
@@ -691,6 +711,21 @@ const WorkspacesDisplay = new Lang.Class({
             global.overlay_group.add_actor(this._workspacesViews[i].actor);
     },
 
+    _scrollValueChanged: function() {
+        if (this._workspacesOnlyOnPrimary)
+            return;
+
+        for (let i = 0; i < this._workspacesViews.length; i++) {
+            if (i == this._primaryIndex)
+                continue;
+
+            let adjustment = this._workspacesViews[i].scrollAdjustment;
+            // the adjustments work in terms of workspaces, so the
+            // values map directly
+            adjustment.value = this._scrollAdjustment.value;
+        }
+    },
+
     _getPrimaryView: function() {
         if (!this._workspacesViews)
             return null;



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