【问题标题】:Creating signals in vapi files在 vapi 文件中创建信号
【发布时间】:2019-01-11 13:20:51
【问题描述】:

我正在尝试编写一个 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");});

【问题讨论】:

    标签: vala vapi


    【解决方案1】:

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

    uiWindowOnClosing 中使用的模式是传递一个 C 函数指针以用作回调。在 Vala 方面,这些被称为delegateslibui 没有为函数点添加 typedef,所以 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);
    }
    

    这是未经测试的,但应该能让您更好地了解基本概念。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

        在 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代码中。

        感谢您的帮助。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-01-30
          • 1970-01-01
          • 2020-08-18
          • 2015-08-02
          • 1970-01-01
          • 2011-01-16
          • 1970-01-01
          相关资源
          最近更新 更多