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.
"""
import functools
from PyQt5.QtGui import QWindow
from PyQt5.QtCore import pyqtSignal, QObject, QEvent
from PyQt5.QtWidgets import QApplication
@ -60,6 +62,9 @@ def init(win_id, parent):
KM.yesno: modeparsers.PromptKeyParser(win_id, modeman),
}
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.hint, keyparsers[KM.hint].handle)
modeman.register(KM.insert, keyparsers[KM.insert].handle, passthrough=True)

View File

@ -23,7 +23,9 @@
import collections
import functools
from PyQt5.QtCore import QObject
from PyQt5.QtCore import QObject, QTimer
from qutebrowser.utils import log
class UnsetObject:
@ -68,12 +70,24 @@ class ObjectRegistry(collections.UserDict):
super().__setitem__(name, obj)
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."""
log.misc.debug("destroyed: {}".format(name))
try:
del self[name]
except KeyError:
pass
def dump_objects(self):
"""Dump all objects as a list of strings."""
lines = []

View File

@ -94,7 +94,7 @@ class CompletionView(QTreeView):
super().__init__(parent)
self._win_id = 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',
window=win_id)
self.enabled = config.get('completion', 'show')

View File

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

View File

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

View File

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