The focus flash is drawn inside the window border and follows its rounded corners.
Before, the flash used the full tile rect (border included) with square corners: with the defaults (focus.flash-width = 2, border.width = 2, same border.active color) it covered the border exactly, so only its square corners showed over the rounded border.
How
ports.FocusFlash.Radius (logical px, 0 = square).
Core: window and column flashes use the client rect (tile minus its drawn border sides, clientRect) and the inner radius max(windowRadius(...) - border.width, 0), the same values the renderer uses for the window body. Monitor flash unchanged.
Vulkan: roundedInnerBorder draws one rounded ring (flagRounded|flagRing, rounded hole) when Radius > 0; square strips otherwise.
Checks
make check, make race, make mocks-check, staticcheck ./... pass.
Tests: TestFlashFollowsInnerBorderAndRadius (tile/column with gaps, tile without gaps, float, monitor), TestFocusFlashRoundedRing (scale 1 and 2), TestFocusFlashZeroRadiusStaysSquare.
Headless e2e (gaps 12, border 3, radius 14, red flash): mid-flash frames show a 3 px rounded flash ring inside the grey border, no square corners.
@@ -54,7 +54,7 @@ See [examples/config](../examples/config) for every key with its default.
54
54
| `animations.speed` | `normal` | `slow`, `normal`, `fast`, or a factor from `0.1` to `10` |
55
55
| `focus.follow-move` | `off` | Follow a column moved to another workspace |
56
56
| `focus.position-hint` | `on` | Show workspace/band dots near the output bottom for 600ms after a position change, then fade for 150ms (no fade with animations off); hidden in overview, fullscreen and session lock; never captured |
57
-
| `focus.flash` | `on` | Briefly draw an inner border on the window, column or output an action changed |
57
+
| `focus.flash` | `on` | Briefly draw an inner border, inside the window border, on the window, column or output an action changed |
58
58
| `focus.flash-width` | `2` | Flash border width in logical pixels, `1` to `8` |
59
59
| `focus.flash-opacity` | `0.6` | Starting opacity of the flash, `0.1` to `1` |
60
60
| `focus.flash-duration` | `200ms` | Fade duration, `50ms` to `1s`; not scaled by `animations.speed` |
@@ -54,7 +54,7 @@ See [examples/config](../examples/config) for every key with its default.
54
| `animations.speed` | `normal` | `slow`, `normal`, `fast`, or a factor from `0.1` to `10` |
54
| `animations.speed` | `normal` | `slow`, `normal`, `fast`, or a factor from `0.1` to `10` |
55
| `focus.follow-move` | `off` | Follow a column moved to another workspace |
55
| `focus.follow-move` | `off` | Follow a column moved to another workspace |
56
| `focus.position-hint` | `on` | Show workspace/band dots near the output bottom for 600ms after a position change, then fade for 150ms (no fade with animations off); hidden in overview, fullscreen and session lock; never captured |
56
| `focus.position-hint` | `on` | Show workspace/band dots near the output bottom for 600ms after a position change, then fade for 150ms (no fade with animations off); hidden in overview, fullscreen and session lock; never captured |
57
-
| `focus.flash` | `on` | Briefly draw an inner border on the window, column or output an action changed |
57
+
| `focus.flash` | `on` | Briefly draw an inner border, inside the window border, on the window, column or output an action changed |
58
| `focus.flash-width` | `2` | Flash border width in logical pixels, `1` to `8` |
58
| `focus.flash-width` | `2` | Flash border width in logical pixels, `1` to `8` |
59
| `focus.flash-opacity` | `0.6` | Starting opacity of the flash, `0.1` to `1` |
59
| `focus.flash-opacity` | `0.6` | Starting opacity of the flash, `0.1` to `1` |
60
| `focus.flash-duration` | `200ms` | Fade duration, `50ms` to `1s`; not scaled by `animations.speed` |
60
| `focus.flash-duration` | `200ms` | Fade duration, `50ms` to `1s`; not scaled by `animations.speed` |