logoalt Hacker News

Joker_vDyesterday at 11:13 PM1 replyview on HN

Frankly, the way the functionality needed to implement LF-to-CRLF conversion on output/CR-to-LF conversion on input/line editing/session and process management is split between the terminal itself, the kernel, and the application code is quite awkward.

And of course, the concerns of the serial line driver are thrown into the mix too, for the added entertainment.


Replies

jonnyasmaryesterday at 11:30 PM

The split-of-responsibilities point really shows up when you try to host a TUI inside a PTY you control. Spawning Claude Code, Codex, and other agents into terminal panes on macOS, I hit this chain of small surprises:

- SIGWINCH doesn't always fire on initial spawn — the TUI starts up thinking it has 0 columns and emits garbage until the first real resize. Fix: synthesize an ioctl(TIOCSWINSZ) before the first read, and re-send on focus events. - xterm.js negotiates dimensions with the PTY backend over a non-obvious dance; off-by-one in the cell math wraps long prompts in the wrong place every time. - Tools that detect "am I in a TTY" via isatty() behave differently from tools that stat() stdin; a few agents fall through to non-TUI mode if the PTY's mode bits aren't quite right.

None of that is reflected in the abstract "PTY is a virtual terminal" mental model. The kernel/terminal/application split is a leaky abstraction in practice — you only find out by hosting one inside the other.

show 1 reply