diff --git a/qutebrowser/utils/misc.py b/qutebrowser/utils/misc.py index 19121cd4c..4c2da4fbb 100644 --- a/qutebrowser/utils/misc.py +++ b/qutebrowser/utils/misc.py @@ -32,7 +32,7 @@ from urllib.parse import urljoin, urlencode from functools import reduce from distutils.version import StrictVersion as Version -from PyQt5.QtCore import QCoreApplication, QStandardPaths, qVersion +from PyQt5.QtCore import QCoreApplication, QStandardPaths, QEventLoop, qVersion from PyQt5.QtGui import QColor from pkg_resources import resource_string @@ -384,3 +384,21 @@ def format_size(size, base=1024, suffix=''): return '{:.02f}{}{}'.format(size, p, suffix) size /= base return '{:.02f}{}{}'.format(size, prefixes[-1], suffix) + + +class EventLoop(QEventLoop): + + """A thin wrapper around QEventLoop which raises an exception when doing + exec_() multiple times. + """ + + def __init__(self, parent=None): + super().__init__(parent) + self._executing = False + + def exec_(self, flags=QEventLoop.AllEvents): + if self._executing: + raise AssertionError("Eventloop is already running!") + self._executing = True + super().exec_(flags) + self._executing = False diff --git a/qutebrowser/widgets/statusbar/prompt.py b/qutebrowser/widgets/statusbar/prompt.py index 9fc2b0fda..b23b1d16c 100644 --- a/qutebrowser/widgets/statusbar/prompt.py +++ b/qutebrowser/widgets/statusbar/prompt.py @@ -17,7 +17,7 @@ """Prompt shown in the statusbar.""" -from PyQt5.QtCore import pyqtSignal, pyqtSlot, QEventLoop +from PyQt5.QtCore import pyqtSignal, pyqtSlot from PyQt5.QtWidgets import QHBoxLayout, QWidget, QLineEdit import qutebrowser.keyinput.modeman as modeman @@ -25,6 +25,7 @@ import qutebrowser.commands.utils as cmdutils from qutebrowser.widgets.statusbar.textbase import TextBase from qutebrowser.widgets.misc import MinimalLineEdit from qutebrowser.utils.usertypes import PromptMode, Question +from qutebrowser.utils.misc import EventLoop class Prompt(QWidget): @@ -33,7 +34,7 @@ class Prompt(QWidget): Attributes: question: A Question object with the question to be asked to the user. - loop: A local QEventLoop to spin in exec_. + loop: A local EventLoop to spin in exec_. _hbox: The QHBoxLayout used to display the text and prompt. _txt: The TextBase instance (QLabel) used to display the prompt text. _input: The MinimalLineEdit instance (QLineEdit) used for the input. @@ -50,7 +51,7 @@ class Prompt(QWidget): super().__init__(parent) self.question = None - self.loop = QEventLoop() + self.loop = EventLoop() self._hbox = QHBoxLayout(self) self._hbox.setContentsMargins(0, 0, 0, 0)