summaryrefslogtreecommitdiff
path: root/qutebrowser/qt/machinery.py
diff options
context:
space:
mode:
Diffstat (limited to 'qutebrowser/qt/machinery.py')
-rw-r--r--qutebrowser/qt/machinery.py79
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"