文档中关于SourceCompletionProvider
:的说明
You must implement this interface to provide proposals to SourceCompletion
"实现这个接口"在上下文中意味着什么?
我应该使用这些函数创建新的GObject
吗?有什么例子吗?。
当我有新的GObject
时,我如何向它添加函数(如sourceCompletionProviderGetName
)?
感谢
gtk+是用C编写的,但它使用glib
来提供面向对象风格的接口。许多gtk+neneneba API是使用OO意义上的接口定义的。实际的gtk+功能是由实现这些接口的"对象"(指向遵循glib约定的结构的指针)提供的。因此,"实现这个接口"的意思正是写一个"类"(通过glib系统在C中),实现所需的接口(通过设置适当的glib挂钩来处理特定的函数调用)。
在gtk2hs中,glib接口被翻译为类型类,末尾附加单词"class"。SourceCompletionProviderClass
就是其中一个类,它旨在准确地表示glib接口。不幸的是,C端的"类方法"并没有在Haskell中真正公开。类型类提供的唯一方法是强制转换操作,这只是为了解决Haskell类型系统和OOP继承树之间的不匹配问题。glib类方法被转换为对一些数据进行操作的常规Haskell函数,这些数据可以被转换为适当的类型。这意味着没有好的方法可以通过gtk2hs实现一个新的类实例。
尽管在理论上,你可以通过创建一个新的GObject从Haskell方面强行引入必要的行为,但很可能并不是所有必要的函数(你需要一些低级的油嘴滑舌的东西)都暴露了,所以你需要自己绑定它们(我似乎记得一两年前gtk2hs的维护人员发布了这样的东西,但现在找不到链接)。在这一点上,自己用C实现这一切可能不太容易出错。我有一个用于cellrenderer接口的代码库,您可能会发现它作为一个模型很有用。大多数有趣的事情都发生在C头文件中。您仍然可以通过函数指针将Haskell函数设置为从C端调用。
如果你真的想完全从Haskell开始,我会先找到一个相当简单的接口(比如我的cellrender函数或另一个SourceCompletionProvider
),然后通过预处理器运行头部,看看glib宏能翻译成什么。然后你就可以看到设置glib对象所需的定义。最重要的函数是*_init、*_finalize、*_get_property和*_set_property,尽管其他一些函数也是必要的。*
是对象名称的占位符。IIRC,大多数默认函数都是由G_DEFINE_TYPE
宏设置的,该宏还设置了名称前缀。