@@ -26,6 +26,7 @@
|
|||||||
import signal
|
import signal
|
||||||
import sys
|
import sys
|
||||||
import traceback
|
import traceback
|
||||||
|
import threading
|
||||||
|
|
||||||
|
|
||||||
try:
|
try:
|
||||||
@@ -105,6 +106,8 @@ class ElectrumGui(PrintError):
|
|||||||
self.timer = Timer()
|
self.timer = Timer()
|
||||||
self.nd = None
|
self.nd = None
|
||||||
self.network_updated_signal_obj = QNetworkUpdatedSignalObject()
|
self.network_updated_signal_obj = QNetworkUpdatedSignalObject()
|
||||||
|
self._num_wizards_in_progress = 0
|
||||||
|
self._num_wizards_lock = threading.Lock()
|
||||||
# init tray
|
# init tray
|
||||||
self.dark_icon = self.config.get("dark_icon", False)
|
self.dark_icon = self.config.get("dark_icon", False)
|
||||||
self.tray = QSystemTrayIcon(self.tray_icon(), None)
|
self.tray = QSystemTrayIcon(self.tray_icon(), None)
|
||||||
@@ -195,6 +198,18 @@ class ElectrumGui(PrintError):
|
|||||||
run_hook('on_new_window', w)
|
run_hook('on_new_window', w)
|
||||||
return 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):
|
def start_new_window(self, path, uri, app_is_starting=False):
|
||||||
'''Raises the window for the wallet if it is open. Otherwise
|
'''Raises the window for the wallet if it is open. Otherwise
|
||||||
opens the wallet and creates a new window for it'''
|
opens the wallet and creates a new window for it'''
|
||||||
@@ -291,10 +306,15 @@ class ElectrumGui(PrintError):
|
|||||||
signal.signal(signal.SIGINT, lambda *args: self.app.quit())
|
signal.signal(signal.SIGINT, lambda *args: self.app.quit())
|
||||||
|
|
||||||
def quit_after_last_window():
|
def quit_after_last_window():
|
||||||
# on some platforms, not only does exec_ not return but not even
|
# keep daemon running after close
|
||||||
# aboutToQuit is emitted (but following this, it should be emitted)
|
if self.config.get('daemon'):
|
||||||
if self.app.quitOnLastWindowClosed():
|
return
|
||||||
self.app.quit()
|
# 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)
|
self.app.lastWindowClosed.connect(quit_after_last_window)
|
||||||
|
|
||||||
def clean_up():
|
def clean_up():
|
||||||
@@ -306,10 +326,6 @@ class ElectrumGui(PrintError):
|
|||||||
self.tray.hide()
|
self.tray.hide()
|
||||||
self.app.aboutToQuit.connect(clean_up)
|
self.app.aboutToQuit.connect(clean_up)
|
||||||
|
|
||||||
# keep daemon running after close
|
|
||||||
if self.config.get('daemon'):
|
|
||||||
self.app.setQuitOnLastWindowClosed(False)
|
|
||||||
|
|
||||||
# main loop
|
# main loop
|
||||||
self.app.exec_()
|
self.app.exec_()
|
||||||
# on some platforms the exec_ call may not return, so use clean_up()
|
# on some platforms the exec_ call may not return, so use clean_up()
|
||||||
|
|||||||
Reference in New Issue
Block a user