如何在 Vala 中调整 window 大小?

How to do something on window resize in Vala?

我正在写一个 Vala application.And 我想在 window 调整大小时执行一些函数。我试图用 window 调整大小回调重写 C 示例,它似乎工作正常(编译,我的意思是),但是当我 运行 我的程序出现段错误时。

这是我的代码:

Gtk.Widget toplevel = this.get_toplevel();
Gtk.Window window = (Gtk.Window)toplevel;

....

Signal.connect(window, "size-allocate", (GLib.Callback)this.callback, null);

函数callback()是:

private bool callback(Gtk.Widget* window, Gtk.Allocation? a,  char * data )
{       
    resizeAllImages(window->get_allocated_width());
    return false;
}

我试图将此 (http://osdir.com/ml/gtk-list/2010-01/msg00092.html) 教程重写为 Vala,但看起来我做错了什么。 你能帮我吗?

您不需要直接使用connect。有内置的信号处理。这些信号具有相同的名称,只是破折号更改为下划线(例如,Gtk.Widget.size_allocate)。

要连接,只需将其添加到信号处理程序中,如下所示:

widget.size_allocate.connect(this.callback);

您的信号处理程序应如下所示:

private bool callback(Gtk.Widget sender, Gtk.Allocation? a) { ...

您的方法失败的原因是您将 null 传递给处理程序:

Signal.connect(window, "size-allocate", (GLib.Callback)this.callback, this);

Vala 区分了有上下文的委托(即闭包)和没有上下文的委托(即函数指针,a.k.a。“静态委托”)。如果您查看 Gtk.Callback,您会注意到 has_target = false。这使它成为一个静态委托,因此您需要根据回调的需要传递数据指针。