Dim inactive split panes (#250, #243) (#260)
Surface which pane has focus by dimming inactive splits with Ghostty's
own unfocused-split overlay semantics.
- WorktreeTerminalState exposes activeSurfaceID(for:) backed by the
single focusedSurfaceIdByTab source of truth. Click-path and explicit
focus paths (goto_split, split zoom, palette) both funnel through the
new recordActiveSurface choke point so two panes can't both claim
active and focus-loss can't wipe the remembered active pane.
- GhosttyRuntime reads unfocused-split-opacity and unfocused-split-fill
via ghostty_config_get, clamping the overlay opacity to [0, 1] and
returning nil (with a SupaLogger warning) when both the fill and
background keys are missing so the UI can skip the overlay rather
than silently paint it black.
- WorktreeTerminalTabsView threads the overlay config down to LeafView
and bumps a SwiftUI invalidation counter on
.ghosttyRuntimeConfigDidChange so live config reloads re-read the
values. Split divider uses the system separator color.
- SplitTreeTests locks in recordActiveSurface symmetry across the
click and goto_split paths, dedup via emitFocusChangedIfNeeded,
idempotence on the explicit path, and focus-loss as a no-op.
authored by