2012-09-20 55 views
1

我已经部分解决了prev问题。将Ptr()转换为SourceCompletionProvider

现在我能够通过bindings-gobject注册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 

回答

1

SourceCompletionProvider要求,因为这是一个NEWTYPE,内SourceCompletionProvider仅仅是从指针到其它类型的这种外来指针区分的标记。如果你看definition of Ptr a,它的data Ptr a = Ptr Addr# - a是一个幻像类型,它不出现在右侧,所以定义实际上并不是递归的。

可以使用newForeignPtr_转换Ptr()ForeignPtr()然后将它与castForeignPtr转换为ForeignPtr SourceCompletionProvider

编辑:在这个寻找多一点之后,我觉得做这个工作,你需要先转换你的PtrGObject以上概述,然后使用unsafeCastGObject方法。虽然没有测试过。

+0

嗯...我想我需要添加终结器,对吧?我可以使用'p'g_object_unref'作为终结器,这足够吗? – Yuras

+0

从查看[C接口文档](http://developer.gnome.org/gobject/stable/gobject-The-Base-Object-Type.html#g-object-unref)后我可以看出,你对了。 –

+0

刚刚尝试过 - 像一个魅力。谢谢! – Yuras