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.
|
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)
|
||||||
|
@ -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 = []
|
||||||
|
@ -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')
|
||||||
|
@ -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()
|
||||||
|
@ -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)
|
||||||
|
@ -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))
|
||||||
|
Loading…
Reference in New Issue
Block a user