From fbb78f11330655dd0a68295cee8680cd2d71a18b Mon Sep 17 00:00:00 2001 From: Marc Jauvin Date: Mon, 12 Feb 2018 21:57:53 -0500 Subject: [PATCH] hook into modeman's entered and left signals - save previous mode when a prompt is shown - restore previous mode when finished prompting --- qutebrowser/keyinput/modeman.py | 21 ++++++++++----------- qutebrowser/mainwindow/mainwindow.py | 1 + qutebrowser/mainwindow/tabbedbrowser.py | 10 ++++++++++ 3 files changed, 21 insertions(+), 11 deletions(-) diff --git a/qutebrowser/keyinput/modeman.py b/qutebrowser/keyinput/modeman.py index 5204c8068..585742d36 100644 --- a/qutebrowser/keyinput/modeman.py +++ b/qutebrowser/keyinput/modeman.py @@ -115,6 +115,7 @@ class ModeManager(QObject): Attributes: mode: The mode we're currently in. _win_id: The window ID of this ModeManager + _prev_mode: mode before a prompt poped up _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 @@ -138,6 +139,7 @@ class ModeManager(QObject): super().__init__(parent) self._win_id = win_id self._parsers = {} + self._prev_mode = usertypes.KeyMode.normal self.mode = usertypes.KeyMode.normal self._releaseevents_to_pass = set() @@ -247,6 +249,11 @@ class ModeManager(QObject): return log.modes.debug("Overriding mode {}.".format(self.mode)) self.left.emit(self.mode, mode, self._win_id) + if mode in prompt_modes: + # save previous mode when being prompted + self._prev_mode = self.mode + else: + self._prev_mode = usertypes.KeyMode.normal self.mode = mode self.entered.emit(mode, self._win_id) @@ -266,12 +273,6 @@ class ModeManager(QObject): usertypes.KeyMode.yesno, usertypes.KeyMode.prompt]: raise cmdexc.CommandError( "Mode {} can't be entered manually!".format(mode)) - - if (config.val.tabs.mode_on_change == 'restore' and - m.name in ['insert', 'passthrough']): - window = objreg.get('main-window', scope='window', - window=self._win_id) - window.tabbed_browser.currentWidget().data.input_mode = m self.enter(m, 'command') @pyqtSlot(usertypes.KeyMode, str, bool) @@ -299,6 +300,9 @@ class ModeManager(QObject): self.clear_keychain() self.mode = usertypes.KeyMode.normal self.left.emit(mode, self.mode, self._win_id) + if mode in [usertypes.KeyMode.prompt, usertypes.KeyMode.yesno]: + self.enter(self._prev_mode, + reason='restore mode before {}'.format(mode.name)) @cmdutils.register(instance='mode-manager', name='leave-mode', not_modes=[usertypes.KeyMode.normal], scope='window') @@ -306,11 +310,6 @@ class ModeManager(QObject): """Leave the mode we're currently in.""" if self.mode == usertypes.KeyMode.normal: raise ValueError("Can't leave normal mode!") - if config.val.tabs.mode_on_change == 'restore': - window = objreg.get('main-window', scope='window', - window=self._win_id) - tab = window.tabbed_browser.currentWidget() - tab.data.input_mode = usertypes.KeyMode.normal self.leave(self.mode, 'leave current') def eventFilter(self, event): diff --git a/qutebrowser/mainwindow/mainwindow.py b/qutebrowser/mainwindow/mainwindow.py index 05482a1d5..18b349d5d 100644 --- a/qutebrowser/mainwindow/mainwindow.py +++ b/qutebrowser/mainwindow/mainwindow.py @@ -484,6 +484,7 @@ class MainWindow(QWidget): self.tabbed_browser.cur_fullscreen_requested.connect(status.maybe_hide) # command input / completion + mode_manager.entered.connect(self.tabbed_browser.on_mode_entered) mode_manager.left.connect(self.tabbed_browser.on_mode_left) cmd.clear_completion_selection.connect( completion_obj.on_clear_completion_selection) diff --git a/qutebrowser/mainwindow/tabbedbrowser.py b/qutebrowser/mainwindow/tabbedbrowser.py index 94fd05b83..7d60369d3 100644 --- a/qutebrowser/mainwindow/tabbedbrowser.py +++ b/qutebrowser/mainwindow/tabbedbrowser.py @@ -631,6 +631,14 @@ class TabbedBrowser(tabwidget.TabWidget): if config.val.tabs.tabs_are_windows: self.window().setWindowIcon(icon) + @pyqtSlot(usertypes.KeyMode) + def on_mode_entered(self, mode): + """Save input mode when tabs.mode_on_change = restore.""" + input_modes = [usertypes.KeyMode.insert, usertypes.KeyMode.passthrough] + if (mode in input_modes and + config.val.tabs.mode_on_change == 'restore'): + self.currentWidget().data.input_mode = mode + @pyqtSlot(usertypes.KeyMode) def on_mode_left(self, mode): """Give focus to current tab if command mode was left.""" @@ -642,6 +650,8 @@ class TabbedBrowser(tabwidget.TabWidget): if widget is None: return widget.setFocus() + elif config.val.tabs.mode_on_change == 'restore': + self.currentWidget().data.input_mode = usertypes.KeyMode.normal @pyqtSlot(int) def on_current_changed(self, idx):