mirror of
https://github.com/AvengeMedia/DankMaterialShell.git
synced 2026-06-23 11:35:25 -04:00
portal: add bidirectional syncing with freedesktop color-scheme, read in
addition to the existing write
This commit is contained in:
+12
-27
@@ -175,8 +175,7 @@ Item {
|
||||
property bool barSurfacesLoaded: true
|
||||
|
||||
function recreateBarSurfaces() {
|
||||
log.info("Recreating bar surfaces, screens:", Quickshell.screens.length,
|
||||
Quickshell.screens.map(s => s.name).join(","));
|
||||
log.info("Recreating bar surfaces, screens:", Quickshell.screens.length, Quickshell.screens.map(s => s.name).join(","));
|
||||
if (barSurfacesLoaded)
|
||||
barSurfacesLoaded = false;
|
||||
barSurfaceReloadAction.schedule();
|
||||
@@ -345,12 +344,7 @@ Item {
|
||||
}
|
||||
|
||||
function triggerSurfaceRecovery(source) {
|
||||
log.info("Surface recovery triggered by:", source,
|
||||
"screens:", Quickshell.screens.length,
|
||||
Quickshell.screens.map(s => s.name).join(","),
|
||||
"barLoaded:", root.barSurfacesLoaded,
|
||||
"frameLoaded:", root.frameSurfacesLoaded,
|
||||
"dockEnabled:", root.dockEnabled);
|
||||
log.info("Surface recovery triggered by:", source, "screens:", Quickshell.screens.length, Quickshell.screens.map(s => s.name).join(","), "barLoaded:", root.barSurfacesLoaded, "frameLoaded:", root.frameSurfacesLoaded, "dockEnabled:", root.dockEnabled);
|
||||
surfaceResumeRecoveryTimer.pass = 0;
|
||||
surfaceResumeRecoveryTimer.interval = 800;
|
||||
surfaceResumeRecoveryTimer.restart();
|
||||
@@ -361,15 +355,11 @@ Item {
|
||||
function onScreensChanged() {
|
||||
const hasReal = root._hasRealScreen();
|
||||
const currentNames = root._getRealScreenNames();
|
||||
log.info("Screens changed:", Quickshell.screens.length,
|
||||
Quickshell.screens.map(s => "'" + s.name + "'").join(","),
|
||||
"hasReal:", hasReal, "hadReal:", root.hadRealScreen);
|
||||
log.info("Screens changed:", Quickshell.screens.length, Quickshell.screens.map(s => "'" + s.name + "'").join(","), "hasReal:", hasReal, "hadReal:", root.hadRealScreen);
|
||||
const fullReconnect = !root.hadRealScreen && hasReal;
|
||||
const partialReconnect = root.previousRealScreenNames.length > 0
|
||||
&& currentNames.some(name => !root.previousRealScreenNames.includes(name));
|
||||
const partialReconnect = root.previousRealScreenNames.length > 0 && currentNames.some(name => !root.previousRealScreenNames.includes(name));
|
||||
if (fullReconnect || partialReconnect) {
|
||||
log.info("Screen reconnect detected, scheduling surface recovery",
|
||||
"full:", fullReconnect, "partial:", partialReconnect);
|
||||
log.info("Screen reconnect detected, scheduling surface recovery", "full:", fullReconnect, "partial:", partialReconnect);
|
||||
root.scheduleScreenReconnectRecovery();
|
||||
}
|
||||
root.hadRealScreen = hasReal;
|
||||
@@ -429,9 +419,7 @@ Item {
|
||||
property int pass: 0
|
||||
onTriggered: {
|
||||
pass++;
|
||||
log.info("Surface recovery pass", pass,
|
||||
"screens:", Quickshell.screens.length,
|
||||
Quickshell.screens.map(s => s.name).join(","));
|
||||
log.info("Surface recovery pass", pass, "screens:", Quickshell.screens.length, Quickshell.screens.map(s => s.name).join(","));
|
||||
|
||||
root.recreateBarSurfaces();
|
||||
|
||||
@@ -457,11 +445,12 @@ Item {
|
||||
|
||||
Component.onCompleted: {
|
||||
dockRecreateDebounce.start();
|
||||
// Force PolkitService singleton to initialize
|
||||
PolkitService.polkitAvailable;
|
||||
// Force DisplayConfigState singleton to initialize so auto-config runs at startup
|
||||
DisplayConfigState.hasOutputBackend;
|
||||
loginSoundTimer.start();
|
||||
|
||||
// These are dummy references just to trigger the singletons onCompleted to trigger
|
||||
PolkitService.polkitAvailable;
|
||||
DisplayConfigState.hasOutputBackend;
|
||||
PortalService.systemColorScheme;
|
||||
}
|
||||
|
||||
Loader {
|
||||
@@ -1041,11 +1030,7 @@ Item {
|
||||
target: SessionService
|
||||
|
||||
function onSessionResumed() {
|
||||
log.info("Session resumed: screens:", Quickshell.screens.length,
|
||||
Quickshell.screens.map(s => s.name).join(","),
|
||||
"barLoaded:", root.barSurfacesLoaded,
|
||||
"frameLoaded:", root.frameSurfacesLoaded,
|
||||
"dockEnabled:", root.dockEnabled);
|
||||
log.info("Session resumed: screens:", Quickshell.screens.length, Quickshell.screens.map(s => s.name).join(","), "barLoaded:", root.barSurfacesLoaded, "frameLoaded:", root.frameSurfacesLoaded, "dockEnabled:", root.dockEnabled);
|
||||
|
||||
root.pendingOsdResumeReloads = 2;
|
||||
osdResumeRecreateTimer.interval = 400;
|
||||
|
||||
@@ -58,6 +58,7 @@ Singleton {
|
||||
signal openUrlRequested(string url)
|
||||
signal appPickerRequested(var data)
|
||||
signal screensaverStateUpdate(var data)
|
||||
signal freedesktopStateUpdate(var data)
|
||||
signal clipboardStateUpdate(var data)
|
||||
signal locationStateUpdate(var data)
|
||||
signal sysupdateStateUpdate(var data)
|
||||
@@ -384,6 +385,8 @@ Singleton {
|
||||
screensaverInhibited = data.inhibited || false;
|
||||
screensaverInhibitors = data.inhibitors || [];
|
||||
screensaverStateUpdate(data);
|
||||
} else if (service === "freedesktop") {
|
||||
freedesktopStateUpdate(data);
|
||||
} else if (service === "dbus") {
|
||||
dbusSignalReceived(data.subscriptionId || "", data);
|
||||
} else if (service === "clipboard") {
|
||||
|
||||
@@ -87,17 +87,22 @@ Singleton {
|
||||
}
|
||||
}
|
||||
|
||||
function getSystemColorScheme() {
|
||||
if (typeof SettingsData !== "undefined" && SettingsData.syncModeWithPortal === false) {
|
||||
function evaluateColorScheme() {
|
||||
if (typeof SettingsData === "undefined" || !SettingsData.syncModeWithPortal)
|
||||
return;
|
||||
}
|
||||
if (!freedeskAvailable)
|
||||
if (!settingsPortalAvailable)
|
||||
return;
|
||||
DMSService.sendRequest("freedesktop.settings.getColorScheme", null, response => {
|
||||
if (response.result) {
|
||||
systemColorScheme = response.result.value || 0;
|
||||
}
|
||||
});
|
||||
if (typeof SessionData !== "undefined" && SessionData.themeModeAutoEnabled)
|
||||
return;
|
||||
if (typeof Theme === "undefined")
|
||||
return;
|
||||
// Defer mid-generation: setLightMode's regen would be dropped, and DMS's own transient color-scheme toggle would be misread. Re-run on worker completion.
|
||||
if (Theme.workerRunning)
|
||||
return;
|
||||
const shouldBeLight = systemColorScheme !== 1;
|
||||
if (Theme.isLightMode === shouldBeLight)
|
||||
return;
|
||||
Theme.setLightMode(shouldBeLight, true, false);
|
||||
}
|
||||
|
||||
function setLightMode(isLightMode) {
|
||||
@@ -176,6 +181,36 @@ Singleton {
|
||||
colorSchemeDetector.running = true;
|
||||
}
|
||||
|
||||
Connections {
|
||||
target: typeof SettingsData !== "undefined" ? SettingsData : null
|
||||
|
||||
function onSyncModeWithPortalChanged() {
|
||||
if (SettingsData.syncModeWithPortal)
|
||||
root.evaluateColorScheme();
|
||||
}
|
||||
}
|
||||
|
||||
Connections {
|
||||
target: DMSService
|
||||
|
||||
function onFreedesktopStateUpdate(data) {
|
||||
if (!data || !data.settings)
|
||||
return;
|
||||
root.settingsPortalAvailable = data.settings.available === true;
|
||||
root.systemColorScheme = data.settings.colorScheme || 0;
|
||||
root.evaluateColorScheme();
|
||||
}
|
||||
}
|
||||
|
||||
Connections {
|
||||
target: typeof Theme !== "undefined" ? Theme : null
|
||||
|
||||
function onWorkerRunningChanged() {
|
||||
if (!Theme.workerRunning)
|
||||
root.evaluateColorScheme();
|
||||
}
|
||||
}
|
||||
|
||||
Connections {
|
||||
target: DMSService
|
||||
|
||||
@@ -232,9 +267,8 @@ Singleton {
|
||||
DMSService.sendRequest("freedesktop.getState", null, response => {
|
||||
if (response.result && response.result.settings) {
|
||||
settingsPortalAvailable = response.result.settings.available || false;
|
||||
if (settingsPortalAvailable && SettingsData.syncModeWithPortal) {
|
||||
getSystemColorScheme();
|
||||
}
|
||||
systemColorScheme = response.result.settings.colorScheme || 0;
|
||||
evaluateColorScheme();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user