Unregister network callbacks from QT gui
Rework the callback system in QT to make this easy, and avoid leaking window references that prevent the window from being GC-ed on close
This commit is contained in:
parent
0d4de870a5
commit
ae4cfc9f0b
|
@ -491,7 +491,7 @@ def make_new_contact():
|
||||||
|
|
||||||
do_refresh = False
|
do_refresh = False
|
||||||
|
|
||||||
def update_callback():
|
def update_callback(event):
|
||||||
global do_refresh
|
global do_refresh
|
||||||
print "gui callback", network.is_connected()
|
print "gui callback", network.is_connected()
|
||||||
do_refresh = True
|
do_refresh = True
|
||||||
|
@ -908,7 +908,7 @@ class ElectrumGui:
|
||||||
global wallet, network, contacts, config
|
global wallet, network, contacts, config
|
||||||
network = _network
|
network = _network
|
||||||
config = _config
|
config = _config
|
||||||
network.register_callback('updated', update_callback)
|
network.register_callback(update_callback, ['updated'])
|
||||||
|
|
||||||
contacts = util.StoreDict(config, 'contacts')
|
contacts = util.StoreDict(config, 'contacts')
|
||||||
|
|
||||||
|
|
|
@ -551,7 +551,7 @@ class ElectrumWindow:
|
||||||
self.context_id = self.status_bar.get_context_id("statusbar")
|
self.context_id = self.status_bar.get_context_id("statusbar")
|
||||||
self.update_status_bar()
|
self.update_status_bar()
|
||||||
|
|
||||||
self.network.register_callback('updated', self.update_callback)
|
self.network.register_callback(self.update_callback, ['updated'])
|
||||||
|
|
||||||
|
|
||||||
def update_status_bar_thread():
|
def update_status_bar_thread():
|
||||||
|
@ -585,7 +585,7 @@ class ElectrumWindow:
|
||||||
thread.start_new_thread(check_recipient_thread, ())
|
thread.start_new_thread(check_recipient_thread, ())
|
||||||
self.notebook.set_current_page(0)
|
self.notebook.set_current_page(0)
|
||||||
|
|
||||||
def update_callback(self):
|
def update_callback(self, event):
|
||||||
self.wallet_updated = True
|
self.wallet_updated = True
|
||||||
|
|
||||||
def do_update_password(self, button, wallet):
|
def do_update_password(self, button, wallet):
|
||||||
|
|
|
@ -382,13 +382,18 @@ class ElectrumWindow(App):
|
||||||
|
|
||||||
# connect callbacks
|
# connect callbacks
|
||||||
if self.network:
|
if self.network:
|
||||||
self.network.register_callback('updated', self._trigger_update_wallet)
|
interests = ['update', 'status', 'new_transaction']
|
||||||
self.network.register_callback('status', self._trigger_update_status)
|
self.network.register_callback(self.on_network, interests)
|
||||||
self.network.register_callback('new_transaction', self._trigger_notify_transactions)
|
|
||||||
|
|
||||||
self.wallet = None
|
self.wallet = None
|
||||||
|
|
||||||
|
def on_network(self, event, *args):
|
||||||
|
if event == 'updated':
|
||||||
|
self._trigger_update_wallet()
|
||||||
|
elif event == 'status':
|
||||||
|
self._trigger_update_status()
|
||||||
|
elif event == 'new_transaction':
|
||||||
|
self._trigger_notify_transactions(*args)
|
||||||
|
|
||||||
@profiler
|
@profiler
|
||||||
def load_wallet(self, wallet):
|
def load_wallet(self, wallet):
|
||||||
|
|
|
@ -160,12 +160,10 @@ class ElectrumWindow(QMainWindow, PrintError):
|
||||||
|
|
||||||
# network callbacks
|
# network callbacks
|
||||||
if self.network:
|
if self.network:
|
||||||
self.network.register_callback('updated', lambda: self.need_update.set())
|
self.connect(self, QtCore.SIGNAL('network'), self.on_network_qt)
|
||||||
self.network.register_callback('new_transaction', self.new_transaction)
|
interests = ['updated', 'new_transaction', 'status',
|
||||||
self.register_callback('status', self.update_status)
|
'banner', 'verified']
|
||||||
self.register_callback('banner', self.console.showMessage)
|
self.network.register_callback(self.on_network, interests)
|
||||||
self.register_callback('verified', self.history_list.update_item)
|
|
||||||
|
|
||||||
# set initial message
|
# set initial message
|
||||||
self.console.showMessage(self.network.banner)
|
self.console.showMessage(self.network.banner)
|
||||||
|
|
||||||
|
@ -194,11 +192,27 @@ class ElectrumWindow(QMainWindow, PrintError):
|
||||||
self.show()
|
self.show()
|
||||||
self.raise_()
|
self.raise_()
|
||||||
|
|
||||||
def register_callback(self, name, method):
|
def on_network(self, event, *args):
|
||||||
""" run callback in the qt thread """
|
if event == 'updated':
|
||||||
self.connect(self, QtCore.SIGNAL(name), method)
|
self.need_update.set()
|
||||||
self.network.register_callback(name, lambda *params: self.emit(QtCore.SIGNAL(name), *params))
|
elif event == 'new_transaction':
|
||||||
|
self.tx_notifications.append(args[0])
|
||||||
|
elif event in ['status', 'banner', 'verified']:
|
||||||
|
# Handle in GUI thread
|
||||||
|
self.emit(QtCore.SIGNAL('network'), event, *args)
|
||||||
|
else:
|
||||||
|
self.print_error("unexpected network message:", event, args)
|
||||||
|
|
||||||
|
def on_network_qt(self, event, *args):
|
||||||
|
# Handle a network message in the GUI thread
|
||||||
|
if event == 'status':
|
||||||
|
self.update_status()
|
||||||
|
elif event == 'banner':
|
||||||
|
self.console.showMessage(args[0])
|
||||||
|
elif event == 'verified':
|
||||||
|
self.history_list.update_item(*args)
|
||||||
|
else:
|
||||||
|
self.print_error("unexpected network_qt signal:", event, args)
|
||||||
|
|
||||||
def fetch_alias(self):
|
def fetch_alias(self):
|
||||||
self.alias_info = None
|
self.alias_info = None
|
||||||
|
@ -418,10 +432,6 @@ class ElectrumWindow(QMainWindow, PrintError):
|
||||||
])
|
])
|
||||||
QMessageBox.information(self, "Electrum - " + _("Reporting Bugs"), msg)
|
QMessageBox.information(self, "Electrum - " + _("Reporting Bugs"), msg)
|
||||||
|
|
||||||
|
|
||||||
def new_transaction(self, tx):
|
|
||||||
self.tx_notifications.append(tx)
|
|
||||||
|
|
||||||
def notify_transactions(self):
|
def notify_transactions(self):
|
||||||
if not self.network or not self.network.is_connected():
|
if not self.network or not self.network.is_connected():
|
||||||
return
|
return
|
||||||
|
@ -2800,6 +2810,8 @@ class ElectrumWindow(QMainWindow, PrintError):
|
||||||
NetworkDialog(self.wallet.network, self.config, self).do_exec()
|
NetworkDialog(self.wallet.network, self.config, self).do_exec()
|
||||||
|
|
||||||
def closeEvent(self, event):
|
def closeEvent(self, event):
|
||||||
|
if self.network:
|
||||||
|
self.network.unregister_callback(self.on_network)
|
||||||
self.config.set_key("is_maximized", self.isMaximized())
|
self.config.set_key("is_maximized", self.isMaximized())
|
||||||
if not self.isMaximized():
|
if not self.isMaximized():
|
||||||
g = self.geometry()
|
g = self.geometry()
|
||||||
|
|
17
gui/stdio.py
17
gui/stdio.py
|
@ -34,10 +34,7 @@ class ElectrumGui:
|
||||||
self.wallet.start_threads(network)
|
self.wallet.start_threads(network)
|
||||||
self.contacts = StoreDict(self.config, 'contacts')
|
self.contacts = StoreDict(self.config, 'contacts')
|
||||||
|
|
||||||
self.wallet.network.register_callback('updated', self.updated)
|
network.register_callback(self.on_network, ['updated', 'banner'])
|
||||||
|
|
||||||
self.wallet.network.register_callback('peers', self.peers)
|
|
||||||
self.wallet.network.register_callback('banner', self.print_banner)
|
|
||||||
self.commands = [_("[h] - displays this help text"), \
|
self.commands = [_("[h] - displays this help text"), \
|
||||||
_("[i] - display transaction history"), \
|
_("[i] - display transaction history"), \
|
||||||
_("[o] - enter payment order"), \
|
_("[o] - enter payment order"), \
|
||||||
|
@ -49,6 +46,12 @@ class ElectrumGui:
|
||||||
_("[q] - quit") ]
|
_("[q] - quit") ]
|
||||||
self.num_commands = len(self.commands)
|
self.num_commands = len(self.commands)
|
||||||
|
|
||||||
|
def on_network(self, event, *args):
|
||||||
|
if event == 'updated':
|
||||||
|
self.updated()
|
||||||
|
elif event == 'banner':
|
||||||
|
self.print_banner()
|
||||||
|
|
||||||
def main_command(self):
|
def main_command(self):
|
||||||
self.print_balance()
|
self.print_balance()
|
||||||
c = raw_input("enter command: ")
|
c = raw_input("enter command: ")
|
||||||
|
@ -65,12 +68,6 @@ class ElectrumGui:
|
||||||
elif c == "q" : self.done = 1
|
elif c == "q" : self.done = 1
|
||||||
else: self.print_commands()
|
else: self.print_commands()
|
||||||
|
|
||||||
def peers(self):
|
|
||||||
print("got peers list:")
|
|
||||||
l = filter_protocol(self.wallet.network.get_servers(), 's')
|
|
||||||
for s in l:
|
|
||||||
print (s)
|
|
||||||
|
|
||||||
def updated(self):
|
def updated(self):
|
||||||
s = self.get_balance()
|
s = self.get_balance()
|
||||||
if s != self.last_balance:
|
if s != self.last_balance:
|
||||||
|
|
|
@ -53,7 +53,7 @@ class ElectrumGui:
|
||||||
self.history = None
|
self.history = None
|
||||||
|
|
||||||
if self.network:
|
if self.network:
|
||||||
self.network.register_callback('updated', self.update)
|
self.network.register_callback(self.update, ['updated'])
|
||||||
|
|
||||||
self.tab_names = [_("History"), _("Send"), _("Receive"), _("Addresses"), _("Contacts"), _("Banner")]
|
self.tab_names = [_("History"), _("Send"), _("Receive"), _("Addresses"), _("Contacts"), _("Banner")]
|
||||||
self.num_tabs = len(self.tab_names)
|
self.num_tabs = len(self.tab_names)
|
||||||
|
@ -80,7 +80,7 @@ class ElectrumGui:
|
||||||
self.set_cursor(0)
|
self.set_cursor(0)
|
||||||
return s
|
return s
|
||||||
|
|
||||||
def update(self):
|
def update(self, event):
|
||||||
self.update_history()
|
self.update_history()
|
||||||
if self.tab == 0:
|
if self.tab == 0:
|
||||||
self.print_history()
|
self.print_history()
|
||||||
|
|
|
@ -194,14 +194,21 @@ class Network(util.DaemonThread):
|
||||||
if self.plugins:
|
if self.plugins:
|
||||||
self.plugins.set_network(self)
|
self.plugins.set_network(self)
|
||||||
|
|
||||||
def register_callback(self, event, callback):
|
def register_callback(self, callback, events):
|
||||||
with self.lock:
|
with self.lock:
|
||||||
self.callbacks[event].append(callback)
|
for event in events:
|
||||||
|
self.callbacks[event].append(callback)
|
||||||
|
|
||||||
|
def unregister_callback(self, callback):
|
||||||
|
with self.lock:
|
||||||
|
for callbacks in self.callbacks.values():
|
||||||
|
if callback in callbacks:
|
||||||
|
callbacks.remove(callback)
|
||||||
|
|
||||||
def trigger_callback(self, event, *args):
|
def trigger_callback(self, event, *args):
|
||||||
with self.lock:
|
with self.lock:
|
||||||
callbacks = self.callbacks[event][:]
|
callbacks = self.callbacks[event][:]
|
||||||
[callback(*args) for callback in callbacks]
|
[callback(event, *args) for callback in callbacks]
|
||||||
|
|
||||||
def read_recent_servers(self):
|
def read_recent_servers(self):
|
||||||
if not self.config.path:
|
if not self.config.path:
|
||||||
|
|
|
@ -78,7 +78,7 @@ def row_to_dict(x):
|
||||||
|
|
||||||
|
|
||||||
# this process detects when addresses have received payments
|
# this process detects when addresses have received payments
|
||||||
def on_wallet_update():
|
def on_wallet_update(event):
|
||||||
for addr, v in pending_requests.items():
|
for addr, v in pending_requests.items():
|
||||||
h = wallet.history.get(addr, [])
|
h = wallet.history.get(addr, [])
|
||||||
requested_amount = v.get('requested')
|
requested_amount = v.get('requested')
|
||||||
|
@ -280,7 +280,7 @@ if __name__ == '__main__':
|
||||||
|
|
||||||
wallet.synchronize = lambda: None # prevent address creation by the wallet
|
wallet.synchronize = lambda: None # prevent address creation by the wallet
|
||||||
wallet.start_threads(network)
|
wallet.start_threads(network)
|
||||||
network.register_callback('updated', on_wallet_update)
|
network.register_callback(on_wallet_update, ['updated'])
|
||||||
|
|
||||||
threading.Thread(target=db_thread, args=()).start()
|
threading.Thread(target=db_thread, args=()).start()
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue