Clean up correctly when a window is closed.

This commit is contained in:
Florian Bruhin 2014-09-29 10:43:06 +02:00
parent b84eb6aeb0
commit e6fe358d73
6 changed files with 30 additions and 2 deletions

View File

@ -23,6 +23,8 @@ Module attributes:
manager: The ModeManager instance. manager: The ModeManager instance.
""" """
import functools
from PyQt5.QtGui import QWindow from PyQt5.QtGui import QWindow
from PyQt5.QtCore import pyqtSignal, QObject, QEvent from PyQt5.QtCore import pyqtSignal, QObject, QEvent
from PyQt5.QtWidgets import QApplication from PyQt5.QtWidgets import QApplication
@ -60,6 +62,9 @@ def init(win_id, parent):
KM.yesno: modeparsers.PromptKeyParser(win_id, modeman), KM.yesno: modeparsers.PromptKeyParser(win_id, modeman),
} }
objreg.register('keyparsers', keyparsers, scope='window', window=win_id) objreg.register('keyparsers', keyparsers, scope='window', window=win_id)
modeman.destroyed.connect(
functools.partial(objreg.delete, 'keyparsers', scope='window',
window=win_id))
modeman.register(KM.normal, keyparsers[KM.normal].handle) modeman.register(KM.normal, keyparsers[KM.normal].handle)
modeman.register(KM.hint, keyparsers[KM.hint].handle) modeman.register(KM.hint, keyparsers[KM.hint].handle)
modeman.register(KM.insert, keyparsers[KM.insert].handle, passthrough=True) modeman.register(KM.insert, keyparsers[KM.insert].handle, passthrough=True)

View File

@ -23,7 +23,9 @@
import collections import collections
import functools import functools
from PyQt5.QtCore import QObject from PyQt5.QtCore import QObject, QTimer
from qutebrowser.utils import log
class UnsetObject: class UnsetObject:
@ -68,12 +70,24 @@ class ObjectRegistry(collections.UserDict):
super().__setitem__(name, obj) super().__setitem__(name, obj)
def on_destroyed(self, name): def on_destroyed(self, name):
"""Schedule removing of a destroyed QObject.
We don't remove the destroyed object immediately because it might still
be destroying its children, which might still use the object
registry.
"""
log.misc.debug("schedule destroyed: {}".format(name))
QTimer.singleShot(0, functools.partial(self._on_destroyed, name))
def _on_destroyed(self, name):
"""Remove a destroyed QObject.""" """Remove a destroyed QObject."""
log.misc.debug("destroyed: {}".format(name))
try: try:
del self[name] del self[name]
except KeyError: except KeyError:
pass pass
def dump_objects(self): def dump_objects(self):
"""Dump all objects as a list of strings.""" """Dump all objects as a list of strings."""
lines = [] lines = []

View File

@ -94,7 +94,7 @@ class CompletionView(QTreeView):
super().__init__(parent) super().__init__(parent)
self._win_id = win_id self._win_id = win_id
objreg.register('completion', self, scope='window', window=win_id) objreg.register('completion', self, scope='window', window=win_id)
completer_obj = completer.Completer(win_id) completer_obj = completer.Completer(win_id, self)
objreg.register('completer', completer_obj, scope='window', objreg.register('completer', completer_obj, scope='window',
window=win_id) window=win_id)
self.enabled = config.get('completion', 'show') self.enabled = config.get('completion', 'show')

View File

@ -72,6 +72,7 @@ class MainWindow(QWidget):
def __init__(self, win_id, parent=None): def __init__(self, win_id, parent=None):
super().__init__(parent) super().__init__(parent)
self.setAttribute(Qt.WA_DeleteOnClose)
self._commandrunner = None self._commandrunner = None
self.win_id = win_id self.win_id = win_id
self.registry = objreg.ObjectRegistry() self.registry = objreg.ObjectRegistry()

View File

@ -19,6 +19,8 @@
"""Prompt shown in the statusbar.""" """Prompt shown in the statusbar."""
import functools
from PyQt5.QtCore import pyqtSignal from PyQt5.QtCore import pyqtSignal
from PyQt5.QtWidgets import QHBoxLayout, QWidget, QLineEdit from PyQt5.QtWidgets import QHBoxLayout, QWidget, QLineEdit
@ -69,6 +71,9 @@ class Prompt(QWidget):
prompter_obj = prompter.Prompter(win_id) prompter_obj = prompter.Prompter(win_id)
objreg.register('prompter', prompter_obj, scope='window', objreg.register('prompter', prompter_obj, scope='window',
window=win_id) window=win_id)
self.destroyed.connect(
functools.partial(objreg.delete, 'prompter', scope='window',
window=win_id))
def __repr__(self): def __repr__(self):
return utils.get_repr(self) return utils.get_repr(self)

View File

@ -113,6 +113,9 @@ class TabbedBrowser(tabwidget.TabWidget):
dispatcher = commands.CommandDispatcher(win_id) dispatcher = commands.CommandDispatcher(win_id)
objreg.register('command-dispatcher', dispatcher, scope='window', objreg.register('command-dispatcher', dispatcher, scope='window',
window=win_id) window=win_id)
self.destroyed.connect(
functools.partial(objreg.delete, 'command-dispatcher',
scope='window', window=win_id))
self._now_focused = None self._now_focused = None
# FIXME adjust this to font size # FIXME adjust this to font size
self.setIconSize(QSize(12, 12)) self.setIconSize(QSize(12, 12))