0%

Swift调用GLib

g_signal_connect

Swift无法调用C宏, 需要使用g_signal_connect_data函数

1
2
3
4
let slot: @convention(c) (UnsafeMutableRawPointer?) -> Void = { data in
...
}
g_signal_connect_data(ptr, "signal", unsafeBitCast(slot, to: GCallback?.self), data, nil, G_CONNECT_AFTER)

slot必须标记为@convention(c), 否则unsafeBitCast将产生fatalError

g_object_get_property

1
2
3
4
5
6
7
func gproperty<T, R>(of ptr: UnsafeMutablePointer<T>, name: String, transform: (UnsafeMutablePointer<GValue>) -> R) -> R {
ptr.withMemoryRebound(to: GObject.self, capacity: 1) {
var value = GValue()
g_object_get_property($0, name, &value)
return transform(&value)
}
}

再使用g_value_get族函数从GValue中获取值

1
let property = gproperty(of: ptr, name: "property") { g_value_get_variant($0) }

待续..