From 451f30c9e1472083f4eca9b88dec06970a973708 Mon Sep 17 00:00:00 2001 From: affederaffe <68356204+affederaffe@users.noreply.github.com> Date: Wed, 10 May 2023 01:05:21 +0200 Subject: [PATCH] Fix color scheme hot switching --- .../DBusPlatformSettings.cs | 37 ++++++++++--------- 1 file changed, 19 insertions(+), 18 deletions(-) diff --git a/src/Avalonia.FreeDesktop/DBusPlatformSettings.cs b/src/Avalonia.FreeDesktop/DBusPlatformSettings.cs index 8b2b38bb82..e6ea880b6a 100644 --- a/src/Avalonia.FreeDesktop/DBusPlatformSettings.cs +++ b/src/Avalonia.FreeDesktop/DBusPlatformSettings.cs @@ -32,29 +32,35 @@ namespace Avalonia.FreeDesktop try { var value = await _settings!.ReadAsync("org.freedesktop.appearance", "color-scheme"); - _themeVariant = ReadAsColorScheme(value); + _themeVariant = ToColorScheme(((value.Value as DBusVariantItem)!.Value as DBusUInt32Item)!.Value); } catch (Exception ex) { Logger.TryGet(LogEventLevel.Error, LogArea.FreeDesktopPlatform)?.Log(this, "Unable to get org.freedesktop.appearance.color-scheme value", ex); } + _accentColor = await TryGetAccentColorAsync(); + + _lastColorValues = BuildPlatformColorValues(); + if (_lastColorValues is not null) + OnColorValuesChanged(_lastColorValues); + } + + private async Task TryGetAccentColorAsync() + { try { var value = await _settings!.ReadAsync("org.kde.kdeglobals.General", "AccentColor"); - _accentColor = ReadAsAccentColor(value); + return ToAccentColor(((value.Value as DBusVariantItem)!.Value as DBusStringItem)!.Value); } catch (Exception ex) { Logger.TryGet(LogEventLevel.Error, LogArea.FreeDesktopPlatform)?.Log(this, "Unable to get org.kde.kdeglobals.General.AccentColor value", ex); + return null; } - - _lastColorValues = BuildPlatformColorValues(); - if (_lastColorValues is not null) - OnColorValuesChanged(_lastColorValues); } - private void SettingsChangedHandler(Exception? exception, (string @namespace, string key, DBusVariantItem value) valueTuple) + private async void SettingsChangedHandler(Exception? exception, (string @namespace, string key, DBusVariantItem value) valueTuple) { if (exception is not null) return; @@ -62,12 +68,8 @@ namespace Avalonia.FreeDesktop switch (valueTuple) { case ("org.freedesktop.appearance", "color-scheme", { } colorScheme): - _themeVariant = ReadAsColorScheme(colorScheme); - _lastColorValues = BuildPlatformColorValues(); - OnColorValuesChanged(_lastColorValues!); - break; - case ("org.kde.kdeglobals.General", "AccentColor", { } accentColor): - _accentColor = ReadAsAccentColor(accentColor); + _themeVariant = ToColorScheme((colorScheme.Value as DBusUInt32Item)!.Value); + _accentColor = await TryGetAccentColorAsync(); _lastColorValues = BuildPlatformColorValues(); OnColorValuesChanged(_lastColorValues!); break; @@ -85,21 +87,20 @@ namespace Avalonia.FreeDesktop return null; } - private static PlatformThemeVariant ReadAsColorScheme(DBusVariantItem value) + private static PlatformThemeVariant ToColorScheme(uint value) { /* 0: No preference 1: Prefer dark appearance 2: Prefer light appearance */ - var isDark = ((value.Value as DBusVariantItem)!.Value as DBusUInt32Item)!.Value == 1; + var isDark = value == 1; return isDark ? PlatformThemeVariant.Dark : PlatformThemeVariant.Light; } - private static Color ReadAsAccentColor(DBusVariantItem value) + private static Color ToAccentColor(string value) { - var colorStr = ((value.Value as DBusVariantItem)!.Value as DBusStringItem)!.Value; - var rgb = colorStr.Split(','); + var rgb = value.Split(','); return new Color(255, byte.Parse(rgb[0]), byte.Parse(rgb[1]), byte.Parse(rgb[2])); } }