summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRay Strode <rstrode@redhat.com>2020-09-28 22:28:08 -0400
committerRay Strode <rstrode@redhat.com>2020-10-07 16:40:12 -0400
commit6f882f4718803e2984e124683b9975f6ab5b8e17 (patch)
tree7bbd431ffbc9276457634006ade89f9861ebe1ea
parent9963f7ce845362c59dac953a71fbac98f447c13d (diff)
downloadgnome-shell-wip/fix-screen-shield-motion-handler-leak.tar.gz
screenShield: Fix pointer motion signal handler leakwip/fix-screen-shield-motion-handler-leak
The screen shield code listens for motion events on the stage so that it can hide the pointer until the user moves the mouse. Unfortunately, if the user never moves the mouse, the signal handler connection gets leaked. This commit makes sure the connection gets disconnected when the shield goes away. https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1459
-rw-r--r--js/ui/screenShield.js31
1 files changed, 21 insertions, 10 deletions
diff --git a/js/ui/screenShield.js b/js/ui/screenShield.js
index b368162ce..52baae8ff 100644
--- a/js/ui/screenShield.js
+++ b/js/ui/screenShield.js
@@ -336,6 +336,25 @@ var ScreenShield = class {
}
}
+ _showPointer() {
+ this._cursorTracker.set_pointer_visible(true);
+
+ if (this._motionId) {
+ global.stage.disconnect(this._motionId);
+ this._motionId = 0;
+ }
+ }
+
+ _hidePointerUntilMotion() {
+ this._motionId = global.stage.connect('captured-event', (stage, event) => {
+ if (event.type() == Clutter.EventType.MOTION)
+ this._showPointer();
+
+ return Clutter.EVENT_PROPAGATE;
+ });
+ this._cursorTracker.set_pointer_visible(false);
+ }
+
_hideLockScreen(animate) {
if (this._lockScreenState == MessageTray.State.HIDDEN)
return;
@@ -364,7 +383,7 @@ var ScreenShield = class {
this._hideLockScreenComplete();
}
- this._cursorTracker.set_pointer_visible(true);
+ this._showPointer();
}
_ensureUnlockDialog(allowCancel) {
@@ -435,15 +454,7 @@ var ScreenShield = class {
}
_lockScreenShown(params) {
- let motionId = global.stage.connect('captured-event', (stage, event) => {
- if (event.type() == Clutter.EventType.MOTION) {
- this._cursorTracker.set_pointer_visible(true);
- global.stage.disconnect(motionId);
- }
-
- return Clutter.EVENT_PROPAGATE;
- });
- this._cursorTracker.set_pointer_visible(false);
+ this._hidePointerUntilMotion();
this._lockScreenState = MessageTray.State.SHOWN;