Прослушивание событий "смена владельца" для буфера обмена в gtk2hs. Как настроить?

Используя 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 запросить владельца изменения событий.

  • on из System.Glib.Signals нужен связанный виджет, принимает любой объект и событие, связанное с этим объектом (on :: object -> Signal object callback -> callback -> IO (ConnectId object). Если я правильно понял X, не нужно иметь окно для прослушивания этого события.

Либо я неправильно понял, как обернуть это, либо я натолкнулся на еще не реализованную часть gtk в Gtk2Hs.

Поэтому я посмотрел на определение 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",

Это не сработало, так как я получил ошибку во время выполнения программы о том, что событие не найдено. Естественно.

Любые идеи о том, как правильно слушать события "смена владельца" в gtk, если это возможно?

1 ответ

Решение

Вы правы, что это не реализовано в данный момент. Добавление этого не должно быть слишком сложным, и может быть интересным проектом, если вы хотите заняться разработкой gtk2hs. Вы хотите добавить новый конструктор к Event тип вместе с псевдонимом описательного типа, как type EventOwnerChange = Event, Вам нужно будет продлить marshalEvent чтобы справиться с этим новым видом событий, и там может быть unmarshalEvent, но я не могу вспомнить.

После того, как все это будет сделано, должно быть довольно легко подключиться к соответствующему сигналу, используя connect_* семейство функций (которые предназначены только для внутреннего использования gtk2hs и поэтому не представлены в API). Из документации для события смены владельца вам, вероятно, потребуется использовать что-то вроде Signal (connect_OBJECT__NONE "owner-change"),

Также может быть необходимо добавить к EventMask типа, хотя я не уверен - проверь и посмотри.

Другие вопросы по тегам