diff options
Diffstat (limited to 'qutebrowser/qt/machinery.py')
-rw-r--r-- | qutebrowser/qt/machinery.py | 79 |
1 files changed, 79 insertions, 0 deletions
diff --git a/qutebrowser/qt/machinery.py b/qutebrowser/qt/machinery.py new file mode 100644 index 000000000..66a35a855 --- /dev/null +++ b/qutebrowser/qt/machinery.py @@ -0,0 +1,79 @@ +# vim: ft=python fileencoding=utf-8 sts=4 sw=4 et: +# FIXME:qt6 (lint) +# pylint: disable=missing-module-docstring +# flake8: noqa + +import os +import importlib + + +_WRAPPERS = [ + "PyQt6", + "PyQt5", + # Needs more work + # "PySide6", +] + + +class Error(Exception): + pass + + +class Unavailable(Error, ImportError): + + """Raised when a module is unavailable with the given wrapper.""" + + def __init__(self) -> None: + super().__init__(f"Unavailable with {WRAPPER}") + + +class UnknownWrapper(Error): + pass + + +def _autoselect_wrapper(): + for wrapper in _WRAPPERS: + try: + importlib.import_module(wrapper) + except ImportError: + # FIXME:qt6 show/log this somewhere? + continue + return wrapper + + wrappers = ", ".join(_WRAPPERS) + raise Error(f"No Qt wrapper found, tried {wrappers}") + + +def _select_wrapper(): + env_var = "QUTE_QT_WRAPPER" + env_wrapper = os.environ.get(env_var) + if env_wrapper is None: + return _autoselect_wrapper() + + if env_wrapper not in _WRAPPERS: + raise Error(f"Unknown wrapper {env_wrapper} set via {env_var}, " + f"allowed: {', '.join(_WRAPPERS)}") + + return env_wrapper + + +WRAPPER = _select_wrapper() +USE_PYQT5 = WRAPPER == "PyQt5" +USE_PYQT6 = WRAPPER == "PyQt6" +USE_PYSIDE6 = WRAPPER == "PySide6" +assert USE_PYQT5 ^ USE_PYQT6 ^ USE_PYSIDE6 + +IS_QT5 = USE_PYQT5 +IS_QT6 = USE_PYQT6 or USE_PYSIDE6 +IS_PYQT = USE_PYQT5 or USE_PYQT6 +IS_PYSIDE = USE_PYSIDE6 +assert IS_QT5 ^ IS_QT6 +assert IS_PYQT ^ IS_PYSIDE + + +if USE_PYQT5: + PACKAGE = "PyQt5" +elif USE_PYQT6: + PACKAGE = "PyQt6" +elif USE_PYSIDE6: + PACKAGE = "PySide6" |