diff --git a/qutebrowser/app.py b/qutebrowser/app.py index 8d8696af9..941b29c22 100644 --- a/qutebrowser/app.py +++ b/qutebrowser/app.py @@ -18,38 +18,15 @@ """Initialization of qutebrowser and application-wide things.""" ### Things we want to do before normal imports ### +import qutebrowser.utils.earlyinit as earlyinit +earlyinit.check_python_version() +earlyinit.init_faulthandler() +earlyinit.fix_harfbuzz() +earlyinit.check_pyqt_core() +earlyinit.check_pyqt_webkit() -import sys - -# Print a nice traceback on segfault -- only available on Python 3.3+, but if -# it's unavailable, it doesn't matter much. -try: - import faulthandler # pylint: disable=import-error -except ImportError: - pass -else: - if sys.__stdout__ is not None: - # When run with pythonw.exe, sys.__stdout__ can be None: - # https://docs.python.org/3/library/sys.html#sys.__stdout__ - # If we'd enable faulthandler in that case, we just get a weird - # exception, so we don't enable faulthandler in that case. - # - # FIXME at the point we have our config/data dirs, we probably should - # re-enable faulthandler to write to a file. Then we can also display - # crashes to the user at the next start. - faulthandler.enable() - -# See https://bugreports.qt-project.org/browse/QTBUG-36099 -# We need to do this before importing PyQt -import qutebrowser.utils.harfbuzz as harfbuzz -harfbuzz.fix() - -# Check if everything we should be able to import is there -import qutebrowser.utils.dependencies as dependencies -dependencies.check() - -# Early imports done, normal imports following now. import os +import sys import logging import subprocess import configparser diff --git a/qutebrowser/utils/dependencies.py b/qutebrowser/utils/earlyinit.py similarity index 61% rename from qutebrowser/utils/dependencies.py rename to qutebrowser/utils/earlyinit.py index c808cbab0..d743a209a 100644 --- a/qutebrowser/utils/dependencies.py +++ b/qutebrowser/utils/earlyinit.py @@ -1,5 +1,3 @@ -# Copyright 2014 Florian Bruhin (The Compiler) -# # This file is part of qutebrowser. # # qutebrowser is free software: you can redistribute it and/or modify @@ -15,21 +13,66 @@ # You should have received a copy of the GNU General Public License # along with qutebrowser. If not, see . -"""Check if everything needed for qutebrowser is there. - -In a separate file because this needs to be done early before any imports. -""" +"""Things which need to be done really early (e.g. before importing Qt).""" +import os import sys -def check(): - """Check if all dependencies are met.""" +def check_python_version(): + """Check if correct python version is run.""" if sys.hexversion < 0x03030000: print("Fatal error: At least Python 3.3 is required to run " "qutebrowser, but {} is installed!".format( '.'.join(map(str, sys.version_info[:3])))) sys.exit(1) + + +def init_faulthandler(): + """Enable faulthandler module if available. + + This print a nice traceback on segfauls. It's only available on Python + 3.3+, but if it's unavailable, it doesn't matter much (we just ignore + that). + """ + + try: + import faulthandler # pylint: disable=import-error + except ImportError: + return + if sys.__stdout__ is not None: + # When run with pythonw.exe, sys.__stdout__ can be None: + # https://docs.python.org/3/library/sys.html#sys.__stdout__ + # If we'd enable faulthandler in that case, we just get a weird + # exception, so we don't enable faulthandler in that case. + # + # FIXME at the point we have our config/data dirs, we probably should + # re-enable faulthandler to write to a file. Then we can also display + # crashes to the user at the next start. + return + faulthandler.enable() + if hasattr(faulthandler, 'register'): + # If available, we also want a traceback on SIGUSR1. + from signal import SIGUSR1 + faulthandler.register(SIGUSR1) + + +def fix_harfbuzz(): + """Fix harfbuzz issues. + + This switches to an older (but more stable) harfbuzz font rendering engine + instead of using the system wide one. + + This fixes crashes on various sites. + See https://bugreports.qt-project.org/browse/QTBUG-36099 + """ + if sys.platform.startswith('linux'): + # Switch to old but stable font rendering engine + os.environ['QT_HARFBUZZ'] = 'old' + + +def check_pyqt_core(): + """Check if PyQt core is installed.""" import textwrap try: import PyQt5.QtCore # pylint: disable=unused-variable @@ -59,12 +102,17 @@ def check(): print() traceback.print_exc() sys.exit(1) + + +def check_pyqt_webkit(): + """Check if PyQt WebKit is installed.""" # At this point we can rely on QtCore being available, so we can display an # error dialog try: import PyQt5.QtWebKit except ImportError: from PyQt5.QtWidgets import QApplication, QMessageBox + import textwrap app = QApplication(sys.argv) msgbox = QMessageBox(QMessageBox.Critical, "qutebrowser: Fatal error!", textwrap.dedent(""" diff --git a/qutebrowser/utils/harfbuzz.py b/qutebrowser/utils/harfbuzz.py deleted file mode 100644 index 6d8ccc5b6..000000000 --- a/qutebrowser/utils/harfbuzz.py +++ /dev/null @@ -1,39 +0,0 @@ -# Copyright 2014 Florian Bruhin (The Compiler) -# -# This file is part of qutebrowser. -# -# qutebrowser is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# qutebrowser is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with qutebrowser. If not, see . - -"""Fixer to set QT_HARFBUZZ variable. - -In its own file so it doesn't include any Qt stuff, because if it did, it -wouldn't work. -""" - -import os -import sys - - -def fix(): - """Fix harfbuzz issues. - - This switches to an older (but more stable) harfbuzz font rendering engine - instead of using the system wide one. - - This fixes crashes on various sites. - See https://bugreports.qt-project.org/browse/QTBUG-36099 - """ - if sys.platform.startswith('linux'): - # Switch to old but stable font rendering engine - os.environ['QT_HARFBUZZ'] = 'old'