diff --git a/frontends/src/jp/base.py b/frontends/src/jp/base.py index cdb00956..df73cd07 100644 --- a/frontends/src/jp/base.py +++ b/frontends/src/jp/base.py @@ -106,6 +106,19 @@ class Jp(object): def progress_id(self, value): self._progress_id = value + + def addOnQuitCallback(self, callback, *args, **kwargs): + """Add a callback which will be called on quit command + + @param callback(callback): method to call + """ + try: + callbacks_list = self._onQuitCallbacks + except AttributeError: + callbacks_list = self._onQuitCallbacks = [] + finally: + callbacks_list.append((callback, args, kwargs)) + def _make_parents(self): self.parents = {} @@ -182,7 +195,26 @@ class Jp(object): except AttributeError: pass + def quitFromSignal(self, errcode=0): + """Same as self.quit, but from a signal handler + + /!\: return must be used after calling this method ! + """ + assert self.need_loop + # XXX: python-dbus will show a traceback if we exit in a signal handler with an error code + # so we use this little timeout trick to avoid it + GLib.timeout_add(0, self.quit, errcode) + def quit(self, errcode=0): + # first the onQuitCallbacks + try: + callbacks_list = self._onQuitCallbacks + except AttributeError: + pass + else: + for callback, args, kwargs in callbacks_list: + callback(*args, **kwargs) + self.stop_loop() if errcode: sys.exit(errcode)