From 6f6925200161ffa6c11f0e2be107b0d7230b9ff0 Mon Sep 17 00:00:00 2001 From: Peter Fajdiga Date: Sat, 20 Dec 2025 21:59:59 +0100 Subject: [PATCH] set focus after scrolling with the touchpad gesture Co-authored-by: Grafcube --- src/lib/layout/Desktop.ts | 14 +++++++++++++- src/lib/world/World.ts | 4 +++- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/src/lib/layout/Desktop.ts b/src/lib/layout/Desktop.ts index 42a88c4..f1bb760 100644 --- a/src/lib/layout/Desktop.ts +++ b/src/lib/layout/Desktop.ts @@ -141,8 +141,20 @@ class Desktop { this.setScroll(this.gestureScrollXInitial + this.config.gestureScrollStep * amount, false); } - public gestureScrollFinish() { + public gestureScrollFinish(focusedWindow: Window|null) { + const scrolledRight = this.scrollX > this.gestureScrollXInitial!; this.gestureScrollXInitial = null; + + const visibleRange = this.getCurrentVisibleRange(); + if (focusedWindow !== null && !Range.contains(visibleRange, focusedWindow.column)) { + // the focused window is no longer visible, find a new window to focus + const focusTargetColumn = scrolledRight ? + this.grid.getLeftmostVisibleColumn(visibleRange) : + this.grid.getRightmostVisibleColumn(visibleRange); + if (focusTargetColumn !== null) { + focusTargetColumn.getWindowToFocus().focus(); + } + } } public arrange() { diff --git a/src/lib/world/World.ts b/src/lib/world/World.ts index 70ba860..6842279 100644 --- a/src/lib/world/World.ts +++ b/src/lib/world/World.ts @@ -158,9 +158,11 @@ class World { public gestureScrollFinish() { this.do((clientManager, desktopManager) => { + const focusedWindow = Workspace.activeWindow === null ? null : clientManager.findTiledWindow(Workspace.activeWindow); const currentDesktop = desktopManager.getCurrentDesktop(); if (currentDesktop !== undefined) { - currentDesktop.gestureScrollFinish(); + console.assert(focusedWindow === null || focusedWindow.column.grid.desktop === currentDesktop); + currentDesktop.gestureScrollFinish(focusedWindow); } }); }