diff --git a/CHANGELOG.asciidoc b/CHANGELOG.asciidoc index cd4c84e98..dd72442df 100644 --- a/CHANGELOG.asciidoc +++ b/CHANGELOG.asciidoc @@ -58,6 +58,8 @@ Changed - With `new-instance-open-target` set to a tab option, the tab is now opened in the most recently focused (instead of the last opened) window. This can be configured with the new `new-instance-open-target.window` setting. + It can also be set to `last-visible` to show the pages in the most recently + visible window. - Word hints now are more clever about getting the element text from some elements. - Completions for `:help` and `:bind` now also show hidden commands - The `:buffer` completion now also filters using the first column (id). diff --git a/doc/help/settings.asciidoc b/doc/help/settings.asciidoc index 277954815..a04e27878 100644 --- a/doc/help/settings.asciidoc +++ b/doc/help/settings.asciidoc @@ -456,6 +456,7 @@ Valid values: * +last-opened+: Open new tabs in the last opened window. * +last-focused+: Open new tabs in the most recently focused window. + * +last-visible+: Open new tabs in the most recently visible window. Default: +pass:[last-focused]+ diff --git a/qutebrowser/app.py b/qutebrowser/app.py index 561175bee..ef2be8cab 100644 --- a/qutebrowser/app.py +++ b/qutebrowser/app.py @@ -350,6 +350,9 @@ def on_focus_changed(_old, new): window = new.window() if isinstance(window, mainwindow.MainWindow): objreg.register('last-focused-main-window', window, update=True) + # A focused window must also be visible, and in this case we should + # consider it as the most recently looked-at window + objreg.register('last-visible-main-window', window, update=True) def open_desktopservices_url(url): diff --git a/qutebrowser/config/configdata.py b/qutebrowser/config/configdata.py index 3dd2ff9b5..656b8c1ab 100644 --- a/qutebrowser/config/configdata.py +++ b/qutebrowser/config/configdata.py @@ -233,7 +233,9 @@ def data(readonly=False): ('last-opened', "Open new tabs in the last opened " "window."), ('last-focused', "Open new tabs in the most recently " - "focused window.") + "focused window."), + ('last-visible', "Open new tabs in the most recently " + "visible window.") )), 'last-focused'), "Which window to choose when opening links as new tabs."), diff --git a/qutebrowser/mainwindow/mainwindow.py b/qutebrowser/mainwindow/mainwindow.py index a53c4f702..496245b8c 100644 --- a/qutebrowser/mainwindow/mainwindow.py +++ b/qutebrowser/mainwindow/mainwindow.py @@ -74,6 +74,8 @@ def get_window(via_ipc, force_window=False, force_tab=False, window = objreg.last_focused_window() elif win_mode == 'last-opened': window = objreg.last_window() + elif win_mode == 'last-visible': + window = objreg.last_visible_window() except objreg.NoWindow: # There is no window left, so we open a new one window = MainWindow() @@ -458,8 +460,23 @@ class MainWindow(QWidget): self._downloadview.updateGeometry() self.tabbed_browser.tabBar().refresh() + def showEvent(self, e): + """Extend showEvent to register us as the last-visible-main-window. + + Args: + e: The QShowEvent + """ + super().showEvent(e) + objreg.register('last-visible-main-window', self, update=True) + def _do_close(self): """Helper function for closeEvent.""" + last_visible = objreg.get('last-visible-main-window') + if self is last_visible: + try: + objreg.delete('last-visible-main-window') + except KeyError: + pass objreg.get('session-manager').save_last_window_session() self._save_geometry() log.destroy.debug("Closing window {}".format(self.win_id)) diff --git a/qutebrowser/utils/objreg.py b/qutebrowser/utils/objreg.py index 1bdc55429..5fc91c3b8 100644 --- a/qutebrowser/utils/objreg.py +++ b/qutebrowser/utils/objreg.py @@ -285,6 +285,14 @@ def dump_objects(): return lines +def last_visible_window(): + """Get the last visible window, or the last focused window if none.""" + try: + return get('last-visible-main-window') + except KeyError: + return last_focused_window() + + def last_focused_window(): """Get the last focused window, or the last window if none.""" try: