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)