From dae1617a8b7ee7c40beb452046c5ec84e69931ee Mon Sep 17 00:00:00 2001 From: srdusr <99972264+srdusr@users.noreply.github.com> Date: Mon, 3 Feb 2025 20:15:00 +0200 Subject: Fix focusing a minimized window not restoring it focus_window marked the target focused without clearing minimized, so a dock icon's Activate (or the plain "focus" IPC command) on a minimized window left it focused but still excluded from visible_windows/rendering - reads exactly like the click did nothing, since the window never actually reappears. Every focus_window caller gets the restore for free now. Added a Super+n keybind for minimize too, since none existed at all before this. --- crates/core/src/manager/tests.rs | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) (limited to 'crates/core/src/manager/tests.rs') diff --git a/crates/core/src/manager/tests.rs b/crates/core/src/manager/tests.rs index 1c80304..aa2fb1a 100644 --- a/crates/core/src/manager/tests.rs +++ b/crates/core/src/manager/tests.rs @@ -428,6 +428,27 @@ assert_eq!(wm.focused_id(), Some(id)); } + #[test] + fn focusing_a_minimized_window_also_restores_it() { + // Regression: `focus_window` marked a window focused without + // clearing `minimized` - a dock icon's click (foreign-toplevel + // `Activate`, or the plain `"focus"` IPC command) both route + // through here, so clicking a minimized app's dock icon left it + // `focused: true` but still `minimized: true`, still excluded from + // `visible_windows`/rendering. Reads exactly like the click did + // nothing, since the window never actually reappears. + let mut wm = wm_with_monitor(); + let id = wm.alloc_window_id(); + wm.add_window(Window::new(id, "a")); + wm.minimize_window(id); + assert!(wm.window(id).unwrap().minimized, "sanity: actually minimized first"); + + wm.focus_window(id); + assert!(!wm.window(id).unwrap().minimized, "focusing a minimized window must restore it"); + assert_eq!(wm.focused_id(), Some(id)); + assert!(wm.visible_windows().any(|w| w.id == id)); + } + #[test] fn refocusing_an_already_visible_window_does_not_trigger_auto_back_and_forth() { // The fix above must not call `switch_workspace` unconditionally -- -- cgit v1.2.3