From d6e5e137879129f5d663254a12e83a73e85fb9b4 Mon Sep 17 00:00:00 2001 From: Lucas Alber Date: Wed, 7 Jan 2026 17:21:02 +0100 Subject: [PATCH 1/2] Switch windows with Super+Scroll --- patches.js | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/patches.js b/patches.js index 743da7f7c..13ae6301f 100644 --- a/patches.js +++ b/patches.js @@ -16,7 +16,7 @@ import * as WindowManager from 'resource:///org/gnome/shell/ui/windowManager.js' import * as WindowPreview from 'resource:///org/gnome/shell/ui/windowPreview.js'; import * as Screenshot from 'resource:///org/gnome/shell/ui/screenshot.js'; -import { Utils, Tiling, Scratch, Settings, OverviewLayout } from './imports.js'; +import { Utils, Tiling, Scratch, Settings, OverviewLayout, Navigator } from './imports.js'; /** Some of Gnome Shell's default behavior is really sub-optimal when using @@ -214,6 +214,27 @@ export function setupOverrides() { if (WindowManager.TouchpadWorkspaceSwitchAction) // disable 4-finger swipe registerOverridePrototype(WindowManager.TouchpadWorkspaceSwitchAction, '_checkActivated', () => false); + + registerOverridePrototype(WindowManager.WindowManager, 'handleWorkspaceScroll', + function (event) { + if (event.type() !== Clutter.EventType.SCROLL) + return Clutter.EVENT_PROPAGATE; + + const direction = event.get_scroll_direction(); + + if (direction === Clutter.ScrollDirection.UP) { + const tabPopup = Navigator.getActionDispatcher(Clutter.GrabState.KEYBOARD); + tabPopup.show(false, 'switch-global-left', Clutter.ModifierType.MOD4_MASK); + return Clutter.EVENT_STOP; + } else if (direction === Clutter.ScrollDirection.DOWN) { + const tabPopup = Navigator.getActionDispatcher(Clutter.GrabState.KEYBOARD); + tabPopup.show(false, 'switch-global-right', Clutter.ModifierType.MOD4_MASK); + return Clutter.EVENT_STOP; + } + + return Clutter.EVENT_PROPAGATE; + }); + // disable swipe gesture trackers swipeTrackers.forEach(t => { registerOverrideProp(t, "enabled", false, false); From 1e46b4058f170a903714b9bc063cdd67f98fc4d3 Mon Sep 17 00:00:00 2001 From: Lucas Alber Date: Wed, 7 Jan 2026 17:23:05 +0100 Subject: [PATCH 2/2] Invert mouse scroll direction globally (minibar, navigator, ...) --- patches.js | 12 ++++++++++-- tiling.js | 4 ++-- topbar.js | 4 ++-- 3 files changed, 14 insertions(+), 6 deletions(-) diff --git a/patches.js b/patches.js index 13ae6301f..5fda3a839 100644 --- a/patches.js +++ b/patches.js @@ -224,11 +224,11 @@ export function setupOverrides() { if (direction === Clutter.ScrollDirection.UP) { const tabPopup = Navigator.getActionDispatcher(Clutter.GrabState.KEYBOARD); - tabPopup.show(false, 'switch-global-left', Clutter.ModifierType.MOD4_MASK); + tabPopup.show(false, 'switch-global-right', Clutter.ModifierType.MOD4_MASK); return Clutter.EVENT_STOP; } else if (direction === Clutter.ScrollDirection.DOWN) { const tabPopup = Navigator.getActionDispatcher(Clutter.GrabState.KEYBOARD); - tabPopup.show(false, 'switch-global-right', Clutter.ModifierType.MOD4_MASK); + tabPopup.show(false, 'switch-global-left', Clutter.ModifierType.MOD4_MASK); return Clutter.EVENT_STOP; } @@ -445,6 +445,14 @@ export function setupOverrides() { this._icon.set_size(size * scaleFactor, size * scaleFactor); }); + registerOverridePrototype(AltTab.AppSwitcherPopup, '_scrollHandler', function(direction) { + if (direction === Clutter.ScrollDirection.UP) { + props['_scrollHandler'].saved(Clutter.ScrollDirection.DOWN); + } else if (direction === Clutter.ScrollDirection.DOWN) { + props['_scrollHandler'].saved(Clutter.ScrollDirection.UP); + } + }) + registerOverridePrototype(Screenshot.ScreenshotUI, 'open', async function(mode) { const saved = getSavedPrototype(Screenshot.ScreenshotUI, 'open'); diff --git a/tiling.js b/tiling.js index ad86b5813..ba05d6654 100644 --- a/tiling.js +++ b/tiling.js @@ -1971,11 +1971,11 @@ border-radius: ${borderWidth}px; switch (dir) { case Clutter.ScrollDirection.LEFT: case Clutter.ScrollDirection.UP: - this.switchLeft(false); + this.switchRight(false); break; case Clutter.ScrollDirection.RIGHT: case Clutter.ScrollDirection.DOWN: - this.switchRight(false); + this.switchLeft(false); break; } }); diff --git a/topbar.js b/topbar.js index c9822a6ac..be692a393 100644 --- a/topbar.js +++ b/topbar.js @@ -181,10 +181,10 @@ export function topBarScrollAction(event) { let direction = event.get_scroll_direction(); switch (direction) { case Clutter.ScrollDirection.DOWN: - Tiling.spaces?.activeSpace.switchRight(false); + Tiling.spaces?.activeSpace.switchLeft(false); break; case Clutter.ScrollDirection.UP: - Tiling.spaces?.activeSpace.switchLeft(false); + Tiling.spaces?.activeSpace.switchRight(false); break; } const selected = Tiling.spaces?.activeSpace?.selectedWindow;