Move early init code to own file
This commit is contained in:
parent
ee02b44117
commit
8fddd328f6
@ -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
|
||||
|
@ -1,5 +1,3 @@
|
||||
# Copyright 2014 Florian Bruhin (The Compiler) <mail@qutebrowser.org>
|
||||
#
|
||||
# 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 <http://www.gnu.org/licenses/>.
|
||||
|
||||
"""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("""
|
@ -1,39 +0,0 @@
|
||||
# Copyright 2014 Florian Bruhin (The Compiler) <mail@qutebrowser.org>
|
||||
#
|
||||
# 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 <http://www.gnu.org/licenses/>.
|
||||
|
||||
"""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'
|
Loading…
Reference in New Issue
Block a user