在 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>
问题
我找不到任何 OwnerChangeEvent
。 Graphics.UI.Gtk.Gdk.EventM只提供EventM
类型的函数来查询所有者变更事件。
on
来自 System.Glib.Signals 需要关联的小部件 接受任何对象和与该对象关联的事件(on :: object -> Signal object callback -> callback -> IO (ConnectId object
).如果我对 X 理解正确的话,应该没有必要 window 来监听这个事件。
要么我误解了如何将它们组合在一起,要么我已经触及了 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
类型中,虽然我没有信心--测试一下看看。
使用 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>
问题
我找不到任何
OwnerChangeEvent
。 Graphics.UI.Gtk.Gdk.EventM只提供EventM
类型的函数来查询所有者变更事件。on
来自 System.Glib.Signals需要关联的小部件接受任何对象和与该对象关联的事件(on :: object -> Signal object callback -> callback -> IO (ConnectId object
).如果我对 X 理解正确的话,应该没有必要 window 来监听这个事件。
要么我误解了如何将它们组合在一起,要么我已经触及了 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
类型中,虽然我没有信心--测试一下看看。