SFML и GTK + - GtkFileChooserDialog - PullRequest
       35

SFML и GTK + - GtkFileChooserDialog

2 голосов
/ 31 июля 2011

Я пишу приложение с использованием SFML и хочу использовать GTK + для создания диалоговых окон выбора файлов.У меня есть этот код:

gtk_init(&argc, &argv);

GtkWidget *dialog;
dialog = gtk_file_chooser_dialog_new ("Open file...", NULL, GTK_FILE_CHOOSER_ACTION_OPEN, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT, NULL);
gtk_dialog_run (GTK_DIALOG (dialog));

И диалог показывает, но он не разрушается: (

1 Ответ

2 голосов
/ 31 июля 2011

В документации gtk_dialog_run есть примечание

После того, как gtk_dialog_run () вернется, вы несете ответственность за сокрытие или уничтожение диалога, если вы хотите это сделать.

Таким образом, диалог не должен уничтожаться автоматически, программист должен это сделать.


EDIT:

Другая проблема заключается в том, что вы не запускаете основной цикл GTK (gtk_main() или его вариант), поэтому GTK не может иметь дело с событиями, необходимыми для уничтожения виджета (ни одна из частей GTK не работает во время присутствия событий) ). Решение для этого находится в ответе на другой вопрос с использованием gtk_idle_add() для вызова функции после gtk_main() называется. В этой функции отображается диалоговое окно, результат передается вызывающей стороне, диалоговое окно уничтожается и вызывается gtk_main_quit() для завершения основного цикла GTK.

Однако, gtk_idle_add() устарел в GTK + 2.6 и отсутствует в GTK + 3.0, поэтому вместо него следует использовать g_idle_add(). Ваш код может быть похож на

struct fch_result {
    gint response;
    // other information to return like filename,...
};

static gboolean fch_dialog(gpointer user_data)
{
    struct fch_result *result = (struct fch_result *) user_data;
    GtkWidget *dialog = gtk_file_chooser_dialog_new ( ... );
    result->response = gtk_dialog_run (GTK_DIALOG(dialog));
    // now add other information to result

    gtk_widget_destroy(dialog);
    gtk_main_quit();  // terminate the gtk_main loop called from caller
    return FALSE;
}

int main(int argc, char** argv)
{
    gtk_init(&argc, &argv);

    struct fch_result data;
    g_idle_add(fch_dialog, &data);

    gtk_main();

    // continue with the program
    return 0;
}
...