Сигналы в 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);
}
Это не проверено, но должно дать вам лучшее представление о базовых концепциях.