osc8: update URI ranges as we print data, *not* when the URI is closed

At first, an OSC-8 URI range was added when we received the closing
OSC-8 escape (i.e. with an empty URI).

But, this meant that cursor movements while the OSC-8 escape was in
effect wasn’t handled correctly, since we’d add a range that spanned
the cursor movements.

Attempts were made to handle this in the cursor movement functions, by
closing and re-opening the URI.

However, there are too many corner cases to make this a viable
approach. Scrolling is one such example, line-wrapping another.

This patch takes a different approach; emit, or update the URI range
when we print to the grid. This models the intended behavior much more
closely, where an active OSC-8 URI act like any other SGR attribute -
it is applied to all cells printed to, but otherwise have no effect.

To avoid killing performance, this is only done in the “generic”
printer. This means OSC-8 open/close calls must now “switch” the ASCII
printer.

Note that the “fast” printer still needs to *erase* pre-existing OSC-8
URIs.

Closes #816
This commit is contained in:
Daniel Eklöf 2021-11-25 19:22:52 +01:00
parent 82219713cc
commit 8c50a7afd4
No known key found for this signature in database
GPG key ID: 5BBD4992C116573F
5 changed files with 143 additions and 116 deletions

View file

@ -185,7 +185,6 @@ struct vt {
struct {
uint64_t id;
char *uri;
struct coord begin;
} osc8;
struct {