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 なら同様に使えるのかな?
と楽しみにしていたら又一週間リリースが延びたようだ。
ま、いつものことか。



