在gtk2hs中收听剪贴板的“所有者更改”事件。怎么设置?

时间:2015-03-04 01:33:45

标签: haskell gtk2hs

使用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>

问题

  • 我找不到任何OwnerChangeEventGraphics.UI.Gtk.Gdk.EventM仅提供EventM类型的功能来查询所有者更改事件。

  • 来自System.Glib.Signals
  • 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中正确收听“所有者更改”事件的任何想法?

1 个答案:

答案 0 :(得分:1)

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

完成所有操作后,使用connect_*系列函数连接到相应的信号应该非常容易(仅限内部使用gtk2h,因此不会在API中公开)。从owner-change事件的文档中,您可能需要使用类似Signal (connect_OBJECT__NONE "owner-change")的内容。

可能还需要添加EventMask类型,虽然我不自信 - 测试一下然后看看。