101 字
1 分钟
Swift 调用 GLib

g_signal_connect#

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

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#

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中获取值

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

待续..#

Swift 调用 GLib
https://shsuco.com/posts/swift调用glib/
作者
shsuco
发布于
2022-07-26
许可协议
CC BY-NC-SA 4.0