ui/gtk: retry sending VTE console input

Commit 584af1f1d9 ("ui/gtk: add a keyboard fifo to the VTE
consoles") changed the VTE chardev backend code to rely on the
chr_accept_input() callback function. The code expects a
chr_accept_input() call whenever qemu_chr_be_can_write() bytes
were written. It turns out this is wrong. Some chardev
frontends only call this callback after can_write was 0.

Change the code to send data until the keyboard fifo is empty
or qemu_chr_be_can_write() returns 0.

Fixes: 584af1f1d9 ("ui/gtk: add a keyboard fifo to the VTE consoles")
Signed-off-by: Volker Rümelin <vr_qemu@t-online.de>
Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Message-Id: <20210810063257.17411-1-vr_qemu@t-online.de>
Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
This commit is contained in:
Volker Rümelin 2021-08-10 08:32:57 +02:00 committed by Gerd Hoffmann
parent bccabb3a5d
commit 7bce330ae4

View File

@ -1646,16 +1646,14 @@ static void gd_vc_send_chars(VirtualConsole *vc)
len = qemu_chr_be_can_write(vc->vte.chr); len = qemu_chr_be_can_write(vc->vte.chr);
avail = fifo8_num_used(&vc->vte.out_fifo); avail = fifo8_num_used(&vc->vte.out_fifo);
if (len > avail) { while (len > 0 && avail > 0) {
len = avail;
}
while (len > 0) {
const uint8_t *buf; const uint8_t *buf;
uint32_t size; uint32_t size;
buf = fifo8_pop_buf(&vc->vte.out_fifo, len, &size); buf = fifo8_pop_buf(&vc->vte.out_fifo, MIN(len, avail), &size);
qemu_chr_be_write(vc->vte.chr, (uint8_t *)buf, size); qemu_chr_be_write(vc->vte.chr, (uint8_t *)buf, size);
len -= size; len = qemu_chr_be_can_write(vc->vte.chr);
avail -= size;
} }
} }