Merge pull request #2 from Quinta0/claude/gnome-wallpaper-auto-rotation-r1ailq
Fix login freeze: make the UPower proxy lookup async, not blocking
This commit was merged in pull request #2.
This commit is contained in:
+24
-7
@@ -7,6 +7,8 @@ import * as Main from 'resource:///org/gnome/shell/ui/main.js';
|
||||
import {SettingsKey} from './settingsKeys.js';
|
||||
import {loadGstreamerModules, GSTREAMER_INSTALL_HINT} from './gstreamerAvailability.js';
|
||||
|
||||
Gio._promisify(Gio.DBusProxy, 'new_for_bus', 'new_for_bus_finish');
|
||||
|
||||
/**
|
||||
* Ways to get a decoded frame onto an actor, tried in order and "pinned"
|
||||
* once one works. `new Clutter.Image()` failed with "is not a constructor"
|
||||
@@ -79,6 +81,7 @@ export class LiveWallpaperManager {
|
||||
this._fullscreenChangedId = 0;
|
||||
this._upowerProxy = null;
|
||||
this._upowerSignalId = 0;
|
||||
this._powerWatchGeneration = 0;
|
||||
|
||||
this._frameCount = 0;
|
||||
this._pollCount = 0;
|
||||
@@ -428,19 +431,33 @@ export class LiveWallpaperManager {
|
||||
this._logger.debug(`Fullscreen tracking unavailable, pause-when-fullscreen disabled (${e.message ?? e})`);
|
||||
}
|
||||
|
||||
try {
|
||||
this._upowerProxy = Gio.DBusProxy.new_for_bus_sync(
|
||||
// Deliberately async: the *_sync() variant blocks gnome-shell's
|
||||
// single main thread (it *is* the compositor) until the system bus
|
||||
// replies, which can take many seconds — or the full ~25s GDBus
|
||||
// timeout — if upowerd is still starting up or the bus is busy,
|
||||
// exactly the conditions right after login. That froze the entire
|
||||
// screen (and could make the session look hung/crashed) since this
|
||||
// runs every time live wallpaper starts, including automatically
|
||||
// at login whenever it was left enabled.
|
||||
const watchGeneration = ++this._powerWatchGeneration;
|
||||
Gio.DBusProxy.new_for_bus(
|
||||
Gio.BusType.SYSTEM, Gio.DBusProxyFlags.NONE, null,
|
||||
'org.freedesktop.UPower', '/org/freedesktop/UPower', 'org.freedesktop.UPower', null);
|
||||
this._upowerSignalId = this._upowerProxy.connect(
|
||||
'g-properties-changed', () => this._checkBattery());
|
||||
'org.freedesktop.UPower', '/org/freedesktop/UPower', 'org.freedesktop.UPower', null)
|
||||
.then(proxy => {
|
||||
if (watchGeneration !== this._powerWatchGeneration)
|
||||
return; // Superseded by a _stop()/_connectPowerWatches() while this was in flight.
|
||||
this._upowerProxy = proxy;
|
||||
this._upowerSignalId = proxy.connect('g-properties-changed', () => this._checkBattery());
|
||||
this._checkBattery();
|
||||
} catch (e) {
|
||||
})
|
||||
.catch(e => {
|
||||
this._logger.debug(`UPower unavailable, pause-on-battery disabled (${e.message ?? e})`);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
_disconnectPowerWatches() {
|
||||
this._powerWatchGeneration++;
|
||||
|
||||
if (this._fullscreenChangedId) {
|
||||
global.display.disconnect(this._fullscreenChangedId);
|
||||
this._fullscreenChangedId = 0;
|
||||
|
||||
Reference in New Issue
Block a user