From 092e6764c8be3ffcd2dcbbaa9fa1f50da5342ea7 Mon Sep 17 00:00:00 2001 From: William Laverty Date: Wed, 4 Feb 2026 01:07:16 -0800 Subject: [PATCH 1/3] Add missing icons for stash/unstash directions (#1036) The stash and unstash directions were missing from the WindowAction+Image extension, causing empty boxes to appear in the Keybinds settings when users created keybinds for these actions. Added: - stash: square.stack.3d.down.right (represents moving window aside) - unstash: square.stack.3d.up (represents restoring window) - noSelection: explicitly returns nil (for clarity) Fixes #1036 --- .../Window Action/WindowAction+Image.swift | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Loop/Window Management/Window Action/WindowAction+Image.swift b/Loop/Window Management/Window Action/WindowAction+Image.swift index 590a71b0..05cbed64 100644 --- a/Loop/Window Management/Window Action/WindowAction+Image.swift +++ b/Loop/Window Management/Window Action/WindowAction+Image.swift @@ -37,6 +37,8 @@ extension WindowAction { switch direction { case .noAction: .systemImage("questionmark") + case .noSelection: + nil // No selection state should not display an icon case .undo: .systemImage("arrow.uturn.backward") case .initialFrame: @@ -93,6 +95,10 @@ extension WindowAction { .systemImage("chevron.down") case .focusNextInStack: .systemImage("rectangle.stack") + case .stash: + .systemImage("square.stack.3d.down.right") + case .unstash: + .systemImage("square.stack.3d.up") default: nil } From 820782dd3568afecc5f51f565cdbb8565121b948 Mon Sep 17 00:00:00 2001 From: William Laverty Date: Thu, 5 Feb 2026 23:09:24 -0800 Subject: [PATCH 2/3] fix: move stash icon to fallback in IconView per reviewer feedback Stash can display calculated frames when an anchor is selected, so it should not override those frames. Moving to fallback section means it only shows the icon when no calculated frame is available. --- Loop/Window Management/Window Action/WindowAction+Image.swift | 2 -- 1 file changed, 2 deletions(-) diff --git a/Loop/Window Management/Window Action/WindowAction+Image.swift b/Loop/Window Management/Window Action/WindowAction+Image.swift index 05cbed64..2447ce84 100644 --- a/Loop/Window Management/Window Action/WindowAction+Image.swift +++ b/Loop/Window Management/Window Action/WindowAction+Image.swift @@ -95,8 +95,6 @@ extension WindowAction { .systemImage("chevron.down") case .focusNextInStack: .systemImage("rectangle.stack") - case .stash: - .systemImage("square.stack.3d.down.right") case .unstash: .systemImage("square.stack.3d.up") default: From 99d9a38d6103ef737680cd54f7513f14b1a3b273 Mon Sep 17 00:00:00 2001 From: William Laverty Date: Thu, 5 Feb 2026 23:09:31 -0800 Subject: [PATCH 3/3] fix: add stash icon as fallback when no calculated frame available Added stash direction check in determineDisplayMode() fallback section. This ensures stash shows its icon only when an anchor isn't selected (when calculated frames aren't available), preserving frame display when anchors are selected. --- Loop/Window Management/Window Action/IconView.swift | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/Loop/Window Management/Window Action/IconView.swift b/Loop/Window Management/Window Action/IconView.swift index f8e7267d..dc3d7ce7 100644 --- a/Loop/Window Management/Window Action/IconView.swift +++ b/Loop/Window Management/Window Action/IconView.swift @@ -199,7 +199,7 @@ final class IconRenderView: NSView { return .frame(fillFrame) } - // And if all else fails... + // Fallback icons for actions that can't display calculated frames if currentAction.direction == .custom, let image = NSImage(systemSymbolName: "slider.horizontal.3", accessibilityDescription: nil) { return .image(image) @@ -209,6 +209,11 @@ final class IconRenderView: NSView { return .image(image) } + // Stash icon as fallback when no anchor is selected (can't calculate frame) + if currentAction.direction == .stash, let image = NSImage(systemSymbolName: "square.stack.3d.down.right", accessibilityDescription: nil) { + return .image(image) + } + return nil }