首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在vapi文件中创建信号

在vapi文件中创建信号
EN

Stack Overflow用户
提问于 2019-01-11 21:20:51
回答 3查看 62关注 0票数 1

我正在尝试编写一个VAPI文件,以便在Vala中使用libui (https://github.com/andlabs/libui)。

我不知道如何将事件从控件连接到vala信号。

在libui头中是,例如关闭窗口,此方法定义:

代码语言:javascript
复制
_UI_EXTERN void uiWindowOnClosing(uiWindow *w, int (*f)(uiWindow *w, void *data), void *data);  

在C示例中,使用方法"onClosing“作为参数调用此方法:

代码语言:javascript
复制
uiWindowOnClosing(w, onClosing, NULL);  

我怎么做才能像这样:

代码语言:javascript
复制
window.OnClosing.connect(()=>{print("End");});
EN

回答 3

Stack Overflow用户

发布于 2019-01-12 21:33:52

Vala中的信号是使用GLib的信号实现的,这是observer pattern的一个示例。要在Vala中使用信号,该类需要继承自Object,而且看起来libui并没有使用GLib的GObject。所以不可能在这个绑定中使用信号。尽管可以在Vala绑定中使用信号。例如,gtksourceview VAPI绑定SourceBufferredoundo信号。

uiWindowOnClosing中使用的模式是传递一个C函数指针作为回调。在VALA端,这些被称为delegateslibui没有为功能点添加类型定义,所以Vala需要生成类型定义。这是通过在VAPI中使用[CCode (has_typedef = false)]来指示的。

这里的另一个问题是用户数据void *data的空指针。使用简单的泛型可能是最好的约束。

绑定的粗略切割将是:

代码语言:javascript
复制
[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);
}

这是未经测试的,但应该会让您对基本概念有一个更好的了解。

票数 2
EN

Stack Overflow用户

发布于 2019-01-12 01:03:29

这是不可能的。Vala的signal机制基于GLib的signal系统。您可以让它们使用lambdas,但不能使用信号。

票数 1
EN

Stack Overflow用户

发布于 2019-01-19 21:14:00

在vapi中使用您的代码,并使用以下代码调用它:

代码语言:javascript
复制
w.on_closing(()=>{Quit();return 0;}, null);  

带来了这样的信息:

代码语言:javascript
复制
error: too many arguments to function ‘uiWindowOnClosing’
uiWindowOnClosing (_tmp3_, ___lambda4__ui_window_callback, NULL, NULL);

但这是可行的:

代码语言:javascript
复制
public void on_closing (Callback callback);  

在vapi中,以及

代码语言:javascript
复制
w.on_closing(()=>{Quit();return 0;});  

在vala代码中。

谢谢你的帮助。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54147403

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档