screenShield: Don't unnecessarily close or recreate inhibitors
ScreenShield::_syncInhibitor() was closing (and recreating) the inhibitor everytime it was called, even if no change was needed. This gets called in various places, including on property changes in the login1 dbus object. These happen by the time logind already started suspending at which point new inhibitors can no longer be created. It is only waiting for existing inhibitors to be closed, so closing the inhibitor without a new inhibitor will cause the suspending to proceed immediately if no other inhibitors are present. This can also happen before the lock screen is shown, which will then complete after resume. Fix this by keeping track of the expected inhibition state and only create or close inhibitors if there was a change to that. Fixes https://gitlab.gnome.org/GNOME/gnome-shell/-/issues/3736 Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1927>
This commit is contained in:
parent
4a3e3ee1b8
commit
fb313033ea
@ -122,6 +122,7 @@ var ScreenShield = class {
|
|||||||
this._isActive = false;
|
this._isActive = false;
|
||||||
this._isLocked = false;
|
this._isLocked = false;
|
||||||
this._inUnlockAnimation = false;
|
this._inUnlockAnimation = false;
|
||||||
|
this._inhibited = false;
|
||||||
this._activationTime = 0;
|
this._activationTime = 0;
|
||||||
this._becameActiveId = 0;
|
this._becameActiveId = 0;
|
||||||
this._lockTimeoutId = 0;
|
this._lockTimeoutId = 0;
|
||||||
@ -203,20 +204,29 @@ var ScreenShield = class {
|
|||||||
}
|
}
|
||||||
|
|
||||||
_syncInhibitor() {
|
_syncInhibitor() {
|
||||||
let lockEnabled = this._settings.get_boolean(LOCK_ENABLED_KEY);
|
const lockEnabled = this._settings.get_boolean(LOCK_ENABLED_KEY);
|
||||||
let lockLocked = this._lockSettings.get_boolean(DISABLE_LOCK_KEY);
|
const lockLocked = this._lockSettings.get_boolean(DISABLE_LOCK_KEY);
|
||||||
let inhibit = this._loginSession && this._loginSession.Active &&
|
const inhibit = !!this._loginSession && this._loginSession.Active &&
|
||||||
!this._isActive && lockEnabled && !lockLocked && Main.sessionMode.unlockDialog;
|
!this._isActive && lockEnabled && !lockLocked &&
|
||||||
|
!!Main.sessionMode.unlockDialog;
|
||||||
|
|
||||||
|
if (inhibit === this._inhibited)
|
||||||
|
return;
|
||||||
|
|
||||||
|
this._inhibited = inhibit;
|
||||||
|
|
||||||
if (inhibit) {
|
if (inhibit) {
|
||||||
this._loginManager.inhibit(_("GNOME needs to lock the screen"),
|
this._loginManager.inhibit(_('GNOME needs to lock the screen'),
|
||||||
inhibitor => {
|
inhibitor => {
|
||||||
if (this._inhibitor)
|
if (inhibitor) {
|
||||||
this._inhibitor.close(null);
|
if (this._inhibitor)
|
||||||
this._inhibitor = inhibitor;
|
inhibitor.close(null);
|
||||||
|
else
|
||||||
|
this._inhibitor = inhibitor;
|
||||||
|
}
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
if (this._inhibitor)
|
this._inhibitor?.close(null);
|
||||||
this._inhibitor.close(null);
|
|
||||||
this._inhibitor = null;
|
this._inhibitor = null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user