screenShield: Fix pointer motion signal 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
This commit is contained in:
parent
2b44fa893f
commit
6758746f25
@ -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) {
|
_hideLockScreen(animate) {
|
||||||
if (this._lockScreenState == MessageTray.State.HIDDEN)
|
if (this._lockScreenState == MessageTray.State.HIDDEN)
|
||||||
return;
|
return;
|
||||||
@ -364,7 +383,7 @@ var ScreenShield = class {
|
|||||||
this._hideLockScreenComplete();
|
this._hideLockScreenComplete();
|
||||||
}
|
}
|
||||||
|
|
||||||
this._cursorTracker.set_pointer_visible(true);
|
this._showPointer();
|
||||||
}
|
}
|
||||||
|
|
||||||
_ensureUnlockDialog(allowCancel) {
|
_ensureUnlockDialog(allowCancel) {
|
||||||
@ -435,15 +454,7 @@ var ScreenShield = class {
|
|||||||
}
|
}
|
||||||
|
|
||||||
_lockScreenShown(params) {
|
_lockScreenShown(params) {
|
||||||
let motionId = global.stage.connect('captured-event', (stage, event) => {
|
this._hidePointerUntilMotion();
|
||||||
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._lockScreenState = MessageTray.State.SHOWN;
|
this._lockScreenState = MessageTray.State.SHOWN;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user