URI: 
       tadd option to leave daemon running after GUI is closed - electrum - Electrum Bitcoin wallet
  HTML git clone https://git.parazyd.org/electrum
   DIR Log
   DIR Files
   DIR Refs
   DIR Submodules
       ---
   DIR commit 3ec0ceba3e7c65404d2579c64fac9449cbc450f1
   DIR parent 67d3d6b5b5426e0c13bc80437a0b3716e8446134
  HTML Author: ThomasV <thomasv@electrum.org>
       Date:   Thu, 13 Sep 2018 16:25:56 +0200
       
       add option to leave daemon running after GUI is closed
       
       Diffstat:
         M electrum/commands.py                |       1 +
         M electrum/daemon.py                  |      36 +++++++++++++++----------------
         M electrum/gui/qt/__init__.py         |      17 +++++++++++++----
         M run_electrum                        |       4 ++--
       
       4 files changed, 33 insertions(+), 25 deletions(-)
       ---
   DIR diff --git a/electrum/commands.py b/electrum/commands.py
       t@@ -853,6 +853,7 @@ def get_parser():
            parser_gui.add_argument("-o", "--offline", action="store_true", dest="offline", default=False, help="Run offline")
            parser_gui.add_argument("-m", action="store_true", dest="hide_gui", default=False, help="hide GUI on startup")
            parser_gui.add_argument("-L", "--lang", dest="language", default=None, help="default language used in GUI")
       +    parser_gui.add_argument("--daemon", action="store_true", dest="daemon", default=False, help="keep daemon running after GUI is closed")
            add_network_options(parser_gui)
            add_global_options(parser_gui)
            # daemon
   DIR diff --git a/electrum/daemon.py b/electrum/daemon.py
       t@@ -120,7 +120,7 @@ def get_rpc_credentials(config):
        
        class Daemon(DaemonThread):
        
       -    def __init__(self, config, fd, is_gui):
       +    def __init__(self, config, fd):
                DaemonThread.__init__(self)
                self.config = config
                if config.get('offline'):
       t@@ -133,12 +133,11 @@ class Daemon(DaemonThread):
                self.gui = None
                self.wallets = {}
                # Setup JSONRPC server
       -        self.init_server(config, fd, is_gui)
       +        self.init_server(config, fd)
        
       -    def init_server(self, config, fd, is_gui):
       +    def init_server(self, config, fd):
                host = config.get('rpchost', '127.0.0.1')
                port = config.get('rpcport', 0)
       -
                rpc_user, rpc_password = get_rpc_credentials(config)
                try:
                    server = VerifyingJSONRPCServer((host, port), logRequests=False,
       t@@ -153,14 +152,12 @@ class Daemon(DaemonThread):
                self.server = server
                server.timeout = 0.1
                server.register_function(self.ping, 'ping')
       -        if is_gui:
       -            server.register_function(self.run_gui, 'gui')
       -        else:
       -            server.register_function(self.run_daemon, 'daemon')
       -            self.cmd_runner = Commands(self.config, None, self.network)
       -            for cmdname in known_commands:
       -                server.register_function(getattr(self.cmd_runner, cmdname), cmdname)
       -            server.register_function(self.run_cmdline, 'run_cmdline')
       +        server.register_function(self.run_gui, 'gui')
       +        server.register_function(self.run_daemon, 'daemon')
       +        self.cmd_runner = Commands(self.config, None, self.network)
       +        for cmdname in known_commands:
       +            server.register_function(getattr(self.cmd_runner, cmdname), cmdname)
       +        server.register_function(self.run_cmdline, 'run_cmdline')
        
            def ping(self):
                return True
       t@@ -215,13 +212,12 @@ class Daemon(DaemonThread):
            def run_gui(self, config_options):
                config = SimpleConfig(config_options)
                if self.gui:
       -            #if hasattr(self.gui, 'new_window'):
       -            #    path = config.get_wallet_path()
       -            #    self.gui.new_window(path, config.get('url'))
       -            #    response = "ok"
       -            #else:
       -            #    response = "error: current GUI does not support multiple windows"
       -            response = "error: Electrum GUI already running"
       +            if hasattr(self.gui, 'new_window'):
       +                path = config.get_wallet_path()
       +                self.gui.new_window(path, config.get('url'))
       +                response = "ok"
       +            else:
       +                response = "error: current GUI does not support multiple windows"
                else:
                    response = "Error: Electrum is running in daemon mode. Please stop the daemon first."
                return response
       t@@ -299,6 +295,8 @@ class Daemon(DaemonThread):
                self.on_stop()
        
            def stop(self):
       +        if self.gui:
       +            self.gui.stop()
                self.print_error("stopping, removing lockfile")
                remove_lockfile(get_lockfile(self.config))
                DaemonThread.stop(self)
   DIR diff --git a/electrum/gui/qt/__init__.py b/electrum/gui/qt/__init__.py
       t@@ -45,7 +45,7 @@ from electrum.base_wizard import GoBack
        # from electrum.synchronizer import Synchronizer
        # from electrum.verifier import SPV
        # from electrum.util import DebugMem
       -from electrum.util import (UserCancelled, print_error,
       +from electrum.util import (UserCancelled, PrintError,
                                   WalletFileException, BitcoinException)
        # from electrum.wallet import Abstract_Wallet
        
       t@@ -86,7 +86,7 @@ class QNetworkUpdatedSignalObject(QObject):
            network_updated_signal = pyqtSignal(str, object)
        
        
       -class ElectrumGui:
       +class ElectrumGui(PrintError):
        
            def __init__(self, config, daemon, plugins):
                set_language(config.get('language'))
       t@@ -128,7 +128,7 @@ class ElectrumGui:
                        self.app.setStyleSheet(qdarkstyle.load_stylesheet_pyqt5())
                    except BaseException as e:
                        use_dark_theme = False
       -                print_error('Error setting dark theme: {}'.format(e))
       +                self.print_error('Error setting dark theme: {}'.format(e))
                # Even if we ourselves don't set the dark theme,
                # the OS/window manager/etc might set *a dark theme*.
                # Hence, try to choose colors accordingly:
       t@@ -222,7 +222,7 @@ class ElectrumGui:
                    except UserCancelled:
                        pass
                    except GoBack as e:
       -                print_error('[start_new_window] Exception caught (GoBack)', e)
       +                self.print_error('[start_new_window] Exception caught (GoBack)', e)
                    except (WalletFileException, BitcoinException) as e:
                        traceback.print_exc(file=sys.stderr)
                        d = QMessageBox(QMessageBox.Warning, _('Error'),
       t@@ -267,6 +267,7 @@ class ElectrumGui:
                if not self.windows:
                    self.config.save_last_wallet(window.wallet)
                run_hook('on_close_window', window)
       +        self.daemon.stop_wallet(window.wallet.storage.path)
        
            def init_network(self):
                # Show network dialog if config does not exist
       t@@ -309,6 +310,14 @@ class ElectrumGui:
                    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()
       +
       +    def stop(self):
       +        self.print_error('closing GUI')
       +        self.app.quit()
   DIR diff --git a/run_electrum b/run_electrum
       t@@ -415,7 +415,7 @@ if __name__ == '__main__':
                fd, server = daemon.get_fd_or_server(config)
                if fd is not None:
                    plugins = init_plugins(config, config.get('gui', 'qt'))
       -            d = daemon.Daemon(config, fd, True)
       +            d = daemon.Daemon(config, fd)
                    d.start()
                    d.init_gui(config, plugins)
                    sys.exit(0)
       t@@ -436,7 +436,7 @@ if __name__ == '__main__':
                                print_stderr("starting daemon (PID %d)" % pid)
                                sys.exit(0)
                        init_plugins(config, 'cmdline')
       -                d = daemon.Daemon(config, fd, False)
       +                d = daemon.Daemon(config, fd)
                        d.start()
                        if config.get('websocket_server'):
                            from electrum import websockets