diff --git a/qutebrowser/app.py b/qutebrowser/app.py index df0f24f16..44058c02b 100644 --- a/qutebrowser/app.py +++ b/qutebrowser/app.py @@ -16,9 +16,10 @@ class QuteBrowser(QApplication): self.commandparser = cmdutils.CommandParser() self.keyparser = KeyParser(self.mainwindow) + self.mainwindow.tabs.keypress.connect(self.keyparser.handle) self.keyparser.set_cmd_text.connect(self.mainwindow.status.cmd.set_cmd) self.mainwindow.status.cmd.got_cmd.connect(self.commandparser.parse) - self.mainwindow.status.cmd.got_cmd.connect(self.mainwindow.setFocus) + self.mainwindow.status.cmd.got_cmd.connect(self.mainwindow.tabs.setFocus) self.commandparser.error.connect(self.mainwindow.status.disp_error) self.init_cmds() diff --git a/qutebrowser/commands/keys.py b/qutebrowser/commands/keys.py index 4a599b6b2..1074bf789 100644 --- a/qutebrowser/commands/keys.py +++ b/qutebrowser/commands/keys.py @@ -4,34 +4,31 @@ from PyQt5.QtGui import QKeySequence import logging class KeyParser(QObject): - keyparent = None + keystring = '' set_cmd_text = pyqtSignal(str) - id_to_cmd = {} - - def __init__(self, keyparent): - super().__init__() - self.keyparent = keyparent - sc = QShortcut(keyparent) - sc.setKey(QKeySequence(':')) - sc.setContext(Qt.WidgetWithChildrenShortcut) - sc.activated.connect(self.handle_empty) + key_to_cmd = {} def from_cmd_dict(self, d): for cmd in d.values(): if cmd.key is not None: logging.debug('registered: {} -> {}'.format(cmd.name, cmd.key)) - sc = QShortcut(self.keyparent) - sc.setKey(QKeySequence(cmd.key)) - sc.setContext(Qt.WidgetWithChildrenShortcut) - sc.activated.connect(self.handle) - self.id_to_cmd[sc.id()] = cmd + self.key_to_cmd[cmd.key] = cmd - def handle(self): - cmd = self.id_to_cmd[self.sender().id()] - if cmd.nargs and cmd.nargs != 0: - self.set_cmd_text.emit(':{} '.format(cmd.name)) + def handle(self, e): + logging.debug('Got key: {} / text: {}'.format(e.key(), e.text())) + self.keystring += e.text() + if self.keystring == ':': + self.set_cmd_text.emit(':') + self.keystring = '' + return + try: + cmd = self.key_to_cmd[self.keystring] + except KeyError: + logging.debug('No match for "{}" (added {})'.format(self.keystring, e.text())) + pass else: - cmd.run() - - def handle_empty(self): - self.set_cmd_text.emit(':') + self.keystring = '' + if cmd.nargs and cmd.nargs != 0: + self.set_cmd_text.emit(':{} '.format(cmd.name)) + else: + cmd.run() diff --git a/qutebrowser/widgets/browser.py b/qutebrowser/widgets/browser.py index 8c5512cef..a64deb93b 100644 --- a/qutebrowser/widgets/browser.py +++ b/qutebrowser/widgets/browser.py @@ -7,6 +7,7 @@ import logging class TabbedBrowser(TabWidget): cur_progress = pyqtSignal(int) cur_load_finished = pyqtSignal(bool) + keypress = pyqtSignal('QKeyEvent') url_stack = [] def __init__(self, parent): @@ -126,6 +127,10 @@ class TabbedBrowser(TabWidget): tab = self.widget(idx) self.cur_progress.emit(tab.progress) + def keyPressEvent(self, e): + self.keypress.emit(e) + super().keyPressEvent(e) + class BrowserTab(QWebView): parent = None progress = 0 diff --git a/qutebrowser/widgets/mainwindow.py b/qutebrowser/widgets/mainwindow.py index 879adfd22..74184acad 100644 --- a/qutebrowser/widgets/mainwindow.py +++ b/qutebrowser/widgets/mainwindow.py @@ -20,7 +20,7 @@ class MainWindow(QMainWindow): self.tabs.setObjectName("tabs") self.vbox.addWidget(self.tabs) - self.status = StatusBar(self.cwidget) + self.status = StatusBar(self) self.vbox.addWidget(self.status) self.tabs.cur_progress.connect(self.status.prog.set_progress) diff --git a/qutebrowser/widgets/statusbar.py b/qutebrowser/widgets/statusbar.py index e48c854cc..bdd29dc7e 100644 --- a/qutebrowser/widgets/statusbar.py +++ b/qutebrowser/widgets/statusbar.py @@ -4,10 +4,12 @@ from PyQt5.QtGui import QValidator, QKeySequence class StatusBar(QWidget): has_error = False + parent = None # TODO: the statusbar should be a bit smaller def __init__(self, parent): super().__init__(parent) + self.parent = parent self.setObjectName(self.__class__.__name__) self.set_color("white", "black") self.hbox = QHBoxLayout(self) @@ -117,7 +119,8 @@ class StatusCommand(QLineEdit): self.esc = QShortcut(self) self.esc.setKey(QKeySequence(Qt.Key_Escape)) self.esc.setContext(Qt.WidgetWithChildrenShortcut) - self.esc.activated.connect(parent.setFocus) + # FIXME this is fugly and doesn't clear the keystring + self.esc.activated.connect(parent.parent.tabs.setFocus) def process_cmd(self): text = self.text().lstrip(':')