2015-09-28 65 views
0

我創建一個GtkFixed對象,並通過gtk_container_add將其放入GtkEventBox(當然,銷燬前一個子項)。這種方式在Windows上工作正常,但在Mac上它崩潰。gtk_container_add粉碎在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 

代碼在主線程拼命地跑在窗口的「實現」回調。相同。

的代碼是:

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使得控制莫名其妙dissapeared在Windows

回答

0

我跟蹤GTK和油腔滑調的源代碼,並想通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:最後,我做了所有的改變,它的工作方式。