diff options
author | Ray Strode <rstrode@redhat.com> | 2020-09-28 22:28:08 -0400 |
---|---|---|
committer | Ray Strode <rstrode@redhat.com> | 2020-10-07 16:40:12 -0400 |
commit | 6f882f4718803e2984e124683b9975f6ab5b8e17 (patch) | |
tree | 7bbd431ffbc9276457634006ade89f9861ebe1ea | |
parent | 9963f7ce845362c59dac953a71fbac98f447c13d (diff) | |
download | gnome-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.js | 31 |
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; |