我已部分解决了prev个问题。
现在我可以通过GObject
注册bindings-gobject
子类型了(参见hpase)
我可以使用c'g_type_add_interface_static函数实现SourceCompletionProvider
(但尚未尝试过)。
唯一的问题是将Ptr ()
返回的c'g_object_newv
转换为gtk2hs
数据类型SourceCompletionProvider
。我该怎么做?任何提示?
SourceCompletionProvider
的定义如下:
newtype SourceCompletionProvider = SourceCompletionProvider (ForeignPtr (SourceCompletionProvider))
这个定义是什么意思?为什么它是递归的?提供商是ForeignPtr
提供商 - 对我来说很奇怪。
感谢。
解决方案:
makeNewGObject mkGObject $ castPtr <$> c'g_object_newv myObType 0 nullPtr
答案 0 :(得分:1)
外部SourceCompletionProvider
是必需的,因为这是一个新类型,而内部SourceCompletionProvider
只是区分这个外部指针和指向其他类型的指针的标记。如果您查看definition of Ptr a
,它是data Ptr a = Ptr Addr#
- a
是一个未出现在右侧的幻像类型,因此该定义实际上不是递归的。
您可以使用newForeignPtr_
将Ptr ()
转换为ForeignPtr ()
,然后使用castForeignPtr
将其转换为ForeignPtr SourceCompletionProvider
。
修改:仔细观察后,我认为为了完成这项工作,您需要先使用所概述的方法将Ptr
转换为GObject
上面然后使用unsafeCastGObject
。但是没有经过测试。