Crash after moving GtkTextView to a new container
Forwarded from https://github.com/gtk-rs/gtk-rs/issues/277
This is basically first putting a textview into a box, adding the box to the window. Then removing the box from the window and adding the textview to another box which is then added to the window again. Then the window is shown, and a segfault happens.
The GTK3 version in C crashes too, see below
#include <gtk/gtk.h>
static void
build_ui (GtkApplication * app)
{
GtkWidget *window = gtk_application_window_new (app);
GtkWidget *view = gtk_text_view_new ();
g_object_ref_sink (view);
{
GtkWidget *container = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 1);
gtk_container_add (GTK_CONTAINER (container), view);
gtk_container_add (GTK_CONTAINER (window), container);
gtk_container_remove (GTK_CONTAINER (window), container);
}
{
GtkWidget *container = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 1);
gtk_container_add (GTK_CONTAINER (container), view);
gtk_container_add (GTK_CONTAINER (window), container);
}
g_object_unref (view);
gtk_widget_show_all (window);
}
int
main (int argc, char *argv[])
{
GtkApplication *app = gtk_application_new (NULL, G_APPLICATION_FLAGS_NONE);
g_signal_connect (app, "activate", G_CALLBACK (build_ui), NULL);
return g_application_run (G_APPLICATION (app), argc, argv);
}
The GTK4 version does not
#include <gtk/gtk.h>
static void
build_ui (GtkApplication * app)
{
GtkWidget *window = gtk_application_window_new (app);
GtkWidget *view = gtk_text_view_new ();
g_object_ref_sink (view);
{
GtkWidget *container = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 1);
gtk_box_append (GTK_BOX (container), view);
gtk_window_set_child (GTK_WINDOW (window), container);
gtk_window_set_child (GTK_WINDOW (window), NULL);
}
{
GtkWidget *container = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 1);
gtk_box_append (GTK_BOX (container), view);
gtk_window_set_child (GTK_WINDOW (window), container);
}
g_object_unref (view);
gtk_window_present (GTK_WINDOW (window));
}
int
main (int argc, char *argv[])
{
GtkApplication *app = gtk_application_new (NULL, G_APPLICATION_FLAGS_NONE);
g_signal_connect (app, "activate", G_CALLBACK (build_ui), NULL);
return g_application_run (G_APPLICATION (app), argc, argv);
}
Backtrace of the crash is as follows
0x00007ffff7a78a3f in _gtk_pixel_cache_set_extra_size (cache=0x0, extra_width=extra_width@entry=64, extra_height=<optimized out>)
at ../../../../gtk/gtkpixelcache.c:98
98 ../../../../gtk/gtkpixelcache.c: No such file or directory.
(gdb) bt
#0 0x00007ffff7a78a3f in _gtk_pixel_cache_set_extra_size (cache=0x0, extra_width=extra_width@entry=64, extra_height=<optimized out>)
at ../../../../gtk/gtkpixelcache.c:98
#1 0x00007ffff7b11672 in gtk_text_view_size_allocate (widget=0x55555586a310 [GtkTextView], allocation=0x7fffffffcbc0)
at ../../../../gtk/gtktextview.c:4281
#2 0x00007ffff7b78fc7 in gtk_widget_size_allocate_with_baseline
(widget=0x55555586a310 [GtkTextView], allocation=allocation@entry=0x7fffffffcce0, baseline=<optimized out>, baseline@entry=-1)
at ../../../../gtk/gtkwidget.c:6175
#3 0x00007ffff79000e7 in gtk_box_size_allocate_no_center (widget=0x55555586f2c0 [GtkBox], allocation=0x7fffffffcda0) at ../../../../gtk/gtkbox.c:817
#4 0x00007ffff79003d8 in gtk_box_allocate_contents
(gadget=<optimized out>, allocation=0x7fffffffcda0, baseline=<optimized out>, out_clip=0x7fffffffcdc0, unused=<optimized out>)
at ../../../../gtk/gtkbox.c:1211
#5 0x00007ffff7958103 in gtk_css_gadget_allocate
(gadget=0x5555557f3b20 [GtkCssCustomGadget], allocation=allocation@entry=0x7fffffffced0, baseline=-1, out_clip=out_clip@entry=0x7fffffffce20)
at ../../../../gtk/gtkcssgadget.c:790
#6 0x00007ffff7901865 in gtk_box_size_allocate (widget=0x55555586f2c0 [GtkBox], allocation=0x7fffffffced0) at ../../../../gtk/gtkbox.c:1225
#7 0x00007ffff7b78fc7 in gtk_widget_size_allocate_with_baseline
(widget=widget@entry=0x55555586f2c0 [GtkBox], allocation=allocation@entry=0x7fffffffcf50, baseline=<optimized out>, baseline@entry=-1)
at ../../../../gtk/gtkwidget.c:6175
#8 0x00007ffff7b7937a in gtk_widget_size_allocate (widget=widget@entry=0x55555586f2c0 [GtkBox], allocation=allocation@entry=0x7fffffffcf50)
at ../../../../gtk/gtkwidget.c:6256
#9 0x00007ffff7b8fba3 in gtk_window_size_allocate (widget=0x5555558602b0 [GtkApplicationWindow], allocation=<optimized out>)
at ../../../../gtk/gtkwindow.c:7921
#10 0x00007ffff7b78fc7 in gtk_widget_size_allocate_with_baseline
(widget=widget@entry=0x5555558602b0 [GtkApplicationWindow], allocation=allocation@entry=0x7fffffffd090, baseline=<optimized out>,
baseline@entry=-1) at ../../../../gtk/gtkwidget.c:6175
#11 0x00007ffff7b7937a in gtk_widget_size_allocate
(widget=widget@entry=0x5555558602b0 [GtkApplicationWindow], allocation=allocation@entry=0x7fffffffd090) at ../../../../gtk/gtkwidget.c:6256
#12 0x00007ffff7b8dada in gtk_window_realize (widget=0x5555558602b0 [GtkApplicationWindow]) at ../../../../gtk/gtkwindow.c:7424
#13 0x00007ffff78f3ee0 in gtk_application_window_real_realize (widget=0x5555558602b0 [GtkApplicationWindow])
at ../../../../gtk/gtkapplicationwindow.c:681
#17 0x00007ffff75cbc0f in <emit signal ??? on instance 0x5555558602b0 [GtkApplicationWindow]>
(instance=instance@entry=0x5555558602b0, signal_id=<optimized out>, detail=detail@entry=0) at ../../../gobject/gsignal.c:3550
#14 0x00007ffff75b3092 in g_closure_invoke
(closure=closure@entry=0x5555555ce630, return_value=return_value@entry=0x0, n_param_values=1, param_values=param_values@entry=0x7fffffffd340, invocation_hint=invocation_hint@entry=0x7fffffffd2c0) at ../../../gobject/gclosure.c:810
#15 0x00007ffff75c509a in signal_emit_unlocked_R
(node=node@entry=0x5555555fe650, detail=detail@entry=0, instance=instance@entry=0x5555558602b0, emission_return=emission_return@entry=0x0, instance_and_params=instance_and_params@entry=0x7fffffffd340) at ../../../gobject/gsignal.c:3668
#16 0x00007ffff75cb69f in g_signal_emit_valist
(instance=<optimized out>, signal_id=<optimized out>, detail=<optimized out>, var_args=var_args@entry=0x7fffffffd4c0)
at ../../../gobject/gsignal.c:3494
--Type <RET> for more, q to quit, c to continue without paging--
#18 0x00007ffff7b7e3e7 in gtk_widget_realize (widget=0x5555558602b0 [GtkApplicationWindow]) at ../../../../gtk/gtkwidget.c:5519
#19 0x00007ffff7b8b89e in gtk_window_show (widget=0x5555558602b0 [GtkApplicationWindow]) at ../../../../gtk/gtkwindow.c:6181
#23 0x00007ffff75cbc0f in <emit signal ??? on instance 0x5555558602b0 [GtkApplicationWindow]>
(instance=instance@entry=0x5555558602b0, signal_id=<optimized out>, detail=detail@entry=0) at ../../../gobject/gsignal.c:3550
#20 0x00007ffff75b3092 in g_closure_invoke
(closure=closure@entry=0x5555555cea70, return_value=return_value@entry=0x0, n_param_values=1, param_values=param_values@entry=0x7fffffffd800, invocation_hint=invocation_hint@entry=0x7fffffffd780) at ../../../gobject/gclosure.c:810
#21 0x00007ffff75c509a in signal_emit_unlocked_R
(node=node@entry=0x5555555f9b40, detail=detail@entry=0, instance=instance@entry=0x5555558602b0, emission_return=emission_return@entry=0x0, instance_and_params=instance_and_params@entry=0x7fffffffd800) at ../../../gobject/gsignal.c:3668
#22 0x00007ffff75cb69f in g_signal_emit_valist
(instance=<optimized out>, signal_id=<optimized out>, detail=<optimized out>, var_args=var_args@entry=0x7fffffffd980)
at ../../../gobject/gsignal.c:3494
#24 0x00007ffff7b77e16 in gtk_widget_show (widget=0x5555558602b0 [GtkApplicationWindow]) at ../../../../gtk/gtkwidget.c:4848
#25 0x0000555555555341 in build_ui (app=0x5555555720f0 [GtkApplication]) at tset3.c:30
#29 0x00007ffff75cbc0f in <emit signal ??? on instance 0x5555555720f0 [GtkApplication]>
(instance=instance@entry=0x5555555720f0, signal_id=<optimized out>, detail=detail@entry=0) at ../../../gobject/gsignal.c:3550
#26 0x00007ffff75b3092 in g_closure_invoke
(closure=0x555555573c00, return_value=return_value@entry=0x0, n_param_values=1, param_values=param_values@entry=0x7fffffffdc50, invocation_hint=invocation_hint@entry=0x7fffffffdbd0) at ../../../gobject/gclosure.c:810
#27 0x00007ffff75c5403 in signal_emit_unlocked_R
(node=node@entry=0x55555556ce40, detail=detail@entry=0, instance=instance@entry=0x5555555720f0, emission_return=emission_return@entry=0x0, instance_and_params=instance_and_params@entry=0x7fffffffdc50) at ../../../gobject/gsignal.c:3738
#28 0x00007ffff75cb69f in g_signal_emit_valist
(instance=<optimized out>, signal_id=<optimized out>, detail=<optimized out>, var_args=var_args@entry=0x7fffffffddd0)
at ../../../gobject/gsignal.c:3494
#30 0x00007ffff76d7e83 in g_application_activate (application=application@entry=0x5555555720f0 [GtkApplication]) at ../../../gio/gapplication.c:2303
#31 0x00007ffff76d8218 in g_application_real_local_command_line
(application=0x5555555720f0 [GtkApplication], arguments=0x7fffffffdf28, exit_status=0x7fffffffdf24) at ../../../gio/gapplication.c:1139
#32 0x00007ffff76d838e in g_application_run (application=0x5555555720f0 [GtkApplication], argc=-8412, argv=<optimized out>)
at ../../../gio/gapplication.c:2528
#33 0x00005555555553bc in main (argc=1, argv=0x7fffffffe098) at test.c:38
Edited by Sebastian Dröge