mirror of
https://github.com/AvengeMedia/DankMaterialShell.git
synced 2026-08-06 13:38:28 -04:00
theme: prevent failed portal writes from reverting theme mode
related: #2786 port 1.5
This commit is contained in:
@@ -260,15 +260,15 @@ func Run(opts Options) error {
|
|||||||
return buildErr
|
return buildErr
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if opts.SyncModeWithPortal {
|
||||||
|
syncColorScheme(opts.Mode)
|
||||||
|
}
|
||||||
|
|
||||||
if !changed {
|
if !changed {
|
||||||
log.Info("No color changes detected, skipping refresh")
|
log.Info("No color changes detected, skipping refresh")
|
||||||
return ErrNoChanges
|
return ErrNoChanges
|
||||||
}
|
}
|
||||||
|
|
||||||
if opts.SyncModeWithPortal {
|
|
||||||
syncColorScheme(opts.Mode)
|
|
||||||
}
|
|
||||||
|
|
||||||
log.Info("Done")
|
log.Info("Done")
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
@@ -1006,6 +1006,13 @@ func syncColorScheme(mode ColorMode) {
|
|||||||
scheme = "default"
|
scheme = "default"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if cur, err := utils.GsettingsGet("org.gnome.desktop.interface", "color-scheme"); err == nil {
|
||||||
|
cur = strings.Trim(cur, "'")
|
||||||
|
if cur == scheme || (mode == ColorModeLight && cur == "prefer-light") {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if err := utils.GsettingsSet("org.gnome.desktop.interface", "color-scheme", scheme); err != nil {
|
if err := utils.GsettingsSet("org.gnome.desktop.interface", "color-scheme", scheme); err != nil {
|
||||||
log.Warnf("Failed to sync color-scheme: %v", err)
|
log.Warnf("Failed to sync color-scheme: %v", err)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1336,9 +1336,7 @@ Singleton {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (!isGreeterMode) {
|
if (!isGreeterMode) {
|
||||||
if (!matugenAvailable) {
|
PortalService.setLightMode(light);
|
||||||
PortalService.setLightMode(light);
|
|
||||||
}
|
|
||||||
if (typeof SettingsData !== "undefined") {
|
if (typeof SettingsData !== "undefined") {
|
||||||
SettingsData.updateCosmicThemeMode(light);
|
SettingsData.updateCosmicThemeMode(light);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -16,6 +16,7 @@ Singleton {
|
|||||||
property string profileImage: ""
|
property string profileImage: ""
|
||||||
property bool settingsPortalAvailable: false
|
property bool settingsPortalAvailable: false
|
||||||
property int systemColorScheme: 0
|
property int systemColorScheme: 0
|
||||||
|
property bool colorSchemeInitialized: false
|
||||||
|
|
||||||
property bool freedeskAvailable: false
|
property bool freedeskAvailable: false
|
||||||
property string colorSchemeCommand: ""
|
property string colorSchemeCommand: ""
|
||||||
@@ -97,15 +98,24 @@ Singleton {
|
|||||||
return typeof Theme !== "undefined";
|
return typeof Theme !== "undefined";
|
||||||
}
|
}
|
||||||
|
|
||||||
// Only follow values stable for the settle window — the opt-in GTK4-refresh toggle reverts within ~400ms and following it would loop.
|
// Follow only genuine portal transitions, debounced by the settle window — the
|
||||||
function evaluateColorScheme() {
|
// opt-in GTK4-refresh toggle reverts within ~400ms, and a stale portal value
|
||||||
|
// (broken gsettings→portal bridge) must never revert a DMS-initiated change.
|
||||||
|
function handlePortalColorScheme(scheme) {
|
||||||
|
const isTransition = colorSchemeInitialized && scheme !== systemColorScheme;
|
||||||
|
colorSchemeInitialized = true;
|
||||||
|
systemColorScheme = scheme;
|
||||||
|
|
||||||
if (!canSyncColorScheme())
|
if (!canSyncColorScheme())
|
||||||
return;
|
return;
|
||||||
const shouldBeLight = systemColorScheme !== 1;
|
|
||||||
|
const shouldBeLight = scheme !== 1;
|
||||||
if (Theme.isLightMode === shouldBeLight) {
|
if (Theme.isLightMode === shouldBeLight) {
|
||||||
colorSchemeSettleTimer.stop();
|
colorSchemeSettleTimer.stop();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
if (!isTransition)
|
||||||
|
return;
|
||||||
colorSchemeSettleTimer.restart();
|
colorSchemeSettleTimer.restart();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -138,13 +148,16 @@ Singleton {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
const targetScheme = isLightMode ? "default" : "prefer-dark";
|
const preferLight = isLightMode && systemColorScheme === 2;
|
||||||
|
const targetScheme = isLightMode ? (preferLight ? "prefer-light" : "default") : "prefer-dark";
|
||||||
|
|
||||||
if (colorSchemeCommand === "gsettings") {
|
switch (colorSchemeCommand) {
|
||||||
|
case "gsettings":
|
||||||
Quickshell.execDetached(["gsettings", "set", "org.gnome.desktop.interface", "color-scheme", targetScheme]);
|
Quickshell.execDetached(["gsettings", "set", "org.gnome.desktop.interface", "color-scheme", targetScheme]);
|
||||||
}
|
break;
|
||||||
if (colorSchemeCommand === "dconf") {
|
case "dconf":
|
||||||
Quickshell.execDetached(["dconf", "write", "/org/gnome/desktop/interface/color-scheme", `'${targetScheme}'`]);
|
Quickshell.execDetached(["dconf", "write", "/org/gnome/desktop/interface/color-scheme", `'${targetScheme}'`]);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -206,8 +219,11 @@ Singleton {
|
|||||||
target: typeof SettingsData !== "undefined" ? SettingsData : null
|
target: typeof SettingsData !== "undefined" ? SettingsData : null
|
||||||
|
|
||||||
function onSyncModeWithPortalChanged() {
|
function onSyncModeWithPortalChanged() {
|
||||||
if (SettingsData.syncModeWithPortal)
|
if (!SettingsData.syncModeWithPortal)
|
||||||
root.evaluateColorScheme();
|
return;
|
||||||
|
if (typeof Theme === "undefined")
|
||||||
|
return;
|
||||||
|
root.setSystemColorScheme(Theme.isLightMode);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -218,17 +234,7 @@ Singleton {
|
|||||||
if (!data || !data.settings)
|
if (!data || !data.settings)
|
||||||
return;
|
return;
|
||||||
root.settingsPortalAvailable = data.settings.available === true;
|
root.settingsPortalAvailable = data.settings.available === true;
|
||||||
root.systemColorScheme = data.settings.colorScheme || 0;
|
root.handlePortalColorScheme(data.settings.colorScheme || 0);
|
||||||
root.evaluateColorScheme();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Connections {
|
|
||||||
target: typeof Theme !== "undefined" ? Theme : null
|
|
||||||
|
|
||||||
function onWorkerRunningChanged() {
|
|
||||||
if (!Theme.workerRunning)
|
|
||||||
root.evaluateColorScheme();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -288,8 +294,7 @@ Singleton {
|
|||||||
DMSService.sendRequest("freedesktop.getState", null, response => {
|
DMSService.sendRequest("freedesktop.getState", null, response => {
|
||||||
if (response.result && response.result.settings) {
|
if (response.result && response.result.settings) {
|
||||||
settingsPortalAvailable = response.result.settings.available || false;
|
settingsPortalAvailable = response.result.settings.available || false;
|
||||||
systemColorScheme = response.result.settings.colorScheme || 0;
|
handlePortalColorScheme(response.result.settings.colorScheme || 0);
|
||||||
evaluateColorScheme();
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user