Cover Letter Detail
Show a cover letter.
GET /api/1.1/covers/2222070/?format=api
{ "id": 2222070, "url": "http://patchwork.ozlabs.org/api/1.1/covers/2222070/?format=api", "web_url": "http://patchwork.ozlabs.org/project/qemu-devel/cover/20260410-qemu-vnc-v2-0-231416f76dc3@redhat.com/", "project": { "id": 14, "url": "http://patchwork.ozlabs.org/api/1.1/projects/14/?format=api", "name": "QEMU Development", "link_name": "qemu-devel", "list_id": "qemu-devel.nongnu.org", "list_email": "qemu-devel@nongnu.org", "web_url": "", "scm_url": "", "webscm_url": "" }, "msgid": "<20260410-qemu-vnc-v2-0-231416f76dc3@redhat.com>", "date": "2026-04-10T19:18:22", "name": "[v2,00/67] ui: add standalone VNC server over D-Bus", "submitter": { "id": 66774, "url": "http://patchwork.ozlabs.org/api/1.1/people/66774/?format=api", "name": "Marc-André Lureau", "email": "marcandre.lureau@redhat.com" }, "mbox": "http://patchwork.ozlabs.org/project/qemu-devel/cover/20260410-qemu-vnc-v2-0-231416f76dc3@redhat.com/mbox/", "series": [ { "id": 499494, "url": "http://patchwork.ozlabs.org/api/1.1/series/499494/?format=api", "web_url": "http://patchwork.ozlabs.org/project/qemu-devel/list/?series=499494", "date": "2026-04-10T19:18:23", "name": "ui: add standalone VNC server over D-Bus", "version": 2, "mbox": "http://patchwork.ozlabs.org/series/499494/mbox/" } ], "comments": "http://patchwork.ozlabs.org/api/covers/2222070/comments/", "headers": { "Return-Path": "<qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org>", "X-Original-To": "incoming@patchwork.ozlabs.org", "Delivered-To": "patchwork-incoming@legolas.ozlabs.org", "Authentication-Results": [ "legolas.ozlabs.org;\n\tdkim=pass (1024-bit key;\n unprotected) header.d=redhat.com header.i=@redhat.com header.a=rsa-sha256\n header.s=mimecast20190719 header.b=ZXuKmiYp;\n\tdkim-atps=neutral", "legolas.ozlabs.org;\n spf=pass (sender SPF authorized) smtp.mailfrom=nongnu.org\n (client-ip=209.51.188.17; helo=lists.gnu.org;\n envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org;\n receiver=patchwork.ozlabs.org)" ], "Received": [ "from lists.gnu.org (lists1p.gnu.org [209.51.188.17])\n\t(using TLSv1.2 with cipher ECDHE-ECDSA-AES256-GCM-SHA384 (256/256 bits))\n\t(No client certificate requested)\n\tby legolas.ozlabs.org (Postfix) with ESMTPS id 4fsmpW0RTHz1yGS\n\tfor <incoming@patchwork.ozlabs.org>; Sat, 11 Apr 2026 05:20:03 +1000 (AEST)", "from localhost ([::1] helo=lists1p.gnu.org)\n\tby lists.gnu.org with esmtp (Exim 4.90_1)\n\t(envelope-from <qemu-devel-bounces@nongnu.org>)\n\tid 1wBHNi-0002FX-Az; Fri, 10 Apr 2026 15:19:06 -0400", "from eggs.gnu.org ([2001:470:142:3::10])\n by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256)\n (Exim 4.90_1) (envelope-from <marcandre.lureau@redhat.com>)\n id 1wBHNg-0002Ey-2L\n for qemu-devel@nongnu.org; Fri, 10 Apr 2026 15:19:04 -0400", "from us-smtp-delivery-124.mimecast.com ([170.10.133.124])\n by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256)\n (Exim 4.90_1) (envelope-from <marcandre.lureau@redhat.com>)\n id 1wBHNc-0000L3-BV\n for qemu-devel@nongnu.org; Fri, 10 Apr 2026 15:19:03 -0400", "from mx-prod-mc-03.mail-002.prod.us-west-2.aws.redhat.com\n (ec2-54-186-198-63.us-west-2.compute.amazonaws.com [54.186.198.63]) by\n relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3,\n cipher=TLS_AES_256_GCM_SHA384) id us-mta-322-bdBxSP5oO3uF6XrYJ7P_xw-1; Fri,\n 10 Apr 2026 15:18:54 -0400", "from mx-prod-int-08.mail-002.prod.us-west-2.aws.redhat.com\n (mx-prod-int-08.mail-002.prod.us-west-2.aws.redhat.com [10.30.177.111])\n (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)\n key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest\n SHA256)\n (No client certificate requested)\n by mx-prod-mc-03.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTPS\n id BD0951956054; Fri, 10 Apr 2026 19:18:53 +0000 (UTC)", "from localhost (unknown [10.44.22.4])\n by mx-prod-int-08.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTP\n id 0DAFF1800B7F; Fri, 10 Apr 2026 19:18:51 +0000 (UTC)" ], "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com;\n s=mimecast20190719; t=1775848738;\n h=from:from:reply-to:subject:subject:date:date:message-id:message-id:\n to:to:cc:cc:mime-version:mime-version:content-type:content-type:\n content-transfer-encoding:content-transfer-encoding;\n bh=qJqeKQIvI1wzoS4nC5CVuB9LnRSqFcvxOzeX5n0xkHU=;\n b=ZXuKmiYpRwDN1b30opi+Wmktv/QMGurBilBGiGvivvRtGmjhk271YaosEYtz/tQkXTFt3W\n PqKhBB/28fggUvysprulb22RnHk0wJwFF6OpPPlGyHDELtd/ToSKTgqBXRfrhtBofWGMFf\n Lq7jfJvfenYFGS06g707Cd446x+5oq0=", "X-MC-Unique": "bdBxSP5oO3uF6XrYJ7P_xw-1", "X-Mimecast-MFC-AGG-ID": "bdBxSP5oO3uF6XrYJ7P_xw_1775848734", "From": "=?utf-8?q?Marc-Andr=C3=A9_Lureau?= <marcandre.lureau@redhat.com>", "Subject": "[PATCH v2 00/67] ui: add standalone VNC server over D-Bus", "Date": "Fri, 10 Apr 2026 23:18:22 +0400", "Message-Id": "<20260410-qemu-vnc-v2-0-231416f76dc3@redhat.com>", "MIME-Version": "1.0", "Content-Type": "text/plain; charset=\"utf-8\"", "Content-Transfer-Encoding": "8bit", "X-B4-Tracking": "v=1; b=H4sIAAAAAAAC/0XMQQ7CIBCF4as0sxYDo4K68h6mixYGYVFQqETTc\n HexiXH5v7x8C2RKnjKcuwUSFZ99DC1w04F2Q7gR86Y1IEfJdwLZg6YnK0Gzk5Ro9UEhSoR2vye\n y/rVS176183mO6b3KRXzXH6L+SBGMs/2RRmG0VaOSl0TGDfNWxwn6WusHHQrTlaEAAAA=", "X-Change-ID": "20260312-qemu-vnc-9662fc572262", "To": "qemu-devel@nongnu.org", "Cc": "=?utf-8?q?Marc-Andr=C3=A9_Lureau?= <marcandre.lureau@redhat.com>,\n\t=?utf-8?q?Daniel_P=2E_Berrang=C3=A9?= <berrange@redhat.com>, =?utf-8?q?Phil?=\n\t=?utf-8?q?ippe_Mathieu-Daud=C3=A9?= <philmd@linaro.org>,\n Fabrice Bellard <fabrice@bellard.org>", "X-Developer-Signature": "v=1; a=openpgp-sha256; l=13280;\n i=marcandre.lureau@redhat.com; h=from:subject:message-id;\n bh=0QvD4qt5z80S9jrNnycG6omPcKwKnuS1t50FGprv6a4=;\n b=owEBbQKS/ZANAwAKAdro4Ql1lpzlAcsmYgBp2U0SZ4WPEvgn8TJHBeBhtIGhPMq6ZXn/XlHAQ\n jXfAhmJPYCJAjMEAAEKAB0WIQSHqb2TP4fGBtJ29i3a6OEJdZac5QUCadlNEgAKCRDa6OEJdZac\n 5e2pD/9KeKivluV0NKdCnilKe5d9uwhKmDq5c5UADh15YQqB2amFM87MKFpw2x8M7NyV/ClzY0C\n 4igUp6fzG6eW6LVgoAss9nGNTkAh88CtRIfqqDpobDxTKcHzlBTIWrO6IhnhSPXdsrMJXUF3mqI\n /eikpmvUSzXdga43jFnPeRhA4dQyzNnP9cOafYRUr7sc9Nn3HsoXSzAJ7Ozo2USTEyTEAqPudzL\n 1ObzeJJChf5/Xh967fa550WUjjPpwLf2P5Zarw8jEY7tZ8f9aU44Racay5eljwpi4JK56GajAoP\n VeRpoQfqyPeIa2XkJaYCqh/zRTge2gV/AHhy/tyo5ELm1fRZ2kDHemGpvhOuUSxSpXiDUXxkbbZ\n bDNyvANxvSeWiTbQok+EQAquwTSA2H4B3J8KgNmwlTmTglV+OabTXHsflZZe+AMnUZ/dLRm1Sh7\n r++u/1E3juGHAsasYrLtYkZsdQX/48z+wp+qheE4euYh2vtxCRehtFlpOoKgH/s/Mgd0CcnN4tQ\n 5cxUimKX5awZAMJbv+C3Jb93GE7cJJDS0tPrr0G85GSLjWZMngX3cGXJ58Vl35DLA/x4iSI6I7p\n lhovC6tgdyNfUhJJ01ZhD9wEq+d+oWY61yTWkqeEJh0518cc6+YhKLuZ34W65XcPzQMWn/JClgi\n SeZTZMe4YRx3aGA==", "X-Developer-Key": "i=marcandre.lureau@redhat.com; a=openpgp;\n fpr=87A9BD933F87C606D276F62DDAE8E10975969CE5", "X-Scanned-By": "MIMEDefang 3.4.1 on 10.30.177.111", "Received-SPF": "pass client-ip=170.10.133.124;\n envelope-from=marcandre.lureau@redhat.com;\n helo=us-smtp-delivery-124.mimecast.com", "X-Spam_score_int": "7", "X-Spam_score": "0.7", "X-Spam_bar": "/", "X-Spam_report": "(0.7 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.54,\n DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1,\n RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H2=0.001, RCVD_IN_SBL_CSS=3.335,\n RCVD_IN_VALIDITY_RPBL_BLOCKED=0.001, RCVD_IN_VALIDITY_SAFE_BLOCKED=0.001,\n SPF_HELO_PASS=-0.001, SPF_PASS=-0.001 autolearn=no autolearn_force=no", "X-Spam_action": "no action", "X-BeenThere": "qemu-devel@nongnu.org", "X-Mailman-Version": "2.1.29", "Precedence": "list", "List-Id": "qemu development <qemu-devel.nongnu.org>", "List-Unsubscribe": "<https://lists.nongnu.org/mailman/options/qemu-devel>,\n <mailto:qemu-devel-request@nongnu.org?subject=unsubscribe>", "List-Archive": "<https://lists.nongnu.org/archive/html/qemu-devel>", "List-Post": "<mailto:qemu-devel@nongnu.org>", "List-Help": "<mailto:qemu-devel-request@nongnu.org?subject=help>", "List-Subscribe": "<https://lists.nongnu.org/mailman/listinfo/qemu-devel>,\n <mailto:qemu-devel-request@nongnu.org?subject=subscribe>", "Errors-To": "qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org", "Sender": "qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org" }, "content": "This series adds qemu-vnc, a standalone VNC server that connects to a\nrunning QEMU instance via the D-Bus display interface (org.qemu.Display1).\nThis allows serving a VNC display as a separate process with an independent\nlifecycle and privilege domain, without requiring VNC support compiled into\nthe QEMU system emulator itself.\n\nThe bulk of the series is preparatory refactoring:\n\n- Clean up VNC code: merge init/open, fix leaks, simplify error handling\n- Extract and clean up VT100 emulation from console-vc into a reusable unit\n- Reorganize ui/ code: move DisplaySurface functions, vgafont, datadir\nand other pieces into their own files\n- Refactor console APIs: rename methods, simplify listener registration,\nreturn completion status from gfx_update\n- Extract common ui sources into a static library that can be linked by\nboth the system emulator and the new standalone binary\n\nThe final patch adds contrib/qemu-vnc, built when both VNC and D-Bus\ndisplay support are enabled.\n\nSigned-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>\n---\nChanges in v2:\n- renamed utf8_ DFA function/symbols with bh_ (Bjoern Hoehrmann) prefix\n- use \"QemuVT *vt = &s->vt;\" to avoid some code churn\n- use size_t for vt100_input()\n- replace back compound literal usage for QEMUUIInfo, use variable\n- add a preliminary patch to convert vnc_display_init/open() to return bool\n- add doc comment for qemu_console_{un}register_listener()\n- document GraphicsHwOps.gfx_update better\n- add \"ui/vnc: make the worker thread per-VncDisplay\", and free it on vnc_display_free()\n- add \"ui/vnc: add vnc_cleanup()\"\n- add \"replace VNC_DEBUG with trace-events\"\n- qemu-vnc: add sasl & authz support, doc updates\n- move qemu-vnc under tools/\n- rebased, collect trailer tags\n- Link to v1: https://lore.kernel.org/qemu-devel/20260317-qemu-vnc-v1-0-48eb1dcf7b76@redhat.com\n\n---\nMarc-André Lureau (67):\n ui/vnc-jobs: remove needless buffer_reset() before end\n ui/vnc: clarify intent using buffer_empty() function\n ui/vnc-jobs: vnc_has_job_locked() argument cannot be NULL\n ui/vnc-jobs: remove dead VncJobQueue.exit\n ui/vnc-jobs: remove vnc_queue_clear()\n ui/vnc-jobs: narrow taking the queue lock\n ui/vnc-jobs: drop redundant (and needless) qemu_thread_get_self()\n ui/console-vc: fix off-by-one in CSI J 2 (clear entire screen)\n ui/console-vc: add UTF-8 input decoding with CP437 rendering\n ui/console-vc: ignore string-type escape sequences\n ui/console-vc: fix comment shift-out/in comments\n ui/console: dispatch get_label() through QOM virtual method\n ui/console-vc: introduce QemuVT100\n ui/console-vc: set vt100 associated pixman image\n ui/console-vc: vga_putcharxy()->vt100_putcharxy()\n ui/console-vc: make invalidate_xy() take vt100\n ui/console-vc: make show_cursor() take vt100\n ui/console-vc: decouple VT100 display updates via function pointer\n ui/console-vc: console_refresh() -> vt100_refresh()\n ui/console-vc: move cursor blinking logic into VT100 layer\n ui/console-vc: console_scroll() -> vt100_scroll()\n ui/console-vc: refactor text_console_resize() into vt100_set_image()\n ui/console-vc: move vc_put_lf() to VT100 layer as vt100_put_lf()\n ui/console-vc: unify the write path\n ui/console-vc: move VT100 state machine and output FIFO into QemuVT100\n ui/console-vc: extract vt100_input() from vc_chr_write()\n ui/console-vc: extract vt100_keysym() from qemu_text_console_handle_keysym()\n ui/console-vc: extract vt100_init() and vt100_fini()\n ui/console: remove console_ch_t typedef and console_write_ch()\n ui: avoid duplicating vgafont16 in each translation unit\n ui/vgafont: add SPDX license header\n ui: move FONT_WIDTH/HEIGHT to vgafont.h\n ui/console-vc: move VT100 emulation into separate unit\n util: move datadir.c from system/\n ui: move DisplaySurface functions to display-surface.c\n ui: make qemu_default_pixelformat() static inline\n ui: make unregister_displaychangelistener() skip unregistered\n ui: minor code simplification\n system: make qemu_del_vm_change_state_handler accept NULL\n ui/vnc: assert preconditions instead of silently returning\n ui/vnc: simplify vnc_init_func error handling\n ui/vnc: VncDisplay.id is not const\n ui/keymaps: introduce kbd_layout_free()\n ui/vnc: fix vnc_display_init() leak on failure\n ui/vnc: make vnc_disconnect_finish() private\n ui/vnc: make the worker thread per-VncDisplay\n ui/vnc: vnc_display_init() and vnc_display_open() return bool\n ui/vnc: merge vnc_display_init() and vnc_display_open()\n ui/vnc: add vnc_cleanup()\n ui/vnc: report an error for duplicate display id\n ui/vnc: defer listener registration until the console is known\n ui/vnc: expose vnc_disconnect_start()\n ui/vnc: remove left-over dead code\n ui/vnc: explicitly link with png\n ui/vnc: add vnc-system unit, to allow different implementations\n ui/console: remove qemu_console_is_visible()\n ui/console: simplify registering display/console change listener\n ui/console: add doc comment for qemu_console_{un}register_listener()\n ui/console: return completion status from gfx_update callback\n ui/console: rename public API to use consistent qemu_console_ prefix\n ui/console: move console_handle_touch_event() to input\n ui/vnc: replace VNC_DEBUG with trace-events\n ui: extract common sources into a static library\n tests: rename the dbus-daemon helper script\n tests/qtest: fix dbus-vmstate-test compilation\n tests/qtest: drop DBUS_VMSTATE_TEST_TMPDIR\n tools/qemu-vnc: add standalone VNC server over D-Bus\n\n MAINTAINERS | 5 +\n docs/conf.py | 3 +\n docs/interop/dbus-display.rst | 2 +\n docs/interop/dbus-vnc.rst | 26 +\n docs/interop/index.rst | 1 +\n docs/meson.build | 1 +\n docs/tools/index.rst | 1 +\n docs/tools/qemu-vnc.rst | 222 ++\n meson.build | 17 +\n hw/display/qxl.h | 2 +-\n include/ui/console.h | 153 +-\n include/ui/input.h | 15 +\n include/ui/qemu-pixman.h | 8 +\n include/ui/surface.h | 2 -\n tools/qemu-vnc/qemu-vnc.h | 46 +\n tools/qemu-vnc/trace.h | 4 +\n ui/console-priv.h | 8 -\n ui/cp437.h | 13 +\n ui/keymaps.h | 1 +\n ui/vgafont.h | 4618 +---------------------\n ui/vnc-jobs.h | 3 +-\n ui/vnc.h | 22 +-\n ui/vt100.h | 92 +\n hw/arm/musicpal.c | 7 +-\n hw/display/artist.c | 8 +-\n hw/display/ati.c | 16 +-\n hw/display/bcm2835_fb.c | 12 +-\n hw/display/bochs-display.c | 20 +-\n hw/display/cg3.c | 11 +-\n hw/display/cirrus_vga.c | 8 +-\n hw/display/cirrus_vga_isa.c | 2 +-\n hw/display/dm163.c | 10 +-\n hw/display/exynos4210_fimd.c | 10 +-\n hw/display/g364fb.c | 19 +-\n hw/display/jazz_led.c | 24 +-\n hw/display/macfb.c | 12 +-\n hw/display/next-fb.c | 8 +-\n hw/display/omap_lcdc.c | 18 +-\n hw/display/pl110.c | 9 +-\n hw/display/qxl-render.c | 18 +-\n hw/display/qxl.c | 25 +-\n hw/display/ramfb-standalone.c | 6 +-\n hw/display/ramfb.c | 4 +-\n hw/display/sm501.c | 14 +-\n hw/display/ssd0303.c | 14 +-\n hw/display/ssd0323.c | 16 +-\n hw/display/tcx.c | 22 +-\n hw/display/vga-isa.c | 2 +-\n hw/display/vga-mmio.c | 2 +-\n hw/display/vga-pci.c | 6 +-\n hw/display/vga.c | 60 +-\n hw/display/vhost-user-gpu.c | 22 +-\n hw/display/virtio-gpu-base.c | 7 +-\n hw/display/virtio-gpu-rutabaga.c | 10 +-\n hw/display/virtio-gpu-udmabuf.c | 4 +-\n hw/display/virtio-gpu-virgl.c | 20 +-\n hw/display/virtio-gpu.c | 26 +-\n hw/display/virtio-vga.c | 10 +-\n hw/display/vmware_vga.c | 21 +-\n hw/display/xenfb.c | 12 +-\n hw/display/xlnx_dp.c | 20 +-\n hw/vfio/display.c | 49 +-\n system/runstate.c | 8 +\n tests/qtest/dbus-vmstate-test.c | 13 +-\n tests/qtest/dbus-vnc-test.c | 1342 +++++++\n tools/qemu-vnc/audio.c | 307 ++\n tools/qemu-vnc/chardev.c | 127 +\n tools/qemu-vnc/clipboard.c | 378 ++\n tools/qemu-vnc/console.c | 168 +\n tools/qemu-vnc/dbus.c | 439 ++\n tools/qemu-vnc/display.c | 456 +++\n tools/qemu-vnc/input.c | 239 ++\n tools/qemu-vnc/qemu-vnc.c | 491 +++\n tools/qemu-vnc/stubs.c | 62 +\n tools/qemu-vnc/utils.c | 59 +\n ui/console-vc-stubs.c | 9 +-\n ui/console-vc.c | 1021 +----\n ui/console.c | 491 +--\n ui/cp437.c | 205 +\n ui/curses.c | 23 +-\n ui/dbus-console.c | 16 +-\n ui/dbus-listener.c | 37 +-\n ui/display-surface.c | 107 +\n ui/egl-headless.c | 8 +-\n ui/gtk-egl.c | 6 +-\n ui/gtk-gl-area.c | 6 +-\n ui/gtk.c | 36 +-\n ui/input.c | 65 +\n ui/keymaps.c | 13 +-\n ui/sdl2-2d.c | 2 +-\n ui/sdl2-gl.c | 2 +-\n ui/sdl2.c | 22 +-\n ui/spice-display.c | 24 +-\n ui/vgafont.c | 4616 +++++++++++++++++++++\n ui/vnc-auth-sasl.c | 13 +-\n ui/vnc-enc-tight.c | 4 +-\n ui/vnc-enc-zlib.c | 4 +-\n ui/vnc-jobs.c | 112 +-\n ui/vnc-system.c | 19 +\n ui/vnc-ws.c | 10 +-\n ui/vnc.c | 291 +-\n ui/vt100.c | 986 +++++\n {system => util}/datadir.c | 0\n hw/display/apple-gfx.m | 26 +-\n meson_options.txt | 2 +\n scripts/meson-buildoptions.sh | 3 +\n system/meson.build | 1 -\n system/trace-events | 1 -\n tests/{dbus-vmstate-daemon.sh => dbus-daemon.sh} | 16 +-\n tests/qtest/meson.build | 18 +-\n tools/qemu-vnc/meson.build | 26 +\n tools/qemu-vnc/qemu-vnc1.xml | 174 +\n tools/qemu-vnc/trace-events | 20 +\n ui/cocoa.m | 23 +-\n ui/meson.build | 103 +-\n ui/trace-events | 29 +-\n util/meson.build | 1 +\n util/trace-events | 3 +\n 118 files changed, 11819 insertions(+), 6713 deletions(-)\n---\nbase-commit: becd22fdc2a071783d9e04421526633772b3b98c\nchange-id: 20260312-qemu-vnc-9662fc572262\n\nBest regards,\n-- \nMarc-André Lureau <marcandre.lureau@redhat.com>" }