Skip to content

Commit

Permalink
Add objects.qapp to avoid needing to None-check
Browse files Browse the repository at this point in the history
We know that QApplication.instance() will always be non-None for
practical purposes, but the stubs now (correctly) declare it as
Optional.

See python-qt-tools/PyQt5-stubs#126
  • Loading branch information
The-Compiler committed Jan 11, 2021
1 parent 8760dc1 commit 3c13ee8
Show file tree
Hide file tree
Showing 16 changed files with 61 additions and 65 deletions.
38 changes: 19 additions & 19 deletions qutebrowser/app.py
Expand Up @@ -92,20 +92,20 @@ def run(args):
configinit.early_init(args)

log.init.debug("Initializing application...")
global q_app
q_app = Application(args)
q_app.setOrganizationName("qutebrowser")
q_app.setApplicationName("qutebrowser")
app = Application(args)
objects.qapp = app
app.setOrganizationName("qutebrowser")
app.setApplicationName("qutebrowser")
# Default DesktopFileName is org.qutebrowser.qutebrowser, set in `get_argparser()`
q_app.setDesktopFileName(args.desktop_file_name)
q_app.setApplicationVersion(qutebrowser.__version__)
app.setDesktopFileName(args.desktop_file_name)
app.setApplicationVersion(qutebrowser.__version__)

if args.version:
print(version.version_info())
sys.exit(usertypes.Exit.ok)

quitter.init(args)
crashsignal.init(q_app=q_app, args=args, quitter=quitter.instance)
crashsignal.init(q_app=app, args=args, quitter=quitter.instance)

try:
server = ipc.send_or_listen(args)
Expand Down Expand Up @@ -136,7 +136,7 @@ def qt_mainloop():
WARNING: misc/crashdialog.py checks the stacktrace for this function
name, so if this is changed, it should be changed there as well!
"""
return q_app.exec()
return objects.qapp.exec()


def init(*, args: argparse.Namespace) -> None:
Expand All @@ -145,7 +145,7 @@ def init(*, args: argparse.Namespace) -> None:

crashsignal.crash_handler.init_faulthandler()

q_app.setQuitOnLastWindowClosed(False)
objects.qapp.setQuitOnLastWindowClosed(False)
quitter.instance.shutting_down.connect(QApplication.closeAllWindows)

_init_icon()
Expand All @@ -165,7 +165,7 @@ def init(*, args: argparse.Namespace) -> None:
eventfilter.init()

log.init.debug("Connecting signals...")
q_app.focusChanged.connect(on_focus_changed)
objects.qapp.focusChanged.connect(on_focus_changed)

_process_args(args)

Expand All @@ -191,7 +191,7 @@ def _init_icon():
if icon.isNull():
log.init.warning("Failed to load icon")
else:
q_app.setWindowIcon(icon)
objects.qapp.setWindowIcon(icon)


def _init_pulseaudio():
Expand Down Expand Up @@ -228,7 +228,7 @@ def _process_args(args):
window = mainwindow.MainWindow(private=private)
if not args.nowindow:
window.show()
q_app.setActiveWindow(window)
objects.qapp.setActiveWindow(window)

process_pos_args(args.command)
_open_startpage()
Expand Down Expand Up @@ -423,7 +423,7 @@ def _init_modules(*, args):
config.instance.changed.connect(_on_config_changed)

log.init.debug("Initializing save manager...")
save_manager = savemanager.SaveManager(q_app)
save_manager = savemanager.SaveManager(objects.qapp)
objreg.register('save-manager', save_manager)
quitter.instance.shutting_down.connect(save_manager.shutdown)
configinit.late_init(save_manager)
Expand All @@ -450,7 +450,7 @@ def _init_modules(*, args):
sql.init(os.path.join(standarddir.data(), 'history.sqlite'))

log.init.debug("Initializing web history...")
history.init(q_app)
history.init(objects.qapp)
except sql.KnownError as e:
error.handle_fatal_exc(e, 'Error initializing SQL',
pre_text='Error initializing SQL',
Expand All @@ -460,7 +460,7 @@ def _init_modules(*, args):
log.init.debug("Initializing command history...")
cmdhistory.init()
log.init.debug("Initializing sessions...")
sessions.init(q_app)
sessions.init(objects.qapp)

log.init.debug("Initializing websettings...")
websettings.init(args)
Expand All @@ -470,18 +470,18 @@ def _init_modules(*, args):
crashsignal.crash_handler.display_faulthandler()

log.init.debug("Initializing quickmarks...")
quickmark_manager = urlmarks.QuickmarkManager(q_app)
quickmark_manager = urlmarks.QuickmarkManager(objects.qapp)
objreg.register('quickmark-manager', quickmark_manager)

log.init.debug("Initializing bookmarks...")
bookmark_manager = urlmarks.BookmarkManager(q_app)
bookmark_manager = urlmarks.BookmarkManager(objects.qapp)
objreg.register('bookmark-manager', bookmark_manager)

log.init.debug("Initializing cookies...")
cookies.init(q_app)
cookies.init(objects.qapp)

log.init.debug("Initializing cache...")
cache.init(q_app)
cache.init(objects.qapp)

log.init.debug("Initializing downloads...")
qtnetworkdownloads.init()
Expand Down
2 changes: 1 addition & 1 deletion qutebrowser/browser/commands.py
Expand Up @@ -65,7 +65,7 @@ def __repr__(self):

def _new_tabbed_browser(self, private):
"""Get a tabbed-browser from a new window."""
args = QApplication.instance().arguments()
args = objects.qapp.arguments()
if private and '--single-process' in args:
raise cmdutils.CommandError("Private windows are unavailable with "
"the single-process process model.")
Expand Down
12 changes: 4 additions & 8 deletions qutebrowser/browser/webkit/network/networkmanager.py
Expand Up @@ -24,10 +24,8 @@
from typing import TYPE_CHECKING, Dict, MutableMapping, Optional, Sequence

import attr
from PyQt5.QtCore import (pyqtSlot, pyqtSignal, QCoreApplication, QUrl,
QByteArray)
from PyQt5.QtNetwork import (QNetworkAccessManager, QNetworkReply, QSslSocket,
QSslError)
from PyQt5.QtCore import pyqtSlot, pyqtSignal, QUrl, QByteArray
from PyQt5.QtNetwork import QNetworkAccessManager, QNetworkReply, QSslSocket, QSslError

from qutebrowser.config import config
from qutebrowser.utils import (message, log, usertypes, utils, objreg,
Expand Down Expand Up @@ -193,18 +191,16 @@ def _set_cookiejar(self):
# We have a shared cookie jar - we restore its parent so we don't
# take ownership of it.
self.setCookieJar(cookie_jar)
app = QCoreApplication.instance()
cookie_jar.setParent(app)
cookie_jar.setParent(objects.qapp)

def _set_cache(self):
"""Set the cache of the NetworkManager correctly."""
if self._private:
return
# We have a shared cache - we restore its parent so we don't take
# ownership of it.
app = QCoreApplication.instance()
self.setCache(cache.diskcache)
cache.diskcache.setParent(app)
cache.diskcache.setParent(objects.qapp)

def _get_abort_signals(self, owner=None):
"""Get a list of signals which should abort a question."""
Expand Down
6 changes: 5 additions & 1 deletion qutebrowser/components/readlinecommands.py
Expand Up @@ -39,7 +39,11 @@ def __init__(self) -> None:

def _widget(self) -> Optional[QLineEdit]:
"""Get the currently active QLineEdit."""
w = QApplication.instance().focusWidget()
# FIXME add this to api.utils or so
qapp = QApplication.instance()
assert qapp is not None
w = qapp.focusWidget()

if isinstance(w, QLineEdit):
return w
else:
Expand Down
11 changes: 5 additions & 6 deletions qutebrowser/keyinput/eventfilter.py
Expand Up @@ -23,10 +23,9 @@

from PyQt5.QtCore import pyqtSlot, QObject, QEvent
from PyQt5.QtGui import QKeyEvent, QWindow
from PyQt5.QtWidgets import QApplication

from qutebrowser.keyinput import modeman
from qutebrowser.misc import quitter
from qutebrowser.misc import quitter, objects
from qutebrowser.utils import objreg


Expand All @@ -50,11 +49,11 @@ def __init__(self, parent: QObject = None) -> None:
}

def install(self) -> None:
QApplication.instance().installEventFilter(self)
objects.qapp.installEventFilter(self)

@pyqtSlot()
def shutdown(self) -> None:
QApplication.instance().removeEventFilter(self)
objects.qapp.removeEventFilter(self)

def _handle_key_event(self, event: QKeyEvent) -> bool:
"""Handle a key press/release event.
Expand All @@ -65,7 +64,7 @@ def _handle_key_event(self, event: QKeyEvent) -> bool:
Return:
True if the event should be filtered, False if it's passed through.
"""
active_window = QApplication.instance().activeWindow()
active_window = objects.qapp.activeWindow()
if active_window not in objreg.window_registry.values():
# Some other window (print dialog, etc.) is focused so we pass the
# event through.
Expand Down Expand Up @@ -112,6 +111,6 @@ def eventFilter(self, obj: QObject, event: QEvent) -> bool:

def init() -> None:
"""Initialize the global EventFilter instance."""
event_filter = EventFilter(parent=QApplication.instance())
event_filter = EventFilter(parent=objects.qapp)
event_filter.install()
quitter.instance.shutting_down.connect(event_filter.shutdown)
4 changes: 2 additions & 2 deletions qutebrowser/keyinput/modeman.py
Expand Up @@ -25,14 +25,14 @@
import attr
from PyQt5.QtCore import pyqtSlot, pyqtSignal, Qt, QObject, QEvent
from PyQt5.QtGui import QKeyEvent
from PyQt5.QtWidgets import QApplication

from qutebrowser.commands import runners
from qutebrowser.keyinput import modeparsers, basekeyparser
from qutebrowser.config import config
from qutebrowser.api import cmdutils
from qutebrowser.utils import usertypes, log, objreg, utils
from qutebrowser.browser import hints
from qutebrowser.misc import objects

INPUT_MODES = [usertypes.KeyMode.insert, usertypes.KeyMode.passthrough]
PROMPT_MODES = [usertypes.KeyMode.prompt, usertypes.KeyMode.yesno]
Expand Down Expand Up @@ -307,7 +307,7 @@ def _handle_keypress(self, event: QKeyEvent, *,
self._releaseevents_to_pass.add(KeyEvent.from_event(event))

if curmode != usertypes.KeyMode.insert:
focus_widget = QApplication.instance().focusWidget()
focus_widget = objects.qapp.focusWidget()
log.modes.debug("match: {}, forward_unbound_keys: {}, "
"passthrough: {}, is_non_alnum: {}, dry_run: {} "
"--> filter: {} (focused: {!r})".format(
Expand Down
8 changes: 4 additions & 4 deletions qutebrowser/mainwindow/mainwindow.py
Expand Up @@ -27,7 +27,7 @@

from PyQt5.QtCore import (pyqtBoundSignal, pyqtSlot, QRect, QPoint, QTimer, Qt,
QCoreApplication, QEventLoop, QByteArray)
from PyQt5.QtWidgets import QWidget, QVBoxLayout, QApplication, QSizePolicy
from PyQt5.QtWidgets import QWidget, QVBoxLayout, QSizePolicy
from PyQt5.QtGui import QPalette

from qutebrowser.commands import runners
Expand All @@ -39,7 +39,7 @@
from qutebrowser.completion import completionwidget, completer
from qutebrowser.keyinput import modeman
from qutebrowser.browser import commands, downloadview, hints, downloads
from qutebrowser.misc import crashsignal, keyhintwidget, sessions
from qutebrowser.misc import crashsignal, keyhintwidget, sessions, objects
from qutebrowser.qt import sip


Expand Down Expand Up @@ -100,7 +100,7 @@ def raise_window(window, alert=True):
window.activateWindow()

if alert:
QApplication.instance().alert(window)
objects.qapp.alert(window)


def get_target_window():
Expand Down Expand Up @@ -275,7 +275,7 @@ def __init__(self, *,
QTimer.singleShot(0, self._connect_overlay_signals)
config.instance.changed.connect(self._on_config_changed)

QApplication.instance().new_window.emit(self)
objects.qapp.new_window.emit(self)
self._set_decoration(config.val.window.hide_decoration)

self.state_before_fullscreen = self.windowState()
Expand Down
6 changes: 3 additions & 3 deletions qutebrowser/mainwindow/windowundo.py
Expand Up @@ -24,10 +24,10 @@

import attr
from PyQt5.QtCore import QObject
from PyQt5.QtWidgets import QApplication

from qutebrowser.config import config
from qutebrowser.mainwindow import mainwindow
from qutebrowser.misc import objects


instance = cast('WindowUndoManager', None)
Expand All @@ -49,7 +49,7 @@ class WindowUndoManager(QObject):
def __init__(self, parent=None):
super().__init__(parent)
self._undos: MutableSequence[_WindowUndoEntry] = collections.deque()
QApplication.instance().window_closing.connect(self._on_window_closing)
objects.qapp.window_closing.connect(self._on_window_closing)
config.instance.changed.connect(self._on_config_changed)

@config.change_filter('tabs.undo_stack_size')
Expand Down Expand Up @@ -88,4 +88,4 @@ def undo_last_window_close(self):

def init():
global instance
instance = WindowUndoManager(parent=QApplication.instance())
instance = WindowUndoManager(parent=objects.qapp)
6 changes: 3 additions & 3 deletions qutebrowser/misc/backendproblem.py
Expand Up @@ -30,8 +30,8 @@

import attr
from PyQt5.QtCore import Qt
from PyQt5.QtWidgets import (QApplication, QDialog, QPushButton, QHBoxLayout,
QVBoxLayout, QLabel, QMessageBox, QWidget)
from PyQt5.QtWidgets import (QDialog, QPushButton, QHBoxLayout, QVBoxLayout, QLabel,
QMessageBox, QWidget)
from PyQt5.QtNetwork import QSslSocket

from qutebrowser.config import config, configfiles
Expand Down Expand Up @@ -236,7 +236,7 @@ def _handle_wayland_webgl(self) -> None:
if os.environ.get('QUTE_SKIP_WAYLAND_WEBGL_CHECK'):
return

platform = QApplication.instance().platformName()
platform = objects.qapp.platformName()
if platform not in ['wayland', 'wayland-egl']:
return

Expand Down
7 changes: 3 additions & 4 deletions qutebrowser/misc/crashdialog.py
Expand Up @@ -33,12 +33,12 @@
from PyQt5.QtCore import pyqtSlot, Qt, QSize
from PyQt5.QtWidgets import (QDialog, QLabel, QTextEdit, QPushButton,
QVBoxLayout, QHBoxLayout, QCheckBox,
QDialogButtonBox, QApplication, QMessageBox)
QDialogButtonBox, QMessageBox)

import qutebrowser
from qutebrowser.utils import version, log, utils
from qutebrowser.misc import (miscwidgets, autoupdate, msgbox, httpclient,
pastebin)
pastebin, objects)
from qutebrowser.config import config, configfiles
from qutebrowser.browser import history

Expand Down Expand Up @@ -241,8 +241,7 @@ def _gather_crash_info(self):
exc: An exception tuple (type, value, traceback)
"""
try:
application = QApplication.instance()
launch_time = application.launch_time.ctime()
launch_time = objects.qapp.launch_time.ctime()
crash_time = datetime.datetime.now().ctime()
text = 'Launch: {}\nCrash: {}'.format(launch_time, crash_time)
self._crash_info.append(('Timestamps', text))
Expand Down
2 changes: 2 additions & 0 deletions qutebrowser/misc/objects.py
Expand Up @@ -26,6 +26,7 @@
from typing import TYPE_CHECKING, Any, Dict, Set, Union, cast

if TYPE_CHECKING:
from PyQt5.QtWidgets import QApplication
from qutebrowser.utils import usertypes
from qutebrowser.commands import command

Expand All @@ -46,3 +47,4 @@ def __eq__(self, other: Any) -> bool:
commands: Dict[str, 'command.Command'] = {}
debug_flags: Set[str] = set()
args = cast(argparse.Namespace, None)
qapp = cast('QApplication', None)
8 changes: 3 additions & 5 deletions qutebrowser/misc/quitter.py
Expand Up @@ -32,7 +32,6 @@
from typing import Iterable, Mapping, MutableSequence, Sequence, cast

from PyQt5.QtCore import QObject, pyqtSignal, QTimer
from PyQt5.QtWidgets import QApplication
try:
import hunter
except ImportError:
Expand Down Expand Up @@ -267,7 +266,7 @@ def _shutdown_3(self, status: int) -> None:
else:
print("Now logging late shutdown.", file=sys.stderr)
hunter.trace()
QApplication.instance().exit(status)
objects.qapp.exit(status)


@cmdutils.register(name='quit')
Expand Down Expand Up @@ -311,7 +310,6 @@ def restart() -> None:
def init(args: argparse.Namespace) -> None:
"""Initialize the global Quitter instance."""
global instance
qapp = QApplication.instance()
instance = Quitter(args=args, parent=qapp)
instance = Quitter(args=args, parent=objects.qapp)
instance.shutting_down.connect(log.shutdown_log)
qapp.lastWindowClosed.connect(instance.on_last_window_closed)
objects.qapp.lastWindowClosed.connect(instance.on_last_window_closed)

0 comments on commit 3c13ee8

Please sign in to comment.