gtksourceview2:实现完成提供程序

Yur*_*ras 3 haskell gtk2hs gtksourceview

文件约状态SourceCompletionProvider:

You must implement this interface to provide proposals to SourceCompletion
Run Code Online (Sandbox Code Playgroud)

"实现此接口"在上下文中意味着什么?

我应该GObject使用这个功能创建新的吗?有什么例子吗?

当我有新的时候GObject,我该如何添加功能(如sourceCompletionProviderGetName)呢?

谢谢

Joh*_*n L 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接口执行此操作,您可能会发现它可用作模型.大多数有趣的东西都发生在C头文件中.您仍然可以通过函数指针设置从C端调用的Haskell函数.

如果你真的想尝试完全从Haskell完成它,我会首先找到一个相当简单的接口(比如我的cellrenderer函数,或者另一个SourceCompletionProvider),并通过preprocesser运行头来查看glib宏转换为什么.然后,您可以看到设置glib对象的必要定义.最重要的函数是*_init,*_finalize,*_get_property和*_set_property,尽管还需要其他一些函数.它*是对象名称的占位符.IIRC,大多数默认函数都是由G_DEFINE_TYPE宏设置的,它也设置了名称前缀.