summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/leap/bitmask/gui/mainwindow.py22
-rw-r--r--src/leap/bitmask/gui/signaltracker.py13
-rw-r--r--src/leap/bitmask/gui/wizard.py3
3 files changed, 31 insertions, 7 deletions
diff --git a/src/leap/bitmask/gui/mainwindow.py b/src/leap/bitmask/gui/mainwindow.py
index 7d55a5d5..b0826303 100644
--- a/src/leap/bitmask/gui/mainwindow.py
+++ b/src/leap/bitmask/gui/mainwindow.py
@@ -288,7 +288,11 @@ class MainWindow(QtGui.QMainWindow, SignalTracker):
if self._first_run():
self._wizard_firstrun = True
- self.disconnect_and_untrack()
+
+ # HACK FIX: disconnection of signals triggers a reconnection later
+ # chich segfaults on wizard quit
+ # self.disconnect_and_untrack()
+
self._wizard = Wizard(backend=self._backend,
leap_signaler=self._leap_signaler)
# Give this window time to finish init and then show the wizard
@@ -341,6 +345,8 @@ class MainWindow(QtGui.QMainWindow, SignalTracker):
conntrack = self.connect_and_track
# XXX does this goes in here? this will be triggered when the login or
# wizard requests provider data
+
+ # XXX - here segfaults if we did a disconnect_and_untrack
conntrack(sig.prov_check_api_certificate, self._get_provider_details)
conntrack(sig.prov_get_details, self._provider_get_details)
@@ -417,7 +423,11 @@ class MainWindow(QtGui.QMainWindow, SignalTracker):
# This happens if the user finishes the provider
# setup but does not register
self._wizard = None
- self._backend_connect(only_tracked=True)
+
+ # HACK FIX: disconnection of signals triggers a reconnection later
+ # chich segfaults on wizard quit
+ # self._backend_connect(only_tracked=True)
+
if self._wizard_firstrun:
self._finish_init()
@@ -433,7 +443,9 @@ class MainWindow(QtGui.QMainWindow, SignalTracker):
there.
"""
if self._wizard is None:
- self.disconnect_and_untrack()
+ # HACK FIX: disconnection of signals triggers a reconnection later
+ # chich segfaults on wizard quit
+ # self.disconnect_and_untrack()
self._wizard = Wizard(backend=self._backend,
leap_signaler=self._leap_signaler)
self._wizard.accepted.connect(self._finish_init)
@@ -764,7 +776,9 @@ class MainWindow(QtGui.QMainWindow, SignalTracker):
self.eip_needs_login.emit()
self._wizard = None
- self._backend_connect(only_tracked=True)
+ # HACK FIX: disconnection of signals triggers a reconnection later
+ # chich segfaults on wizard quit
+ # self._backend_connect(only_tracked=True)
else:
domain = self._settings.get_provider()
if domain is not None:
diff --git a/src/leap/bitmask/gui/signaltracker.py b/src/leap/bitmask/gui/signaltracker.py
index 4884334d..c83359c4 100644
--- a/src/leap/bitmask/gui/signaltracker.py
+++ b/src/leap/bitmask/gui/signaltracker.py
@@ -14,9 +14,12 @@
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
+import logging
from PySide import QtCore
+logger = logging.getLogger(__name__)
+
class SignalTracker(QtCore.QObject):
"""
@@ -39,6 +42,10 @@ class SignalTracker(QtCore.QObject):
:param method: the method to call when the signal is triggered.
:type method: callable, Slot or Signal
"""
+ if (signal, method) in self._connected_signals:
+ logger.warning("Signal already connected.")
+ return
+
self._connected_signals.append((signal, method))
signal.connect(method)
@@ -49,7 +56,9 @@ class SignalTracker(QtCore.QObject):
for signal, method in self._connected_signals:
try:
signal.disconnect(method)
- except RuntimeError:
- pass # Signal was not connected
+ except (TypeError, RuntimeError) as e:
+ # most likely the signal was not connected
+ logger.warning("Disconnect error: {0!r}".format(e))
+ logger.warning("Signal: {0!r} -> {1!r}".format(signal, method))
self._connected_signals = []
diff --git a/src/leap/bitmask/gui/wizard.py b/src/leap/bitmask/gui/wizard.py
index f1eab211..35043a68 100644
--- a/src/leap/bitmask/gui/wizard.py
+++ b/src/leap/bitmask/gui/wizard.py
@@ -152,7 +152,8 @@ class Wizard(QtGui.QWizard, SignalTracker):
self._provider_setup_ok = False
self.ui.lnProvider.setText('')
self.ui.grpCheckProvider.setVisible(False)
- self.disconnect_and_untrack()
+ # HACK FIX: disconnection of signals triggers a segfault on quit
+ # self.disconnect_and_untrack()
def _load_configured_providers(self):
"""