Preclude stale screen content in full-screen mode#75
Draft
seh wants to merge 1 commit intocharmbracelet:mainfrom
Draft
Preclude stale screen content in full-screen mode#75seh wants to merge 1 commit intocharmbracelet:mainfrom
seh wants to merge 1 commit intocharmbracelet:mainfrom
Conversation
When "ultraviolet" runs in full-screen (alternate screen) mode with frequent updates to the same screen positions, relative cursor movements can interact in ways that cause the terminal to fail to overwrite old content, leaving stale screen content visible. Components like the "bubbles" library's spinner that update repeatedly on the same line can induce this problem. The original cursor movement optimization logic assumed reasonably that using relative positioning operations (carriage return, cursor up, reverse index) would be safe and efficient for short distances when the cursor position is known. However, in full-screen mode with rapid updates, combinations of these relative movements can cause the terminal state to become inconsistent with what "ultraviolet" expects, resulting in content that should have been overwritten remaining visible. Instead, force "ultraviolet" to always use absolute cursor positioning (e.g. "CUP" as "ESC[<row>;<col>H") in full-screen mode. While the original relative movement approach works for simple or infrequent updates, absolute positioning is more resilient in full-screen mode because each movement is independent, rather than relying on accumulated state. The trade-off is slightly longer escape sequences, but this ensures reliable visual updates without stale content remaining visible. Note that this changes only how full-screen mode works; the behavior of inline mode behavior remains unchanged.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
When ultraviolet runs in full-screen (alternate screen) mode with frequent updates to the same screen positions, relative cursor movements can interact in ways that cause the terminal to fail to overwrite old content, leaving stale screen content visible. Components like the bubbles library's spinner that update repeatedly on the same line can induce this problem.
The original cursor movement optimization logic assumed reasonably that using relative positioning operations (carriage return, cursor up, reverse index) would be safe and efficient for short distances when the cursor position is known. However, in full-screen mode with rapid updates, combinations of these relative movements can cause the terminal state to become inconsistent with what ultraviolet expects, resulting in content that should have been overwritten remaining visible.
Instead, force ultraviolet to always use absolute cursor positioning (e.g. CUP as
ESC[<row>;<col>H) in full-screen mode. While the original relative movement approach works for simple or infrequent updates, absolute positioning is more resilient in full-screen mode because each movement is independent, rather than relying on accumulated state. The trade-off is slightly longer escape sequences, but this ensures reliable visual updates without stale content remaining visible.Note that this changes only how full-screen mode works; the behavior of inline mode behavior remains unchanged.
CONTRIBUTING.md.