GtkApplicationWindow子类“销毁”两次

时间:2019-04-29 10:10:54

标签: gtk gtk3

我从Gtk来源的示例中获取了application1 并修改了GtkApplicationWindow子类,以将某些窗口状态保存在“销毁”信号处理程序中。我的代码的问题是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 :(得分:0)

好吧,肯定是您通过调用

两次销毁了它。
Epoch 1/20 
436/436

GTK_WIDGET_CLASS(example_app_window_parent_class)->destroy (widget); 回调中

答案 1 :(得分:0)

您要将example_app_window_parent_class存储在哪里?这是从小部件派生的吗?正如GtkNerd所说,如果链接不正确,它可能会复制某些东西。

我对内部结构并不完全自信。对于Gtk2,destroy是GtkObject信号,而不是GtkWidget信号,因此在这种情况下,您可以将其转换为GTK_OBJECT_CLASS,尽管这可能无关紧要-对于Gtk3,它仍然可以。我不确定内部结构,但是由于引用计数,破坏信号可能会多次调用。一个更安全的选择是覆盖finalize,因为它无论何时都只能被调用一次。