Skip to content

Commit

Permalink
Clean up correctly when a window is closed.
Browse files Browse the repository at this point in the history
  • Loading branch information
The-Compiler committed Sep 29, 2014
1 parent b84eb6a commit e6fe358
Show file tree
Hide file tree
Showing 6 changed files with 30 additions and 2 deletions.
5 changes: 5 additions & 0 deletions qutebrowser/keyinput/modeman.py
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,8 @@
manager: The ModeManager instance.
"""

import functools

from PyQt5.QtGui import QWindow
from PyQt5.QtCore import pyqtSignal, QObject, QEvent
from PyQt5.QtWidgets import QApplication
Expand Down Expand Up @@ -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)
Expand Down
16 changes: 15 additions & 1 deletion qutebrowser/utils/objreg.py
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand Down Expand Up @@ -68,12 +70,24 @@ def __setitem__(self, name, obj):
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 = []
Expand Down
2 changes: 1 addition & 1 deletion qutebrowser/widgets/completion.py
Original file line number Diff line number Diff line change
Expand Up @@ -94,7 +94,7 @@ def __init__(self, win_id, parent=None):
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')
Expand Down
1 change: 1 addition & 0 deletions qutebrowser/widgets/mainwindow.py
Original file line number Diff line number Diff line change
Expand Up @@ -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()
Expand Down
5 changes: 5 additions & 0 deletions qutebrowser/widgets/statusbar/prompt.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,8 @@

"""Prompt shown in the statusbar."""

import functools

from PyQt5.QtCore import pyqtSignal
from PyQt5.QtWidgets import QHBoxLayout, QWidget, QLineEdit

Expand Down Expand Up @@ -69,6 +71,9 @@ def __init__(self, win_id, parent=None):
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)
3 changes: 3 additions & 0 deletions qutebrowser/widgets/tabbedbrowser.py
Original file line number Diff line number Diff line change
Expand Up @@ -113,6 +113,9 @@ def __init__(self, win_id, parent=None):
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))
Expand Down

0 comments on commit e6fe358

Please sign in to comment.