Skip to content

fix(core): drain stdin on exit to prevent escape sequence leakage#34134

Merged
FrozenPandaz merged 2 commits intomasterfrom
rgb
Jan 17, 2026
Merged

fix(core): drain stdin on exit to prevent escape sequence leakage#34134
FrozenPandaz merged 2 commits intomasterfrom
rgb

Conversation

@FrozenPandaz
Copy link
Copy Markdown
Contributor

Current Behavior

When exiting the TUI (especially via Ctrl+C), escape sequences leak to the terminal:

^[]11;rgb:2121/2121/2121^[\^[[55;1R^[[?62;22;52c

This happens because the TUI queries terminal background color via OSC 11 to detect dark/light mode. The terminal responds with an escape sequence, but if the program exits before fully consuming the response, it appears in the terminal output.

Expected Behavior

Clean terminal state after TUI exits, with no escape sequence artifacts.

Related Issue(s)

N/A - discovered during development

Solution

Added drain_stdin() function that polls and consumes any pending terminal events before disabling raw mode. This clears any lingering OSC responses (like the background color query response) before the terminal is restored.

fn drain_stdin() {
    use std::time::Duration;
    while crossterm::event::poll(Duration::from_millis(5)).unwrap_or(false) {
        let _ = crossterm::event::read();
    }
}

The 5ms timeout is long enough to catch pending responses but short enough not to noticeably delay exit.

@FrozenPandaz FrozenPandaz requested review from a team as code owners January 16, 2026 21:38
@vercel
Copy link
Copy Markdown

vercel Bot commented Jan 16, 2026

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Review Updated (UTC)
nx-dev Ready Ready Preview Jan 16, 2026 11:29pm

Request Review

@netlify
Copy link
Copy Markdown

netlify Bot commented Jan 16, 2026

Deploy Preview for nx-docs ready!

Name Link
🔨 Latest commit 3fa9ba2
🔍 Latest deploy log https://app.netlify.com/projects/nx-docs/deploys/696ac7886df4490007f5f44c
😎 Deploy Preview https://deploy-preview-34134--nx-docs.netlify.app
📱 Preview on mobile
Toggle QR Code...

QR Code

Use your smartphone camera to open QR code link.

To edit notification comments on pull requests, go to your Netlify project configuration.

@nx-cloud
Copy link
Copy Markdown
Contributor

nx-cloud Bot commented Jan 16, 2026

View your CI Pipeline Execution ↗ for commit 3fa9ba2

Command Status Duration Result
nx affected --targets=lint,test,test-kt,build,e... ✅ Succeeded 14m 29s View ↗
nx run-many -t check-imports check-lock-files c... ✅ Succeeded 2m 54s View ↗
nx-cloud record -- nx-cloud conformance:check ✅ Succeeded 12s View ↗
nx-cloud record -- nx format:check ✅ Succeeded 2s View ↗
nx-cloud record -- nx sync:check ✅ Succeeded <1s View ↗

☁️ Nx Cloud last updated this comment at 2026-01-17 16:30:33 UTC

When the TUI queries terminal background color via OSC 11, the terminal
responds with an escape sequence. If the program exits (especially via
Ctrl+C) before fully consuming this response, the escape sequence leaks
to the terminal output, showing characters like:
^[]11;rgb:2121/2121/2121^[\^[[55;1R

This fix adds drain_stdin() which polls and consumes any pending terminal
events before disabling raw mode, preventing the leakage.
…l size

- Add drain_stdin() to consume pending terminal responses (OSC color queries)
  before TUI exit, preventing escape sequences from leaking to terminal
- Disable TUI when terminal reports 0x0 size to prevent vt100 parser panics
- Add graceful fallback for inline terminal creation errors
@FrozenPandaz FrozenPandaz merged commit 6754cde into master Jan 17, 2026
21 of 22 checks passed
@FrozenPandaz FrozenPandaz deleted the rgb branch January 17, 2026 16:30
@github-actions
Copy link
Copy Markdown
Contributor

This pull request has already been merged/closed. If you experience issues related to these changes, please open a new issue referencing this pull request.

@github-actions github-actions Bot locked as resolved and limited conversation to collaborators Jan 23, 2026
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants