ui/gtk: retry sending VTE console input
Commit584af1f1d9
("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:
parent
bccabb3a5d
commit
7bce330ae4
10
ui/gtk.c
10
ui/gtk.c
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user