Commit 5ac0793ac9 for qemu.org
commit 5ac0793ac9f9f71b7468272736126d5504edf198
Author: Marc-André Lureau <marcandre.lureau@redhat.com>
Date: Tue Jun 23 11:44:43 2026 +0400
ui/gtk: fix tab re-insertion order on window close
Add gd_vc_notebook_pos() which computes the correct notebook position
for a console by counting only non-detached (non-windowed) tabs before
it. Use it in gd_tab_window_close() so a re-attached tab is inserted
at its logical position rather than appended at the end.
Reviewed-by: Daniel P. Berrangé <berrange@redhat.com>
Reviewed-by: Akihiko Odaki <odaki@rsg.ci.i.u-tokyo.ac.jp>
Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Message-ID: <20260623-b4-ui-v4-28-4656aec3398d@redhat.com>
diff --git a/ui/gtk.c b/ui/gtk.c
index 929e4cf43f..741f7bfe37 100644
--- a/ui/gtk.c
+++ b/ui/gtk.c
@@ -1464,16 +1464,37 @@ static void gd_menu_show_tabs(GtkMenuItem *item, void *opaque)
gd_update_windowsize(vc);
}
+static int gd_vc_notebook_pos(GtkDisplayState *s, VirtualConsole *target)
+{
+ int pos = 0;
+ guint i;
+
+ for (i = 0; i < s->vcs->len; i++) {
+ VirtualConsole *vc = g_ptr_array_index(s->vcs, i);
+ if (vc == target) {
+ return pos;
+ }
+ if (!vc->window) {
+ pos++;
+ }
+ }
+ g_assert_not_reached();
+}
+
static gboolean gd_tab_window_close(GtkWidget *widget, GdkEvent *event,
void *opaque)
{
VirtualConsole *vc = opaque;
GtkDisplayState *s = vc->s;
+ int page;
gtk_widget_set_sensitive(vc->menu_item, true);
- gd_widget_reparent(vc->window, s->notebook, vc->tab_item);
- gtk_notebook_set_tab_label_text(GTK_NOTEBOOK(s->notebook),
- vc->tab_item, vc->label);
+ g_object_ref(vc->tab_item);
+ gtk_container_remove(GTK_CONTAINER(vc->window), vc->tab_item);
+ page = gd_vc_notebook_pos(s, vc);
+ gtk_notebook_insert_page(GTK_NOTEBOOK(s->notebook),
+ vc->tab_item, gtk_label_new(vc->label), page);
+ g_object_unref(vc->tab_item);
gtk_widget_destroy(vc->window);
vc->window = NULL;
#if defined(CONFIG_OPENGL)