我从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;
}
答案 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,因为它无论何时都只能被调用一次。