resize: don’t reflow text on alt screen

Alt screen applications normally reflow/readjust themselves on a
window resize.

When we do it too, the result is graphical glitches/flashes since our
re-flowed text is rendered in one frame, and the application re-flowed
text soon thereafter.

We can’t avoid rendering some kind of re-flowed frame, since we don’t
know when, or even if, the application will update itself. To avoid
glitches, we need to render, as closely as possible, what the
application itself will render shortly.

This is actually pretty simple; we just need to copy the visible
content over from the old grid to the new grid. We don’t bother with
text re-flow, but simply truncate long lines.

To simplify things, we simply cancel any active selection (since often
times, it will be corrupted anyway when the application redraws
itself).

Since we’re not reflowing text, there’s no need to translate e.g. the
cursor position - we just keep the current position (but bounded to
the new dimensions).

Fun thing: ‘less’ gets corrupted if we don’t leave the cursor at
the (new) bottom row. To handle this, we check if the cursor (before
resize) is at the bottom row, and if so, we move it to the new bottom
row.

Closes #221
This commit is contained in:
Daniel Eklöf 2020-11-24 19:00:57 +01:00
parent c2f043f906
commit 9a498038d6
No known key found for this signature in database
GPG key ID: 5BBD4992C116573F
4 changed files with 140 additions and 20 deletions

View file

@ -92,6 +92,9 @@ means foot can be PGO:d in e.g. sandboxed build scripts. See
this.
* Sixel default maximum size is now 10000x10000 instead of the current
window size.
* Graphical glitches/flashes when resizing the window while running a
fullscreen application, i.e. the 'alt' screen
(https://codeberg.org/dnkl/foot/issues/221).
### Deprecated