From 853644d7fee0510a21289056a092a052be4527a2 Mon Sep 17 00:00:00 2001 From: Georges Basile Stavracas Neto Date: Thu, 26 Nov 2020 15:10:11 -0300 Subject: [PATCH] appDisplay: Properly destroy SwipeTracker on destroy SwipeTracker connects to signals of the stage, but doesn't disconnect on destroy, leaving them hanging and potentially running callbacks for destroyed objects. This is visible when removing a folder by dragging all icons out, and running the swipe gestures, which will produce a bunch of warnings. Explicitly destroy, remove, and disconnect the swipe tracker. Part-of: --- js/ui/appDisplay.js | 6 ++++++ js/ui/swipeTracker.js | 22 +++++++++++++++++++++- 2 files changed, 27 insertions(+), 1 deletion(-) diff --git a/js/ui/appDisplay.js b/js/ui/appDisplay.js index ac92d2fd9..c5fa78ee6 100644 --- a/js/ui/appDisplay.js +++ b/js/ui/appDisplay.js @@ -217,6 +217,12 @@ var BaseAppView = GObject.registerClass({ this._parentalControlsManager.disconnect(this._appFilterChangedId); this._appFilterChangedId = 0; } + + if (this._swipeTracker) { + this._swipeTracker.destroy(); + delete this._swipeTracker; + } + this._removeDelayedMove(); this._disconnectDnD(); } diff --git a/js/ui/swipeTracker.js b/js/ui/swipeTracker.js index a638d7801..fd13fd725 100644 --- a/js/ui/swipeTracker.js +++ b/js/ui/swipeTracker.js @@ -54,7 +54,8 @@ const TouchpadSwipeGesture = GObject.registerClass({ this._orientation = Clutter.Orientation.VERTICAL; this._enabled = true; - global.stage.connect('captured-event::touchpad', this._handleEvent.bind(this)); + this._stageCaptureEvent = + global.stage.connect('captured-event::touchpad', this._handleEvent.bind(this)); } get enabled() { @@ -125,6 +126,13 @@ const TouchpadSwipeGesture = GObject.registerClass({ return Clutter.EVENT_STOP; } + + destroy() { + if (this._stageCaptureEvent) { + global.stage.disconnect(this._stageCaptureEvent); + delete this._stageCaptureEvent; + } + } }); const TouchSwipeGesture = GObject.registerClass({ @@ -643,4 +651,16 @@ var SwipeTracker = GObject.registerClass({ this._velocity = 0; this._state = State.SCROLLING; } + + destroy() { + if (this._touchpadGesture) { + this._touchpadGesture.destroy(); + delete this._touchpadGesture; + } + + if (this._touchGesture) { + global.stage.remove_action(this._touchGesture); + delete this._touchGesture; + } + } });