gtk_container_add迷恋mac

时间:2015-09-28 13:19:30

标签: macos gtk3

我创建了一个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的回调中运行。相同。

代码是:

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);
}

UPD: set_parent使控件在windows上以某种方式消失了

1 个答案:

答案 0 :(得分:0)

我已经跟踪了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
}

我之前实际上遇到过这种问题,因此所有返回指针的代码都已更改:

char* generate_string();

void generate_string(char** out);

因此,为了解决我的问题,我必须以这种方式提供正确的指针。像:

void create_widget(GtkWidget** out);
UPD:我注意到指针之间存在差异。简而言之,不知何故,它们会在返回时在64位系统上被修剪为32位。

UPD2:最后,我做了所有更改,它就是这样。