2012-09-20 101 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