我正在尝试编写一个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");});
答案 0 :(得分:2)
使用GLib的信号来实现Vala中的信号,这是observer pattern的示例。要在Vala中使用信号,该类需要从Object
继承,而libui
似乎并没有使用GLib的GObject。因此,无法在此绑定中使用信号。尽管可以在Vala绑定中使用信号。例如,gtksourceview VAPI绑定了redo
的{{1}}和undo
信号。
SourceBuffer
中使用的模式是传递C函数指针以用作回调。在Vala方面,它们称为delegates。 uiWindowOnClosing
尚未为功能点添加typedef,因此Vala需要生成它。通过在VAPI中使用libui
可以表明这一点。
这里的另一个问题是用户数据的空指针-[CCode (has_typedef = false)]
。这可能是使用简单泛型的最佳绑定。
在装订线上的粗略切割是:
void *data
这未经测试,但是应该可以使您更好地了解基本概念。
答案 1 :(得分:1)
这是不可能的。 Vala的signal
机制基于GLib的signal系统。您可以使它们使用lambda,但不能使用信号。
答案 2 :(得分:0)
在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;});
在密码代码中。
谢谢您的帮助。