diff options
author | Florian Bruhin <me@the-compiler.org> | 2023-07-22 12:36:31 +0200 |
---|---|---|
committer | Florian Bruhin <me@the-compiler.org> | 2023-07-22 12:36:31 +0200 |
commit | 273230eb07eb848e67abc8c1e6fc95cfe4c46b6f (patch) | |
tree | a198f4b32f439f3602c25a4942b9a0aabe511b87 /qutebrowser | |
parent | 1387b0598b90501dfa1dc8e4cbe5e1d0d05cd048 (diff) | |
parent | ed70741587d0d7f5cc90b2f510c38474a7ad9375 (diff) | |
download | qutebrowser-273230eb07eb848e67abc8c1e6fc95cfe4c46b6f.tar.gz qutebrowser-273230eb07eb848e67abc8c1e6fc95cfe4c46b6f.zip |
Merge remote-tracking branch 'origin/pr/7789'
Diffstat (limited to 'qutebrowser')
-rw-r--r-- | qutebrowser/app.py | 8 | ||||
-rw-r--r-- | qutebrowser/browser/qutescheme.py | 7 | ||||
-rw-r--r-- | qutebrowser/browser/webengine/webenginetab.py | 3 | ||||
-rw-r--r-- | qutebrowser/browser/webkit/webkitelem.py | 5 | ||||
-rw-r--r-- | qutebrowser/browser/webkit/webkithistory.py | 5 | ||||
-rw-r--r-- | qutebrowser/browser/webkit/webkitinspector.py | 4 | ||||
-rw-r--r-- | qutebrowser/browser/webkit/webkitsettings.py | 5 | ||||
-rw-r--r-- | qutebrowser/browser/webkit/webkittab.py | 4 | ||||
-rw-r--r-- | qutebrowser/browser/webkit/webpage.py | 5 | ||||
-rw-r--r-- | qutebrowser/browser/webkit/webview.py | 5 | ||||
-rw-r--r-- | qutebrowser/html/warning-qt5.html | 28 | ||||
-rw-r--r-- | qutebrowser/keyinput/keyutils.py | 30 | ||||
-rw-r--r-- | qutebrowser/qt/_core_pyqtproperty.py | 2 | ||||
-rw-r--r-- | qutebrowser/qt/machinery.py | 40 | ||||
-rw-r--r-- | qutebrowser/qt/opengl.py | 2 | ||||
-rw-r--r-- | qutebrowser/qutebrowser.py | 2 |
16 files changed, 100 insertions, 55 deletions
diff --git a/qutebrowser/app.py b/qutebrowser/app.py index bb2ff56e7..fbfa3df12 100644 --- a/qutebrowser/app.py +++ b/qutebrowser/app.py @@ -367,6 +367,14 @@ def _open_special_pages(args): os.environ.get("QTWEBENGINE_DISABLE_SANDBOX") == "1" ), 'qute://warning/sandboxing'), + + ('qt5-warning-shown', + ( + machinery.IS_QT5 and + machinery.INFO.reason == machinery.SelectionReason.auto and + objects.backend != usertypes.Backend.QtWebKit, + ), + 'qute://warning/qt5'), ] if 'quickstart-done' not in general_sect: diff --git a/qutebrowser/browser/qutescheme.py b/qutebrowser/browser/qutescheme.py index 25834670b..0073f9bd2 100644 --- a/qutebrowser/browser/qutescheme.py +++ b/qutebrowser/browser/qutescheme.py @@ -22,6 +22,7 @@ Module attributes: _HANDLERS: The handlers registered via decorators. """ +import sys import html import json import os @@ -583,6 +584,12 @@ def qute_warning(url: QUrl) -> _HandlerRet: elif path == '/sandboxing': src = jinja.render('warning-sandboxing.html', title='Qt 6 macOS sandboxing warning') + elif path == '/qt5': + is_venv = hasattr(sys, 'real_prefix') or sys.base_prefix != sys.prefix + src = jinja.render('warning-qt5.html', + title='Switch to Qt 6', + is_venv=is_venv, + prefix=sys.prefix) else: raise NotFoundError("Invalid warning page {}".format(path)) return 'text/html', src diff --git a/qutebrowser/browser/webengine/webenginetab.py b/qutebrowser/browser/webengine/webenginetab.py index e55d75ecd..c2957181b 100644 --- a/qutebrowser/browser/webengine/webenginetab.py +++ b/qutebrowser/browser/webengine/webenginetab.py @@ -400,7 +400,8 @@ class WebEngineCaret(browsertab.AbstractCaret): # https://bugreports.qt.io/browse/QTBUG-53134 # Even on Qt 5.10 selectedText() seems to work poorly, see # https://github.com/qutebrowser/qutebrowser/issues/3523 - # FIXME:qt6 Reevaluate? + # With Qt 6.2-6.5, there still seem to be issues (especially with + # multi-line text) self._tab.run_js_async(javascript.assemble('caret', 'getSelection'), callback) diff --git a/qutebrowser/browser/webkit/webkitelem.py b/qutebrowser/browser/webkit/webkitelem.py index ef3e3bea5..8bf5031b1 100644 --- a/qutebrowser/browser/webkit/webkitelem.py +++ b/qutebrowser/browser/webkit/webkitelem.py @@ -15,16 +15,15 @@ # You should have received a copy of the GNU General Public License # along with qutebrowser. If not, see <https://www.gnu.org/licenses/>. -# FIXME:qt6 (lint) -# pylint: disable=no-name-in-module - """QtWebKit specific part of the web element API.""" from typing import cast, TYPE_CHECKING, Iterator, List, Optional, Set from qutebrowser.qt.core import QRect, Qt +# pylint: disable=no-name-in-module from qutebrowser.qt.webkit import QWebElement, QWebSettings from qutebrowser.qt.webkitwidgets import QWebFrame +# pylint: enable=no-name-in-module from qutebrowser.config import config from qutebrowser.utils import log, utils, javascript, usertypes diff --git a/qutebrowser/browser/webkit/webkithistory.py b/qutebrowser/browser/webkit/webkithistory.py index aea648361..d89c705e6 100644 --- a/qutebrowser/browser/webkit/webkithistory.py +++ b/qutebrowser/browser/webkit/webkithistory.py @@ -15,14 +15,13 @@ # You should have received a copy of the GNU General Public License # along with qutebrowser. If not, see <https://www.gnu.org/licenses/>. -# FIXME:qt6 (lint) -# pylint: disable=no-name-in-module - """QtWebKit specific part of history.""" import functools +# pylint: disable=no-name-in-module from qutebrowser.qt.webkit import QWebHistoryInterface +# pylint: enable=no-name-in-module from qutebrowser.utils import debug from qutebrowser.misc import debugcachestats diff --git a/qutebrowser/browser/webkit/webkitinspector.py b/qutebrowser/browser/webkit/webkitinspector.py index cb9cb5615..c181435d1 100644 --- a/qutebrowser/browser/webkit/webkitinspector.py +++ b/qutebrowser/browser/webkit/webkitinspector.py @@ -15,13 +15,13 @@ # You should have received a copy of the GNU General Public License # along with qutebrowser. If not, see <https://www.gnu.org/licenses/>. -# FIXME:qt6 (lint) -# pylint: disable=no-name-in-module """Customized QWebInspector for QtWebKit.""" +# pylint: disable=no-name-in-module from qutebrowser.qt.webkit import QWebSettings from qutebrowser.qt.webkitwidgets import QWebInspector, QWebPage +# pylint: enable=no-name-in-module from qutebrowser.qt.widgets import QWidget from qutebrowser.browser import inspector diff --git a/qutebrowser/browser/webkit/webkitsettings.py b/qutebrowser/browser/webkit/webkitsettings.py index bd65be65b..a20811bae 100644 --- a/qutebrowser/browser/webkit/webkitsettings.py +++ b/qutebrowser/browser/webkit/webkitsettings.py @@ -15,9 +15,6 @@ # You should have received a copy of the GNU General Public License # along with qutebrowser. If not, see <https://www.gnu.org/licenses/>. -# FIXME:qt6 (lint) -# pylint: disable=no-name-in-module - """Bridge from QWebSettings to our own settings. Module attributes: @@ -30,8 +27,10 @@ import os.path from qutebrowser.qt.core import QUrl from qutebrowser.qt.gui import QFont +# pylint: disable=no-name-in-module from qutebrowser.qt.webkit import QWebSettings from qutebrowser.qt.webkitwidgets import QWebPage +# pylint: enable=no-name-in-module from qutebrowser.config import config, websettings from qutebrowser.config.websettings import AttributeInfo as Attr diff --git a/qutebrowser/browser/webkit/webkittab.py b/qutebrowser/browser/webkit/webkittab.py index a756e1a3d..e0483a23a 100644 --- a/qutebrowser/browser/webkit/webkittab.py +++ b/qutebrowser/browser/webkit/webkittab.py @@ -15,8 +15,6 @@ # You should have received a copy of the GNU General Public License # along with qutebrowser. If not, see <https://www.gnu.org/licenses/>. -# FIXME:qt6 (lint) -# pylint: disable=no-name-in-module """Wrapper over our (QtWebKit) WebView.""" @@ -28,8 +26,10 @@ from typing import cast, Iterable, Optional from qutebrowser.qt.core import pyqtSlot, Qt, QUrl, QPoint, QTimer, QSizeF, QSize from qutebrowser.qt.gui import QIcon from qutebrowser.qt.widgets import QWidget +# pylint: disable=no-name-in-module from qutebrowser.qt.webkitwidgets import QWebPage, QWebFrame from qutebrowser.qt.webkit import QWebSettings, QWebHistory, QWebElement +# pylint: enable=no-name-in-module from qutebrowser.qt.printsupport import QPrinter from qutebrowser.browser import browsertab, shared diff --git a/qutebrowser/browser/webkit/webpage.py b/qutebrowser/browser/webkit/webpage.py index 27429f331..b3b1b7ceb 100644 --- a/qutebrowser/browser/webkit/webpage.py +++ b/qutebrowser/browser/webkit/webpage.py @@ -15,9 +15,6 @@ # You should have received a copy of the GNU General Public License # along with qutebrowser. If not, see <https://www.gnu.org/licenses/>. -# FIXME:qt6 (lint) -# pylint: disable=no-name-in-module - """The main browser widgets.""" import html @@ -28,7 +25,9 @@ from qutebrowser.qt.gui import QDesktopServices from qutebrowser.qt.network import QNetworkReply, QNetworkRequest from qutebrowser.qt.widgets import QFileDialog from qutebrowser.qt.printsupport import QPrintDialog +# pylint: disable=no-name-in-module from qutebrowser.qt.webkitwidgets import QWebPage, QWebFrame +# pylint: enable=no-name-in-module from qutebrowser.config import websettings, config from qutebrowser.browser import pdfjs, shared, downloads, greasemonkey diff --git a/qutebrowser/browser/webkit/webview.py b/qutebrowser/browser/webkit/webview.py index 7a08a0736..831b2b689 100644 --- a/qutebrowser/browser/webkit/webview.py +++ b/qutebrowser/browser/webkit/webview.py @@ -15,14 +15,13 @@ # You should have received a copy of the GNU General Public License # along with qutebrowser. If not, see <https://www.gnu.org/licenses/>. -# FIXME:qt6 (lint) -# pylint: disable=no-name-in-module - """The main browser widgets.""" from qutebrowser.qt.core import pyqtSignal, Qt +# pylint: disable=no-name-in-module from qutebrowser.qt.webkit import QWebSettings from qutebrowser.qt.webkitwidgets import QWebView, QWebPage +# pylint: enable=no-name-in-module from qutebrowser.config import config, stylesheet from qutebrowser.keyinput import modeman diff --git a/qutebrowser/html/warning-qt5.html b/qutebrowser/html/warning-qt5.html new file mode 100644 index 000000000..17af2f72c --- /dev/null +++ b/qutebrowser/html/warning-qt5.html @@ -0,0 +1,28 @@ +{% extends "styled.html" %} + +{% block content %} +<h1>{{ title }}</h1> +<span class="note">Note this warning will only appear once. Use <span class="mono">:open +qute://warning/qt5</span> to show it again at a later time.</span> + +<p> + qutebrowser <b>now supports Qt 6</b>. +</p> +<p> + However, in your environment, <b>Qt 6 is not installed</b>. Thus, qutebrowser is still using Qt 5 instead. + + Qt 5.15 based on a very old Chromium version (83 or 87, from mid/late 2020). +</p> +{% if is_venv %} +<p> + You are using a virtualenv. If you want to use Qt 6, you need to create a new + virtualenv with PyQt6 installed. + + If using <span class="mono">mkvenv.py</span>, <b>rerun the script</b> to create a + new virtualenv with Qt 6. +</p> +{% endif %} +<p> + <span class="note">Python installation prefix: <span class="mono">{{ prefix }}</span></span> +</p> +{% endblock %} diff --git a/qutebrowser/keyinput/keyutils.py b/qutebrowser/keyinput/keyutils.py index e2a15b2c0..10f4d5378 100644 --- a/qutebrowser/keyinput/keyutils.py +++ b/qutebrowser/keyinput/keyutils.py @@ -37,9 +37,7 @@ from qutebrowser.qt import machinery from qutebrowser.qt.core import Qt, QEvent from qutebrowser.qt.gui import QKeySequence, QKeyEvent if machinery.IS_QT6: - # FIXME:qt6 (lint) how come pylint isn't picking this up with both backends - # installed? - from qutebrowser.qt.core import QKeyCombination # pylint: disable=no-name-in-module + from qutebrowser.qt.core import QKeyCombination else: QKeyCombination = None # QKeyCombination was added in Qt 6 @@ -349,7 +347,7 @@ def _unset_modifier_bits( https://github.com/python/cpython/issues/105497 """ if machinery.IS_QT5: - return cast(_ModifierType, modifiers & ~mask) + return Qt.KeyboardModifiers(modifiers & ~mask) # can lose type if it's 0 else: return Qt.KeyboardModifier(modifiers.value & ~mask.value) @@ -369,11 +367,14 @@ class KeyInfo: def __post_init__(self) -> None: """Run some validation on the key/modifier values.""" - # This is mainly useful while porting from Qt 5 to 6. - # FIXME:qt6 do we want to remove or keep this (and fix the remaining - # issues) when done? - # assert isinstance(self.key, Qt.Key), self.key - # assert isinstance(self.modifiers, Qt.KeyboardModifier), self.modifiers + # This changed with Qt 6, and e.g. to_qt() relies on this. + if machinery.IS_QT5: + modifier_classes = (Qt.KeyboardModifier, Qt.KeyboardModifiers) + elif machinery.IS_QT6: + modifier_classes = Qt.KeyboardModifier + assert isinstance(self.key, Qt.Key), self.key + assert isinstance(self.modifiers, modifier_classes), self.modifiers + _assert_plain_key(self.key) _assert_plain_modifier(self.modifiers) @@ -488,16 +489,7 @@ class KeyInfo: if machinery.IS_QT5: return int(self.key) | int(self.modifiers) else: - try: - # FIXME:qt6 We might want to consider only supporting KeyInfo to be - # instanciated with a real Qt.Key, not with ints. See __post_init__. - key = Qt.Key(self.key) - except ValueError as e: - # WORKAROUND for - # https://www.riverbankcomputing.com/pipermail/pyqt/2022-April/044607.html - raise InvalidKeyError(e) - - return QKeyCombination(self.modifiers, key) + return QKeyCombination(self.modifiers, self.key) def with_stripped_modifiers(self, modifiers: Qt.KeyboardModifier) -> "KeyInfo": mods = _unset_modifier_bits(self.modifiers, modifiers) diff --git a/qutebrowser/qt/_core_pyqtproperty.py b/qutebrowser/qt/_core_pyqtproperty.py index 8ae62264f..ae6435039 100644 --- a/qutebrowser/qt/_core_pyqtproperty.py +++ b/qutebrowser/qt/_core_pyqtproperty.py @@ -5,7 +5,7 @@ https://github.com/python-qt-tools/PyQt5-stubs/blob/5.15.6.0/PyQt5-stubs/QtCore. """ # flake8: noqa -# pylint: disable=invalid-name,missing-class-docstring,too-many-arguments,redefined-builtin,unused-argument,import-error +# pylint: disable=invalid-name,missing-class-docstring,too-many-arguments,redefined-builtin,unused-argument,no-name-in-module import typing from PyQt6.QtCore import QObject, pyqtSignal diff --git a/qutebrowser/qt/machinery.py b/qutebrowser/qt/machinery.py index e626edcb4..616c7ccfc 100644 --- a/qutebrowser/qt/machinery.py +++ b/qutebrowser/qt/machinery.py @@ -3,6 +3,16 @@ """Qt wrapper selection. Contains selection logic and globals for Qt wrapper selection. + +All other files in this package are intended to be simple wrappers around Qt imports. +Depending on what is set in this module, they import from PyQt5 or PyQt6. + +The import wrappers are intended to be as thin as possible. They will not unify +API-level differences between Qt 5 and Qt 6. This is best handled by the calling code, +which has a better picture of what changed between APIs and how to best handle it. + +What they *will* do is handle simple 1:1 renames of classes, or moves between +modules (where they aim to always expose the Qt 6 API). See e.g. webenginecore.py. """ # NOTE: No qutebrowser or PyQt import should be done here (at import time), @@ -20,11 +30,11 @@ from typing import Optional, Dict from qutebrowser.utils import log -# Packagers: Patch the line below to change the default wrapper for Qt 6 packages, e.g.: -# sed -i 's/_DEFAULT_WRAPPER = "PyQt5"/_DEFAULT_WRAPPER = "PyQt6"/' qutebrowser/qt/machinery.py +# Packagers: Patch the line below to enforce a Qt wrapper, e.g.: +# sed -i 's/_WRAPPER_OVERRIDE = .*/_WRAPPER_OVERRIDE = "PyQt6"/' qutebrowser/qt/machinery.py # # Users: Set the QUTE_QT_WRAPPER environment variable to change the default wrapper. -_DEFAULT_WRAPPER = "PyQt5" +_WRAPPER_OVERRIDE = None WRAPPERS = [ "PyQt6", @@ -80,6 +90,9 @@ class SelectionReason(enum.Enum): #: The wrapper was faked/patched out (e.g. in tests). fake = "fake" + #: The wrapper was overridden by patching _WRAPPER_OVERRIDE. + override = "override" + #: The reason was not set. unknown = "unknown" @@ -152,7 +165,7 @@ def _select_wrapper(args: Optional[argparse.Namespace]) -> SelectionInfo: - If --qt-wrapper is given, use that. - Otherwise, if the QUTE_QT_WRAPPER environment variable is set, use that. - - Otherwise, use PyQt5 (FIXME:qt6 autoselect). + - Otherwise, try the wrappers in WRAPPER in order (PyQt6 -> PyQt5) """ # If any Qt wrapper has been imported before this, something strange might # be happening. @@ -170,15 +183,17 @@ def _select_wrapper(args: Optional[argparse.Namespace]) -> SelectionInfo: if env_wrapper == "auto": return _autoselect_wrapper() elif env_wrapper not in WRAPPERS: - raise Error(f"Unknown wrapper {env_wrapper} set via {env_var}, " - f"allowed: {', '.join(WRAPPERS)}") + raise Error( + f"Unknown wrapper {env_wrapper} set via {env_var}, " + f"allowed: {', '.join(WRAPPERS)}" + ) return SelectionInfo(wrapper=env_wrapper, reason=SelectionReason.env) - # FIXME:qt6 Go back to the auto-detection once ready - # FIXME:qt6 Make sure to still consider _DEFAULT_WRAPPER for packagers - # (rename to _WRAPPER_OVERRIDE since our sed command is broken anyways then?) - # return _autoselect_wrapper() - return SelectionInfo(wrapper=_DEFAULT_WRAPPER, reason=SelectionReason.default) + if _WRAPPER_OVERRIDE is not None: + assert _WRAPPER_OVERRIDE in WRAPPERS # type: ignore[unreachable] + return SelectionInfo(wrapper=_WRAPPER_OVERRIDE, reason=SelectionReason.override) + + return _autoselect_wrapper() # Values are set in init(). If you see a NameError here, it means something tried to @@ -219,8 +234,7 @@ def _set_globals(info: SelectionInfo) -> None: Those are split into multiple global variables because that way we can teach mypy about them via --always-true and --always-false, see tox.ini. """ - global INFO, USE_PYQT5, USE_PYQT6, USE_PYSIDE6, IS_QT5, IS_QT6, \ - IS_PYQT, IS_PYSIDE, _initialized + global INFO, USE_PYQT5, USE_PYQT6, USE_PYSIDE6, IS_QT5, IS_QT6, IS_PYQT, IS_PYSIDE, _initialized assert info.wrapper is not None, info assert not _initialized diff --git a/qutebrowser/qt/opengl.py b/qutebrowser/qt/opengl.py index 0a14dffad..bc5a31c11 100644 --- a/qutebrowser/qt/opengl.py +++ b/qutebrowser/qt/opengl.py @@ -1,4 +1,4 @@ -# pylint: disable=import-error,wildcard-import,unused-import +# pylint: disable=import-error,wildcard-import,unused-import,unused-wildcard-import """Wrapped Qt imports for Qt OpenGL. diff --git a/qutebrowser/qutebrowser.py b/qutebrowser/qutebrowser.py index e778cc23a..fcca87feb 100644 --- a/qutebrowser/qutebrowser.py +++ b/qutebrowser/qutebrowser.py @@ -50,7 +50,7 @@ except ImportError: sys.exit(100) check_python_version() -import argparse # FIXME:qt6 (lint): disable=wrong-import-order +import argparse from qutebrowser.misc import earlyinit from qutebrowser.qt import machinery |