如何在 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
。这使它成为一个静态委托,因此您需要根据回调的需要传递数据指针。
我正在写一个 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
。这使它成为一个静态委托,因此您需要根据回调的需要传递数据指针。