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.EventMEventM
は、所有者変更イベントを照会するタイプの関数のみを提供します。on
System.Glib.Signals から関連付けられたウィジェットが必要であり、任意のオブジェクトとそのオブジェクトに関連付けられたイベントを受け取ります (on :: object -> Signal object callback -> callback -> IO (ConnectId object
)。X を正しく理解していれば、このイベントをリッスンするためのウィンドウを用意する必要はありません。
これをまとめる方法を誤解したか、Gtk2Hs の gtk のまだ実装されていない部分に到達しました。
したがって、keyPressEvent
which の定義は次のようになります。
keyPressEvent :: WidgetClass self => Signal self (EventM EKey Bool)
keyPressEvent = Signal (eventM "key_press_event" [KeyPressMask])
ownerChangeEvent
そのため、 in gtk のようにの定義を追加するだけでテストしましたが、 をkeyPressEvent
置き換え"key_press_event"
ました"owner_change_event"
。
イベントが見つからないという実行時エラーが発生したため、それは機能しませんでした。当然。
可能であれば、gtk で「所有者の変更」イベントを適切にリッスンする方法についてのアイデアはありますか?