Patch Detail
get:
Show a patch.
patch:
Update a patch.
put:
Update a patch.
GET /api/1.1/patches/2222125/?format=api
{ "id": 2222125, "url": "http://patchwork.ozlabs.org/api/1.1/patches/2222125/?format=api", "web_url": "http://patchwork.ozlabs.org/project/qemu-devel/patch/20260410-qemu-vnc-v2-57-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-57-231416f76dc3@redhat.com>", "date": "2026-04-10T19:19:19", "name": "[v2,57/67] ui/console: simplify registering display/console change listener", "commit_ref": null, "pull_url": null, "state": "new", "archived": false, "hash": "1adfa7bc9ad3b335d7f383dfe2f39b6f13b2c1df", "submitter": { "id": 66774, "url": "http://patchwork.ozlabs.org/api/1.1/people/66774/?format=api", "name": "Marc-André Lureau", "email": "marcandre.lureau@redhat.com" }, "delegate": null, "mbox": "http://patchwork.ozlabs.org/project/qemu-devel/patch/20260410-qemu-vnc-v2-57-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/patches/2222125/comments/", "check": "pending", "checks": "http://patchwork.ozlabs.org/api/patches/2222125/checks/", "tags": {}, "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=Dm9It/cY;\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 4fsmzL6M16z1yGb\n\tfor <incoming@patchwork.ozlabs.org>; Sat, 11 Apr 2026 05:27:42 +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 1wBHTH-0006xt-9x; Fri, 10 Apr 2026 15:24:51 -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 1wBHTF-0006xF-Rw\n for qemu-devel@nongnu.org; Fri, 10 Apr 2026 15:24:50 -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 1wBHT8-0002bS-U4\n for qemu-devel@nongnu.org; Fri, 10 Apr 2026 15:24:49 -0400", "from mx-prod-mc-08.mail-002.prod.us-west-2.aws.redhat.com\n (ec2-35-165-154-97.us-west-2.compute.amazonaws.com [35.165.154.97]) by\n relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3,\n cipher=TLS_AES_256_GCM_SHA384) id us-mta-610-dRfPzBuvPjyiAYPFs3ae2g-1; Fri,\n 10 Apr 2026 15:24:36 -0400", "from mx-prod-int-03.mail-002.prod.us-west-2.aws.redhat.com\n (mx-prod-int-03.mail-002.prod.us-west-2.aws.redhat.com [10.30.177.12])\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-08.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTPS\n id 9B60A1800345; Fri, 10 Apr 2026 19:24:35 +0000 (UTC)", "from localhost (unknown [10.44.22.4])\n by mx-prod-int-03.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTP\n id 06B1719560AB; Fri, 10 Apr 2026 19:24:33 +0000 (UTC)" ], "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com;\n s=mimecast20190719; t=1775849077;\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 in-reply-to:in-reply-to:references:references;\n bh=B5gxCmewHIz/X+2RiST7nfGCnkT2jOycpEpFMMmqnGg=;\n b=Dm9It/cY1/Q2F5JXPi1YXykYjrqlTrp53qjoFyggldfaV31veSg+fvP+/T272YSKuno+2v\n W3ncXc85J6R5BIN+uGLhtSVf2Tcrbw/ruUrLTpS0tJlE0SUlAo0bV5LzGG2jqacO7jBn3N\n SPzYGpusqG4oGaD17wY7+LnR+tYkhZ8=", "X-MC-Unique": "dRfPzBuvPjyiAYPFs3ae2g-1", "X-Mimecast-MFC-AGG-ID": "dRfPzBuvPjyiAYPFs3ae2g_1775849075", "From": "=?utf-8?q?Marc-Andr=C3=A9_Lureau?= <marcandre.lureau@redhat.com>", "Date": "Fri, 10 Apr 2026 23:19:19 +0400", "Subject": "[PATCH v2 57/67] ui/console: simplify registering display/console\n change listener", "MIME-Version": "1.0", "Content-Type": "text/plain; charset=\"utf-8\"", "Content-Transfer-Encoding": "8bit", "Message-Id": "<20260410-qemu-vnc-v2-57-231416f76dc3@redhat.com>", "References": "<20260410-qemu-vnc-v2-0-231416f76dc3@redhat.com>", "In-Reply-To": "<20260410-qemu-vnc-v2-0-231416f76dc3@redhat.com>", "To": "qemu-devel@nongnu.org", "Cc": "=?utf-8?q?Marc-Andr=C3=A9_Lureau?= <marcandre.lureau@redhat.com>,\n\t=?utf-8?q?Philippe_Mathieu-Daud=C3=A9?= <philmd@linaro.org>", "X-Developer-Signature": "v=1; a=openpgp-sha256; l=17782;\n i=marcandre.lureau@redhat.com; h=from:subject:message-id;\n bh=ulSnzJcpHIdXHpuilMUXK8Bbd7MMg82E7jWmIZIyrLU=;\n b=owEBbQKS/ZANAwAKAdro4Ql1lpzlAcsmYgBp2U0WkaaXwW4H4GJcO7oql/bMufzZ6ErFWLrM5\n IHSIUnTswuJAjMEAAEKAB0WIQSHqb2TP4fGBtJ29i3a6OEJdZac5QUCadlNFgAKCRDa6OEJdZac\n 5VuZD/9H53ZMVSoxKQ48liVD7gcy2HlRU0k8c+w9JVw2i31V8HEfGK1oLVIhBiIxSxdNuq9Q7lW\n uWVKh8aPXBejuVbpgwQxD+8b2qOWNN9G7wKgWcv6MxYVtMhanE9Q04KsWEe5pA4MAhi6u+P65Bn\n 63w0ijcBRIRuzYrwPXdvPO6B1vB2GhCYGeEODhIi10TkoAtRbQQg92y+pTAFZ+Avhijh50nwWAW\n 1InI/5U+CVeYI2CIwEeKyV+z6IiIKPhSM5+rb+6v1ux6mDK1mIaGU7zUu7QsSY3YGOPUxO2LeVL\n FV+ZXc4O405YG3WFPJ0SdDUV3jOTmDT3gLonME7wK7CbrYAUDl4ikcucUI/aBkawi9rEh+u65DH\n YU/rlDXBBF94pGxBzaW+UZxEoHr4xNQkPvgzs+4LVXBbZGEKJZEXCVBMh4VoAsaCXwiCsnBcYv5\n memXrhpea/Y1/4/wLZWXh5RCqGETjWakmwU0h406gUslQaztKudpXHYnN82rzaxcbzqvhiqq+5I\n Sct0w37RLqOwmIpr4xe7N7ChfEMKP4g6MfHgapD2i1MNUl30g9Y7sSZXt7MovNG+eVt+PYCTyIl\n QKb5VcDlRuP8pO5w0UGzvhJ0M4peoX/cpapNG+nMboLCibesFrITclOFiBiwwY20Ee/CV06Gu4x\n EsGlJdfGlsU0SjA==", "X-Developer-Key": "i=marcandre.lureau@redhat.com; a=openpgp;\n fpr=87A9BD933F87C606D276F62DDAE8E10975969CE5", "X-Scanned-By": "MIMEDefang 3.0 on 10.30.177.12", "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": "-25", "X-Spam_score": "-2.6", "X-Spam_bar": "--", "X-Spam_report": "(-2.6 / 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,\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=ham 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": "Introduce qemu_console_register_listener() which combines setting\ndcl->con, dcl->ops and calling register_displaychangelistener() into a\nsingle call. This removes repetitive boilerplate across all display\nbackends and makes it harder to forget setting one of the fields.\n\nAlso move the early-return check in unregister_displaychangelistener()\nbefore the trace call, so that unregistering a never-registered listener\n(e.g. on error paths) does not dereference a NULL ops pointer.\n\nReviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>\nSigned-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>\n---\n include/ui/console.h | 6 ++++--\n hw/display/qxl.c | 4 +---\n ui/console.c | 11 ++++++++---\n ui/curses.c | 9 +++------\n ui/dbus-console.c | 6 ++----\n ui/dbus-listener.c | 27 ++++++++-------------------\n ui/egl-headless.c | 4 +---\n ui/gtk.c | 10 ++++------\n ui/sdl2.c | 8 +++-----\n ui/spice-display.c | 8 +++-----\n ui/vnc.c | 11 ++++-------\n ui/cocoa.m | 13 ++++---------\n 12 files changed, 45 insertions(+), 72 deletions(-)", "diff": "diff --git a/include/ui/console.h b/include/ui/console.h\nindex 472c188a727..823d3b819b2 100644\n--- a/include/ui/console.h\n+++ b/include/ui/console.h\n@@ -305,10 +305,12 @@ struct DisplayGLCtx {\n \n DisplayState *init_displaystate(void);\n \n-void register_displaychangelistener(DisplayChangeListener *dcl);\n+void qemu_console_register_listener(QemuConsole *con,\n+ DisplayChangeListener *dcl,\n+ const DisplayChangeListenerOps *ops);\n void update_displaychangelistener(DisplayChangeListener *dcl,\n uint64_t interval);\n-void unregister_displaychangelistener(DisplayChangeListener *dcl);\n+void qemu_console_unregister_listener(DisplayChangeListener *dcl);\n \n bool dpy_ui_info_supported(const QemuConsole *con);\n const QemuUIInfo *dpy_get_ui_info(const QemuConsole *con);\ndiff --git a/hw/display/qxl.c b/hw/display/qxl.c\nindex 3d4b5635568..02e8c1435be 100644\n--- a/hw/display/qxl.c\n+++ b/hw/display/qxl.c\n@@ -2252,9 +2252,7 @@ static void qxl_realize_primary(PCIDevice *dev, Error **errp)\n return;\n }\n \n- qxl->ssd.dcl.ops = &display_listener_ops;\n- qxl->ssd.dcl.con = vga->con;\n- register_displaychangelistener(&qxl->ssd.dcl);\n+ qemu_console_register_listener(vga->con, &qxl->ssd.dcl, &display_listener_ops);\n }\n \n static void qxl_realize_secondary(PCIDevice *dev, Error **errp)\ndiff --git a/ui/console.c b/ui/console.c\nindex baffdeb22b1..3ab987add34 100644\n--- a/ui/console.c\n+++ b/ui/console.c\n@@ -642,10 +642,15 @@ dcl_set_graphic_cursor(DisplayChangeListener *dcl, QemuGraphicConsole *con)\n }\n }\n \n-void register_displaychangelistener(DisplayChangeListener *dcl)\n+void qemu_console_register_listener(QemuConsole *con,\n+ DisplayChangeListener *dcl,\n+ const DisplayChangeListenerOps *ops)\n {\n assert(!dcl->ds);\n \n+ dcl->con = con;\n+ dcl->ops = ops;\n+\n trace_displaychangelistener_register(dcl, dcl->ops->dpy_name);\n dcl->ds = get_alloc_displaystate();\n QLIST_INSERT_HEAD(&dcl->ds->listeners, dcl, next);\n@@ -670,10 +675,10 @@ void update_displaychangelistener(DisplayChangeListener *dcl,\n }\n }\n \n-void unregister_displaychangelistener(DisplayChangeListener *dcl)\n+void qemu_console_unregister_listener(DisplayChangeListener *dcl)\n {\n DisplayState *ds = dcl->ds;\n- trace_displaychangelistener_unregister(dcl, dcl->ops->dpy_name);\n+ trace_displaychangelistener_unregister(dcl, dcl->ops ? dcl->ops->dpy_name : NULL);\n if (!ds) {\n return;\n }\ndiff --git a/ui/curses.c b/ui/curses.c\nindex 78f21d940e3..4e2a0b25955 100644\n--- a/ui/curses.c\n+++ b/ui/curses.c\n@@ -324,9 +324,8 @@ static void curses_refresh(DisplayChangeListener *dcl)\n if (con) {\n erase();\n wnoutrefresh(stdscr);\n- unregister_displaychangelistener(dcl);\n- dcl->con = con;\n- register_displaychangelistener(dcl);\n+ qemu_console_unregister_listener(dcl);\n+ qemu_console_register_listener(con, dcl, dcl->ops);\n \n invalidate = 1;\n }\n@@ -805,9 +804,7 @@ static void curses_display_init(DisplayState *ds, DisplayOptions *opts)\n curses_winch_init();\n \n dcl = g_new0(DisplayChangeListener, 1);\n- dcl->con = qemu_console_lookup_default();\n- dcl->ops = &dcl_ops;\n- register_displaychangelistener(dcl);\n+ qemu_console_register_listener(qemu_console_lookup_default(), dcl, &dcl_ops);\n \n invalidate = 1;\n }\ndiff --git a/ui/dbus-console.c b/ui/dbus-console.c\nindex 85e215ef233..249760d82aa 100644\n--- a/ui/dbus-console.c\n+++ b/ui/dbus-console.c\n@@ -143,7 +143,6 @@ dbus_display_console_init(DBusDisplayConsole *object)\n DBusDisplayConsole *ddc = DBUS_DISPLAY_CONSOLE(object);\n \n ddc->listeners = g_ptr_array_new_with_free_func(g_object_unref);\n- ddc->dcl.ops = &dbus_console_dcl_ops;\n }\n \n static void\n@@ -151,7 +150,7 @@ dbus_display_console_dispose(GObject *object)\n {\n DBusDisplayConsole *ddc = DBUS_DISPLAY_CONSOLE(object);\n \n- unregister_displaychangelistener(&ddc->dcl);\n+ qemu_console_unregister_listener(&ddc->dcl);\n g_clear_object(&ddc->iface_touch);\n g_clear_object(&ddc->iface_mouse);\n g_clear_object(&ddc->iface_kbd);\n@@ -553,7 +552,6 @@ dbus_display_console_new(DBusDisplay *display, QemuConsole *con)\n \"g-object-path\", path,\n NULL);\n ddc->display = display;\n- ddc->dcl.con = con;\n /* handle errors, and skip non graphics? */\n qemu_console_fill_device_address(\n con, device_addr, sizeof(device_addr), NULL);\n@@ -611,7 +609,7 @@ dbus_display_console_new(DBusDisplay *display, QemuConsole *con)\n slot->tracking_id = -1;\n }\n \n- register_displaychangelistener(&ddc->dcl);\n+ qemu_console_register_listener(con, &ddc->dcl, &dbus_console_dcl_ops);\n ddc->mouse_mode_notifier.notify = dbus_mouse_mode_change;\n qemu_add_mouse_mode_change_notifier(&ddc->mouse_mode_notifier);\n dbus_mouse_update_is_absolute(ddc);\ndiff --git a/ui/dbus-listener.c b/ui/dbus-listener.c\nindex 37945236e11..fe58e3ef24d 100644\n--- a/ui/dbus-listener.c\n+++ b/ui/dbus-listener.c\n@@ -957,7 +957,7 @@ dbus_display_listener_dispose(GObject *object)\n {\n DBusDisplayListener *ddl = DBUS_DISPLAY_LISTENER(object);\n \n- unregister_displaychangelistener(&ddl->dcl);\n+ qemu_console_unregister_listener(&ddl->dcl);\n g_clear_object(&ddl->conn);\n g_clear_pointer(&ddl->bus_name, g_free);\n g_clear_object(&ddl->proxy);\n@@ -978,28 +978,12 @@ dbus_display_listener_dispose(GObject *object)\n G_OBJECT_CLASS(dbus_display_listener_parent_class)->dispose(object);\n }\n \n-static void\n-dbus_display_listener_constructed(GObject *object)\n-{\n- DBusDisplayListener *ddl = DBUS_DISPLAY_LISTENER(object);\n-\n- ddl->dcl.ops = &dbus_dcl_ops;\n-#ifdef CONFIG_OPENGL\n- if (display_opengl) {\n- ddl->dcl.ops = &dbus_gl_dcl_ops;\n- }\n-#endif\n-\n- G_OBJECT_CLASS(dbus_display_listener_parent_class)->constructed(object);\n-}\n-\n static void\n dbus_display_listener_class_init(DBusDisplayListenerClass *klass)\n {\n GObjectClass *object_class = G_OBJECT_CLASS(klass);\n \n object_class->dispose = dbus_display_listener_dispose;\n- object_class->constructed = dbus_display_listener_constructed;\n }\n \n static void\n@@ -1256,6 +1240,7 @@ dbus_display_listener_new(const char *bus_name,\n GDBusConnection *conn,\n DBusDisplayConsole *console)\n {\n+ const DisplayChangeListenerOps *ops = &dbus_dcl_ops;\n DBusDisplayListener *ddl;\n QemuConsole *con;\n g_autoptr(GError) err = NULL;\n@@ -1288,8 +1273,12 @@ dbus_display_listener_new(const char *bus_name,\n \n con = qemu_console_lookup_by_index(dbus_display_console_get_index(console));\n assert(con);\n- ddl->dcl.con = con;\n- register_displaychangelistener(&ddl->dcl);\n+#ifdef CONFIG_OPENGL\n+ if (display_opengl) {\n+ ops = &dbus_gl_dcl_ops;\n+ }\n+#endif\n+ qemu_console_register_listener(con, &ddl->dcl, ops);\n \n return ddl;\n }\ndiff --git a/ui/egl-headless.c b/ui/egl-headless.c\nindex 352b30b43fb..4f046c975a9 100644\n--- a/ui/egl-headless.c\n+++ b/ui/egl-headless.c\n@@ -229,13 +229,11 @@ static void egl_headless_init(DisplayState *ds, DisplayOptions *opts)\n }\n \n edpy = g_new0(egl_dpy, 1);\n- edpy->dcl.con = con;\n- edpy->dcl.ops = &egl_ops;\n edpy->gls = qemu_gl_init_shader();\n ctx = g_new0(DisplayGLCtx, 1);\n ctx->ops = &eglctx_ops;\n qemu_console_set_display_gl_ctx(con, ctx);\n- register_displaychangelistener(&edpy->dcl);\n+ qemu_console_register_listener(con, &edpy->dcl, &egl_ops);\n }\n }\n \ndiff --git a/ui/gtk.c b/ui/gtk.c\nindex 9ebe7e8df0d..3aaa44ff3e2 100644\n--- a/ui/gtk.c\n+++ b/ui/gtk.c\n@@ -2251,6 +2251,7 @@ static GSList *gd_vc_gfx_init(GtkDisplayState *s, VirtualConsole *vc,\n QemuConsole *con, int idx,\n GSList *group, GtkWidget *view_menu)\n {\n+ const DisplayChangeListenerOps *ops = &dcl_ops;\n bool zoom_to_fit = false;\n int i;\n \n@@ -2275,7 +2276,7 @@ static GSList *gd_vc_gfx_init(GtkDisplayState *s, VirtualConsole *vc,\n vc->gfx.drawing_area = gtk_gl_area_new();\n g_signal_connect(vc->gfx.drawing_area, \"realize\",\n G_CALLBACK(gl_area_realize), vc);\n- vc->gfx.dcl.ops = &dcl_gl_area_ops;\n+ ops = &dcl_gl_area_ops;\n vc->gfx.dgc.ops = &gl_area_ctx_ops;\n } else {\n #ifdef CONFIG_X11\n@@ -2290,7 +2291,7 @@ static GSList *gd_vc_gfx_init(GtkDisplayState *s, VirtualConsole *vc,\n #pragma GCC diagnostic ignored \"-Wdeprecated-declarations\"\n gtk_widget_set_double_buffered(vc->gfx.drawing_area, FALSE);\n #pragma GCC diagnostic pop\n- vc->gfx.dcl.ops = &dcl_egl_ops;\n+ ops = &dcl_egl_ops;\n vc->gfx.dgc.ops = &egl_ctx_ops;\n vc->gfx.has_dmabuf = qemu_egl_has_dmabuf();\n #else\n@@ -2301,7 +2302,6 @@ static GSList *gd_vc_gfx_init(GtkDisplayState *s, VirtualConsole *vc,\n #endif\n {\n vc->gfx.drawing_area = gtk_drawing_area_new();\n- vc->gfx.dcl.ops = &dcl_ops;\n }\n \n \n@@ -2325,12 +2325,10 @@ static GSList *gd_vc_gfx_init(GtkDisplayState *s, VirtualConsole *vc,\n vc->tab_item, gtk_label_new(vc->label));\n \n vc->gfx.kbd = qkbd_state_init(con);\n- vc->gfx.dcl.con = con;\n-\n if (display_opengl) {\n qemu_console_set_display_gl_ctx(con, &vc->gfx.dgc);\n }\n- register_displaychangelistener(&vc->gfx.dcl);\n+ qemu_console_register_listener(con, &vc->gfx.dcl, ops);\n \n gd_connect_vc_gfx_signals(vc);\n group = gd_vc_menu_init(s, vc, idx, group, view_menu);\ndiff --git a/ui/sdl2.c b/ui/sdl2.c\nindex 30e0042fe29..4f8b05fbd85 100644\n--- a/ui/sdl2.c\n+++ b/ui/sdl2.c\n@@ -934,6 +934,7 @@ static void sdl2_display_init(DisplayState *ds, DisplayOptions *o)\n sdl2_console = g_new0(struct sdl2_console, sdl2_num_outputs);\n for (i = 0; i < sdl2_num_outputs; i++) {\n QemuConsole *con = qemu_console_lookup_by_index(i);\n+ const DisplayChangeListenerOps *ops = &dcl_2d_ops;\n assert(con != NULL);\n if (!qemu_console_is_graphic(con) &&\n qemu_console_get_index(con) != 0) {\n@@ -943,13 +944,11 @@ static void sdl2_display_init(DisplayState *ds, DisplayOptions *o)\n sdl2_console[i].opts = o;\n #ifdef CONFIG_OPENGL\n sdl2_console[i].opengl = display_opengl;\n- sdl2_console[i].dcl.ops = display_opengl ? &dcl_gl_ops : &dcl_2d_ops;\n sdl2_console[i].dgc.ops = display_opengl ? &gl_ctx_ops : NULL;\n+ ops = display_opengl ? &dcl_gl_ops : &dcl_2d_ops;\n #else\n sdl2_console[i].opengl = 0;\n- sdl2_console[i].dcl.ops = &dcl_2d_ops;\n #endif\n- sdl2_console[i].dcl.con = con;\n sdl2_console[i].kbd = qkbd_state_init(con);\n #ifdef CONFIG_OPENGL\n if (display_opengl) {\n@@ -957,8 +956,7 @@ static void sdl2_display_init(DisplayState *ds, DisplayOptions *o)\n sdl2_gl_console_init(&sdl2_console[i]);\n }\n #endif\n- register_displaychangelistener(&sdl2_console[i].dcl);\n-\n+ qemu_console_register_listener(con, &sdl2_console[i].dcl, ops);\n #if defined(SDL_VIDEO_DRIVER_WINDOWS) || defined(SDL_VIDEO_DRIVER_X11)\n if (SDL_GetWindowWMInfo(sdl2_console[i].real_window, &info)) {\n #if defined(SDL_VIDEO_DRIVER_WINDOWS)\ndiff --git a/ui/spice-display.c b/ui/spice-display.c\nindex 87cc193cdee..56d8140fad8 100644\n--- a/ui/spice-display.c\n+++ b/ui/spice-display.c\n@@ -1387,13 +1387,13 @@ static void qemu_spice_display_init_one(QemuConsole *con)\n SimpleSpiceDisplay *ssd = g_new0(SimpleSpiceDisplay, 1);\n Error *err = NULL;\n char device_address[256] = \"\";\n+ const DisplayChangeListenerOps *ops = &display_listener_ops;\n \n qemu_spice_display_init_common(ssd);\n \n- ssd->dcl.ops = &display_listener_ops;\n #ifdef HAVE_SPICE_GL\n if (spice_opengl) {\n- ssd->dcl.ops = &display_listener_gl_ops;\n+ ops = &display_listener_gl_ops;\n ssd->dgc.ops = &gl_ctx_ops;\n ssd->gl_unblock_bh = qemu_bh_new(qemu_spice_gl_unblock_bh, ssd);\n ssd->gl_unblock_timer = timer_new_ms(QEMU_CLOCK_REALTIME,\n@@ -1403,8 +1403,6 @@ static void qemu_spice_display_init_one(QemuConsole *con)\n ssd->have_scanout = false;\n }\n #endif\n- ssd->dcl.con = con;\n-\n ssd->qxl.base.sif = &dpy_interface.base;\n qemu_spice_add_display_interface(&ssd->qxl, con);\n \n@@ -1422,7 +1420,7 @@ static void qemu_spice_display_init_one(QemuConsole *con)\n if (spice_opengl) {\n qemu_console_set_display_gl_ctx(con, &ssd->dgc);\n }\n- register_displaychangelistener(&ssd->dcl);\n+ qemu_console_register_listener(con, &ssd->dcl, ops);\n }\n \n void qemu_spice_display_init(void)\ndiff --git a/ui/vnc.c b/ui/vnc.c\nindex 5dd1eb399cc..21698835084 100644\n--- a/ui/vnc.c\n+++ b/ui/vnc.c\n@@ -1859,10 +1859,9 @@ static void do_key_event(VncState *vs, int down, int keycode, int sym)\n qkbd_state_modifier_get(vs->vd->kbd, QKBD_MOD_ALT)) {\n QemuConsole *con = qemu_console_lookup_by_index(qcode - Q_KEY_CODE_1);\n if (con) {\n- unregister_displaychangelistener(&vs->vd->dcl);\n+ qemu_console_unregister_listener(&vs->vd->dcl);\n qkbd_state_switch_console(vs->vd->kbd, con);\n- vs->vd->dcl.con = con;\n- register_displaychangelistener(&vs->vd->dcl);\n+ qemu_console_register_listener(con, &vs->vd->dcl, vs->vd->dcl.ops);\n }\n return;\n }\n@@ -3436,7 +3435,6 @@ VncDisplay *vnc_display_new(const char *id, Error **errp)\n \n qemu_mutex_init(&vd->mutex);\n vd->id = g_strdup(id);\n- vd->dcl.ops = &dcl_ops;\n \n QTAILQ_INIT(&vd->clients);\n vd->expires = TIME_MAX;\n@@ -3519,7 +3517,7 @@ void vnc_display_free(VncDisplay *vd)\n \n vnc_stop_worker_thread(vd);\n vnc_display_close(vd);\n- unregister_displaychangelistener(&vd->dcl);\n+ qemu_console_unregister_listener(&vd->dcl);\n qkbd_state_free(vd->kbd);\n qemu_del_vm_change_state_handler(vd->vmstate_handler_entry);\n kbd_layout_free(vd->kbd_layout);\n@@ -4262,8 +4260,7 @@ static bool vnc_display_open(VncDisplay *vd, Error **errp)\n con = qemu_console_lookup_default();\n }\n \n- vd->dcl.con = con;\n- register_displaychangelistener(&vd->dcl);\n+ qemu_console_register_listener(con, &vd->dcl, &dcl_ops);\n vd->kbd = qkbd_state_init(vd->dcl.con);\n qkbd_state_set_delay(vd->kbd, key_delay_ms);\n \ndiff --git a/ui/cocoa.m b/ui/cocoa.m\nindex 9093d1e408f..aaf82421589 100644\n--- a/ui/cocoa.m\n+++ b/ui/cocoa.m\n@@ -93,9 +93,7 @@ static void cocoa_switch(DisplayChangeListener *dcl,\n .dpy_mouse_set = cocoa_mouse_set,\n .dpy_cursor_define = cocoa_cursor_define,\n };\n-static DisplayChangeListener dcl = {\n- .ops = &dcl_ops,\n-};\n+static DisplayChangeListener dcl;\n static QKbdState *kbd;\n static int cursor_hide = 1;\n static int left_command_key_enabled = 1;\n@@ -425,8 +423,7 @@ - (void) selectConsoleLocked:(unsigned int)index\n \n unregister_displaychangelistener(&dcl);\n qkbd_state_switch_console(kbd, con);\n- dcl.con = con;\n- register_displaychangelistener(&dcl);\n+ qemu_console_register_listener(con, &dcl, &dcl_ops);\n [self notifyMouseModeChange];\n [self updateUIInfo];\n }\n@@ -2145,11 +2142,9 @@ static void cocoa_display_init(DisplayState *ds, DisplayOptions *opts)\n add_console_menu_entries();\n addRemovableDevicesMenuItems();\n \n- dcl.con = qemu_console_lookup_default();\n+ qemu_console_register_listener(qemu_console_lookup_default(),\n+ &dcl, &dcl_ops);\n kbd = qkbd_state_init(dcl.con);\n-\n- // register vga output callbacks\n- register_displaychangelistener(&dcl);\n qemu_add_mouse_mode_change_notifier(&mouse_mode_change_notifier);\n [cocoaView notifyMouseModeChange];\n [cocoaView updateUIInfo];\n", "prefixes": [ "v2", "57/67" ] }