Не удается заставить работать простое приложение GTK3

Все, что мне нужно, это простое диалоговое окно для выбора файла для обработки. Я какое-то время не использовал C lang и не могу найти хороший рабочий пример.

код:

#include <gtk/gtk.h>
#include <stdio.h>

int main(int argc, char const *argv[]) {

  GtkFileChooserNative *native;

  native = gtk_file_chooser_native_new ("Open File", NULL, GTK_FILE_CHOOSER_ACTION_OPEN, NULL, NULL);

  return 0;
}

Я компилирую его с помощью этой команды:

gcc `pkg-config gtk+-3.0 --cflags` `pkg-config gtk+-3.0 --libs` -o out dialog.c

У меня ошибка сегментации на gtk_file_chooser_native_new ()

Может strace поможет:

http://pastebin.com/TdC0A2J3


person ProNOOB    schedule 12.02.2017    source источник
comment
Я воспроизводю эту проблему.   -  person Basile Starynkevitch    schedule 12.02.2017


Ответы (1)


Вам необходимо вызвать gtk_init (перед любая другая функция GTK) или собственный класс приложения и вызовите g_application_run. И ваш main должен быть int main(int argc, char**argv) как обычно.

Следующая программа не segfault (в Linux/Debian/Sid, GTK 3.22.7)

#include <gtk/gtk.h>
#include <stdio.h>
int main (int argc, char  **argv) {
  GtkFileChooserNative *native = NULL;
  gtk_init (&argc, &argv);
  native = gtk_file_chooser_native_new ("Open File", NULL,
             GTK_FILE_CHOOSER_ACTION_OPEN, NULL, NULL);
  guint res = gtk_native_dialog_run (GTK_NATIVE_DIALOG (native));
  if (res == GTK_RESPONSE_ACCEPT) {
    char *filename;
    GtkFileChooser *chooser = GTK_FILE_CHOOSER (native);
    filename = gtk_file_chooser_get_filename (chooser);
    printf ("should open %s\n", filename);
    g_free (filename);
  }
  /// in a real application perhaps you want: gtk_main ();
  return 0;

}

и показывает диалог. Скомпилируйте это, используя

 gcc -Wall -g $(pkg-config gtk+-3.0 --cflags) \
    $(pkg-config gtk+-3.0 --libs) \
    -o out dialog.c

и используйте отладчик gdb при отладке.

person Basile Starynkevitch    schedule 12.02.2017
comment
Да, обычно настоящее приложение GTK имеет свой цикл событий с gtk_main - person Basile Starynkevitch; 12.02.2017
comment
В gtk_native_dialog_run() и gtk_dialog_run() есть свои gtk_main(). Как следствие, gtk_main_quit() выходит только из самого внутреннего gtk_main(). - person andlabs; 12.02.2017
comment
Но полное приложение GTK имеет свой собственный цикл событий, поэтому вызывает gtk_main (вне этих внутренних диалогов) - person Basile Starynkevitch; 12.02.2017