GtkApplicationWindow подкласс "уничтожить" дважды - PullRequest
0 голосов
/ 29 апреля 2019

Я взял приложение1 из примеров в Gtk source и изменил подкласс GtkApplicationWindow, чтобы сохранить некоторое состояние окна в обработчике сигнала «destroy». Проблема с моим кодом в том, что save_some_state() вызывается дважды. Зачем? Как я могу это исправить?

static void
example_app_activate (GApplication *app) {

  ExampleAppWindow *win;

  win = example_app_window_new (EXAMPLE_APP (app));

  gtk_window_present (GTK_WINDOW (win));
}

........

static void
on_app_window_destroy (GtkWidget* widget) 
{
    ExampleAppWindow* win = EXAMPLE_APP_WINDOW(widget);

    save_some_state(win);

    GTK_WIDGET_CLASS(example_app_window_parent_class)->destroy (widget);

}

static void
example_app_window_class_init (ExampleAppWindowClass *klass)
{
    GtkWidgetClass* widget_class = GTK_WIDGET_CLASS (klass);

    widget_class->destroy = on_app_window_destroy;
}

Ответы [ 2 ]

0 голосов
/ 30 апреля 2019

Где вы храните example_app_window_parent_class? Это происходит от виджета? Как говорит GtkNerd, он может дублировать вещи, если он не связан правильно.

Я не совсем уверен во внутренних органах. Для Gtk2 разрушение - это сигнал GtkObject, а не сигнал GtkWidget, поэтому в этом случае вы должны использовать его как GTK_OBJECT_CLASS, хотя это, скорее всего, не имеет значения - для Gtk3 это нормально, как есть. Я не уверен насчет внутренних компонентов, но сигнал уничтожения может вызываться несколько раз из-за подсчета ссылок. Более безопасный вариант - переопределить finalize, так как он должен вызываться только один раз, независимо от того.

0 голосов
/ 30 апреля 2019

Что ж, это определенно похоже на то, что вы уничтожаете его дважды, вызывая

GTK_WIDGET_CLASS(example_app_window_parent_class)->destroy (widget);

в on_app_window_destroy обратном вызове

...