Commit d4895fb4bf for qemu.org

commit d4895fb4bfbcd98fc687de09f9f4ef541ee5860a
Author: Marc-André Lureau <marcandre.lureau@redhat.com>
Date:   Wed Feb 25 14:15:26 2026 +0100

    ui/vnc: defer listener registration until the console is known

    Previously, the display change listener was registered early in
    vnc_display_new() without a console, requiring vnc_display_open() to
    conditionally unregister and re-register it when the actual console was
    resolved. Since vnc_display_new() and vnc_display_open() were merged in
    the previous commit, simply delay the registration and keyboard state
    initialization to vnc_display_open(), after the console has been looked
    up. This removes the conditional re-registration and simplifies the code.

    Reviewed-by: Daniel P. Berrangé <berrange@redhat.com>
    Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>

diff --git a/ui/vnc.c b/ui/vnc.c
index d65153a500..ea1579135b 100644
--- a/ui/vnc.c
+++ b/ui/vnc.c
@@ -3457,8 +3457,6 @@ VncDisplay *vnc_display_new(const char *id, Error **errp)

     vnc_start_worker_thread(vd);

-    register_displaychangelistener(&vd->dcl);
-    vd->kbd = qkbd_state_init(vd->dcl.con);
     vd->vmstate_handler_entry = qemu_add_vm_change_state_handler(
         &vmstate_change_handler, vd);

@@ -4269,13 +4267,9 @@ static bool vnc_display_open(VncDisplay *vd, Error **errp)
         con = qemu_console_lookup_default();
     }

-    if (con != vd->dcl.con) {
-        qkbd_state_free(vd->kbd);
-        unregister_displaychangelistener(&vd->dcl);
-        vd->dcl.con = con;
-        register_displaychangelistener(&vd->dcl);
-        vd->kbd = qkbd_state_init(vd->dcl.con);
-    }
+    vd->dcl.con = con;
+    register_displaychangelistener(&vd->dcl);
+    vd->kbd = qkbd_state_init(vd->dcl.con);
     qkbd_state_set_delay(vd->kbd, key_delay_ms);

     if (saddr_list == NULL) {