[gnome-shell/cherry-pick-1685c779] workspacesView: Update scroll position but not workspace on allocate




commit 02af01cefc8fdbaf713a2103e49ee7d657bd1370
Author: Jonas Ã…dahl <jadahl gmail com>
Date:   Fri Dec 18 15:21:58 2020 +0000

    workspacesView: Update scroll position but not workspace on allocate
    
    Not updating the scroll position on allocate caused a glitch, where a
    window on a workspace that is not the first one would would be
    transparent for one frame when showing the overview.
    
    Closes: https://gitlab.gnome.org/GNOME/gnome-shell/-/issues/3507
    
    
    (cherry picked from commit 1685c77931e390e7736caf6b0577bc48b0e62a4f)
    
    Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1564>

 js/ui/workspacesView.js | 31 +++++++++++++------------------
 1 file changed, 13 insertions(+), 18 deletions(-)
---
diff --git a/js/ui/workspacesView.js b/js/ui/workspacesView.js
index 4a11f08889..2cc8b04897 100644
--- a/js/ui/workspacesView.js
+++ b/js/ui/workspacesView.js
@@ -78,11 +78,10 @@ class WorkspacesView extends WorkspacesViewBase {
 
         this._animating = false; // tweening
         this._gestureActive = false; // touch(pad) gestures
-        this._updateScrollPositionId = 0;
 
         this._scrollAdjustment = scrollAdjustment;
         this._onScrollId = this._scrollAdjustment.connect('notify::value',
-            this._updateScrollPosition.bind(this));
+            this._onScrollAdjustmentChanged.bind(this));
 
         this._workspaces = [];
         this._updateWorkspaces();
@@ -125,14 +124,7 @@ class WorkspacesView extends WorkspacesViewBase {
             child.allocate_available_size(x, y, box.get_width(), box.get_height());
         });
 
-        // Update scroll position in an idle callback to avoid unintended
-        // side effects (e.g. workspace switch) during layout.
-        this._updateScrollPositionId =
-            GLib.idle_add(GLib.PRIORITY_DEFAULT, () => {
-                this._updateScrollPositionId = 0;
-                this._updateScrollPosition();
-                return GLib.SOURCE_REMOVE;
-            });
+        this._updateScrollPosition();
     }
 
     getActiveWorkspace() {
@@ -235,8 +227,6 @@ class WorkspacesView extends WorkspacesViewBase {
     _onDestroy() {
         super._onDestroy();
 
-        if (this._updateScrollPositionId)
-            GLib.source_remove(this._updateScrollPositionId);
         this._scrollAdjustment.disconnect(this._onScrollId);
         global.window_manager.disconnect(this._switchWorkspaceNotifyId);
         let workspaceManager = global.workspace_manager;
@@ -260,15 +250,10 @@ class WorkspacesView extends WorkspacesViewBase {
 
     // sync the workspaces' positions to the value of the scroll adjustment
     // and change the active workspace if appropriate
-    _updateScrollPosition() {
+    _onScrollAdjustmentChanged() {
         if (!this.has_allocation())
             return;
 
-        if (this._updateScrollPositionId) {
-            GLib.source_remove(this._updateScrollPositionId);
-            this._updateScrollPositionId = 0;
-        }
-
         const adj = this._scrollAdjustment;
         const allowSwitch =
             adj.get_transition('value') === null && !this._gestureActive;
@@ -291,9 +276,19 @@ class WorkspacesView extends WorkspacesViewBase {
             metaWorkspace.activate(global.get_current_time());
         }
 
+        this._updateScrollPosition();
+    }
+
+    _updateScrollPosition() {
+        if (!this.has_allocation())
+            return;
+
+        const adj = this._scrollAdjustment;
+
         if (adj.upper == 1)
             return;
 
+        const workspaceManager = global.workspace_manager;
         const vertical = workspaceManager.layout_rows === -1;
         const rtl = this.text_direction === Clutter.TextDirection.RTL;
         const progress = vertical || !rtl


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