关于SourceCompletionProvider
的{{3}}州:
You must implement this interface to provide proposals to SourceCompletion
“实现此接口”在上下文中意味着什么?
我应该使用documentation功能创建新的GObject
吗?任何一个例子?。
当我有新的GObject
时,我该如何向其添加功能(例如sourceCompletionProviderGetName
)?
由于
答案 0 :(得分:5)
gtk +是用C语言编写的,但它使用glib
来提供面向对象的样式接口。大多数gtk + API是使用OO意义上的接口定义的。实际的gtk +功能由实现这些接口的“对象”(遵循glib约定的结构的指针)提供。所以“实现这个接口”就意味着 - 写一个“类”(在C中通过glib系统)实现所需的接口(你可以通过设置适当的glib钩来处理特定的函数调用)。
在gtk2hs中,glib接口被转换为类型类,并在末尾附加单词“class”。 SourceCompletionProviderClass
是这些类中的一个,用于准确表示glib接口。不幸的是,C-side“类方法”并没有真正暴露在Haskell中。类类提供的唯一方法是转换操作,这只是解决Haskell类型系统和OOP继承树之间的不匹配问题。 glib-class-method被转换为一个常规的Haskell函数,对一些可以转换为适当类型的数据进行操作。这意味着没有通过gtk2hs实现新类实例的好方法。
虽然从理论上讲你可以通过创建一个新的GObject来从Haskell方面挖掘出必要的行为,但很可能不是所有必需的函数(你需要一些低级的glib东西)暴露出来,所以你需要自己绑定它们(我似乎记得gtk2hs维护者在一两年前发布类似这样的东西,但现在找不到链接)。那时,你自己在C中实现它可能不太容易出错。我有一个代码库为cellrenderer interface执行此操作,您可能会发现它可用作模型。大多数有趣的东西都发生在C头文件中。您仍然可以通过函数指针设置从C端调用的Haskell函数。
如果你真的想尝试从Haskell完全做到这一点,我会首先找到一个相当简单的界面(比如我的cellrenderer函数,或者另一个SourceCompletionProvider
)并通过preprocesser运行标题来查看glib宏转换为。然后,您可以看到设置glib对象的必要定义。最重要的函数是* _init,* _finalize,* _get_property和* _set_property,尽管还需要其他一些函数。 *
是对象名称的占位符。 IIRC,大多数默认函数都是由G_DEFINE_TYPE
宏设置的,它也设置了名称前缀。