Создание сигналов в файлах VAPI - PullRequest
0 голосов
/ 11 января 2019

Я пытаюсь написать файл VAPI для использования 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");});

Ответы [ 3 ]

0 голосов
/ 12 января 2019

Сигналы в Vala реализованы с использованием сигналов GLib, что является примером схемы наблюдений . Чтобы использовать сигналы в Vala, класс должен наследовать от Object, и, похоже, libui не использует GObject GLib. Поэтому невозможно использовать сигналы в этой привязке. Хотя можно использовать сигналы в привязке Vala. Например, gtksourceview VAPI связывает сигналы redo и undo SourceBuffer.

Шаблон, используемый в uiWindowOnClosing, должен передать указатель на функцию C для использования в качестве обратного вызова. На стороне Вала они называются делегатами . libui не добавил typedef для функциональной точки, поэтому Vala должен сгенерировать это. На это указывает использование [CCode (has_typedef = false)] в VAPI.

Другая проблема здесь - указатель void для пользовательских данных - 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);
}

Это не проверено, но должно дать вам лучшее представление о базовых концепциях.

0 голосов
/ 19 января 2019

используя ваш код в 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);  

в вапи и

w.on_closing(()=>{Quit();return 0;});  

в коде Вала.

Спасибо за вашу помощь.

0 голосов
/ 11 января 2019

Это невозможно. Механизм Vala signal основан на системе GLib signal . Вы можете использовать эти лямбды, но не сигналы.

...