1

我已经部分解决了上一个问题

现在我可以GObject通过bindings-gobject(参见hpase)注册子类型,我可以SourceCompletionProvider使用c'g_type_add_interface_static函数来实现(但还没有尝试过)。

唯一的问题是Ptr ()将由返回的转换c'g_object_newvgtk2hs数据类型SourceCompletionProvider。我该怎么做?有什么提示吗?

SourceCompletionProvider定义如下:

newtype SourceCompletionProvider = SourceCompletionProvider (ForeignPtr (SourceCompletionProvider))

这个定义是什么意思?为什么它是递归的?提供者是ForeignPtr提供者——对我来说看起来很奇怪。

谢谢。

解决方案:

makeNewGObject mkGObject $ castPtr <$> c'g_object_newv myObType 0 nullPtr
4

1 回答 1

1

外部SourceCompletionProvider是必需的,因为这是一个新类型,而内部SourceCompletionProvider只是一个标记,用于将此外部指针与指向其他类型的指针区分开来。如果您查看 的定义Ptr a,它是data Ptr a = Ptr Addr#-a是一种幻影类型,不会出现在右侧,因此该定义实际上不是递归的。

您可以将 a 转换Ptr ()ForeignPtr ()using newForeignPtr_,然后将其转换为ForeignPtr SourceCompletionProviderwith castForeignPtr

编辑:在看了这个之后,我认为要完成这项工作,您需要首先使用上述方法将您的转换为,然后Ptr使用. 不过没有测试。GObjectunsafeCastGObject

于 2012-09-20T10:28:26.183 回答