From nobody Thu Aug 27 02:53:57 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=quarantine dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1781168912; cv=none; d=zohomail.com; s=zohoarc; b=exxuN0ohjMPU5I04sjetjOQ9o2eTrTZq+HWuunAshBjbDa4JqHEeRAWL3+Kv1JgfqEVR6FQNyeQlGkUrQSNGJBLp1r/1AZ35kaWQ/Q/ekKRCfQACwtJdvdqz9VMooRlftbLtZDI0wKN78QLPzqX933+zIWsVxXqUSkPR5sOiVFk= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1781168912; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=l+ySMPhR2kN57PncwepNCQ/27reuJ52ovLQsDP1Z834=; b=YmcG3RCM7G4ORihLh/I0naVrKHX72RpTRnkN/vA2/ND+7w6y3Di4C1nSg40n+9LNKU29EeZhqBt4rdZehBdki09XTYX0S2uSXy1uPX0WIZNiw8vW4V3QG7DaIqI7Vx+QyM4ExXCWN/Yu1/gxpUXADtuoollQtcP49df+9Zu1e2A= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=quarantine dis=none) Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1781168912220667.4263051659506; Thu, 11 Jun 2026 02:08:32 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wXbNI-0006uo-9b; Thu, 11 Jun 2026 05:06:56 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wXbNG-0006l6-OF for qemu-devel@nongnu.org; Thu, 11 Jun 2026 05:06:54 -0400 Received: from us-smtp-delivery-124.mimecast.com ([170.10.129.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wXbNE-0005RI-1h for qemu-devel@nongnu.org; Thu, 11 Jun 2026 05:06:54 -0400 Received: from mx-prod-mc-03.mail-002.prod.us-west-2.aws.redhat.com (ec2-54-186-198-63.us-west-2.compute.amazonaws.com [54.186.198.63]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-605-lErlFTxBPN6DAPzZfHe11g-1; Thu, 11 Jun 2026 05:06:45 -0400 Received: from mx-prod-int-05.mail-002.prod.us-west-2.aws.redhat.com (mx-prod-int-05.mail-002.prod.us-west-2.aws.redhat.com [10.30.177.17]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by mx-prod-mc-03.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTPS id 0D9D01977013; Thu, 11 Jun 2026 09:06:44 +0000 (UTC) Received: from localhost (unknown [10.44.24.21]) by mx-prod-int-05.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTP id AD5F31954105; Thu, 11 Jun 2026 09:06:42 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1781168811; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=l+ySMPhR2kN57PncwepNCQ/27reuJ52ovLQsDP1Z834=; b=JfE5g/kiDAvK0bayByTG+yGrqRe1YwiYCuARvf2iA8qG4qJh7BiXsdiGUnWjm6CKr1QspK C/qPnz6pdBrluvRi+cCQ07q0tnD1/ngEDSDCN9M30/o4mC1taOUHozavpYM8ZyTkWeV43L uQwFooBm8AZe5pL/7IXqChMIooy1ZGo= X-MC-Unique: lErlFTxBPN6DAPzZfHe11g-1 X-Mimecast-MFC-AGG-ID: lErlFTxBPN6DAPzZfHe11g_1781168804 From: =?utf-8?q?Marc-Andr=C3=A9_Lureau?= Date: Thu, 11 Jun 2026 13:03:49 +0400 Subject: [PATCH v3 34/35] ui/dbus: handle console hotplug/unplug events MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260611-b4-ui-v3-34-72bcbbea0fae@redhat.com> References: <20260611-b4-ui-v3-0-72bcbbea0fae@redhat.com> In-Reply-To: <20260611-b4-ui-v3-0-72bcbbea0fae@redhat.com> To: qemu-devel@nongnu.org Cc: Paolo Bonzini , =?utf-8?q?Daniel_P=2E_Berrang=C3=A9?= , =?utf-8?q?Philippe_Mathieu-Daud=C3=A9?= , Pierrick Bouvier , Fabiano Rosas , Laurent Vivier , Alex Williamson , =?utf-8?q?C=C3=A9dric_Le_Goater?= , Peter Maydell , Akihiko Odaki , =?utf-8?q?Marc-Andr=C3=A9_Lureau?= X-Developer-Signature: v=1; a=openpgp-sha256; l=6566; i=marcandre.lureau@redhat.com; h=from:subject:message-id; bh=ciTaD8CwpnHypf+DeGHoeLKIoaO9niQfDZUXGaoqXr4=; b=owEBbQKS/ZANAwAKAdro4Ql1lpzlAcsmYgBqKnnit+aKu/DyIXLWuAiXR3Pf55o/LYXiuubvd /IyhGNW7jOJAjMEAAEKAB0WIQSHqb2TP4fGBtJ29i3a6OEJdZac5QUCaip54gAKCRDa6OEJdZac 5VyOD/9DPQ2sBYVpT1dQ+90dxvSbKyoBWGmCBmLmaMrCJlfPxro3vPt9NZ35GwJvJnCq8BJ4Yl9 TpEHF3f7TJMdmrz36D+l+2DPBfmnGiBP9H5H4tUujCWj6NbKfVrIh6yqeaLbuVtE18zOdg7Slzp D2/OJXMEEjpeYdcHSnpMi7K/TKljTsBfAZxAy1D9WEtYp7ZVp+mjIhLmdezoNSrGuRwg7xbDFPP oZOWF+QaMpXDEulZMmFVHopouPHM1EVprQjxoqd8ht28ilTzD1SmypqjUftb3mqn5iYgeokUydT X24plWoniD0QkGm5c5T4XzcoTAqWM7WmmFFhTLbvwYxTtDFPb065j4aYabqjrA/ETzx8ToMwVFJ Kc8AbmRknqbb29n1CFM4WAJ4shikBqZvm/7QMJfCEDPolUkx7ZK1EsWbTlvrcg8PrhI7c7/0LHQ NWIHXirCa2HaTkctn/CPZfSgjUva1qM3f+OjxaDCkb/wXX6PH4uhc5du8ah0Vrnz9ub7tD63osq r8UDV7t4SKxDy62YcJ6BLZC6xYPTk48XJ+hyIEDXcmDIW61OdLexzxXhnR+l+AAei+Hzw4wCs2B id+H2F2lXXu5hBFHUljrjc3QCxcDhD17cYjgKhqyv/6dxRtF2eHE3UPXGRrjsUK8jEbxc8pxyGw 3L0IY0EVPZ3RTqA== X-Developer-Key: i=marcandre.lureau@redhat.com; a=openpgp; fpr=87A9BD933F87C606D276F62DDAE8E10975969CE5 X-Scanned-By: MIMEDefang 3.0 on 10.30.177.17 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: pass client-ip=170.10.129.124; envelope-from=marcandre.lureau@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: 8 X-Spam_score: 0.8 X-Spam_bar: / X-Spam_report: (0.8 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.445, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H3=0.001, RCVD_IN_MSPIKE_WL=0.001, RCVD_IN_SBL_CSS=3.335, 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 List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1781168912888158500 Subscribe to QemuConsoleEvent notifications to dynamically add and remove D-Bus display consoles. This mirrors the GTK backend's handling added in the previous commits. Signed-off-by: Marc-Andr=C3=A9 Lureau --- ui/dbus.h | 3 ++ ui/dbus-console.c | 5 +++ ui/dbus.c | 93 +++++++++++++++++++++++++++++++++++++++++++++------= ---- 3 files changed, 84 insertions(+), 17 deletions(-) diff --git a/ui/dbus.h b/ui/dbus.h index e4e78590b49..d2cc176648a 100644 --- a/ui/dbus.h +++ b/ui/dbus.h @@ -60,6 +60,7 @@ struct DBusDisplay { DBusClipboardRequest clipboard_request[QEMU_CLIPBOARD_SELECTION__COUNT= ]; =20 Notifier notifier; + Notifier console_notifier; }; =20 #ifdef WIN32 @@ -86,6 +87,8 @@ dbus_display_console_new(DBusDisplay *display, QemuConsol= e *con); int dbus_display_console_get_index(DBusDisplayConsole *ddc); =20 +QemuConsole * +dbus_display_console_get_qemu_console(DBusDisplayConsole *ddc); =20 extern const DisplayChangeListenerOps dbus_console_dcl_ops; =20 diff --git a/ui/dbus-console.c b/ui/dbus-console.c index 63d21493101..12f7decfb60 100644 --- a/ui/dbus-console.c +++ b/ui/dbus-console.c @@ -533,6 +533,11 @@ int dbus_display_console_get_index(DBusDisplayConsole = *ddc) return qemu_console_get_index(ddc->dcl.con); } =20 +QemuConsole *dbus_display_console_get_qemu_console(DBusDisplayConsole *ddc) +{ + return ddc->dcl.con; +} + DBusDisplayConsole * dbus_display_console_new(DBusDisplay *display, QemuConsole *con) { diff --git a/ui/dbus.c b/ui/dbus.c index b23cb44c535..7be0f8e2611 100644 --- a/ui/dbus.c +++ b/ui/dbus.c @@ -142,6 +142,9 @@ dbus_display_finalize(Object *o) { DBusDisplay *dd =3D DBUS_DISPLAY(o); =20 + if (dd->console_notifier.notify) { + qemu_console_remove_notifier(&dd->console_notifier); + } if (dd->notifier.notify) { dbus_display_notifier_remove(&dd->notifier); } @@ -164,14 +167,35 @@ dbus_display_finalize(Object *o) dbus_display =3D NULL; } =20 +static void +dbus_update_console_ids(DBusDisplay *dd) +{ + g_autoptr(GArray) arr =3D g_array_new(FALSE, FALSE, sizeof(guint32)); + + for (guint i =3D 0; i < dd->consoles->len; i++) { + DBusDisplayConsole *ddc =3D g_ptr_array_index(dd->consoles, i); + guint32 idx =3D dbus_display_console_get_index(ddc); + g_array_append_val(arr, idx); + } + + g_object_set(dd->iface, "console-ids", + g_variant_new_fixed_array(G_VARIANT_TYPE("u"), + arr->data, arr->len, + sizeof(guint32)), + NULL); +} + static bool -dbus_display_add_console(DBusDisplay *dd, int idx, Error **errp) +dbus_display_add_console(DBusDisplay *dd, QemuConsole *con, Error **errp) { - QemuConsole *con; DBusDisplayConsole *dbus_console; =20 - con =3D qemu_console_lookup_by_index(idx); - assert(con); + for (guint i =3D 0; i < dd->consoles->len; i++) { + DBusDisplayConsole *ddc =3D g_ptr_array_index(dd->consoles, i); + if (dbus_display_console_get_qemu_console(ddc) =3D=3D con) { + return true; + } + } =20 if (qemu_console_is_graphic(con) && dd->gl_mode !=3D DISPLAY_GL_MODE_OFF) { @@ -179,20 +203,58 @@ dbus_display_add_console(DBusDisplay *dd, int idx, Er= ror **errp) } =20 dbus_console =3D dbus_display_console_new(dd, con); - g_ptr_array_insert(dd->consoles, idx, dbus_console); + g_ptr_array_add(dd->consoles, dbus_console); g_dbus_object_manager_server_export(dd->server, G_DBUS_OBJECT_SKELETON(dbus_consol= e)); + dbus_update_console_ids(dd); return true; } =20 +static void +dbus_display_remove_console(DBusDisplay *dd, QemuConsole *con) +{ + for (guint i =3D 0; i < dd->consoles->len; i++) { + DBusDisplayConsole *ddc =3D g_ptr_array_index(dd->consoles, i); + if (dbus_display_console_get_qemu_console(ddc) =3D=3D con) { + if (display_opengl) { + qemu_console_set_display_gl_ctx(con, NULL); + } + g_dbus_object_manager_server_unexport( + dd->server, + g_dbus_object_get_object_path(G_DBUS_OBJECT(ddc))); + g_ptr_array_remove_index(dd->consoles, i); + dbus_update_console_ids(dd); + break; + } + } +} + +static void +dbus_console_notify(Notifier *n, void *data) +{ + DBusDisplay *dd =3D container_of(n, DBusDisplay, console_notifier); + QemuConsoleEvent *event =3D data; + + switch (event->type) { + case QEMU_CONSOLE_ADDED: { + Error *err =3D NULL; + if (!dbus_display_add_console(dd, event->con, &err)) { + error_report_err(err); + } + break; + } + case QEMU_CONSOLE_REMOVED: + dbus_display_remove_console(dd, event->con); + break; + } +} + static void dbus_display_complete(UserCreatable *uc, Error **errp) { DBusDisplay *dd =3D DBUS_DISPLAY(uc); g_autoptr(GError) err =3D NULL; g_autofree char *uuid =3D qemu_uuid_unparse_strdup(&qemu_uuid); - g_autoptr(GArray) consoles =3D NULL; - GVariant *console_ids; int idx; =20 if (!object_resolve_path_type("", TYPE_DBUS_DISPLAY, NULL)) { @@ -233,27 +295,24 @@ dbus_display_complete(UserCreatable *uc, Error **errp) } } =20 - consoles =3D g_array_new(FALSE, FALSE, sizeof(guint32)); for (idx =3D 0;; idx++) { - if (!qemu_console_lookup_by_index(idx)) { + QemuConsole *con =3D qemu_console_lookup_by_index(idx); + if (!con) { break; } - if (!dbus_display_add_console(dd, idx, errp)) { + if (!dbus_display_add_console(dd, con, errp)) { return; } - g_array_append_val(consoles, idx); } =20 - console_ids =3D g_variant_new_from_data( - G_VARIANT_TYPE("au"), - consoles->data, consoles->len * sizeof(guint32), TRUE, - (GDestroyNotify)g_array_unref, consoles); - g_steal_pointer(&consoles); g_object_set(dd->iface, "name", qemu_name ?: "QEMU " QEMU_VERSION, "uuid", uuid, - "console-ids", console_ids, NULL); + dbus_update_console_ids(dd); + + dd->console_notifier.notify =3D dbus_console_notify; + qemu_console_add_notifier(&dd->console_notifier); =20 if (dd->bus) { g_dbus_object_manager_server_set_connection(dd->server, dd->bus); --=20 2.54.0