I've solved the prev question partially.
Right now I'm able to register GObject
subtype via bindings-gobject
(see hpase)
I can implement SourceCompletionProvider
using c'g_type_add_interface_static function (but didn't tried yet).
The only issue is to convert Ptr ()
, returned by c'g_object_newv
, to gtk2hs
data type SourceCompletionProvider
. How can I do it? Any hints?
SourceCompletionProvider
is defined like:
newtype SourceCompletionProvider = SourceCompletionProvider (ForeignPtr (SourceCompletionProvider))
What does this definition means? Why it is recursive? Provider is a ForeignPtr
to provider -- looks strange for me.
Thanks.
Solution:
makeNewGObject mkGObject $ castPtr <$> c'g_object_newv myObType 0 nullPtr
The outer
SourceCompletionProvider
is required since this is a newtype, and the innerSourceCompletionProvider
is just a marker to distinguish this foreign pointer from pointers to other types. If you look at the definition ofPtr a
, it'sdata Ptr a = Ptr Addr#
-a
is a phantom type that doesn't appear on the right-hand side, so the definition is not actually recursive.You can convert a
Ptr ()
toForeignPtr ()
usingnewForeignPtr_
and then cast it toForeignPtr SourceCompletionProvider
withcastForeignPtr
.edit: After looking at this a bit more, I think that to make this work you'll need to first convert your
Ptr
toGObject
with the method outlined above and then useunsafeCastGObject
. Not tested, though.