在 gtk2hs 中监听剪贴板的 "owner change" 事件。如何设置?

Listening for "owner change" events for the clipboard in gtk2hs. How to set up?

使用 Gtk2Hs,我想设置一个回调来侦听剪贴板的 "Owner change" 事件。

我可以通过查询来了解X服务器是否支持:

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

在 C:

中像 this 那样应该很简单
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>

问题

要么我误解了如何将它们组合在一起,要么我已经触及了 Gtk2Hs 中尚未实现的 gtk 部分。

因此我查看了 keyPressEvent 的定义,它看起来像这样:

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

所以,我通过简单地在 gtk 中添加 ownerChangeEvent 的定义来测试 keyPressEvent,但是用 "key_press_event" 代替 "owner_change_event"

这没有用,因为我收到有关找不到事件的运行时错误。顺其自然。

关于如何在 gtk 中正确监听 "owner change" 事件有什么想法吗?

你是对的,目前还没有实现。添加它不应该太复杂,如果您希望进入 gtk2hs 开发,这可能是一个有趣的项目。您需要向 Event type, together with a descriptive type alias like type EventOwnerChange = Event. You will need to extend marshalEvent 添加一个新的构造函数来处理这种新型事件,虽然我不记得了,但可能还有一个 unmarshalEvent。

完成后,使用 connect_* 系列函数(仅供 gtk2hs 内部使用,因此不会在 API).从 owner-change 事件的文档中,您可能需要使用类似 Signal (connect_OBJECT__NONE "owner-change").

的内容

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