aboutsummaryrefslogtreecommitdiff
path: root/crates/dinggerd/src/terminals.rs
AgeCommit message (Collapse)Author
13 daysterminals: ask Ghostty only once focus has settledIgor Soarez
across a Space switch (a full screen window) tmux sees the new client focused about 0.3 s before Ghostty's front window changes, so learn paired the client with the terminal that had focus. live, raising a full screen window and back crossed the two pairings, and from then on every jump raised the wrong window (old binary: 0 of 10 jumps right). learn now waits a second before asking Ghostty, then still requires the client to be focused. it also drops pairings of clients no longer attached, which piled up with every closed window. e2e step 20: Ghostty lagging behind tmux's focus, crossed pairings healing, pruning; the old learn fails all five. live, two Ghostty windows, one full screen: 16 of 16 jumps right, starting from crossed pairings.
2026-10-23raise the terminal window that holds the tmux clientIgor Soarez
a jump (any click, a shortcut, search) activated the terminal app, which raised whichever window was used last. now: - the client: the named one (a status-line click), else one already on a session holding the agent's window (several terminal windows can show one session; it shows the agent without switching, and keeps its own session in a session group), else any; the focused one first, then the one used last (its last input or focus). - Ghostty (1.3+, scriptable by terminal id, not by tty): dingger learns which terminal holds each client when it gains focus. tmux's client-focus-in hook runs `dingger terminal focused`, which asks Ghostty for its focused terminal and records it in @dingger_terminal_<tty>, but only if the client is still focused once Ghostty answered (a fast switch must not pair the wrong terminal); a terminal holds one client, so an older pairing with it is dropped. `focus` raises the exact terminal (window, tab, split) through `tmux run-shell`: Apple Events from the tmux server count as Ghostty's own, so no permission prompt. a terminal that is gone is forgotten and the app activated, as without a pairing. - in a hook, #{client_name} can be another client (the previous event's); the snippet's hook uses #{hook_client}. e2e step 20: two nested clients on one session, focused by typing focus reports into their outer panes, a fake osascript as Ghostty, a fake open (tests never activate a real app); it loads the snippet's own hook line. each rule has a negative control that fails.