3

文档指出SourceCompletionProvider

You must implement this interface to provide proposals to SourceCompletion

“实现此接口”在上下文中是什么意思?

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

当我有 newGObject时,如何sourceCompletionProviderGetName向它添加功能(如 )?

谢谢

4

1 回答 1

6

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

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

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

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

于 2012-09-17T13:19:31.480 回答