URI: 
       tqt: count wizards in progress (#4349) - electrum - Electrum Bitcoin wallet
  HTML git clone https://git.parazyd.org/electrum
   DIR Log
   DIR Files
   DIR Refs
   DIR Submodules
       ---
   DIR commit 4d62963efe79d2224a5a273b3eaac207def68a7b
   DIR parent f767d41409ad20e60bf535fb78468f276679b6fb
  HTML Author: ghost43 <somber.night@protonmail.com>
       Date:   Wed, 14 Nov 2018 22:39:49 +0100
       
       qt: count wizards in progress (#4349)
       
       fixes #4348
       Diffstat:
         M electrum/gui/qt/__init__.py         |      32 +++++++++++++++++++++++--------
       
       1 file changed, 24 insertions(+), 8 deletions(-)
       ---
   DIR diff --git a/electrum/gui/qt/__init__.py b/electrum/gui/qt/__init__.py
       t@@ -26,6 +26,7 @@
        import signal
        import sys
        import traceback
       +import threading
        
        
        try:
       t@@ -105,6 +106,8 @@ class ElectrumGui(PrintError):
                self.timer = Timer()
                self.nd = None
                self.network_updated_signal_obj = QNetworkUpdatedSignalObject()
       +        self._num_wizards_in_progress = 0
       +        self._num_wizards_lock = threading.Lock()
                # init tray
                self.dark_icon = self.config.get("dark_icon", False)
                self.tray = QSystemTrayIcon(self.tray_icon(), None)
       t@@ -195,6 +198,18 @@ class ElectrumGui(PrintError):
                run_hook('on_new_window', w)
                return w
        
       +    def count_wizards_in_progress(func):
       +        def wrapper(self: 'ElectrumGui', *args, **kwargs):
       +            with self._num_wizards_lock:
       +                self._num_wizards_in_progress += 1
       +            try:
       +                return func(self, *args, **kwargs)
       +            finally:
       +                with self._num_wizards_lock:
       +                    self._num_wizards_in_progress -= 1
       +        return wrapper
       +
       +    @count_wizards_in_progress
            def start_new_window(self, path, uri, app_is_starting=False):
                '''Raises the window for the wallet if it is open.  Otherwise
                opens the wallet and creates a new window for it'''
       t@@ -291,10 +306,15 @@ class ElectrumGui(PrintError):
                signal.signal(signal.SIGINT, lambda *args: self.app.quit())
        
                def quit_after_last_window():
       -            # on some platforms, not only does exec_ not return but not even
       -            # aboutToQuit is emitted (but following this, it should be emitted)
       -            if self.app.quitOnLastWindowClosed():
       -                self.app.quit()
       +            # keep daemon running after close
       +            if self.config.get('daemon'):
       +                return
       +            # check if a wizard is in progress
       +            with self._num_wizards_lock:
       +                if self._num_wizards_in_progress > 0 or len(self.windows) > 0:
       +                    return
       +            self.app.quit()
       +        self.app.setQuitOnLastWindowClosed(False)  # so _we_ can decide whether to quit
                self.app.lastWindowClosed.connect(quit_after_last_window)
        
                def clean_up():
       t@@ -306,10 +326,6 @@ class ElectrumGui(PrintError):
                    self.tray.hide()
                self.app.aboutToQuit.connect(clean_up)
        
       -        # keep daemon running after close
       -        if self.config.get('daemon'):
       -            self.app.setQuitOnLastWindowClosed(False)
       -
                # main loop
                self.app.exec_()
                # on some platforms the exec_ call may not return, so use clean_up()