В документации 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;
}