From: "Marc-André Lureau" <marcandre.lureau@redhat.com>
To: qemu-devel@nongnu.org
Subject: [PATCH 00/60] ui: add standalone VNC server over D-Bus
Date: Tue, 17 Mar 2026 12:50:14 +0400 [thread overview]
Message-ID: <20260317-qemu-vnc-v1-0-48eb1dcf7b76@redhat.com> (raw)
This series adds qemu-vnc, a standalone VNC server that connects to a
running QEMU instance via the D-Bus display interface (org.qemu.Display1).
This allows serving a VNC display as a separate process with an independent
lifecycle and privilege domain, without requiring VNC support compiled into
the QEMU system emulator itself.
The bulk of the series is preparatory refactoring:
- Clean up VNC code: merge init/open, fix leaks, simplify error handling
- Extract and clean up VT100 emulation from console-vc into a reusable unit
- Reorganize ui/ code: move DisplaySurface functions, vgafont, datadir
and other pieces into their own files
- Refactor console APIs: rename methods, simplify listener registration,
return completion status from gfx_update
- Extract common ui sources into a static library that can be linked by
both the system emulator and the new standalone binary
The final patch adds contrib/qemu-vnc, built when both VNC and D-Bus
display support are enabled.
Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
---
Marc-André Lureau (60):
ui/vnc-jobs: fix VncRectEntry leak on job cleanup
ui/vnc-jobs: clear source tag
ui/vnc-jobs: remove needless buffer_reset() before end
ui/vnc: clarify intent using buffer_empty() function
ui/vnc-jobs: vnc_has_job_locked() argument cannot be NULL
ui/vnc-jobs: remove dead VncJobQueue.exit
ui/vnc-jobs: remove vnc_queue_clear()
ui/vnc-jobs: narrow taking the lock when pushing empty jobs
ui/vnc-jobs: drop redundant (and needless) qemu_thread_get_self()
ui/console-vc: fix off-by-one in CSI J 2 (clear entire screen)
ui/console-vc: add UTF-8 input decoding with CP437 rendering
ui/console-vc: ignore string-type escape sequences
ui/console-vc: fix comment shift-out/in comments
ui/console: dispatch get_label() through QOM virtual method
ui/console-vc: introduce QemuVT100
ui/console-vc: set vt100 associated pixman image
ui/console-vc: vga_putcharxy()->vt100_putcharxy()
ui/console-vc: make invalidate_xy() take vt100
ui/console-vc: make show_cursor() take vt100
ui/console-vc: decouple VT100 display updates via function pointer
ui/console-vc: console_refresh() -> vt100_refresh()
ui/console-vc: move cursor blinking logic into VT100 layer
ui/console-vc: console_scroll() -> vt100_scroll()
ui/console-vc: refactor text_console_resize() into vt100_set_image()
ui/console-vc: move vc_put_lf() to VT100 layer as vt100_put_lf()
ui/console-vc: unify the write path
ui/console-vc: move VT100 state machine and output FIFO into QemuVT100
ui/console-vc: extract vt100_input() from vc_chr_write()
ui/console-vc: extract vt100_keysym() from qemu_text_console_handle_keysym()
ui/console-vc: extract vt100_init() and vt100_fini()
ui/console: remove console_ch_t typedef and console_write_ch()
ui: avoid duplicating vgafont16 in each translation unit
ui/vgafont: add SPDX license header
ui: move FONT_WIDTH/HEIGHT to vgafont.h
ui/console-vc: move VT100 emulation into separate unit
util: move datadir.c from system/
ui: move DisplaySurface functions to display-surface.c
ui: make qemu_default_pixelformat() static inline
ui: make unregister_displaychangelistener() skip unregistered
ui: minor code simplification
system: make qemu_del_vm_change_state_handler accept NULL
ui/vnc: assert preconditions instead of silently returning
ui/vnc: simplify vnc_init_func error handling
ui/vnc: VncDisplay.id is not const
ui/vnc: fix vnc_display_init() leak on failure
ui/vnc: merge vnc_display_init() and vnc_display_open()
ui/vnc: report an error for duplicate display id
ui/vnc: defer listener registration until the console is known
ui/vnc: explicitly link with png
ui/vnc: add vnc-system unit, to allow different implementations
ui/console: remove qemu_console_is_visible()
ui/console: simplify registering display/console change listener
ui/console: return completion status from gfx_update callback
ui/console: rename public API to use consistent qemu_console_ prefix
ui/console: move console_handle_touch_event() to input
ui: extract common sources into a static library
tests: rename the dbus-daemon helper script
tests/qtest: fix dbus-vmstate-test compilation
tests/qtest: drop DBUS_VMSTATE_TEST_TMPDIR
contrib/qemu-vnc: add standalone VNC server over D-Bus
MAINTAINERS | 5 +
docs/conf.py | 3 +
docs/interop/dbus-display.rst | 2 +
docs/interop/dbus-vnc.rst | 26 +
docs/interop/index.rst | 1 +
docs/meson.build | 1 +
docs/tools/index.rst | 1 +
docs/tools/qemu-vnc.rst | 199 +
meson.build | 17 +
contrib/qemu-vnc/qemu-vnc.h | 46 +
contrib/qemu-vnc/trace.h | 4 +
hw/display/qxl.h | 2 +-
include/ui/console.h | 146 +-
include/ui/input.h | 15 +
include/ui/qemu-pixman.h | 8 +
include/ui/surface.h | 2 -
ui/console-priv.h | 8 -
ui/cp437.h | 13 +
ui/keymaps.h | 1 +
ui/vgafont.h | 4618 +---------------------
ui/vnc.h | 9 +-
ui/vt100.h | 92 +
contrib/qemu-vnc/audio.c | 307 ++
contrib/qemu-vnc/chardev.c | 127 +
contrib/qemu-vnc/clipboard.c | 378 ++
contrib/qemu-vnc/console.c | 168 +
contrib/qemu-vnc/dbus.c | 439 ++
contrib/qemu-vnc/display.c | 456 +++
contrib/qemu-vnc/input.c | 239 ++
contrib/qemu-vnc/qemu-vnc.c | 450 +++
contrib/qemu-vnc/stubs.c | 66 +
contrib/qemu-vnc/utils.c | 59 +
hw/arm/musicpal.c | 7 +-
hw/display/artist.c | 8 +-
hw/display/ati.c | 16 +-
hw/display/bcm2835_fb.c | 12 +-
hw/display/bochs-display.c | 20 +-
hw/display/cg3.c | 11 +-
hw/display/cirrus_vga.c | 8 +-
hw/display/cirrus_vga_isa.c | 2 +-
hw/display/dm163.c | 10 +-
hw/display/exynos4210_fimd.c | 10 +-
hw/display/g364fb.c | 19 +-
hw/display/jazz_led.c | 24 +-
hw/display/macfb.c | 12 +-
hw/display/next-fb.c | 8 +-
hw/display/omap_lcdc.c | 18 +-
hw/display/pl110.c | 9 +-
hw/display/qxl-render.c | 18 +-
hw/display/qxl.c | 25 +-
hw/display/ramfb-standalone.c | 6 +-
hw/display/ramfb.c | 4 +-
hw/display/sm501.c | 14 +-
hw/display/ssd0303.c | 14 +-
hw/display/ssd0323.c | 16 +-
hw/display/tcx.c | 22 +-
hw/display/vga-isa.c | 2 +-
hw/display/vga-mmio.c | 2 +-
hw/display/vga-pci.c | 6 +-
hw/display/vga.c | 60 +-
hw/display/vhost-user-gpu.c | 22 +-
hw/display/virtio-gpu-base.c | 7 +-
hw/display/virtio-gpu-rutabaga.c | 10 +-
hw/display/virtio-gpu-udmabuf.c | 4 +-
hw/display/virtio-gpu-virgl.c | 20 +-
hw/display/virtio-gpu.c | 26 +-
hw/display/virtio-vga.c | 10 +-
hw/display/vmware_vga.c | 21 +-
hw/display/xenfb.c | 12 +-
hw/display/xlnx_dp.c | 20 +-
hw/vfio/display.c | 49 +-
system/runstate.c | 3 +
tests/qtest/dbus-vmstate-test.c | 13 +-
tests/qtest/dbus-vnc-test.c | 733 ++++
ui/console-vc-stubs.c | 9 +-
ui/console-vc.c | 1021 +----
ui/console.c | 471 +--
ui/cp437.c | 205 +
ui/curses.c | 23 +-
ui/dbus-console.c | 16 +-
ui/dbus-listener.c | 37 +-
ui/display-surface.c | 107 +
ui/egl-headless.c | 8 +-
ui/gtk-egl.c | 6 +-
ui/gtk-gl-area.c | 6 +-
ui/gtk.c | 36 +-
ui/input.c | 65 +
ui/keymaps.c | 13 +-
ui/sdl2-2d.c | 2 +-
ui/sdl2-gl.c | 2 +-
ui/sdl2.c | 24 +-
ui/spice-display.c | 24 +-
ui/vgafont.c | 4616 +++++++++++++++++++++
ui/vnc-jobs.c | 54 +-
ui/vnc-system.c | 19 +
ui/vnc.c | 202 +-
ui/vt100.c | 987 +++++
{system => util}/datadir.c | 0
contrib/qemu-vnc/meson.build | 26 +
contrib/qemu-vnc/qemu-vnc1.xml | 174 +
contrib/qemu-vnc/trace-events | 20 +
hw/display/apple-gfx.m | 26 +-
meson_options.txt | 2 +
scripts/meson-buildoptions.sh | 3 +
system/meson.build | 1 -
system/trace-events | 1 -
tests/{dbus-vmstate-daemon.sh => dbus-daemon.sh} | 16 +-
tests/qtest/meson.build | 13 +-
ui/cocoa.m | 23 +-
ui/meson.build | 103 +-
util/meson.build | 1 +
util/trace-events | 3 +
112 files changed, 10982 insertions(+), 6624 deletions(-)
---
base-commit: 559919ce54927d59b215a4665eda7ab6118a48aa
change-id: 20260312-qemu-vnc-9662fc572262
Best regards,
--
Marc-André Lureau <marcandre.lureau@redhat.com>
next reply other threads:[~2026-03-17 8:51 UTC|newest]
Thread overview: 105+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-03-17 8:50 Marc-André Lureau [this message]
2026-03-17 8:50 ` [PATCH 01/60] ui/vnc-jobs: fix VncRectEntry leak on job cleanup Marc-André Lureau
2026-03-24 13:43 ` Daniel P. Berrangé
2026-03-17 8:50 ` [PATCH 02/60] ui/vnc-jobs: clear source tag Marc-André Lureau
2026-03-24 13:44 ` Daniel P. Berrangé
2026-03-17 8:50 ` [PATCH 03/60] ui/vnc-jobs: remove needless buffer_reset() before end Marc-André Lureau
2026-03-24 13:45 ` Daniel P. Berrangé
2026-03-17 8:50 ` [PATCH 04/60] ui/vnc: clarify intent using buffer_empty() function Marc-André Lureau
2026-03-24 13:45 ` Daniel P. Berrangé
2026-03-17 8:50 ` [PATCH 05/60] ui/vnc-jobs: vnc_has_job_locked() argument cannot be NULL Marc-André Lureau
2026-03-24 13:46 ` Daniel P. Berrangé
2026-03-17 8:50 ` [PATCH 06/60] ui/vnc-jobs: remove dead VncJobQueue.exit Marc-André Lureau
2026-03-24 13:49 ` Daniel P. Berrangé
2026-03-17 8:50 ` [PATCH 07/60] ui/vnc-jobs: remove vnc_queue_clear() Marc-André Lureau
2026-03-24 13:51 ` Daniel P. Berrangé
2026-03-17 8:50 ` [PATCH 08/60] ui/vnc-jobs: narrow taking the lock when pushing empty jobs Marc-André Lureau
2026-03-24 13:53 ` Daniel P. Berrangé
2026-03-24 14:04 ` Marc-André Lureau
2026-03-17 8:50 ` [PATCH 09/60] ui/vnc-jobs: drop redundant (and needless) qemu_thread_get_self() Marc-André Lureau
2026-03-24 14:00 ` Daniel P. Berrangé
2026-03-17 8:50 ` [PATCH 10/60] ui/console-vc: fix off-by-one in CSI J 2 (clear entire screen) Marc-André Lureau
2026-03-24 14:03 ` Daniel P. Berrangé
2026-03-17 8:50 ` [PATCH 11/60] ui/console-vc: add UTF-8 input decoding with CP437 rendering Marc-André Lureau
2026-03-24 14:07 ` Daniel P. Berrangé
2026-03-24 14:17 ` Marc-André Lureau
2026-03-24 15:42 ` Daniel P. Berrangé
2026-03-25 5:35 ` Markus Armbruster
2026-03-25 6:48 ` Marc-André Lureau
2026-03-17 8:50 ` [PATCH 12/60] ui/console-vc: ignore string-type escape sequences Marc-André Lureau
2026-03-17 8:50 ` [PATCH 13/60] ui/console-vc: fix comment shift-out/in comments Marc-André Lureau
2026-03-24 14:11 ` Daniel P. Berrangé
2026-03-17 8:50 ` [PATCH 14/60] ui/console: dispatch get_label() through QOM virtual method Marc-André Lureau
2026-03-24 14:14 ` Daniel P. Berrangé
2026-03-17 8:50 ` [PATCH 15/60] ui/console-vc: introduce QemuVT100 Marc-André Lureau
2026-03-17 8:50 ` [PATCH 16/60] ui/console-vc: set vt100 associated pixman image Marc-André Lureau
2026-03-17 8:50 ` [PATCH 17/60] ui/console-vc: vga_putcharxy()->vt100_putcharxy() Marc-André Lureau
2026-03-17 8:50 ` [PATCH 18/60] ui/console-vc: make invalidate_xy() take vt100 Marc-André Lureau
2026-03-17 8:50 ` [PATCH 19/60] ui/console-vc: make show_cursor() " Marc-André Lureau
2026-03-17 8:50 ` [PATCH 20/60] ui/console-vc: decouple VT100 display updates via function pointer Marc-André Lureau
2026-03-17 8:50 ` [PATCH 21/60] ui/console-vc: console_refresh() -> vt100_refresh() Marc-André Lureau
2026-03-17 8:50 ` [PATCH 22/60] ui/console-vc: move cursor blinking logic into VT100 layer Marc-André Lureau
2026-03-17 8:50 ` [PATCH 23/60] ui/console-vc: console_scroll() -> vt100_scroll() Marc-André Lureau
2026-03-17 8:50 ` [PATCH 24/60] ui/console-vc: refactor text_console_resize() into vt100_set_image() Marc-André Lureau
2026-03-17 8:50 ` [PATCH 25/60] ui/console-vc: move vc_put_lf() to VT100 layer as vt100_put_lf() Marc-André Lureau
2026-03-17 8:50 ` [PATCH 26/60] ui/console-vc: unify the write path Marc-André Lureau
2026-03-17 8:50 ` [PATCH 27/60] ui/console-vc: move VT100 state machine and output FIFO into QemuVT100 Marc-André Lureau
2026-03-17 8:50 ` [PATCH 28/60] ui/console-vc: extract vt100_input() from vc_chr_write() Marc-André Lureau
2026-03-17 8:50 ` [PATCH 29/60] ui/console-vc: extract vt100_keysym() from qemu_text_console_handle_keysym() Marc-André Lureau
2026-03-17 8:50 ` [PATCH 30/60] ui/console-vc: extract vt100_init() and vt100_fini() Marc-André Lureau
2026-03-17 8:50 ` [PATCH 31/60] ui/console: remove console_ch_t typedef and console_write_ch() Marc-André Lureau
2026-03-17 8:50 ` [PATCH 32/60] ui: avoid duplicating vgafont16 in each translation unit Marc-André Lureau
2026-03-24 14:22 ` Daniel P. Berrangé
2026-03-17 8:50 ` [PATCH 33/60] ui/vgafont: add SPDX license header Marc-André Lureau
2026-03-24 14:24 ` Daniel P. Berrangé
2026-03-17 8:50 ` [PATCH 34/60] ui: move FONT_WIDTH/HEIGHT to vgafont.h Marc-André Lureau
2026-03-24 14:25 ` Daniel P. Berrangé
2026-03-17 8:50 ` [PATCH 35/60] ui/console-vc: move VT100 emulation into separate unit Marc-André Lureau
2026-03-17 8:50 ` [PATCH 36/60] util: move datadir.c from system/ Marc-André Lureau
2026-03-24 14:27 ` Daniel P. Berrangé
2026-03-17 8:50 ` [PATCH 37/60] ui: move DisplaySurface functions to display-surface.c Marc-André Lureau
2026-03-17 8:50 ` [PATCH 38/60] ui: make qemu_default_pixelformat() static inline Marc-André Lureau
2026-03-24 14:28 ` Daniel P. Berrangé
2026-03-17 8:50 ` [PATCH 39/60] ui: make unregister_displaychangelistener() skip unregistered Marc-André Lureau
2026-03-24 14:28 ` Daniel P. Berrangé
2026-03-17 8:50 ` [PATCH 40/60] ui: minor code simplification Marc-André Lureau
2026-03-24 14:30 ` Daniel P. Berrangé
2026-03-17 8:50 ` [PATCH 41/60] system: make qemu_del_vm_change_state_handler accept NULL Marc-André Lureau
2026-03-24 14:31 ` Daniel P. Berrangé
2026-03-17 8:50 ` [PATCH 42/60] ui/vnc: assert preconditions instead of silently returning Marc-André Lureau
2026-03-24 14:31 ` Daniel P. Berrangé
2026-03-17 8:50 ` [PATCH 43/60] ui/vnc: simplify vnc_init_func error handling Marc-André Lureau
2026-03-24 14:38 ` Daniel P. Berrangé
2026-03-17 8:50 ` [PATCH 44/60] ui/vnc: VncDisplay.id is not const Marc-André Lureau
2026-03-24 14:39 ` Daniel P. Berrangé
2026-03-17 8:50 ` [PATCH 45/60] ui/vnc: fix vnc_display_init() leak on failure Marc-André Lureau
2026-03-24 14:47 ` Daniel P. Berrangé
2026-03-17 8:51 ` [PATCH 46/60] ui/vnc: merge vnc_display_init() and vnc_display_open() Marc-André Lureau
2026-03-24 14:51 ` Daniel P. Berrangé
2026-03-17 8:51 ` [PATCH 47/60] ui/vnc: report an error for duplicate display id Marc-André Lureau
2026-03-24 14:52 ` Daniel P. Berrangé
2026-03-17 8:51 ` [PATCH 48/60] ui/vnc: defer listener registration until the console is known Marc-André Lureau
2026-03-24 14:53 ` Daniel P. Berrangé
2026-03-17 8:51 ` [PATCH 49/60] ui/vnc: explicitly link with png Marc-André Lureau
2026-03-24 14:56 ` Daniel P. Berrangé
2026-03-17 8:51 ` [PATCH 50/60] ui/vnc: add vnc-system unit, to allow different implementations Marc-André Lureau
2026-03-17 8:51 ` [PATCH 51/60] ui/console: remove qemu_console_is_visible() Marc-André Lureau
2026-03-24 14:57 ` Daniel P. Berrangé
2026-03-17 8:51 ` [PATCH 52/60] ui/console: simplify registering display/console change listener Marc-André Lureau
2026-03-17 8:51 ` [PATCH 53/60] ui/console: return completion status from gfx_update callback Marc-André Lureau
2026-03-17 11:43 ` BALATON Zoltan
2026-03-17 8:51 ` [PATCH 54/60] ui/console: rename public API to use consistent qemu_console_ prefix Marc-André Lureau
2026-03-17 11:46 ` BALATON Zoltan
2026-03-17 8:51 ` [PATCH 55/60] ui/console: move console_handle_touch_event() to input Marc-André Lureau
2026-03-17 8:51 ` [PATCH 56/60] ui: extract common sources into a static library Marc-André Lureau
2026-03-17 8:51 ` [PATCH 57/60] tests: rename the dbus-daemon helper script Marc-André Lureau
2026-03-24 15:05 ` Daniel P. Berrangé
2026-03-17 8:51 ` [PATCH 58/60] tests/qtest: fix dbus-vmstate-test compilation Marc-André Lureau
2026-03-17 12:28 ` Fabiano Rosas
2026-03-17 12:39 ` Marc-André Lureau
2026-03-17 8:51 ` [PATCH 59/60] tests/qtest: drop DBUS_VMSTATE_TEST_TMPDIR Marc-André Lureau
2026-03-17 8:51 ` [PATCH 60/60] contrib/qemu-vnc: add standalone VNC server over D-Bus Marc-André Lureau
2026-03-24 15:24 ` Daniel P. Berrangé
2026-03-24 15:44 ` Peter Maydell
2026-03-25 8:32 ` Marc-André Lureau
2026-03-24 17:36 ` [PATCH 00/60] ui: " Daniel P. Berrangé
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20260317-qemu-vnc-v1-0-48eb1dcf7b76@redhat.com \
--to=marcandre.lureau@redhat.com \
--cc=qemu-devel@nongnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox