使用Gtk2Hs,我想设置一个回调来监听剪贴板的“所有者更改”事件。
我可以通过查询来了解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
需要关联的小部件
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中为keyPressEvent
添加了一个定义,但"key_press_event"
为"owner_change_event"
添加了{{1}}。
这不起作用,因为我收到了关于未找到事件的运行时错误。自然。
如果可能的话,有关如何在gtk中正确收听“所有者更改”事件的任何想法?
答案 0 :(得分:1)
你是对的,目前尚未实施。添加它不应该太复杂,如果你想进入gtk2hs开发,可能是一个有趣的项目。您需要为Event
类型添加新的构造函数,以及类似type EventOwnerChange = Event
的描述性类型别名。你需要扩展marshalEvent
来处理这种新事件,并且可能会有一个unmarshalEvent,虽然我记不起来了。
完成所有操作后,使用connect_*
系列函数连接到相应的信号应该非常容易(仅限内部使用gtk2h,因此不会在API中公开)。从owner-change事件的文档中,您可能需要使用类似Signal (connect_OBJECT__NONE "owner-change")
的内容。
可能还需要添加EventMask
类型,虽然我不自信 - 测试一下然后看看。