diff --git a/qutebrowser/browser/mouse.py b/qutebrowser/browser/mouse.py index 5320bfa6b..24ced7d47 100644 --- a/qutebrowser/browser/mouse.py +++ b/qutebrowser/browser/mouse.py @@ -22,7 +22,7 @@ from PyQt5.QtCore import QObject, QEvent, Qt, QTimer from qutebrowser.config import config -from qutebrowser.utils import message, log, usertypes, qtutils +from qutebrowser.utils import message, log, usertypes, qtutils, objreg from qutebrowser.keyinput import modeman @@ -40,11 +40,12 @@ class ChildEventFilter(QObject): _widget: The widget expected to send out childEvents. """ - def __init__(self, eventfilter, widget, parent=None): + def __init__(self, eventfilter, widget, win_id, parent=None): super().__init__(parent) self._filter = eventfilter assert widget is not None self._widget = widget + self._win_id = win_id def eventFilter(self, obj, event): """Act on ChildAdded events.""" @@ -57,7 +58,22 @@ class ChildEventFilter(QObject): if qtutils.version_check('5.11', compiled=False, exact=True): # WORKAROUND for https://bugreports.qt.io/browse/QTBUG-68076 - QTimer.singleShot(0, self._widget.setFocus) + pass_modes = [usertypes.KeyMode.command, + usertypes.KeyMode.prompt, + usertypes.KeyMode.yesno] + if modeman.instance(self._win_id).mode not in pass_modes: + tabbed_browser = objreg.get('tabbed-browser', + scope='window', + window=self._win_id) + current_index = tabbed_browser.widget.currentIndex() + try: + widget_index = tabbed_browser.widget.indexOf( + self._widget.parent()) + except RuntimeError: + widget_index = -1 + if current_index == widget_index: + QTimer.singleShot(0, self._widget.setFocus) + elif event.type() == QEvent.ChildRemoved: child = event.child() log.mouse.debug("{}: removed child {}".format(obj, child)) diff --git a/qutebrowser/browser/webengine/webenginetab.py b/qutebrowser/browser/webengine/webenginetab.py index fdfbc5fb0..86f5e08c8 100644 --- a/qutebrowser/browser/webengine/webenginetab.py +++ b/qutebrowser/browser/webengine/webenginetab.py @@ -959,7 +959,7 @@ class WebEngineTab(browsertab.AbstractTab): fp.installEventFilter(self._mouse_event_filter) self._child_event_filter = mouse.ChildEventFilter( eventfilter=self._mouse_event_filter, widget=self._widget, - parent=self) + win_id=self.win_id, parent=self) self._widget.installEventFilter(self._child_event_filter) @pyqtSlot() diff --git a/qutebrowser/mainwindow/tabbedbrowser.py b/qutebrowser/mainwindow/tabbedbrowser.py index 6b4e16950..aa5f74824 100644 --- a/qutebrowser/mainwindow/tabbedbrowser.py +++ b/qutebrowser/mainwindow/tabbedbrowser.py @@ -22,7 +22,7 @@ import functools import attr -from PyQt5.QtWidgets import QSizePolicy, QWidget +from PyQt5.QtWidgets import QSizePolicy, QWidget, QApplication from PyQt5.QtCore import pyqtSignal, pyqtSlot, QTimer, QUrl from PyQt5.QtGui import QIcon @@ -462,6 +462,8 @@ class TabbedBrowser(QWidget): "related {}, idx {}".format( url, background, related, idx)) + prev_focus = QApplication.focusWidget() + if (config.val.tabs.tabs_are_windows and self.widget.count() > 0 and not ignore_tabs_are_windows): window = mainwindow.MainWindow(private=self.private) @@ -491,12 +493,21 @@ class TabbedBrowser(QWidget): tab.resize(self.widget.currentWidget().size()) self.widget.tab_index_changed.emit(self.widget.currentIndex(), self.widget.count()) + # Refocus webview in case we lost it by spawning a bg tab + self.widget.currentWidget().setFocus() else: self.widget.setCurrentWidget(tab) # WORKAROUND for https://bugreports.qt.io/browse/QTBUG-68076 # Still seems to be needed with Qt 5.11.1 tab.setFocus() + mode = modeman.instance(self._win_id).mode + if mode in [usertypes.KeyMode.command, usertypes.KeyMode.prompt, + usertypes.KeyMode.yesno]: + # If we were in a command prompt, restore old focus + # The above commands need to be run to switch tabs + prev_focus.setFocus() + tab.show() self.new_tab.emit(tab, idx) return tab diff --git a/tests/end2end/data/hints/link_input.html b/tests/end2end/data/hints/link_input.html new file mode 100644 index 000000000..56d02433c --- /dev/null +++ b/tests/end2end/data/hints/link_input.html @@ -0,0 +1,25 @@ + + + +
+ +