haskell - gtksourceview2 : implement completion provider

标签 haskell gtk2hs gtksourceview

documentation关于 SourceCompletionProvider 的说明:

You must implement this interface to provide proposals to SourceCompletion

“实现此接口(interface)”在上下文中意味着什么?

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

当我有新的 GObject 时,如何向其添加函数(例如 sourceCompletionProviderGetName)?

谢谢

最佳答案

gtk+ 是用 C 语言编写的,但它使用 glib 来提供面向对象风格的接口(interface)。 gtk+ API 的大部分是使用 OO 意义上的接口(interface)来定义的。实际的 gtk+ 功能是由实现这些接口(interface)的“对象”(指向遵循 glib 约定的结构体的指针)提供的。所以“实现这个接口(interface)”的意思就是——编写一个“类”(通过 glib 系统用 C 语言)来实现所需的接口(interface)(通过设置适当的 glib 钩子(Hook)来处理特定的函数调用来实现)。

在 gtk2hs 中,glib 接口(interface)被翻译为类型类,并在末尾附加“class”一词。 SourceCompletionProviderClass 是这些类之一,旨在准确表示 glib 接口(interface)。不幸的是,C 端“类方法”并没有真正在 Haskell 中公开。类型类提供的唯一方法是强制转换操作,这只是为了解决 Haskell 类型系统和 OOP 继承树之间的不匹配问题。 glib-class-method 被转换为对某些可以转换为适当类型的数据进行操作的常规 Haskell 函数。这意味着没有好的方法可以通过 gtk2hs 实现新的类实例。

虽然理论上你可以通过创建一个新的 GObject 从 Haskell 方面硬塞必要的行为,但很可能并不是所有必要的函数(你需要一些低级的 glib 东西)都被公开,所以你需要自己绑定(bind)它们(我似乎记得 gtk2hs 维护者在一两年前发布过类似的内容,但现在找不到链接)。到那时,您自己用 C 语言实现它可能不太容易出错。我有一个代码库可以为 cellrenderer interface 执行此操作,您可能会发现它作为模型很有用。大多数有趣的事情发生在 C 头文件中。您仍然可以通过函数指针将 Haskell 函数设置为从 C 端调用。

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

关于haskell - gtksourceview2 : implement completion provider,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12454209/

相关文章:

haskell - 我使用的是 react 香蕉吗?

reflection - Haskell:为什么要进行类型检查?

haskell - 如何向小村庄模板添加条件注释?

haskell - 如何在gtk2hs中获取TextView中的光标位置?

list - 我如何在 Haskell 中编写一个函数,它接受一个 Ints 列表并返回该列表的所有连续子列表?

user-interface - 是否有Gtk电子表格小部件

haskell - 如何在 haskell/gtk2hs 中制作图形命令行?

python - 使用 GTK3 SourceView 突出显示语法

gtk - 如何使基本代码自动完成?

C Gtk+2 Glade3 : how can i set a SourceBuffer to a GtkSourceView that was loaded from glade?