diff options
author | Florian Bruhin <me@the-compiler.org> | 2019-11-24 22:44:05 +0100 |
---|---|---|
committer | Florian Bruhin <me@the-compiler.org> | 2019-11-24 22:44:19 +0100 |
commit | 62274cee4fc0d77c492a3e1e0d1f75ea8b08f988 (patch) | |
tree | c996b3b707c2dc632ac873b7f1ff2fe22effb06b | |
parent | 42a42ffbe708d81c602730efacbdfd6fecbbd543 (diff) | |
download | qutebrowser-62274cee4fc0d77c492a3e1e0d1f75ea8b08f988.tar.gz qutebrowser-62274cee4fc0d77c492a3e1e0d1f75ea8b08f988.zip |
Remove keyparsers from objreg
This gets rid of an exception/abort when tests are finished with the new PyQt
exit scheme.
See #5017, #640
-rw-r--r-- | qutebrowser/browser/hints.py | 26 | ||||
-rw-r--r-- | qutebrowser/keyinput/modeman.py | 22 | ||||
-rw-r--r-- | qutebrowser/mainwindow/mainwindow.py | 8 | ||||
-rw-r--r-- | qutebrowser/mainwindow/statusbar/bar.py | 13 |
4 files changed, 30 insertions, 39 deletions
diff --git a/qutebrowser/browser/hints.py b/qutebrowser/browser/hints.py index b35ee3cdd..917a9b1d2 100644 --- a/qutebrowser/browser/hints.py +++ b/qutebrowser/browser/hints.py @@ -33,7 +33,7 @@ from PyQt5.QtCore import pyqtSlot, QObject, Qt, QUrl from PyQt5.QtWidgets import QLabel from qutebrowser.config import config, configexc -from qutebrowser.keyinput import modeman, modeparsers +from qutebrowser.keyinput import modeman, modeparsers, basekeyparser from qutebrowser.browser import webelem from qutebrowser.commands import userscripts, runners from qutebrowser.api import cmdutils @@ -384,8 +384,7 @@ class HintManager(QObject): self._actions = HintActions(win_id) - mode_manager = objreg.get('mode-manager', scope='window', - window=win_id) + mode_manager = modeman.instance(self._win_id) mode_manager.left.connect(self.on_mode_left) def _get_text(self) -> str: @@ -595,6 +594,11 @@ class HintManager(QObject): elemstr = elemstr.casefold() return filterstr == elemstr + def _get_keyparser(self, + mode: usertypes.KeyMode) -> basekeyparser.BaseKeyParser: + mode_manager = modeman.instance(self._win_id) + return mode_manager.parsers[mode] + def _start_cb(self, elems: _ElemsType) -> None: """Initialize the elements and labels based on the context set.""" if self._context is None: @@ -626,9 +630,7 @@ class HintManager(QObject): self._context.all_labels.append(label) self._context.labels[string] = label - keyparsers = objreg.get('keyparsers', scope='window', - window=self._win_id) - keyparser = keyparsers[usertypes.KeyMode.hint] + keyparser = self._get_keyparser(usertypes.KeyMode.hint) keyparser.update_bindings(strings) message_bridge = objreg.get('message-bridge', scope='window', @@ -724,8 +726,7 @@ class HintManager(QObject): if tab is None: raise cmdutils.CommandError("No WebView available yet!") - mode_manager = objreg.get('mode-manager', scope='window', - window=self._win_id) + mode_manager = modeman.instance(self._win_id) if mode_manager.mode == usertypes.KeyMode.hint: modeman.leave(self._win_id, usertypes.KeyMode.hint, 're-hinting') @@ -824,9 +825,7 @@ class HintManager(QObject): if follow: # apply auto_follow_timeout timeout = config.val.hints.auto_follow_timeout - keyparsers = objreg.get('keyparsers', scope='window', - window=self._win_id) - normal_parser = keyparsers[usertypes.KeyMode.normal] + normal_parser = self._get_keyparser(usertypes.KeyMode.normal) normal_parser.set_inhibited_timeout(timeout) # unpacking gets us the first (and only) key in the dict. self._fire(*visible) @@ -901,9 +900,8 @@ class HintManager(QObject): for label, string in zip(visible, strings): label.update_text('', string) self._context.labels[string] = label - keyparsers = objreg.get('keyparsers', scope='window', - window=self._win_id) - keyparser = keyparsers[usertypes.KeyMode.hint] + + keyparser = self._get_keyparser(usertypes.KeyMode.hint) keyparser.update_bindings(strings, preserve_filter=True) # Note: filter_hints can be called with non-None filterstr only diff --git a/qutebrowser/keyinput/modeman.py b/qutebrowser/keyinput/modeman.py index 9e50481c7..7b5c8a786 100644 --- a/qutebrowser/keyinput/modeman.py +++ b/qutebrowser/keyinput/modeman.py @@ -37,7 +37,7 @@ from qutebrowser.browser import hints INPUT_MODES = [usertypes.KeyMode.insert, usertypes.KeyMode.passthrough] PROMPT_MODES = [usertypes.KeyMode.prompt, usertypes.KeyMode.yesno] -_ParserDictType = typing.MutableMapping[ +ParserDictType = typing.MutableMapping[ usertypes.KeyMode, basekeyparser.BaseKeyParser] @@ -161,13 +161,7 @@ def init(win_id: int, parent: QObject) -> 'ModeManager': mode=usertypes.KeyMode.run_macro, commandrunner=commandrunner, parent=modeman), - } # type: _ParserDictType - - objreg.register('keyparsers', keyparsers, scope='window', window=win_id) - - modeman.destroyed.connect( # type: ignore - functools.partial(objreg.delete, 'keyparsers', scope='window', - window=win_id)) + } # type: ParserDictType for mode, parser in keyparsers.items(): modeman.register(mode, parser) @@ -204,7 +198,7 @@ class ModeManager(QObject): mode: The mode we're currently in. _win_id: The window ID of this ModeManager _prev_mode: Mode before a prompt popped up - _parsers: A dictionary of modes and their keyparsers. + parsers: A dictionary of modes and their keyparsers. _forward_unbound_keys: If we should forward unbound keys. _releaseevents_to_pass: A set of KeyEvents where the keyPressEvent was passed through, so the release event should as @@ -226,7 +220,7 @@ class ModeManager(QObject): def __init__(self, win_id: int, parent: QObject = None) -> None: super().__init__(parent) self._win_id = win_id - self._parsers = {} # type: _ParserDictType + self.parsers = {} # type: _ParserDictType self._prev_mode = usertypes.KeyMode.normal self.mode = usertypes.KeyMode.normal self._releaseevents_to_pass = set() # type: typing.Set[KeyEvent] @@ -246,7 +240,7 @@ class ModeManager(QObject): True if event should be filtered, False otherwise. """ curmode = self.mode - parser = self._parsers[curmode] + parser = self.parsers[curmode] if curmode != usertypes.KeyMode.insert: log.modes.debug("got keypress in mode {} - delegating to " "{}".format(curmode, utils.qualname(parser))) @@ -303,7 +297,7 @@ class ModeManager(QObject): parser: basekeyparser.BaseKeyParser) -> None: """Register a new mode.""" assert parser is not None - self._parsers[mode] = parser + self.parsers[mode] = parser parser.request_leave.connect(self.leave) def enter(self, mode: usertypes.KeyMode, @@ -322,7 +316,7 @@ class ModeManager(QObject): log.modes.debug("Entering mode {}{}".format( mode, '' if reason is None else ' (reason: {})'.format(reason))) - if mode not in self._parsers: + if mode not in self.parsers: raise ValueError("No keyparser for mode {}".format(mode)) if self.mode == mode or (self.mode in PROMPT_MODES and mode in PROMPT_MODES): @@ -429,4 +423,4 @@ class ModeManager(QObject): @cmdutils.register(instance='mode-manager', scope='window') def clear_keychain(self) -> None: """Clear the currently entered key chain.""" - self._parsers[self.mode].clear_keystring() + self.parsers[self.mode].clear_keystring() diff --git a/qutebrowser/mainwindow/mainwindow.py b/qutebrowser/mainwindow/mainwindow.py index 42a5f3505..640c796eb 100644 --- a/qutebrowser/mainwindow/mainwindow.py +++ b/qutebrowser/mainwindow/mainwindow.py @@ -455,9 +455,8 @@ class MainWindow(QWidget): def _connect_signals(self): """Connect all mainwindow signals.""" - keyparsers = self._get_object('keyparsers') message_bridge = self._get_object('message-bridge') - mode_manager = self._get_object('mode-manager') + mode_manager = modeman.instance(self._win_id) # misc self.tabbed_browser.close_window.connect(self.close) @@ -470,7 +469,8 @@ class MainWindow(QWidget): mode_manager.left.connect(message.global_bridge.mode_left) # commands - keyparsers[usertypes.KeyMode.normal].keystring_updated.connect( + normal_parser = mode_manager.keyparsers[usertypes.KeyMode.normal] + normal_parser.keystring_updated.connect( self.status.keystring.setText) self.status.cmd.got_cmd[str].connect( # type: ignore self._commandrunner.run_safely) @@ -482,7 +482,7 @@ class MainWindow(QWidget): self._command_dispatcher.search) # key hint popup - for mode, parser in keyparsers.items(): + for mode, parser in mode_manager.parsers.items(): parser.keystring_updated.connect(functools.partial( self._keyhint.update_keyhint, mode.name)) diff --git a/qutebrowser/mainwindow/statusbar/bar.py b/qutebrowser/mainwindow/statusbar/bar.py index 8446491ac..463e0c151 100644 --- a/qutebrowser/mainwindow/statusbar/bar.py +++ b/qutebrowser/mainwindow/statusbar/bar.py @@ -26,6 +26,7 @@ from PyQt5.QtWidgets import QWidget, QHBoxLayout, QStackedLayout, QSizePolicy from qutebrowser.browser import browsertab from qutebrowser.config import config +from qutebrowser.keyinput import modeman from qutebrowser.utils import usertypes, log, objreg, utils from qutebrowser.mainwindow.statusbar import (backforward, command, progress, keystring, percentage, url, @@ -333,9 +334,8 @@ class StatusBar(QWidget): @pyqtSlot(usertypes.KeyMode) def on_mode_entered(self, mode): """Mark certain modes in the commandline.""" - keyparsers = objreg.get('keyparsers', scope='window', - window=self._win_id) - if keyparsers[mode].passthrough: + mode_manager = modeman.instance(self._win_id) + if mode_manager.parsers[mode].passthrough: self._set_mode_text(mode.name) if mode in [usertypes.KeyMode.insert, usertypes.KeyMode.command, @@ -348,10 +348,9 @@ class StatusBar(QWidget): @pyqtSlot(usertypes.KeyMode, usertypes.KeyMode) def on_mode_left(self, old_mode, new_mode): """Clear marked mode.""" - keyparsers = objreg.get('keyparsers', scope='window', - window=self._win_id) - if keyparsers[old_mode].passthrough: - if keyparsers[new_mode].passthrough: + mode_manager = modeman.instance(self._win_id) + if mode_manager.parsers[old_mode].passthrough: + if mode_manager.parsers[new_mode].passthrough: self._set_mode_text(new_mode.name) else: self.txt.set_text(self.txt.Text.normal, '') |