我正在尝试编写一个VAPI文件,以便在Vala中使用libui (https://github.com/andlabs/libui)。
我不知道如何将事件从控件连接到vala信号。
在libui头中是,例如关闭窗口,此方法定义:
_UI_EXTERN void uiWindowOnClosing(uiWindow *w, int (*f)(uiWindow *w, void *data), void *data); 在C示例中,使用方法"onClosing“作为参数调用此方法:
uiWindowOnClosing(w, onClosing, NULL); 我怎么做才能像这样:
window.OnClosing.connect(()=>{print("End");});发布于 2019-01-12 21:33:52
Vala中的信号是使用GLib的信号实现的,这是observer pattern的一个示例。要在Vala中使用信号,该类需要继承自Object,而且看起来libui并没有使用GLib的GObject。所以不可能在这个绑定中使用信号。尽管可以在Vala绑定中使用信号。例如,gtksourceview VAPI绑定SourceBuffer的redo和undo信号。
uiWindowOnClosing中使用的模式是传递一个C函数指针作为回调。在VALA端,这些被称为delegates。libui没有为功能点添加类型定义,所以Vala需要生成类型定义。这是通过在VAPI中使用[CCode (has_typedef = false)]来指示的。
这里的另一个问题是用户数据void *data的空指针。使用简单的泛型可能是最好的约束。
绑定的粗略切割将是:
[CCode (cname = "uiWindow")]
public class Window {
[CCode (has_typedef = false, simple_generics = true)]
public delegate int Callback<T> (T data);
[CCode (cname = "uiWindowOnClosing", simple_generics = true)]
public void on_closing<K> (Callback callback, K data);
}这是未经测试的,但应该会让您对基本概念有一个更好的了解。
发布于 2019-01-12 01:03:29
这是不可能的。Vala的signal机制基于GLib的signal系统。您可以让它们使用lambdas,但不能使用信号。
发布于 2019-01-19 21:14:00
在vapi中使用您的代码,并使用以下代码调用它:
w.on_closing(()=>{Quit();return 0;}, null); 带来了这样的信息:
error: too many arguments to function ‘uiWindowOnClosing’
uiWindowOnClosing (_tmp3_, ___lambda4__ui_window_callback, NULL, NULL);但这是可行的:
public void on_closing (Callback callback); 在vapi中,以及
w.on_closing(()=>{Quit();return 0;}); 在vala代码中。
谢谢你的帮助。
https://stackoverflow.com/questions/54147403
复制相似问题