From 1f708f8aa09bf8bbce82314a76b7f34def90b798 Mon Sep 17 00:00:00 2001 From: srdusr <99972264+srdusr@users.noreply.github.com> Date: Sat, 31 Jan 2026 14:34:00 +0200 Subject: Fix desktop-icon deselection and workspace-teleport-on-close; document a shadow limit Desktop icons stayed highlighted after clicking a window: select_desktop_icon(None) was only ever called from start_desktop_marquee, never from the one place every focus path (click, Alt-Tab, dock IPC, scratchpad show, snap flyout) already funnels through. Added the deselect there instead of per-caller. Closing a focused window could silently switch the user's active workspace: remove_window's fallback picked self.order.last(), but that list is global, not per-workspace, so it could land on a background window elsewhere - and focus_window already switches workspace to match whatever it's given (a real, separate feature for a deliberate srd dispatch focus). Fixed by preferring a same-workspace window first. New general.close_focus_follows_workspace (default false, live-settable) controls what happens only when nothing is left on the current workspace at all: off leaves focus at nothing, matching Windows/GNOME/macOS; on restores the old always-follow-the-global-fallback behaviour. Three new tests. Also documented, not fixed: shadows can still bleed onto a neighbouring *monitor* near a multi-output seam (shadow_rect has no monitor-boundary awareness), found via a live cross-monitor screenshot. Moot for this session since general.shadows is already off in the live config, but a real, open gap for anyone who re-enables shadows on a multi-monitor setup. --- crates/core/src/manager/mod.rs | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) (limited to 'crates/core/src/manager/mod.rs') diff --git a/crates/core/src/manager/mod.rs b/crates/core/src/manager/mod.rs index d449486..9265885 100644 --- a/crates/core/src/manager/mod.rs +++ b/crates/core/src/manager/mod.rs @@ -241,6 +241,24 @@ pub struct WindowManager { /// see the Wayland backend's shadow render call site - so this only /// ever turns it off entirely, not on for those. pub shadows_enabled: bool, + /// Whether closing your own focused window is allowed to fall back to + /// a window on a *different* workspace and switch you there to follow + /// it, when nothing else is left on your current one. Read from + /// `general.close_focus_follows_workspace`. `false` (the default) + /// matches every mainstream desktop (Windows/GNOME/macOS never change + /// your active workspace just because a window closed) - `remove_ + /// window`'s own fallback then only ever considers a same-workspace + /// window, leaving focus at `None` if there isn't one, rather than + /// picking whatever window was next in the *global* most-recently- + /// focused order regardless of which workspace it happens to be on. + /// Reported live as windows closing and "teleporting" the user to a + /// previous workspace - exactly this: the global fallback picking a + /// background window elsewhere, then `focus_window`'s own (separate, + /// correct, and unrelated to this setting) "switch workspace to match + /// the newly focused window" side effect following it there. `true` + /// restores that original always-follow behaviour for anyone who + /// wants it. + pub close_focus_follows_workspace: bool, /// Width, in pixels, of the resize grab band along a window's edges, /// read from `general.resize_margin`. See [`crate::window::RESIZE_MARGIN`]'s /// doc comment for the default and why it's what it is. @@ -548,6 +566,7 @@ impl WindowManager { animations_enabled: true, animation_duration_ms: 200, shadows_enabled: true, + close_focus_follows_workspace: false, resize_margin: RESIZE_MARGIN, rounded_corners_enabled: None, gpu_enabled: false, -- cgit v1.2.3