URI: 
       tMerge branch 'master' of git://github.com/spesmilo/electrum - electrum - Electrum Bitcoin wallet
  HTML git clone https://git.parazyd.org/electrum
   DIR Log
   DIR Files
   DIR Refs
   DIR Submodules
       ---
   DIR commit d5db18c59419cf7bc19f2e2a822a063232199030
   DIR parent fe2fdfe400593ca57522df89ee589e7c1b4427e8
  HTML Author: ThomasV <thomasv@electrum.org>
       Date:   Mon,  8 Feb 2016 11:07:02 +0100
       
       Merge branch 'master' of git://github.com/spesmilo/electrum
       
       Diffstat:
         M gui/qt/main_window.py               |       3 ---
         M lib/plugins.py                      |      14 +++++++++++---
         M plugins/hw_wallet/hw_wallet.py      |      13 +++----------
         M plugins/hw_wallet/qt.py             |       3 ---
         M plugins/ledger/ledger.py            |       1 -
         M plugins/trezor/plugin.py            |       7 +------
       
       6 files changed, 15 insertions(+), 26 deletions(-)
       ---
   DIR diff --git a/gui/qt/main_window.py b/gui/qt/main_window.py
       t@@ -154,9 +154,6 @@ class ElectrumWindow(QMainWindow, MessageBoxMixin, PrintError):
                self.connect(self, QtCore.SIGNAL('payment_request_error'), self.payment_request_error)
                self.history_list.setFocus(True)
        
       -        self.connect(self, QtCore.SIGNAL('watching_only_changed'),
       -                     self.watching_only_changed)
       -
                # network callbacks
                if self.network:
                    self.connect(self, QtCore.SIGNAL('network'), self.on_network_qt)
   DIR diff --git a/lib/plugins.py b/lib/plugins.py
       t@@ -392,14 +392,22 @@ class DeviceMgr(PrintError):
                    # See comment above for same code
                    client.handler = wallet.handler
                    # This will trigger a PIN/passphrase entry request
       -            client_first_address = client.first_address(derivation)
       +            try:
       +                client_first_address = client.first_address(derivation)
       +            except (UserCancelled, RuntimeError):
       +                 # Bad / cancelled PIN / passphrase
       +                client_first_address = None
                    if client_first_address == first_address:
                        self.pair_wallet(wallet, info.device.id_)
                        return client
        
       -        # The user input has wrong PIN or passphrase, or it is not pairable
       +        # The user input has wrong PIN or passphrase, or cancelled input,
       +        # or it is not pairable
                raise DeviceUnpairableError(
       -            _('Unable to pair with your %s.') % plugin.device)
       +            _('Unable to pair with your %s.\n\n'
       +              'Ensure you are able to pair it, or you have the seed phrase, '
       +              'before you request bitcoins to be sent to this wallet.'
       +            ) % plugin.device)
        
            def unpaired_device_infos(self, handler, plugin, devices=None):
                '''Returns a list of DeviceInfo objects: one for each connected,
   DIR diff --git a/plugins/hw_wallet/hw_wallet.py b/plugins/hw_wallet/hw_wallet.py
       t@@ -39,29 +39,21 @@ class BIP44_HW_Wallet(BIP44_Wallet):
                # handler.  The handler is per-window and preserved across
                # device reconnects
                self.handler = None
       -        self.force_watching_only = False
        
            def set_session_timeout(self, seconds):
                self.print_error("setting session timeout to %d seconds" % seconds)
                self.session_timeout = seconds
                self.storage.put('session_timeout', seconds)
        
       -    def set_force_watching_only(self, value):
       -        if value != self.force_watching_only:
       -            self.force_watching_only = value
       -            self.handler.watching_only_changed()
       -
            def unpaired(self):
                '''A device paired with the wallet was diconnected.  This can be
                called in any thread context.'''
                self.print_error("unpaired")
       -        self.set_force_watching_only(True)
        
            def paired(self):
                '''A device paired with the wallet was (re-)connected.  This can be
                called in any thread context.'''
                self.print_error("paired")
       -        self.set_force_watching_only(False)
        
            def timeout(self):
                '''Called when the wallet session times out.  Note this is called from
       t@@ -81,9 +73,10 @@ class BIP44_HW_Wallet(BIP44_Wallet):
                return False
        
            def is_watching_only(self):
       -        '''The wallet is watching-only if its trezor device is unpaired.'''
       +        '''The wallet is not watching-only; the user will be prompted for
       +        pin and passphrase as appropriate when needed.'''
                assert not self.has_seed()
       -        return self.force_watching_only
       +        return False
        
            def can_change_password(self):
                return False
   DIR diff --git a/plugins/hw_wallet/qt.py b/plugins/hw_wallet/qt.py
       t@@ -53,9 +53,6 @@ class QtHandlerBase(QObject, PrintError):
            def top_level_window(self):
                return self.win.top_level_window()
        
       -    def watching_only_changed(self):
       -        self.win.emit(SIGNAL('watching_only_changed'))
       -
            def query_choice(self, msg, labels):
                self.done.clear()
                self.qcSig.emit(msg, labels)
   DIR diff --git a/plugins/ledger/ledger.py b/plugins/ledger/ledger.py
       t@@ -37,7 +37,6 @@ class BTChipWallet(BIP44_HW_Wallet):
                # device reconnects
                self.handler = None
                self.force_watching_only = False
       -
                self.device_checked = False
                self.signing = False
        
   DIR diff --git a/plugins/trezor/plugin.py b/plugins/trezor/plugin.py
       t@@ -134,12 +134,7 @@ class TrezorCompatiblePlugin(HW_PluginBase):
                assert self.main_thread != threading.current_thread()
        
                devmgr = self.device_manager()
       -        try:
       -            client = devmgr.client_for_wallet(self, wallet, force_pair)
       -        except:
       -            wallet.set_force_watching_only(True)
       -            raise
       -
       +        client = devmgr.client_for_wallet(self, wallet, force_pair)
                if client:
                    self.print_error("set last_operation")
                    wallet.last_operation = time.time()