我正在编写一个Vala应用程序。我希望在窗口大小调整上执行一些函数。我尝试用窗口调整大小回调重写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,但看起来我做错了。 你能帮帮我吗?
答案 0 :(得分:3)
您不需要直接使用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区分具有上下文(即闭包)的委托和没有上下文的委托(即函数指针,即“静态委托”)。如果你看Gtk.Callback,你会注意到has_target = false
。这使它成为静态委托,因此您需要根据回调的需要传递数据ponter。