summaryrefslogtreecommitdiff
path: root/src/leap/gui
diff options
context:
space:
mode:
Diffstat (limited to 'src/leap/gui')
-rw-r--r--src/leap/gui/mainwindow.py76
-rw-r--r--src/leap/gui/twisted_main.py60
2 files changed, 101 insertions, 35 deletions
diff --git a/src/leap/gui/mainwindow.py b/src/leap/gui/mainwindow.py
index b3ab56d3..fdf84766 100644
--- a/src/leap/gui/mainwindow.py
+++ b/src/leap/gui/mainwindow.py
@@ -71,15 +71,22 @@ class MainWindow(QtGui.QMainWindow):
new_updates = QtCore.Signal(object)
raise_window = QtCore.Signal([])
- def __init__(self, standalone=False, bypass_checks=False):
+ def __init__(self, quit_callback,
+ standalone=False, bypass_checks=False):
"""
Constructor for the client main window
+ :param quit_callback: Function to be called when closing
+ the application.
+ :type quit_callback: callable
+
:param standalone: Set to true if the app should use configs
- inside its pwd
+ inside its pwd
:type standalone: bool
+
:param bypass_checks: Set to true if the app should bypass
- first round of checks for CA certificates at bootstrap
+ first round of checks for CA
+ certificates at bootstrap
:type bypass_checks: bool
"""
QtGui.QMainWindow.__init__(self)
@@ -89,6 +96,7 @@ class MainWindow(QtGui.QMainWindow):
callback=self._new_updates_available)
register(signal=proto.RAISE_WINDOW,
callback=self._on_raise_window_event)
+ self._quit_callback = quit_callback
self._updates_content = ""
@@ -173,27 +181,6 @@ class MainWindow(QtGui.QMainWindow):
self._vpn.process_finished.connect(
self._eip_finished)
- QtCore.QCoreApplication.instance().connect(
- QtCore.QCoreApplication.instance(),
- QtCore.SIGNAL("aboutToQuit()"),
- self._vpn.set_should_quit)
- QtCore.QCoreApplication.instance().connect(
- QtCore.QCoreApplication.instance(),
- QtCore.SIGNAL("aboutToQuit()"),
- self._vpn.wait)
- QtCore.QCoreApplication.instance().connect(
- QtCore.QCoreApplication.instance(),
- QtCore.SIGNAL("aboutToQuit()"),
- self._checker_thread.set_should_quit)
- QtCore.QCoreApplication.instance().connect(
- QtCore.QCoreApplication.instance(),
- QtCore.SIGNAL("aboutToQuit()"),
- self._checker_thread.wait)
- QtCore.QCoreApplication.instance().connect(
- QtCore.QCoreApplication.instance(),
- QtCore.SIGNAL("aboutToQuit()"),
- self._cleanup_pidfiles)
-
self.ui.chkRemember.stateChanged.connect(
self._remember_state_changed)
self.ui.chkRemember.setEnabled(keyring.get_keyring() is not None)
@@ -447,12 +434,6 @@ class MainWindow(QtGui.QMainWindow):
"<a href=\"https://leap.se\">More about LEAP"
"</a>") % (VERSION,))
- def quit(self):
- self._really_quit = True
- if self._wizard:
- self._wizard.close()
- self.close()
-
def changeEvent(self, e):
"""
Reimplements the changeEvent method to minimize to tray
@@ -976,17 +957,42 @@ class MainWindow(QtGui.QMainWindow):
def _cleanup_pidfiles(self):
"""
- SLOT
- TRIGGERS:
- self.aboutToQuit
+ Removes lockfiles on a clean shutdown.
- Triggered on about to quit signal, removes lockfiles on a clean
- shutdown
+ Triggered after aboutToQuit signal.
"""
if IS_WIN:
lockfile = WindowsLock()
lockfile.release_lock()
+ def _cleanup_and_quit(self):
+ """
+ Call all the cleanup actions in a serialized way.
+ Should be called from the quit function.
+ """
+ logger.debug('About to quit, doing cleanup...')
+ self._vpn.set_should_quit()
+ self._vpn.wait()
+ self._checker_thread.set_should_quit()
+ self._checker_thread.wait()
+ self._cleanup_pidfiles()
+
+ def quit(self):
+ """
+ Cleanup and tidely close the main window before quitting.
+ """
+ self._cleanup_and_quit()
+
+ self._really_quit = True
+ if self._wizard:
+ self._wizard.close()
+ self.close()
+
+ if self._quit_callback:
+ self._quit_callback()
+ logger.debug('Bye.')
+
+
if __name__ == "__main__":
import signal
diff --git a/src/leap/gui/twisted_main.py b/src/leap/gui/twisted_main.py
new file mode 100644
index 00000000..c7add3ee
--- /dev/null
+++ b/src/leap/gui/twisted_main.py
@@ -0,0 +1,60 @@
+# -*- coding: utf-8 -*-
+# twisted_main.py
+# Copyright (C) 2013 LEAP
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+"""
+Main functions for integration of twisted reactor
+"""
+import logging
+
+from twisted.internet import error
+
+# Resist the temptation of putting the import reactor here,
+# it will raise an "reactor already imported" error.
+
+logger = logging.getLogger(__name__)
+
+
+def start(app):
+ """
+ Start the mainloop.
+
+ :param app: the main qt QApplication instance.
+ :type app: QtCore.QApplication
+ """
+ from twisted.internet import reactor
+ logger.debug('starting twisted reactor')
+
+ # this seems to be troublesome under some
+ # unidentified settings.
+ #reactor.run()
+
+ reactor.runReturn()
+ app.exec_()
+
+
+def quit(app):
+ """
+ Stop the mainloop.
+
+ :param app: the main qt QApplication instance.
+ :type app: QtCore.QApplication
+ """
+ from twisted.internet import reactor
+ logger.debug('stopping twisted reactor')
+ try:
+ reactor.stop()
+ except error.ReactorNotRunning:
+ logger.debug('reactor not running')