From 8656102182da8f8d52c0cea7495aff1b43c3bf21 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marco=20Trevisan=20=28Trevi=C3=B1o=29?= Date: Mon, 12 Aug 2019 16:25:48 +0200 Subject: [PATCH] workspacesDisplay: Disconnect MetaLater and parent signals on destroy When the WorkspacesDisplay actor is destroyed we should remove the ongoing later and parent widget connections to avoid accessing an invalid object on callback. https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/700 --- js/ui/workspacesView.js | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/js/ui/workspacesView.js b/js/ui/workspacesView.js index af490e94a..8c1ba81a6 100644 --- a/js/ui/workspacesView.js +++ b/js/ui/workspacesView.js @@ -524,6 +524,22 @@ var WorkspacesDisplay = class { this._keyPressEventId = 0; this._fullGeometry = null; + + this.actor.connect('destroy', this._onDestroy.bind(this)); + } + + _onDestroy() { + if (this._notifyOpacityId) { + let parent = this.actor.get_parent(); + if (parent) + parent.disconnect(this._notifyOpacityId); + this._notifyOpacityId = 0; + } + + if (this._parentSetLater) { + Meta.later_remove(this._parentSetLater); + this._parentSetLater = 0; + } } _onPan(action) { @@ -717,7 +733,11 @@ var WorkspacesDisplay = class { oldParent.disconnect(this._notifyOpacityId); this._notifyOpacityId = 0; - Meta.later_add(Meta.LaterType.BEFORE_REDRAW, () => { + if (this._parentSetLater) + return; + + this._parentSetLater = Meta.later_add(Meta.LaterType.BEFORE_REDRAW, () => { + this._parentSetLater = 0; let newParent = this.actor.get_parent(); if (!newParent) return;