gtk_container_add 暗恋 mac
gtk_container_add crush on mac
我创建了一个 GtkFixed 对象并通过 gtk_container_add 将其放入 GtkEventBox(当然会销毁之前的子对象)。这种方式在 Windows 上工作正常,但在 Mac 上它会崩溃。
堆栈跟踪显示应用程序在 gtk_get_parent 崩溃。我尝试使用 set_parent 过程,但它也崩溃了:
[debug][New Thread 0x1b0f of process 88699]
[debug]Program received signal SIGSEGV, Segmentation fault.
[debug]0x0000000100b3cf3d in gtk_widget_set_parent () from /usr/local/lib/libgtk-3.0.dylib
[debug]>>>>>>cb_gdb:
Program received signal SIGSEGV, Segmentation fault.
In gtk_widget_set_parent () (/usr/local/lib/libgtk-3.0.dylib)
[debug]> bt 30
[debug]#0 0x0000000100b3cf3d in gtk_widget_set_parent () from /usr/local/lib/libgtk-3.0.dylib
代码在主线程和 Window 的 "realize" 回调中运行。一样。
密码是:
void main_view_reset_list_view(GtkWidget* list_view, GtkWidget* new_item)
{
GtkEventBox* eb = GTK_EVENT_BOX(list_view);
GtkBin* bin = GTK_BIN(list_view);
GtkContainer* container = GTK_CONTAINER(list_view);
GtkWidget* subview;
subview = gtk_bin_get_child(bin);
if (subview)
{
gtk_container_remove(container, subview);
gtk_widget_unparent (subview);
gtk_widget_destroy(subview);
}
gtk_widget_set_parent(new_item, container); // crash
GtkWidget* parent = gtk_widget_get_parent(container);
GtkWidget* parent2 = gtk_widget_get_parent(new_item); // 0 on windows, crash on mac
if (new_item)
{
gtk_container_add(container, new_item);
gtk_widget_show(new_item);
}
gtk_widget_show(list_view);
}
更新:
set_parent 使控件在 windows
上以某种方式消失
我追踪了 gtk 和 glib 的源代码,发现 G_IS_OBJECT() 失败了,这很奇怪。 post 让我想到这个问题与指针相关。我调试了我的代码,发现这是真的。
GtkWidget* create_widget()
{
return gtk_fixed_new(); // result points to 0x1018bf830
}
void refresh_widgets()
{
GtkWidget* w = create_widget(); // w points to 0x18bf830
}
我以前确实遇到过这种问题,所以 return 指针的所有代码都已更改:
char* generate_string();
到
void generate_string(char** out);
因此,为了解决我的问题,我必须以这种方式提供正确的指示。喜欢:
void create_widget(GtkWidget** out);
UPD:我注意到指针之间存在差异。简而言之,它们在 return.
的 64 位系统上以某种方式被修剪为 32 位
UPD2:最后,我进行了所有更改并且它以这种方式工作。
我创建了一个 GtkFixed 对象并通过 gtk_container_add 将其放入 GtkEventBox(当然会销毁之前的子对象)。这种方式在 Windows 上工作正常,但在 Mac 上它会崩溃。
堆栈跟踪显示应用程序在 gtk_get_parent 崩溃。我尝试使用 set_parent 过程,但它也崩溃了:
[debug][New Thread 0x1b0f of process 88699]
[debug]Program received signal SIGSEGV, Segmentation fault.
[debug]0x0000000100b3cf3d in gtk_widget_set_parent () from /usr/local/lib/libgtk-3.0.dylib
[debug]>>>>>>cb_gdb:
Program received signal SIGSEGV, Segmentation fault.
In gtk_widget_set_parent () (/usr/local/lib/libgtk-3.0.dylib)
[debug]> bt 30
[debug]#0 0x0000000100b3cf3d in gtk_widget_set_parent () from /usr/local/lib/libgtk-3.0.dylib
代码在主线程和 Window 的 "realize" 回调中运行。一样。
密码是:
void main_view_reset_list_view(GtkWidget* list_view, GtkWidget* new_item)
{
GtkEventBox* eb = GTK_EVENT_BOX(list_view);
GtkBin* bin = GTK_BIN(list_view);
GtkContainer* container = GTK_CONTAINER(list_view);
GtkWidget* subview;
subview = gtk_bin_get_child(bin);
if (subview)
{
gtk_container_remove(container, subview);
gtk_widget_unparent (subview);
gtk_widget_destroy(subview);
}
gtk_widget_set_parent(new_item, container); // crash
GtkWidget* parent = gtk_widget_get_parent(container);
GtkWidget* parent2 = gtk_widget_get_parent(new_item); // 0 on windows, crash on mac
if (new_item)
{
gtk_container_add(container, new_item);
gtk_widget_show(new_item);
}
gtk_widget_show(list_view);
}
更新: set_parent 使控件在 windows
上以某种方式消失我追踪了 gtk 和 glib 的源代码,发现 G_IS_OBJECT() 失败了,这很奇怪。 post 让我想到这个问题与指针相关。我调试了我的代码,发现这是真的。
GtkWidget* create_widget()
{
return gtk_fixed_new(); // result points to 0x1018bf830
}
void refresh_widgets()
{
GtkWidget* w = create_widget(); // w points to 0x18bf830
}
我以前确实遇到过这种问题,所以 return 指针的所有代码都已更改:
char* generate_string();
到
void generate_string(char** out);
因此,为了解决我的问题,我必须以这种方式提供正确的指示。喜欢:
void create_widget(GtkWidget** out);
UPD:我注意到指针之间存在差异。简而言之,它们在 return.
的 64 位系统上以某种方式被修剪为 32 位UPD2:最后,我进行了所有更改并且它以这种方式工作。