Clean up correctly when a window is closed.
This commit is contained in:
parent
b84eb6aeb0
commit
e6fe358d73
@ -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)
|
||||
|
@ -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 = []
|
||||
|
@ -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')
|
||||
|
@ -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()
|
||||
|
@ -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)
|
||||
|
@ -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))
|
||||
|
Loading…
Reference in New Issue
Block a user