[gnome-shell/wip/exalm/gestures-part-2: 2/3] appDisplay: Don't allow mouse scrolling while animating



commit a5a11ead564eb3cd9e69c7809ff347aae268c918
Author: Alexander Mikhaylenko <alexm gnome org>
Date:   Wed Oct 16 12:30:14 2019 +0500

    appDisplay: Don't allow mouse scrolling while animating
    
    Prevent uncontrollably fast scrolling. Use the same duration as switching
    animation, but add a separate timeout to account for disabled animations.
    
    https://gitlab.gnome.org/GNOME/gnome-shell/issues/1338
    
    https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/825

 js/ui/appDisplay.js | 24 ++++++++++++++++++++++++
 1 file changed, 24 insertions(+)
---
diff --git a/js/ui/appDisplay.js b/js/ui/appDisplay.js
index 1bc1373354..887dcc8f32 100644
--- a/js/ui/appDisplay.js
+++ b/js/ui/appDisplay.js
@@ -363,6 +363,9 @@ var AllView = GObject.registerClass({
         this._displayingPopup = false;
         this._currentPopupDestroyId = 0;
 
+        this._canScroll = true; // limiting scrolling speed
+        this._scrollTimeoutId = 0;
+
         this._availWidth = 0;
         this._availHeight = 0;
 
@@ -392,6 +395,15 @@ var AllView = GObject.registerClass({
         Main.overview.connect('item-drag-end', this._onDragEnd.bind(this));
 
         this._nEventBlockerInhibits = 0;
+
+        this.connect('destroy', this._onDestroy.bind(this));
+    }
+
+    _onDestroy() {
+        if (this._scrollTimeoutId != 0) {
+            GLib.source_remove(this._scrollTimeoutId);
+            this._scrollTimeoutId = 0;
+        }
     }
 
     vfunc_map() {
@@ -621,11 +633,23 @@ var AllView = GObject.registerClass({
         if (this._displayingPopup || !this._scrollView.reactive)
             return Clutter.EVENT_STOP;
 
+        if (!this._canScroll)
+            return Clutter.EVENT_STOP;
+
         let direction = event.get_scroll_direction();
         if (direction == Clutter.ScrollDirection.UP)
             this.goToPage(this._grid.currentPage - 1);
         else if (direction == Clutter.ScrollDirection.DOWN)
             this.goToPage(this._grid.currentPage + 1);
+        else
+            return Clutter.EVENT_STOP;
+
+        this._canScroll = false;
+        this._scrollTimeoutId = GLib.timeout_add(GLib.PRIORITY_DEFAULT, PAGE_SWITCH_TIME, () => {
+            this._canScroll = true;
+            this._scrollTimeoutId = 0;
+            return GLib.SOURCE_REMOVE;
+        });
 
         return Clutter.EVENT_STOP;
     }


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