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: