GTK+ で PostMessage をやりたい。
ようするに関数を抜けてからシグナルの処理をしたい。
g_signal_emit では関数がそこで止まってしまう。
g_idle_add を使って似たようなことはできるんだけど。
Gedit for Windows part3 | PaePoi
やはり正攻法でやりたいジャン。
gdk_event_put という関数を見つけた。
この引数に GdkEvent を渡せばイケるかも。
Gjs で書いていたけど GdkEvent がどうやっても作れない。
手段を知らないだけか実装されていないのかは不明。
ということで久々に PyGObject でやってみる。
#!/usr/bin/env python3 import gi gi.require_version('Gtk', '3.0') from gi.repository import Gtk, Gdk class EmitTest (Gtk.Window): """ SendMessage, PostMessage """ def __init__(self): Gtk.Window.__init__(self) b1 = Gtk.Button(label="g_signal_emit") b2 = Gtk.Button(label="gdk_event_put") b1.connect("clicked", self.on_emit_clicked) b2.connect("clicked", self.on_put_clicked) vbox = Gtk.Box.new(Gtk.Orientation.VERTICAL, 0) vbox.pack_start(b1, False, False, 0) vbox.pack_start(b2, False, False, 0) self.add(vbox) self.show_all() def on_emit_clicked(self, button): ''' # output delete-event [g_signal_emit] Clicked ''' self.emit("delete-event", None) print("[g_signal_emit] Clicked") def on_put_clicked(self, button): ''' # output [gdk_event_put] Clicked delete-event ''' event = Gdk.Event.new(Gdk.EventType.DELETE) event.any.window = self.props.window event.put() print("[gdk_event_put] Clicked") def do_delete_event(self, event): print("delete-event") Gtk.main_quit() return True EmitTest() Gtk.main()
gdk_event_put ならハンドラを抜けた後に delete-event が発行される。
これなら PostMessage と同じように使えそうだ。
ただ本当は Gjs でやりたいんですけど。
Fedora 24 に入る Gjs なら同様に使えるのかな?
と楽しみにしていたら又一週間リリースが延びたようだ。
ま、いつものことか。