• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

umputun / agterm / 29206745005
98%

Build:
DEFAULT BRANCH: master
Ran 12 Jul 2026 07:58PM UTC
Jobs 1
Files 63
Run time 1min
Badge
Embed ▾
README BADGES
x

If you need to use a raster PNG badge, change the '.svg' to '.png' in the link

Markdown

Textile

RDoc

HTML

Rst

12 Jul 2026 07:55PM UTC coverage: 97.777%. Remained the same
29206745005

push

github

web-flow
fix: stop split-focus flicker from overlapping focus retry loops (#200)

split panes flickered on a rapid focus change - the tmux-style zoom keybind (`session split on` + `session focus right`, or focus-left then focus-right) fires two focus ops back-to-back, and `focusSplitPane` spawned an uncancelled 12x30ms `makeFirstResponder` retry loop per call. Two loops with opposite targets ran at once and ping-ponged first responder between the panes for ~400ms, so `splitFocused` flipped ~13 times and both surfaces redrew on each flip. Intermittent, pre-existing (I see it back to 0.11.0), and never on a plain `cmd+d` (single call).

**fix**: a per-window generation counter. A fresh `focusSplitPane` call bumps its window's counter, and an in-flight loop bows out on its next tick once its generation is stale. Keyed by the owning window because one NSWindow has one first responder - so a focus op in one window never cancels another window's still-materializing retry, and same-window ops get last-focus-wins. The surviving loop still re-asserts through the split-materialize / reparent churn, so the retry keeps its purpose.

**refactor**: `focusSplitPane` moves to a new `AppActions+Focus.swift` to keep `AppActions.swift` under the 1000-line cap. `focusGeneration` stays in the main class (extensions can't hold stored properties); `frontmostQuickTerminal` and `terminalZoomActive(for:)` widened to internal for the extension.

verified by hand with the real repro - instrumented the churn (13 flips collapsed to a single settle) and confirmed visually. No unit test: the method is AppKit-entangled (`makeFirstResponder`, ~360ms timing), so it can't be host-free tested and a UI test of the flip would be flaky. Extracting the generation gate into a host-free helper is a possible follow-up.

4971 of 5084 relevant lines covered (97.78%)

5913752.59 hits per line

Jobs
ID Job ID Ran Files Coverage
1 29206745005.1 12 Jul 2026 07:58PM UTC 63
97.78
GitHub Action Run
Source Files on build 29206745005
  • Tree
  • List 63
  • Changed 0
  • Source Changed 0
  • Coverage Changed 0
Coverage ∆ File Lines Relevant Covered Missed Hits/Line
  • Back to Repo
  • Github Actions Build #29206745005
  • 5a7ea612 on github
  • Prev Build on master (#29206331390)
  • Next Build on master (#29221200566)
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc