[gnome-shell/gnome-3-34] appDisplay: Add a timeout when switching pages during DnD



commit 19bb459a57191a5685d17801ca43c316720ab6a8
Author: Jonas Dreßler <verdre v0yd nl>
Date:   Sat Nov 23 22:25:00 2019 +0100

    appDisplay: Add a timeout when switching pages during DnD
    
    Currently when dragging an icon to the space above or below the appGrid
    to switch pages, we do so very quickly without checking when the last
    page-switch happened. This makes it hard to move icons to pages which
    are not the first or the last one, since the other pages are skipped
    very quickly.
    
    To fix this, add a timeout of 1 second that blocks switching pages after
    a page-switch using drag overshoot occured.
    
    Fixes https://gitlab.gnome.org/GNOME/gnome-shell/issues/1693

 js/ui/appDisplay.js | 45 ++++++++++++++++++++++++++++++++-------------
 1 file changed, 32 insertions(+), 13 deletions(-)
---
diff --git a/js/ui/appDisplay.js b/js/ui/appDisplay.js
index 15faf04a80..49e6d58de8 100644
--- a/js/ui/appDisplay.js
+++ b/js/ui/appDisplay.js
@@ -41,6 +41,7 @@ var APP_ICON_SCALE_IN_TIME = 500;
 var APP_ICON_SCALE_IN_DELAY = 700;
 
 const OVERSHOOT_THRESHOLD = 20;
+const OVERSHOOT_TIMEOUT = 1000;
 
 const SWITCHEROO_BUS_NAME = 'net.hadess.SwitcherooControl';
 const SWITCHEROO_OBJECT_PATH = '/net/hadess/SwitcherooControl';
@@ -354,6 +355,7 @@ var AllView = class AllView extends BaseAppView {
         this._availHeight = 0;
 
         this._lastOvershootY = -1;
+        this._lastOvershootTimeoutId = 0;
 
         Main.overview.connect('hidden', () => this.goToPage(0));
         this._grid.connect('space-opened', () => {
@@ -747,6 +749,13 @@ var AllView = class AllView extends BaseAppView {
             this.folderIcons[i].adaptToSize(availWidth, availHeight);
     }
 
+    _resetOvershoot() {
+        if (this._lastOvershootTimeoutId)
+            GLib.source_remove(this._lastOvershootTimeoutId);
+        this._lastOvershootTimeoutId = 0;
+        this._lastOvershootY = -1;
+    }
+
     _handleDragOvershoot(dragEvent) {
         let [, gridY] = this.actor.get_transformed_position();
         let [, gridHeight] = this.actor.get_transformed_size();
@@ -760,7 +769,8 @@ var AllView = class AllView extends BaseAppView {
         if (dragEvent.y > gridY && dragEvent.y < gridBottom) {
             // Check whether we moved out the area of the last switch
             if (Math.abs(this._lastOvershootY - dragEvent.y) > OVERSHOOT_THRESHOLD)
-                this._lastOvershootY = -1;
+                this._resetOvershoot();
+
             return;
         }
 
@@ -768,20 +778,29 @@ var AllView = class AllView extends BaseAppView {
         if (this._lastOvershootY >= 0)
             return;
 
-        this._lastOvershootY = dragEvent.y;
-
-        // Moving above the grid
         let currentY = this._adjustment.value;
-        if (dragEvent.y <= gridY && currentY > 0) {
-            this.goToPage(this._grid.currentPage - 1);
-            return;
-        }
-
-        // Moving below the grid
         let maxY = this._adjustment.upper - this._adjustment.page_size;
-        if (dragEvent.y >= gridBottom && currentY < maxY) {
+
+        if (dragEvent.y <= gridY && currentY > 0)
+            this.goToPage(this._grid.currentPage - 1);
+        else if (dragEvent.y >= gridBottom && currentY < maxY)
             this.goToPage(this._grid.currentPage + 1);
-        }
+        else
+            return; // don't go beyond first/last page
+
+        this._lastOvershootY = dragEvent.y;
+
+        if (this._lastOvershootTimeoutId > 0)
+            GLib.source_remove(this._lastOvershootTimeoutId);
+
+        this._lastOvershootTimeoutId =
+            GLib.timeout_add(GLib.PRIORITY_DEFAULT, OVERSHOOT_TIMEOUT, () => {
+                this._resetOvershoot();
+                this._handleDragOvershoot(dragEvent);
+                return GLib.SOURCE_REMOVE;
+            });
+        GLib.Source.set_name_by_id(this._lastOvershootTimeoutId,
+            '[gnome-shell] this._lastOvershootTimeoutId');
     }
 
     _onDragBegin() {
@@ -815,7 +834,7 @@ var AllView = class AllView extends BaseAppView {
         }
 
         this._eventBlocker.visible = this._currentPopup !== null;
-        this._lastOvershootY = -1;
+        this._resetOvershoot();
     }
 
     _canAccept(source) {


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