diff --git a/CHANGELOG.asciidoc b/CHANGELOG.asciidoc index 1cdc19113..c22ede6eb 100644 --- a/CHANGELOG.asciidoc +++ b/CHANGELOG.asciidoc @@ -55,6 +55,9 @@ Changed title is changed via javascript. - `:hint` now has a `--mode ` flag to override the hint mode configured using the `hints -> mode` setting. +- 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. Removed ~~~~~~~ @@ -63,6 +66,8 @@ Removed and thus removed. - The `:completion-item-prev` and `:completion-item-next` commands got merged into a new `:completion-focus {prev,next}` command and thus removed. +- The `ui -> hide-mouse-cursor` setting since it was completely broken and + nobody seemed to care. v0.8.3 (unreleased) ------------------- diff --git a/README.asciidoc b/README.asciidoc index f8bbc1404..65bd44d6f 100644 --- a/README.asciidoc +++ b/README.asciidoc @@ -177,6 +177,7 @@ Contributors, sorted by the number of commits in descending order: * Oliver Caldwell * Jonas Schürmann * error800 +* Niklas Haas * Liam BEGUIN * skinnay * Zach-Button @@ -202,7 +203,6 @@ Contributors, sorted by the number of commits in descending order: * Samuel Loury * Peter Michely * Panashe M. Fundira -* Niklas Haas * Link * Larry Hynes * Johannes Altmanninger diff --git a/doc/help/settings.asciidoc b/doc/help/settings.asciidoc index 7670057fb..2f680d3c8 100644 --- a/doc/help/settings.asciidoc +++ b/doc/help/settings.asciidoc @@ -23,6 +23,7 @@ |<>|Enable workarounds for broken sites. |<>|Default encoding to use for websites. |<>|How to open links in an existing instance if a new one is launched. +|<>|Which window to choose when opening links as new tabs. |<>|How to log javascript console messages. |<>|Whether to always save the open pages. |<>|The name of the session to save by default, or empty for the last loaded session. @@ -49,7 +50,6 @@ |<>|Whether to hide the statusbar unless a message is shown. |<>|Padding for statusbar (top, bottom, left, right). |<>|The format to use for the window title. The following placeholders are defined: -|<>|Whether to hide the mouse cursor. |<>|Use standard JavaScript modal dialog for alert() and confirm() |<>|Hide the window decoration when using wayland (requires restart) |<>|Keychains that shouldn't be shown in the keyhint dialog @@ -448,6 +448,17 @@ Valid values: Default: +pass:[tab]+ +[[general-new-instance-open-target.window]] +=== new-instance-open-target.window +Which window to choose when opening links as new tabs. + +Valid values: + + * +last-opened+: Open new tabs in the last opened window. + * +last-focused+: Open new tabs in the most recently focused window. + +Default: +pass:[last-focused]+ + [[general-log-javascript-console]] === log-javascript-console How to log javascript console messages. @@ -651,17 +662,6 @@ The format to use for the window title. The following placeholders are defined: Default: +pass:[{perc}{title}{title_sep}qutebrowser]+ -[[ui-hide-mouse-cursor]] -=== hide-mouse-cursor -Whether to hide the mouse cursor. - -Valid values: - - * +true+ - * +false+ - -Default: +pass:[false]+ - [[ui-modal-js-dialog]] === modal-js-dialog Use standard JavaScript modal dialog for alert() and confirm() diff --git a/qutebrowser/app.py b/qutebrowser/app.py index 295fca1fe..a25e3a4bb 100644 --- a/qutebrowser/app.py +++ b/qutebrowser/app.py @@ -33,9 +33,9 @@ import tokenize from PyQt5.QtWidgets import QApplication, QWidget from PyQt5.QtWebKit import QWebSettings -from PyQt5.QtGui import QDesktopServices, QPixmap, QIcon, QCursor, QWindow +from PyQt5.QtGui import QDesktopServices, QPixmap, QIcon, QWindow from PyQt5.QtCore import (pyqtSlot, qInstallMessageHandler, QTimer, QUrl, - QObject, Qt, QEvent, pyqtSignal) + QObject, QEvent, pyqtSignal) try: import hunter except ImportError: @@ -339,19 +339,17 @@ def _save_version(): def on_focus_changed(_old, new): """Register currently focused main window in the object registry.""" - if not isinstance(new, QWidget) and new is not None: + if new is None: + return + + if not isinstance(new, QWidget): log.misc.debug("on_focus_changed called with non-QWidget {!r}".format( new)) + return - if new is None or not isinstance(new, mainwindow.MainWindow): - try: - objreg.delete('last-focused-main-window') - except KeyError: - pass - qApp.restoreOverrideCursor() - else: - objreg.register('last-focused-main-window', new.window(), update=True) - _maybe_hide_mouse_cursor() + window = new.window() + if isinstance(window, mainwindow.MainWindow): + objreg.register('last-focused-main-window', window, update=True) def open_desktopservices_url(url): @@ -362,17 +360,6 @@ def open_desktopservices_url(url): tabbed_browser.tabopen(url) -@config.change_filter('ui', 'hide-mouse-cursor', function=True) -def _maybe_hide_mouse_cursor(): - """Hide the mouse cursor if it isn't yet and it's configured.""" - if config.get('ui', 'hide-mouse-cursor'): - if qApp.overrideCursor() is not None: - return - qApp.setOverrideCursor(QCursor(Qt.BlankCursor)) - else: - qApp.restoreOverrideCursor() - - def _init_modules(args, crash_handler): """Initialize all 'modules' which need to be initialized. @@ -434,8 +421,6 @@ def _init_modules(args, crash_handler): os.environ['QT_WAYLAND_DISABLE_WINDOWDECORATION'] = '1' else: os.environ.pop('QT_WAYLAND_DISABLE_WINDOWDECORATION', None) - _maybe_hide_mouse_cursor() - objreg.get('config').changed.connect(_maybe_hide_mouse_cursor) temp_downloads = downloads.TempDownloadManager(qApp) objreg.register('temporary-downloads', temp_downloads) diff --git a/qutebrowser/config/config.py b/qutebrowser/config/config.py index a5521e275..412fdc68f 100644 --- a/qutebrowser/config/config.py +++ b/qutebrowser/config/config.py @@ -350,6 +350,7 @@ class ConfigManager(QObject): ('tabs', 'auto-hide'), ('tabs', 'hide-always'), ('ui', 'display-statusbar-messages'), + ('ui', 'hide-mouse-cursor'), ('general', 'wrap-search'), ] CHANGED_OPTIONS = { diff --git a/qutebrowser/config/configdata.py b/qutebrowser/config/configdata.py index 6837ed70a..7ed51142c 100644 --- a/qutebrowser/config/configdata.py +++ b/qutebrowser/config/configdata.py @@ -227,6 +227,16 @@ def data(readonly=False): "How to open links in an existing instance if a new one is " "launched."), + ('new-instance-open-target.window', + SettingValue(typ.String( + valid_values=typ.ValidValues( + ('last-opened', "Open new tabs in the last opened " + "window."), + ('last-focused', "Open new tabs in the most recently " + "focused window.") + )), 'last-focused'), + "Which window to choose when opening links as new tabs."), + ('log-javascript-console', SettingValue(typ.String( valid_values=typ.ValidValues( @@ -346,10 +356,6 @@ def data(readonly=False): "* `{scroll_pos}`: The page scroll position.\n" "* `{host}`: The host of the current web page."), - ('hide-mouse-cursor', - SettingValue(typ.Bool(), 'false'), - "Whether to hide the mouse cursor."), - ('modal-js-dialog', SettingValue(typ.Bool(), 'false'), "Use standard JavaScript modal dialog for alert() and confirm()"), diff --git a/qutebrowser/mainwindow/mainwindow.py b/qutebrowser/mainwindow/mainwindow.py index 8198ba8cd..a53c4f702 100644 --- a/qutebrowser/mainwindow/mainwindow.py +++ b/qutebrowser/mainwindow/mainwindow.py @@ -69,7 +69,11 @@ def get_window(via_ipc, force_window=False, force_tab=False, window_to_raise = window else: try: - window = objreg.last_window() + win_mode = config.get('general', 'new-instance-open-target.window') + if win_mode == 'last-focused': + window = objreg.last_focused_window() + elif win_mode == 'last-opened': + window = objreg.last_window() except objreg.NoWindow: # There is no window left, so we open a new one window = MainWindow() @@ -175,9 +179,6 @@ class MainWindow(QWidget): QTimer.singleShot(0, self._connect_resize_keyhint) objreg.get('config').changed.connect(self.on_config_changed) - if config.get('ui', 'hide-mouse-cursor'): - self.setCursor(Qt.BlankCursor) - objreg.get("app").new_window.emit(self) def _init_downloadmanager(self): diff --git a/qutebrowser/utils/objreg.py b/qutebrowser/utils/objreg.py index 0dc6ec68c..d347b7756 100644 --- a/qutebrowser/utils/objreg.py +++ b/qutebrowser/utils/objreg.py @@ -178,10 +178,7 @@ def _get_window_registry(window): app = get('app') win = app.activeWindow() elif window == 'last-focused': - try: - win = get('last-focused-main-window') - except KeyError: - win = last_window() + win = last_focused_window() else: win = window_registry[window] except (KeyError, NoWindow): @@ -276,6 +273,14 @@ def dump_objects(): return lines +def last_focused_window(): + """Get the last focused window, or the last window if none.""" + try: + return get('last-focused-main-window') + except KeyError: + return last_window() + + def last_window(): """Get the last opened window object.""" if not window_registry: diff --git a/tests/end2end/fixtures/quteprocess.py b/tests/end2end/fixtures/quteprocess.py index 493b3fb6c..b379b42a5 100644 --- a/tests/end2end/fixtures/quteprocess.py +++ b/tests/end2end/fixtures/quteprocess.py @@ -330,6 +330,7 @@ class QuteProc(testprocess.Process): settings = [ ('ui', 'message-timeout', '0'), ('general', 'auto-save-interval', '0'), + ('general', 'new-instance-open-target.window', 'last-opened') ] if not self._webengine: settings.append(('network', 'ssl-strict', 'false'))