From 7bce330ae4040860ddb5ce66dc7999f16577855c Mon Sep 17 00:00:00 2001 From: =?utf8?q?Volker=20R=C3=BCmelin?= Date: Tue, 10 Aug 2021 08:32:57 +0200 Subject: [PATCH] ui/gtk: retry sending VTE console input MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit 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 Reviewed-by: Marc-André Lureau Message-Id: <20210810063257.17411-1-vr_qemu@t-online.de> Signed-off-by: Gerd Hoffmann --- ui/gtk.c | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/ui/gtk.c b/ui/gtk.c index 974e4dfc0b..cfb0728d1f 100644 --- a/ui/gtk.c +++ b/ui/gtk.c @@ -1646,16 +1646,14 @@ static void gd_vc_send_chars(VirtualConsole *vc) len = qemu_chr_be_can_write(vc->vte.chr); avail = fifo8_num_used(&vc->vte.out_fifo); - if (len > avail) { - len = avail; - } - while (len > 0) { + while (len > 0 && avail > 0) { const uint8_t *buf; 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); - len -= size; + len = qemu_chr_be_can_write(vc->vte.chr); + avail -= size; } } -- 2.39.5