【问题标题】:gtksourceview2: implement completion providergtksourceview2:实现完成提供程序
【发布时间】:2012-09-17 06:38:44
【问题描述】:

documentation 声明了 SourceCompletionProvider

You must implement this interface to provide proposals to SourceCompletion

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

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

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

谢谢

【问题讨论】:

  • 包维护者注意:您可能认为您的代码是自记录的。它不是。解释一下!

标签: haskell gtk2hs gtksourceview


【解决方案1】:

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 interface 执行此操作的代码库,您可能会发现它作为模型很有用。大多数有趣的东西都发生在 C 头文件中。您仍然可以通过函数指针设置从 C 端调用的 Haskell 函数。

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

【讨论】:

  • 不知道用binding-gobject(hackage.haskell.org/package/bindings-gobject)能不能做到
  • @Yuras 可能。我认为您需要创建一个新类型对象,将其注册到 glib 类型系统,然后您可以使用新类型创建一个 GObject,并设置适当的回调。然后,您可以通过适当的指针转换在 binding-gobjectgtk2hs 之间进行转换。
  • 感谢您的帮助。我终于通过bindings-gobject 解决了这个问题。见stackoverflow.com/questions/12509431/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-23
  • 2015-05-07
  • 2011-01-10
  • 2017-04-01
  • 2018-12-04
  • 2019-02-21
相关资源
最近更新 更多