2013-02-18 45 views
2

我正在試圖製作一個C程序的測試版本,其中用戶可以使用GTK文件選擇器加載遊戲級別。它似乎工作,並打開文件選擇器窗口,但當用戶試圖選擇一個文件時崩潰。這個問題似乎是在的GtkWindow沒有被承認爲一個GtkWindow,儘管被聲明爲:GtkWindow未被識別爲文件選擇器 - C

GtkWidget *window; 
window = gtk_window_new(GTK_WINDOW_TOPLEVEL); //initialize window 

我然後將其保存到GUI結構的窗口指針:

typedef struct gui gui_t; 

struct gui { 
    GtkWidget *window; 
    GtkWidget *frame; 
    GtkWidget *menu_bar; 
    GtkWidget *drawing_area; 
    GtkWidget *vbox; 
    level_t *game; 
}; 

哪個然後傳遞到下面的load_menu回調,目前只是嘗試打印選定的文件名:

void gui_load_menu(gpointer data) { 

    gui_t *gui = (gui_t *)data; 

    GtkWindow *window = (GtkWindow *)(gui->window); 

    GtkWidget *dialog; 

    dialog = gtk_file_chooser_dialog_new("Load Level", GTK_WINDOW(window), GTK_FILE_CHOOSER_ACTION_OPEN, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT, NULL); 

    if(gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT) { 
     char *filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog)); 

     fprintf(stdout, "%s", filename); 
    } 
} 

這些是特定的運行時錯誤:

(guitest:4445):GLib的-的GObject-WARNING **:無效uninstantiatable guchar' in cast to類型的GtkWindow」

(guitest:4445):GTK的CRITICAL **:gtk_window_set_transient_for:斷言`父== NULL | | GTK_IS_WINDOW(父)'失敗

任何想法?

謝謝!

+0

用'--g-fatal-warnings'運行整個事情並使用'catchsegv'或'gdb'來獲取跟蹤/行它崩潰的地方。也放置一些'g_assert(GTK_IS_WINDOW(foo));'測試 – drahnr 2013-02-18 22:17:19

+0

@drahnr我添加了一個斷言,檢查window是否是一個窗口(我有權訪問源),並且斷言失敗。我看起來更深一點,'data'爲空。這是我們使用的回調函數:'g_signal_connect(G_OBJECT(load),「activate」,G_CALLBACK(gui_load_menu),gui);' – 2013-02-18 23:01:27

回答

0

您需要使用回調正確的簽名,這應該是

void gui_load_menu(GtkWidget *widget, gpointer data)

每個回調都可以有不同的簽名,你需要看的信號,你用它來看看有什麼文件它是。在這種情況下,我假定load是一個GtkMenuItem,文檔位於:http://developer.gnome.org/gtk3/3.2/GtkMenuItem.html#GtkMenuItem-activate

+0

哇,愚蠢的疏忽。萬分感謝! – user2084863 2013-02-19 04:20:45