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>
This commit is contained in:
Georges Basile Stavracas Neto 2021-01-08 18:12:52 -03:00 committed by Marge Bot
parent cffad8b749
commit 08ac3c7750

View File

@ -771,11 +771,27 @@ class WorkspacesDisplay extends St.Widget {
if (event.is_pointer_emulated()) if (event.is_pointer_emulated())
return Clutter.EVENT_PROPAGATE; 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; let workspaceManager = global.workspace_manager;
const vertical = workspaceManager.layout_rows === -1; const vertical = workspaceManager.layout_rows === -1;
let activeWs = workspaceManager.get_active_workspace(); let activeWs = workspaceManager.get_active_workspace();
let ws; let ws;
switch (event.get_scroll_direction()) { switch (direction) {
case Clutter.ScrollDirection.UP: case Clutter.ScrollDirection.UP:
if (vertical) if (vertical)
ws = activeWs.get_neighbor(Meta.MotionDirection.UP); ws = activeWs.get_neighbor(Meta.MotionDirection.UP);