@samitouri / QOSamiQemu / commits / 5ac0793ac9

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>

Marc-André Lureau committed Jun 23, 2026 at 11:44 UTC 5ac0793ac9f9f71b7468272736126d5504edf198
1 file changed +24 -3
ui/gtk.c
+24 -3
@@ -1464,16 +1464,37 @@ static void gd_menu_show_tabs(GtkMenuItem *item, void *opaque)
1464 gd_update_windowsize(vc);
1465 }
1466
1467 +static int gd_vc_notebook_pos(GtkDisplayState *s, VirtualConsole *target)
1468 +{
1469 + int pos = 0;
1470 + guint i;
1471 +
1472 + for (i = 0; i < s->vcs->len; i++) {
1473 + VirtualConsole *vc = g_ptr_array_index(s->vcs, i);
1474 + if (vc == target) {
1475 + return pos;
1476 + }
1477 + if (!vc->window) {
1478 + pos++;
1479 + }
1480 + }
1481 + g_assert_not_reached();
1482 +}
1483 +
1484 static gboolean gd_tab_window_close(GtkWidget *widget, GdkEvent *event,
1485 void *opaque)
1486 {
1487 VirtualConsole *vc = opaque;
1488 GtkDisplayState *s = vc->s;
1489 + int page;
1490
1491 gtk_widget_set_sensitive(vc->menu_item, true);
1474 - gd_widget_reparent(vc->window, s->notebook, vc->tab_item);
1475 - gtk_notebook_set_tab_label_text(GTK_NOTEBOOK(s->notebook),
1476 - vc->tab_item, vc->label);
1492 + g_object_ref(vc->tab_item);
1493 + gtk_container_remove(GTK_CONTAINER(vc->window), vc->tab_item);
1494 + page = gd_vc_notebook_pos(s, vc);
1495 + gtk_notebook_insert_page(GTK_NOTEBOOK(s->notebook),
1496 + vc->tab_item, gtk_label_new(vc->label), page);
1497 + g_object_unref(vc->tab_item);
1498 gtk_widget_destroy(vc->window);
1499 vc->window = NULL;
1500 #if defined(CONFIG_OPENGL)