screenShield: Asyncify _syncInhibitor()

Fixes: https://gitlab.gnome.org/GNOME/gnome-shell/-/issues/4553
Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1952>
This commit is contained in:
Sebastian Keller 2021-08-15 02:18:12 +02:00
parent 85075192f3
commit 5791e257e7
2 changed files with 23 additions and 31 deletions

View File

@ -188,19 +188,14 @@ var LoginManagerSystemd = class {
this._proxy.SuspendRemote(true); this._proxy.SuspendRemote(true);
} }
async inhibit(reason, callback) { async inhibit(reason, cancellable) {
try {
const inVariant = new GLib.Variant('(ssss)', const inVariant = new GLib.Variant('(ssss)',
['sleep', 'GNOME Shell', reason, 'delay']); ['sleep', 'GNOME Shell', reason, 'delay']);
const [outVariant_, fdList] = const [outVariant_, fdList] =
await this._proxy.call_with_unix_fd_list('Inhibit', await this._proxy.call_with_unix_fd_list('Inhibit',
inVariant, 0, -1, null, null); inVariant, 0, -1, null, cancellable);
const [fd] = fdList.steal_fds(); const [fd] = fdList.steal_fds();
callback(new Gio.UnixInputStream({ fd })); return new Gio.UnixInputStream({ fd });
} catch (e) {
logError(e, 'Error getting systemd inhibitor');
callback(null);
}
} }
_prepareForSleep(proxy, sender, [aboutToSuspend]) { _prepareForSleep(proxy, sender, [aboutToSuspend]) {
@ -236,8 +231,9 @@ var LoginManagerDummy = class {
this.emit('prepare-for-sleep', false); this.emit('prepare-for-sleep', false);
} }
inhibit(reason, callback) { /* eslint-disable-next-line require-await */
callback(null); async inhibit() {
return null;
} }
}; };
Signals.addSignalMethods(LoginManagerDummy.prototype); Signals.addSignalMethods(LoginManagerDummy.prototype);

View File

@ -203,7 +203,7 @@ var ScreenShield = class {
return this._isModal; return this._isModal;
} }
_syncInhibitor() { async _syncInhibitor() {
const lockEnabled = this._settings.get_boolean(LOCK_ENABLED_KEY); const lockEnabled = this._settings.get_boolean(LOCK_ENABLED_KEY);
const lockLocked = this._lockSettings.get_boolean(DISABLE_LOCK_KEY); const lockLocked = this._lockSettings.get_boolean(DISABLE_LOCK_KEY);
const inhibit = !!this._loginSession && this._loginSession.Active && const inhibit = !!this._loginSession && this._loginSession.Active &&
@ -215,22 +215,18 @@ var ScreenShield = class {
this._inhibited = inhibit; this._inhibited = inhibit;
if (inhibit) { this._inhibitCancellable?.cancel();
this._loginManager.inhibit(_('GNOME needs to lock the screen'), this._inhibitCancellable = new Gio.Cancellable();
inhibitor => {
if (inhibitor) {
if (this._inhibitor)
inhibitor.close(null);
else
this._inhibitor = inhibitor;
}
// Handle uninhibits that happened after the start if (inhibit) {
if (!this._inhibited) { try {
this._inhibitor?.close(null); this._inhibitor = await this._loginManager.inhibit(
this._inhibitor = null; _('GNOME needs to lock the screen'),
this._inhibitCancellable);
} catch (e) {
if (!e.matches(Gio.IOErrorEnum, Gio.IOErrorEnum.CANCELLED))
log('Failed to inhibit suspend: %s'.format(e.message));
} }
});
} else { } else {
this._inhibitor?.close(null); this._inhibitor?.close(null);
this._inhibitor = null; this._inhibitor = null;