[gnome-shell] workspacesView/workspacesDisplay: Handle smooth events



commit 08ac3c775002c0b3ac2481b4dca6f37713e9718a
Author: Georges Basile Stavracas Neto <georges stavracas gmail com>
Date:   Fri Jan 8 18:12:52 2021 -0300

    workspacesView/workspacesDisplay: Handle smooth events
    
    On X11, the scroll handler can receive smooth events, which should
    trigger a workspace switch. Handle smooth events by checking their
    scroll delta, and adjusting the direction depending on these deltas.
    
    Fixes: https://gitlab.gnome.org/GNOME/mutter/-/issues/1614
    Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1603>

 js/ui/workspacesView.js | 18 +++++++++++++++++-
 1 file changed, 17 insertions(+), 1 deletion(-)
---
diff --git a/js/ui/workspacesView.js b/js/ui/workspacesView.js
index 8fc21c40df..99a1e65973 100644
--- a/js/ui/workspacesView.js
+++ b/js/ui/workspacesView.js
@@ -771,11 +771,27 @@ class WorkspacesDisplay extends St.Widget {
         if (event.is_pointer_emulated())
             return Clutter.EVENT_PROPAGATE;
 
+        let direction = event.get_scroll_direction();
+        if (direction === Clutter.ScrollDirection.SMOOTH) {
+            const [dx, dy] = event.get_scroll_delta();
+            if (Math.abs(dx) > Math.abs(dy)) {
+                direction = dx < 0
+                    ? Clutter.ScrollDirection.RIGHT
+                    : Clutter.ScrollDirection.LEFT;
+            } else if (Math.abs(dy) > Math.abs(dx)) {
+                direction = dy < 0
+                    ? Clutter.ScrollDirection.UP
+                    : Clutter.ScrollDirection.DOWN;
+            } else {
+                return Clutter.EVENT_PROPAGATE;
+            }
+        }
+
         let workspaceManager = global.workspace_manager;
         const vertical = workspaceManager.layout_rows === -1;
         let activeWs = workspaceManager.get_active_workspace();
         let ws;
-        switch (event.get_scroll_direction()) {
+        switch (direction) {
         case Clutter.ScrollDirection.UP:
             if (vertical)
                 ws = activeWs.get_neighbor(Meta.MotionDirection.UP);


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