1

使用 Gtk2Hs,我想设置一个回调来监听剪贴板的“所有者更改”事件。

我可以通过以下查询了解 X 服务器是否支持此功能:

display <- fmap fromJust displayGetDefault
canBeNotified <- displayRequestSelectionNotification display selectionPrimary

在 C中这样做应该是直截了当的:

GtkClipboard* clipboard = gtk_clipboard_get(GDK_SELECTION_PRIMARY);
g_signal_connect(clipboard, "owner-change",
G_CALLBACK(handle_owner_change), NULL);

我看到 Gtk2Hs 中的回调是这样设置的:

<widget> `on` <event> $ <action>

问题

  • 我找不到任何OwnerChangeEvent. Graphics.UI.Gtk.Gdk.EventM仅提供类型函数EventM来查询所有者更改事件。

  • onSystem.Glib.Signals 需要一个关联的小部件接受任何对象和与该对象关联的事件 ( on :: object -> Signal object callback -> callback -> IO (ConnectId object)。如果我对 X 的理解正确,则不需要有一个窗口来监听此事件。

要么我误解了如何将它包装在一起,要么我已经达到了 Gtk2Hs 中尚未实现的 gtk 部分。

因此,我查看了它的定义,keyPressEvent如下所示:

keyPressEvent :: WidgetClass self => Signal self (EventM EKey Bool)
keyPressEvent = Signal (eventM "key_press_event" [KeyPressMask])

ownerChangeEvent所以,我通过在 gtk like 中简单地添加一个定义来进行测试keyPressEvent,但替换"key_press_event""owner_change_event".

这不起作用,因为我收到关于找不到事件的运行时错误。自然。

如果可能的话,关于如何在 gtk 中正确监听“所有者更改”事件的任何想法?

4

1 回答 1

1

您说得对,目前尚未实施。添加它不应该太复杂,如果你想进入 gtk2hs 开发,它可能是一个有趣的项目。您需要向该Event类型添加一个新的构造函数,以及一个描述性类型别名,如type EventOwnerChange = Event. 您将需要扩展marshalEvent来处理这种新类型的事件,并且可能有一个 unmarshalEvent 挂在附近,尽管我不记得了。

一旦这一切都完成了,使用函数系列连接到适当的信号应该很容易connect_*(这些函数仅供 gtk2hs 内部使用,因此不会在 API 中公开)。从所有者更改事件的文档中,您可能需要使用类似Signal (connect_OBJECT__NONE "owner-change").

可能还需要添加到EventMask类型中,尽管我没有信心——测试一下看看。

于 2015-03-04T07:24:55.613 回答