diff --git a/qutebrowser/app.py b/qutebrowser/app.py index 1280c4cd1..1064c758f 100644 --- a/qutebrowser/app.py +++ b/qutebrowser/app.py @@ -58,7 +58,6 @@ class Application(QApplication): mainwindow: The MainWindow QWidget. config: The main ConfigManager cmd_history: The "cmd_history" LineConfigParser instance. - modeman: The global ModeManager instance. args: ArgumentParser instance. _commandrunner: The main CommandRunner instance. _debugconsole: The ConsoleWidget for debugging. @@ -95,7 +94,6 @@ class Application(QApplication): self._keyparsers = None self._crashdlg = None self._crashlogfile = None - self.modeman = None self.cmd_history = None self.config = None self.keyconfig = None @@ -112,6 +110,7 @@ class Application(QApplication): self._handle_segfault() log.init.debug("Initializing modes...") self._init_modes() + modeman_obj = self.registry['modeman'] log.init.debug("Initializing websettings...") websettings.init() log.init.debug("Initializing quickmarks...") @@ -137,16 +136,16 @@ class Application(QApplication): self.downloadmanager = downloads.DownloadManager(self) log.init.debug("Initializing main window...") self.mainwindow = mainwindow.MainWindow() - self.modeman.mainwindow = self.mainwindow + modeman_obj.mainwindow = self.mainwindow log.init.debug("Initializing debug console...") self._debugconsole = console.ConsoleWidget() log.init.debug("Initializing eventfilter...") - self.installEventFilter(self.modeman) + self.installEventFilter(modeman_obj) self.setQuitOnLastWindowClosed(False) log.init.debug("Connecting signals...") self._connect_signals() - self.modeman.enter(utypes.KeyMode.normal, 'init') + modeman.enter(utypes.KeyMode.normal, 'init') log.init.debug("Showing mainwindow...") if not args.nowindow: @@ -227,26 +226,27 @@ class Application(QApplication): utypes.KeyMode.yesno: modeparsers.PromptKeyParser(self), } - self.modeman = modeman.ModeManager(self) - self.modeman.register(utypes.KeyMode.normal, - self._keyparsers[utypes.KeyMode.normal].handle) - self.modeman.register(utypes.KeyMode.hint, - self._keyparsers[utypes.KeyMode.hint].handle) - self.modeman.register(utypes.KeyMode.insert, - self._keyparsers[utypes.KeyMode.insert].handle, - passthrough=True) - self.modeman.register( + modeman_obj = modeman.ModeManager(self) + self.registry['modeman'] = modeman_obj + modeman_obj.register(utypes.KeyMode.normal, + self._keyparsers[utypes.KeyMode.normal].handle) + modeman_obj.register(utypes.KeyMode.hint, + self._keyparsers[utypes.KeyMode.hint].handle) + modeman_obj.register(utypes.KeyMode.insert, + self._keyparsers[utypes.KeyMode.insert].handle, + passthrough=True) + modeman_obj.register( utypes.KeyMode.passthrough, self._keyparsers[utypes.KeyMode.passthrough].handle, passthrough=True) - self.modeman.register(utypes.KeyMode.command, - self._keyparsers[utypes.KeyMode.command].handle, - passthrough=True) - self.modeman.register(utypes.KeyMode.prompt, - self._keyparsers[utypes.KeyMode.prompt].handle, - passthrough=True) - self.modeman.register(utypes.KeyMode.yesno, - self._keyparsers[utypes.KeyMode.yesno].handle) + modeman_obj.register(utypes.KeyMode.command, + self._keyparsers[utypes.KeyMode.command].handle, + passthrough=True) + modeman_obj.register(utypes.KeyMode.prompt, + self._keyparsers[utypes.KeyMode.prompt].handle, + passthrough=True) + modeman_obj.register(utypes.KeyMode.yesno, + self._keyparsers[utypes.KeyMode.yesno].handle) def _init_misc(self): """Initialize misc things.""" @@ -378,16 +378,17 @@ class Application(QApplication): completer = self.mainwindow.completion.completer searchrunner = self.registry['searchrunner'] messagebridge = self.registry['messagebridge'] + modeman = self.registry['modeman'] # misc self.lastWindowClosed.connect(self.shutdown) tabs.quit.connect(self.shutdown) # status bar - self.modeman.entered.connect(status.on_mode_entered) - self.modeman.left.connect(status.on_mode_left) - self.modeman.left.connect(status.cmd.on_mode_left) - self.modeman.left.connect(status.prompt.prompter.on_mode_left) + modeman.entered.connect(status.on_mode_entered) + modeman.left.connect(status.on_mode_left) + modeman.left.connect(status.cmd.on_mode_left) + modeman.left.connect(status.prompt.prompter.on_mode_left) # commands cmd.got_cmd.connect(self._commandrunner.run_safely) @@ -418,7 +419,7 @@ class Application(QApplication): # config self.config.style_changed.connect(style.get_stylesheet.cache_clear) for obj in (tabs, completion, self.mainwindow, self.cmd_history, - websettings, self.modeman, status, status.txt): + websettings, modeman, status, status.txt): self.config.changed.connect(obj.on_config_changed) for obj in kp.values(): self.keyconfig.changed.connect(obj.on_keyconfig_changed) @@ -444,7 +445,7 @@ class Application(QApplication): tabs.cur_load_status_changed.connect(status.url.on_load_status_changed) # command input / completion - self.modeman.left.connect(tabs.on_mode_left) + modeman.left.connect(tabs.on_mode_left) cmd.clear_completion_selection.connect( completion.on_clear_completion_selection) cmd.hide_completion.connect(completion.hide) @@ -747,9 +748,11 @@ class Application(QApplication): """Second stage of shutdown.""" log.destroy.debug("Stage 2 of shutting down...") # Remove eventfilter - if self.modeman is not None: + try: log.destroy.debug("Removing eventfilter...") - self.removeEventFilter(self.modeman) + self.removeEventFilter(self.registry['modeman']) + except KeyError: + pass # Close all tabs if self.mainwindow is not None: log.destroy.debug("Closing tabs...") diff --git a/qutebrowser/browser/hints.py b/qutebrowser/browser/hints.py index 16cb21fb7..b4430c063 100644 --- a/qutebrowser/browser/hints.py +++ b/qutebrowser/browser/hints.py @@ -149,8 +149,8 @@ class HintManager(QObject): """ super().__init__(parent) self._context = None - modeman.instance().left.connect(self.on_mode_left) - modeman.instance().entered.connect(self.on_mode_entered) + utils.get_object('modeman').left.connect(self.on_mode_left) + utils.get_object('modeman').entered.connect(self.on_mode_entered) def _cleanup(self): """Clean up after hinting.""" diff --git a/qutebrowser/commands/command.py b/qutebrowser/commands/command.py index e16c40b93..4a13e97bd 100644 --- a/qutebrowser/commands/command.py +++ b/qutebrowser/commands/command.py @@ -98,9 +98,7 @@ class Command: Raise: PrerequisitesError if the command can't be called currently. """ - # We don't use modeman.instance() here to avoid a circular import - # of qutebrowser.keyinput.modeman. - curmode = QCoreApplication.instance().modeman.mode() + curmode = utils.get_object('modeman').mode() if self.modes is not None and curmode not in self.modes: mode_names = '/'.join(mode.name for mode in self.modes) raise cmdexc.PrerequisitesError( diff --git a/qutebrowser/keyinput/modeman.py b/qutebrowser/keyinput/modeman.py index 297621b2e..394c07388 100644 --- a/qutebrowser/keyinput/modeman.py +++ b/qutebrowser/keyinput/modeman.py @@ -29,7 +29,7 @@ from PyQt5.QtWidgets import QApplication from qutebrowser.config import config from qutebrowser.commands import cmdexc, cmdutils -from qutebrowser.utils import usertypes, log +from qutebrowser.utils import usertypes, log, utils class ModeLockedError(Exception): @@ -37,25 +37,20 @@ class ModeLockedError(Exception): """Exception raised when the mode is currently locked.""" -def instance(): - """Get the global modeman instance.""" - return QApplication.instance().modeman - - def enter(mode, reason=None): """Enter the mode 'mode'.""" - instance().enter(mode, reason) + utils.get_object('modeman').enter(mode, reason) def leave(mode, reason=None): """Leave the mode 'mode'.""" - instance().leave(mode, reason) + utils.get_object('modeman').leave(mode, reason) def maybe_enter(mode, reason=None): """Convenience method to enter 'mode' without exceptions.""" try: - instance().enter(mode, reason) + utils.get_object('modeman').enter(mode, reason) except ModeLockedError: pass @@ -63,7 +58,7 @@ def maybe_enter(mode, reason=None): def maybe_leave(mode, reason=None): """Convenience method to leave 'mode' without exceptions.""" try: - instance().leave(mode, reason) + utils.get_object('modeman').leave(mode, reason) except ValueError as e: # This is rather likely to happen, so we only log to debug log. log.modes.debug(e) diff --git a/qutebrowser/widgets/statusbar/bar.py b/qutebrowser/widgets/statusbar/bar.py index 44e514d8a..968d4ec0c 100644 --- a/qutebrowser/widgets/statusbar/bar.py +++ b/qutebrowser/widgets/statusbar/bar.py @@ -27,7 +27,7 @@ from PyQt5.QtWidgets import QWidget, QHBoxLayout, QStackedLayout, QSizePolicy from qutebrowser.keyinput import modeman from qutebrowser.config import config, style -from qutebrowser.utils import usertypes, log +from qutebrowser.utils import usertypes, log, utils from qutebrowser.widgets.statusbar import (command, progress, keystring, percentage, url, prompt) from qutebrowser.widgets.statusbar import text as textwidget @@ -376,7 +376,7 @@ class StatusBar(QWidget): @pyqtSlot(usertypes.KeyMode) def on_mode_entered(self, mode): """Mark certain modes in the commandline.""" - if mode in modeman.instance().passthrough: + if mode in utils.get_object('modeman').passthrough: text = "-- {} MODE --".format(mode.name.upper()) self.txt.set_text(self.txt.Text.normal, text) if mode == usertypes.KeyMode.insert: @@ -385,7 +385,7 @@ class StatusBar(QWidget): @pyqtSlot(usertypes.KeyMode) def on_mode_left(self, mode): """Clear marked mode.""" - if mode in modeman.instance().passthrough: + if mode in utils.get_object('modeman').passthrough: self.txt.set_text(self.txt.Text.normal, '') if mode == usertypes.KeyMode.insert: self._set_insert_active(False) diff --git a/qutebrowser/widgets/statusbar/prompter.py b/qutebrowser/widgets/statusbar/prompter.py index e0d13ddba..ec62551ad 100644 --- a/qutebrowser/widgets/statusbar/prompter.py +++ b/qutebrowser/widgets/statusbar/prompter.py @@ -280,13 +280,14 @@ class Prompter: self.question = question mode = self._display_question() question.aborted.connect(lambda: modeman.maybe_leave(mode, 'aborted')) + modeman_obj = utils.get_object('modeman') try: modeman.enter(mode, 'question asked') except modeman.ModeLockedError: - if modeman.instance().mode() != usertypes.KeyMode.prompt: + if modeman_obj.mode() != usertypes.KeyMode.prompt: question.abort() return None - modeman.instance().locked = True + modeman_obj.locked = True if blocking: loop = qtutils.EventLoop() self._loops.append(loop) diff --git a/qutebrowser/widgets/webview.py b/qutebrowser/widgets/webview.py index 2229cb625..2f42754d8 100644 --- a/qutebrowser/widgets/webview.py +++ b/qutebrowser/widgets/webview.py @@ -358,7 +358,8 @@ class WebView(QWebView): self._set_load_status(LoadStatus.error) if not config.get('input', 'auto-insert-mode'): return - if modeman.instance().mode() == usertypes.KeyMode.insert or not ok: + if (utils.get_object('modeman').mode() == usertypes.KeyMode.insert or + not ok): return frame = self.page().currentFrame() try: