[gnome-shell] appDisplay: Properly destroy SwipeTracker on destroy



commit 853644d7fee0510a21289056a092a052be4527a2
Author: Georges Basile Stavracas Neto <georges stavracas gmail com>
Date:   Thu Nov 26 15:10:11 2020 -0300

    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: <https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1518>

 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 ac92d2fd9d..c5fa78ee61 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 a638d78019..fd13fd7252 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;
+        }
+    }
 });


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]