Repository navigation
v0.2.48
v0.2.48 — Fix runaway window-focus flicker when a popout terminal is open
Release date: 2026-08-05
Previous version: v0.2.47
TL;DR
Fixes a severe focus flicker storm: with a terminal popped out into a separate
window, opening the new-terminal form in another project could send the two
app windows into a self-sustaining focus ping-pong (15–30Hz title-bar
flashing, effectively freezing the desktop until manual intervention). The
loop ran entirely in the Electron main process, which is why the v0.2.47
renderer-side guard did not catch it.
Highlights
Popout + new-terminal form no longer triggers a focus flicker storm
- Diagnosed from IME debug logs: the forced IME handoff on form entry blurs
the main window, which hands OS activation to the open popout. Each
window's focus-recovery bridge then re-fired the other — a stalefocus
event (processed after activation had already moved to the sibling window)
turned thewebContents.focus()rebind into an HWND activation steal,
re-arming the sibling's bridge in an endless loop (~10,400 window events
over 28 seconds in the captured reproduction). - The bridge now skips rebinding on stale focus events. A fresh-focus rebind
targets the already-active window and cannot steal activation, so the loop
can no longer form. Lock-screen and alt-tab IME recovery paths are
unaffected — the pending rebind still runs when focus genuinely returns. - The main window and popout windows previously carried duplicated copies of
the bridge; they now share a single implementation so future fixes apply to
both.
Install / Update
npm i -g clitrigger@0.2.48Desktop app — pick the right asset:
- Windows (recommended):
CLITrigger-Setup-0.2.48.exe— installer with Start Menu shortcut, uninstaller, and auto-update. - Windows (portable):
CLITrigger-0.2.48.exe— run directly, no install; no shortcuts and no auto-update (grab new versions manually). - macOS:
.dmg/ Linux:.AppImage
Full commit list
- b20fbe5 fix(ime): focus-bridge stale 이벤트 가드 — 팝아웃 공존 시 창 간 포커스 강탈 핑퐁 폭주 해소
Related docs
- Detailed changelog — per-date technical decision records
Full Changelog: v0.2.47...v0.2.48