diff options
Diffstat (limited to 'qutebrowser/misc/earlyinit.py')
-rw-r--r-- | qutebrowser/misc/earlyinit.py | 48 |
1 files changed, 31 insertions, 17 deletions
diff --git a/qutebrowser/misc/earlyinit.py b/qutebrowser/misc/earlyinit.py index ef7814ab1..40f6dbd49 100644 --- a/qutebrowser/misc/earlyinit.py +++ b/qutebrowser/misc/earlyinit.py @@ -35,6 +35,7 @@ import traceback import signal import importlib import datetime +from typing import NoReturn try: import tkinter except ImportError: @@ -42,6 +43,10 @@ except ImportError: # NOTE: No qutebrowser or PyQt import should be done here, as some early # initialization needs to take place before that! +# +# The machinery module is an exception, as it also is required to never import Qt +# itself at import time. +from qutebrowser.qt import machinery START_TIME = datetime.datetime.now() @@ -136,11 +141,26 @@ def init_faulthandler(fileobj=sys.__stderr__): # pylint: enable=no-member,useless-suppression -def check_pyqt(): - """Check if PyQt core modules (QtCore/QtWidgets) are installed.""" - from qutebrowser.qt import machinery +def _fatal_qt_error(text: str) -> NoReturn: + """Show a fatal error about Qt being missing.""" + if tkinter and '--no-err-windows' not in sys.argv: + root = tkinter.Tk() + root.withdraw() + tkinter.messagebox.showerror("qutebrowser: Fatal error!", text) + else: + print(text, file=sys.stderr) + if '--debug' in sys.argv or '--no-err-windows' in sys.argv: + print(file=sys.stderr) + traceback.print_exc() + sys.exit(1) + + +def check_qt_available(info: machinery.SelectionInfo) -> None: + """Check if Qt core modules (QtCore/QtWidgets) are installed.""" + if info.wrapper is None: + _fatal_qt_error(f"No Qt wrapper was importable.\n\n{info}") - packages = [f'{machinery.PACKAGE}.QtCore', f'{machinery.PACKAGE}.QtWidgets'] + packages = [f'{info.wrapper}.QtCore', f'{info.wrapper}.QtWidgets'] for name in packages: try: importlib.import_module(name) @@ -150,16 +170,8 @@ def check_pyqt(): text = text.replace('</b>', '') text = text.replace('<br />', '\n') text = text.replace('%ERROR%', str(e)) - if tkinter and '--no-err-windows' not in sys.argv: - root = tkinter.Tk() - root.withdraw() - tkinter.messagebox.showerror("qutebrowser: Fatal error!", text) - else: - print(text, file=sys.stderr) - if '--debug' in sys.argv or '--no-err-windows' in sys.argv: - print(file=sys.stderr) - traceback.print_exc() - sys.exit(1) + text += '\n\n' + str(info) + _fatal_qt_error(text) def qt_version(qversion=None, qt_version_str=None): @@ -240,14 +252,13 @@ def _check_modules(modules): def check_libraries(): """Check if all needed Python libraries are installed.""" - from qutebrowser.qt import machinery modules = { 'jinja2': _missing_str("jinja2"), 'yaml': _missing_str("PyYAML"), } for subpkg in ['QtQml', 'QtOpenGL', 'QtDBus']: - package = f'{machinery.PACKAGE}.{subpkg}' + package = f'{machinery.INFO.wrapper}.{subpkg}' modules[package] = _missing_str(package) if sys.version_info < (3, 9): @@ -292,6 +303,7 @@ def init_log(args): from qutebrowser.utils import log log.init_log(args) log.init.debug("Log initialized.") + log.init.debug(str(machinery.INFO)) def check_optimize_flag(): @@ -329,9 +341,11 @@ def early_init(args): # First we initialize the faulthandler as early as possible, so we # theoretically could catch segfaults occurring later during earlyinit. init_faulthandler() + # Then we configure the selected Qt wrapper + info = machinery.init(args) # Here we check if QtCore is available, and if not, print a message to the # console or via Tk. - check_pyqt() + check_qt_available(info) # Init logging as early as possible init_log(args) # Now we can be sure QtCore is available, so we can print dialogs on |