destroy and delete-event Signal

現在作っている PyGI アプリで Window size を保存したい。
GtkApplication から起動なら delete-event で Gtk.main_quit せずに閉じる。
ちなみに delete-event は標準の「閉じる」ボタンか吐くシグナルです。

なので destroy Signal で処理しようとしたのだけど。

#!/usr/bin/env python
#-*- coding:utf-8 -*-

from gi.repository import Gtk, Gio

class DestroyTest(Gtk.Window):
    def __init__(self):
        Gtk.Window.__init__(self)
        cx, cy = self.get_size()
        print "initialize size {0},{1}".format(cx, cy)
        self.connect("delete-event", self.on_delete_event)
        self.connect("destroy", self.on_destroy)
        # Resize
        self.resize(320, 240)
        self.show_all()

    def on_destroy(self, widget):
        cx, cy = self.get_size()
        print "destroy size {0},{1}".format(cx, cy)

    def on_delete_event(self, widget, event):
        cx, cy = self.get_size()
        print "delete-event size {0},{1}".format(cx, cy)

class App(Gtk.Application):
    def __init__(self):
        Gtk.Application.__init__(
                self,
                application_id="apps.test.destroy",
                flags=Gio.ApplicationFlags.FLAGS_NONE)
        self.connect("activate", self.on_activate)
        
    def on_activate(self, data=None):
        w = DestroyTest()
        w.set_application(self)
    
if __name__ == "__main__":
    app = App()
    app.run(None)

""" output
initialize size 200,200
delete-event size 320,240
destroy size 200,200
"""

こうなっってしまった。
破棄された後に値を得ようとしているのだからそりゃそうだ。
.NET とかなら例外、って GTK+ は C 言語だったね。

それなら delete-event で設定保持を行えばいい。
んでもって emit も destroy から変更して。
で、又困ってしまった。

#!/usr/bin/env python
#-*- coding:utf-8 -*-

from gi.repository import Gtk, Gio, Gdk, GdkX11

class DestroyTest(Gtk.Window):
    def __init__(self):
        Gtk.Window.__init__(self)
        button = Gtk.Button("emit delete-event")
        button.connect("clicked", self.on_button_clicked)
        self.add(button)
        self.connect("delete-event", self.on_delete_event, button)
        self.show_all()

    def on_button_clicked(self, button, data=None):
        """
            emit is No Close
        """
        event = Gdk.Event(Gdk.EventType.DELETE)
        self.emit("delete-event", event)
        # Enable a Close
        #self.emit("destroy")

    def on_delete_event(self, widget, event, button):
        button.set_label("catch delete-event")
        return False

class App(Gtk.Application):
    def __init__(self):
        Gtk.Application.__init__(
                self,
                application_id="apps.test.destroy",
                flags=Gio.ApplicationFlags.FLAGS_NONE)
        self.connect("activate", self.on_activate)
        
    def on_activate(self, data=None):
        w = DestroyTest()
        w.set_application(self)
    
if __name__ == "__main__":
    app = App()
    app.run(None)

delete-event の emit だけじゃ終了してくれない。
メニューやボタンから終了するなら destroy も投げる必要あり?

GtkApplication はどうやって閉じているのだろう。
やっぱり普通に Gtk.main() を使ったほうが楽かも。