summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--qutebrowser/browser/browsertab.py9
-rw-r--r--qutebrowser/browser/hints.py12
-rw-r--r--qutebrowser/keyinput/modeman.py6
-rw-r--r--qutebrowser/keyinput/modeparsers.py23
-rw-r--r--qutebrowser/mainwindow/mainwindow.py2
-rw-r--r--tests/helpers/fixtures.py2
-rw-r--r--tests/helpers/stubs.py9
-rw-r--r--tests/unit/browser/test_hints.py8
-rw-r--r--tests/unit/keyinput/test_modeparsers.py13
9 files changed, 45 insertions, 39 deletions
diff --git a/qutebrowser/browser/browsertab.py b/qutebrowser/browser/browsertab.py
index e0b8deb5a..d4657c079 100644
--- a/qutebrowser/browser/browsertab.py
+++ b/qutebrowser/browser/browsertab.py
@@ -40,7 +40,7 @@ from qutebrowser.config import config
from qutebrowser.utils import (utils, objreg, usertypes, log, qtutils,
urlutils, message)
from qutebrowser.misc import miscwidgets, objects
-from qutebrowser.browser import eventfilter, hints
+from qutebrowser.browser import eventfilter
from qutebrowser.qt import sip
if typing.TYPE_CHECKING:
@@ -887,13 +887,6 @@ class AbstractTab(QWidget):
self._tab_event_filter = eventfilter.TabEventFilter(
self, parent=self)
self.backend = None
-
- # FIXME:qtwebengine Should this be public api via self.hints?
- # Also, should we get it out of objreg?
- hintmanager = hints.HintManager(win_id, self.tab_id, parent=self)
- objreg.register('hintmanager', hintmanager, scope='tab',
- window=self.win_id, tab=self.tab_id)
-
self.before_load_started.connect(self._on_before_load_started)
def _set_widget(self, widget: QWidget) -> None:
diff --git a/qutebrowser/browser/hints.py b/qutebrowser/browser/hints.py
index 7ccfe6b0a..b7568546e 100644
--- a/qutebrowser/browser/hints.py
+++ b/qutebrowser/browser/hints.py
@@ -379,11 +379,10 @@ class HintManager(QObject):
Target.delete: "Delete an element",
}
- def __init__(self, win_id, tab_id, parent=None):
+ def __init__(self, win_id, parent=None):
"""Constructor."""
super().__init__(parent)
self._win_id = win_id
- self._tab_id = tab_id
self._context = None
self._word_hinter = WordHinter()
@@ -603,10 +602,10 @@ class HintManager(QObject):
tabbed_browser = objreg.get('tabbed-browser', default=None,
scope='window', window=self._win_id)
tab = tabbed_browser.widget.currentWidget()
- if tab.tab_id != self._tab_id:
+ if tab.tab_id != self._context.tab.tab_id:
log.hints.debug(
"Current tab changed ({} -> {}) before _start_cb is run."
- .format(self._tab_id, tab.tab_id))
+ .format(self._context.tab.tab_id, tab.tab_id))
return
strings = self._hint_strings(elems)
@@ -635,7 +634,7 @@ class HintManager(QObject):
# to make auto_follow == 'always' work
self._handle_auto_follow()
- @cmdutils.register(instance='hintmanager', scope='tab', name='hint',
+ @cmdutils.register(instance='hintmanager', scope='window', name='hint',
star_args_optional=True, maxsplit=2)
def start(self, # pylint: disable=keyword-arg-before-vararg
group='all', target=Target.normal, *args, mode=None,
@@ -810,6 +809,7 @@ class HintManager(QObject):
# unpacking gets us the first (and only) key in the dict.
self._fire(*visible)
+ @pyqtSlot(str)
def handle_partial_key(self, keystr):
"""Handle a new partial keypress."""
if self._context is None:
@@ -956,7 +956,7 @@ class HintManager(QObject):
if self._context is not None:
self._context.first_run = False
- @cmdutils.register(instance='hintmanager', scope='tab',
+ @cmdutils.register(instance='hintmanager', scope='window',
modes=[usertypes.KeyMode.hint])
def follow_hint(self, select=False, keystring=None):
"""Follow a hint.
diff --git a/qutebrowser/keyinput/modeman.py b/qutebrowser/keyinput/modeman.py
index eb11926c3..eb9ae537a 100644
--- a/qutebrowser/keyinput/modeman.py
+++ b/qutebrowser/keyinput/modeman.py
@@ -30,6 +30,7 @@ from qutebrowser.keyinput import modeparsers
from qutebrowser.config import config
from qutebrowser.api import cmdutils
from qutebrowser.utils import usertypes, log, objreg, utils
+from qutebrowser.browser import hints
INPUT_MODES = [usertypes.KeyMode.insert, usertypes.KeyMode.passthrough]
PROMPT_MODES = [usertypes.KeyMode.prompt, usertypes.KeyMode.yesno]
@@ -70,6 +71,10 @@ def init(win_id, parent):
commandrunner = runners.CommandRunner(win_id)
+ hintmanager = hints.HintManager(win_id, parent=parent)
+ objreg.register('hintmanager', hintmanager, scope='window',
+ window=win_id)
+
keyparsers = {
usertypes.KeyMode.normal:
modeparsers.NormalKeyParser(win_id=win_id,
@@ -78,6 +83,7 @@ def init(win_id, parent):
usertypes.KeyMode.hint:
modeparsers.HintKeyParser(win_id=win_id,
commandrunner=commandrunner,
+ hintmanager=hintmanager,
parent=modeman),
usertypes.KeyMode.insert:
modeparsers.PassthroughKeyParser(win_id=win_id,
diff --git a/qutebrowser/keyinput/modeparsers.py b/qutebrowser/keyinput/modeparsers.py
index cb7412d6c..e4366bcb5 100644
--- a/qutebrowser/keyinput/modeparsers.py
+++ b/qutebrowser/keyinput/modeparsers.py
@@ -30,6 +30,7 @@ import enum
from PyQt5.QtCore import pyqtSlot, Qt, QObject
from PyQt5.QtGui import QKeySequence, QKeyEvent
+from qutebrowser.browser import hints
from qutebrowser.commands import runners, cmdexc
from qutebrowser.config import config
from qutebrowser.keyinput import basekeyparser, keyutils
@@ -182,6 +183,7 @@ class HintKeyParser(CommandKeyParser):
Attributes:
_filtertext: The text to filter with.
+ _hintmanager: The HintManager to use.
_last_press: The nature of the last keypress, a LastPress member.
"""
@@ -189,19 +191,19 @@ class HintKeyParser(CommandKeyParser):
def __init__(self, win_id: int,
commandrunner: runners.CommandRunner,
+ hintmanager: hints.HintManager,
parent: QObject = None) -> None:
super().__init__(win_id, commandrunner, parent)
+ self._hintmanager = hintmanager
self._filtertext = ''
self._last_press = LastPress.none
self._read_config('hint')
- self.keystring_updated.connect(self.on_keystring_updated)
+ self.keystring_updated.connect(self._hintmanager.handle_partial_key)
def _handle_filter_key(self, e: QKeyEvent) -> QKeySequence.SequenceMatch:
"""Handle keys for string filtering."""
log.keyboard.debug("Got filter key 0x{:x} text {}".format(
e.key(), e.text()))
- hintmanager = objreg.get('hintmanager', scope='tab',
- window=self._win_id, tab='current')
if e.key() == Qt.Key_Backspace:
log.keyboard.debug("Got backspace, mode {}, filtertext '{}', "
"sequence '{}'".format(self._last_press,
@@ -209,7 +211,7 @@ class HintKeyParser(CommandKeyParser):
self._sequence))
if self._last_press != LastPress.keystring and self._filtertext:
self._filtertext = self._filtertext[:-1]
- hintmanager.filter_hints(self._filtertext)
+ self._hintmanager.filter_hints(self._filtertext)
return QKeySequence.ExactMatch
elif self._last_press == LastPress.keystring and self._sequence:
self._sequence = self._sequence[:-1]
@@ -217,18 +219,18 @@ class HintKeyParser(CommandKeyParser):
if not self._sequence and self._filtertext:
# Switch back to hint filtering mode (this can happen only
# in numeric mode after the number has been deleted).
- hintmanager.filter_hints(self._filtertext)
+ self._hintmanager.filter_hints(self._filtertext)
self._last_press = LastPress.filtertext
return QKeySequence.ExactMatch
else:
return QKeySequence.NoMatch
- elif hintmanager.current_mode() != 'number':
+ elif self._hintmanager.current_mode() != 'number':
return QKeySequence.NoMatch
elif not e.text():
return QKeySequence.NoMatch
else:
self._filtertext += e.text()
- hintmanager.filter_hints(self._filtertext)
+ self._hintmanager.filter_hints(self._filtertext)
self._last_press = LastPress.filtertext
return QKeySequence.ExactMatch
@@ -272,13 +274,6 @@ class HintKeyParser(CommandKeyParser):
if not preserve_filter:
self._filtertext = ''
- @pyqtSlot(str)
- def on_keystring_updated(self, keystr: str) -> None:
- """Update hintmanager when the keystring was updated."""
- hintmanager = objreg.get('hintmanager', scope='tab',
- window=self._win_id, tab='current')
- hintmanager.handle_partial_key(keystr)
-
class CaretKeyParser(CommandKeyParser):
diff --git a/qutebrowser/mainwindow/mainwindow.py b/qutebrowser/mainwindow/mainwindow.py
index 8d571c7eb..861d1c6f0 100644
--- a/qutebrowser/mainwindow/mainwindow.py
+++ b/qutebrowser/mainwindow/mainwindow.py
@@ -220,7 +220,7 @@ class MainWindow(QWidget):
self._init_completion()
log.init.debug("Initializing modes...")
- modeman.init(self.win_id, self)
+ modeman.init(win_id=self.win_id, parent=self)
self._commandrunner = runners.CommandRunner(self.win_id,
partial_match=True)
diff --git a/tests/helpers/fixtures.py b/tests/helpers/fixtures.py
index d752456e6..d1c822886 100644
--- a/tests/helpers/fixtures.py
+++ b/tests/helpers/fixtures.py
@@ -512,7 +512,7 @@ def fake_args(request):
@pytest.fixture
def mode_manager(win_registry, config_stub, key_config_stub, qapp):
- mm = modeman.init(0, parent=qapp)
+ mm = modeman.init(win_id=0, parent=qapp)
yield mm
objreg.delete('mode-manager', scope='window', window=0)
diff --git a/tests/helpers/stubs.py b/tests/helpers/stubs.py
index 8e8851dba..5addc5def 100644
--- a/tests/helpers/stubs.py
+++ b/tests/helpers/stubs.py
@@ -650,3 +650,12 @@ class FakeCommandRunner(runners.AbstractCommandRunner):
def run(self, text, count=None, *, safely=False):
self.commands.append((text, count))
+
+
+class FakeHintManager:
+
+ def __init__(self):
+ self.keystr = None
+
+ def handle_partial_key(self, keystr):
+ self.keystr = keystr
diff --git a/tests/unit/browser/test_hints.py b/tests/unit/browser/test_hints.py
index 8ce677a25..3398db76a 100644
--- a/tests/unit/browser/test_hints.py
+++ b/tests/unit/browser/test_hints.py
@@ -54,8 +54,7 @@ def test_show_benchmark(benchmark, tabbed_browser, qtbot, message_bridge,
with qtbot.wait_signal(tab.load_finished):
tab.load_url(QUrl('qute://testdata/data/hints/benchmark.html'))
- manager = qutebrowser.browser.hints.HintManager(
- win_id=0, tab_id=tab.tab_id)
+ manager = qutebrowser.browser.hints.HintManager(win_id=0)
def bench():
with qtbot.wait_signal(mode_manager.entered):
@@ -76,8 +75,7 @@ def test_match_benchmark(benchmark, tabbed_browser, qtbot, message_bridge,
tab.load_url(QUrl('qute://testdata/data/hints/benchmark.html'))
config_stub.val.hints.scatter = False
- manager = qutebrowser.browser.hints.HintManager(
- win_id=0, tab_id=tab.tab_id)
+ manager = qutebrowser.browser.hints.HintManager(win_id=0)
with qtbot.wait_signal(mode_manager.entered):
manager.start()
@@ -106,7 +104,7 @@ def test_scattered_hints_count(min_len, num_chars, num_elements):
2. There can only be two hint lengths, only 1 apart
3. There are no unique prefixes for long hints, such as 'la' with no 'l<x>'
"""
- manager = qutebrowser.browser.hints.HintManager(0, 0)
+ manager = qutebrowser.browser.hints.HintManager(win_id=0)
chars = string.ascii_lowercase[:num_chars]
hints = manager._hint_scattered(min_len, chars,
diff --git a/tests/unit/keyinput/test_modeparsers.py b/tests/unit/keyinput/test_modeparsers.py
index ff4bfe28d..ae7c0ce38 100644
--- a/tests/unit/keyinput/test_modeparsers.py
+++ b/tests/unit/keyinput/test_modeparsers.py
@@ -85,10 +85,15 @@ class TestsNormalKeyParser:
class TestHintKeyParser:
@pytest.fixture
- def keyparser(self, config_stub, key_config_stub, commandrunner):
- kp = modeparsers.HintKeyParser(win_id=0, commandrunner=commandrunner)
- kp.keystring_updated.disconnect() # Don't try to update HintManager
- return kp
+ def hintmanager(self, stubs):
+ return stubs.FakeHintManager()
+
+ @pytest.fixture
+ def keyparser(self, config_stub, key_config_stub, commandrunner,
+ hintmanager):
+ return modeparsers.HintKeyParser(win_id=0,
+ hintmanager=hintmanager,
+ commandrunner=commandrunner)
def test_simple_hint_match(self, keyparser, fake_keyevent, commandrunner):
keyparser.update_bindings(['aa', 'as'])