term: enqueue data to slave if there are queued paste data buffers

When writing paste data to the terminal (either interactively, or as
an OSC-52 reply), we enqueue other data (key presses, for examples, or
query replies) while the paste is happening.

The idea is to send the key press _after_ all paste data has been
written, to ensure consistency.

Unfortunately, we only checked for an on-going paste. I.e. where the
paste itself hasn't yet finished. It is also possible the paste itself
has finished, but we haven't yet flushed all the paste buffers. That
is, if we were able to *receive* paste data faster than the terminal
client was able to *consume* it. In this case, we've queued up paste
data in the terminal. These are in separate queues, and when emitting
e.g. a key press, we didn't check if all _those_ queues had been
flushed yet.

Closes #2307
This commit is contained in:
Daniel Eklöf 2026-03-21 14:43:27 +01:00
parent 2fb7bb0ea4
commit 037a2f4fa2
No known key found for this signature in database
GPG key ID: 5BBD4992C116573F
2 changed files with 11 additions and 1 deletions

View file

@ -75,6 +75,13 @@
### Deprecated
### Removed
### Fixed
* Other output (key presses, query replies etc) being mixed with paste
data, both interactive pastes and OSC-52 ([#2307][2307]).
[2307]: https://codeberg.org/dnkl/foot/issues/2307
### Security
### Contributors

View file

@ -120,7 +120,10 @@ term_to_slave(struct terminal *term, const void *data, size_t len)
return false;
}
if (tll_length(term->ptmx_buffers) > 0 || term->is_sending_paste_data) {
if (unlikely(tll_length(term->ptmx_buffers) > 0 ||
term->is_sending_paste_data ||
tll_length(term->ptmx_paste_buffers) > 0))
{
/*
* Don't even try to send data *now* if there's queued up
* data, since that would result in events arriving out of