Browse Source

Fix color scheme hot switching

pull/11298/head
affederaffe 3 years ago
parent
commit
451f30c9e1
  1. 37
      src/Avalonia.FreeDesktop/DBusPlatformSettings.cs

37
src/Avalonia.FreeDesktop/DBusPlatformSettings.cs

@ -32,29 +32,35 @@ namespace Avalonia.FreeDesktop
try try
{ {
var value = await _settings!.ReadAsync("org.freedesktop.appearance", "color-scheme"); 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) catch (Exception ex)
{ {
Logger.TryGet(LogEventLevel.Error, LogArea.FreeDesktopPlatform)?.Log(this, "Unable to get org.freedesktop.appearance.color-scheme value", 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<Color?> TryGetAccentColorAsync()
{
try try
{ {
var value = await _settings!.ReadAsync("org.kde.kdeglobals.General", "AccentColor"); 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) catch (Exception ex)
{ {
Logger.TryGet(LogEventLevel.Error, LogArea.FreeDesktopPlatform)?.Log(this, "Unable to get org.kde.kdeglobals.General.AccentColor value", 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) if (exception is not null)
return; return;
@ -62,12 +68,8 @@ namespace Avalonia.FreeDesktop
switch (valueTuple) switch (valueTuple)
{ {
case ("org.freedesktop.appearance", "color-scheme", { } colorScheme): case ("org.freedesktop.appearance", "color-scheme", { } colorScheme):
_themeVariant = ReadAsColorScheme(colorScheme); _themeVariant = ToColorScheme((colorScheme.Value as DBusUInt32Item)!.Value);
_lastColorValues = BuildPlatformColorValues(); _accentColor = await TryGetAccentColorAsync();
OnColorValuesChanged(_lastColorValues!);
break;
case ("org.kde.kdeglobals.General", "AccentColor", { } accentColor):
_accentColor = ReadAsAccentColor(accentColor);
_lastColorValues = BuildPlatformColorValues(); _lastColorValues = BuildPlatformColorValues();
OnColorValuesChanged(_lastColorValues!); OnColorValuesChanged(_lastColorValues!);
break; break;
@ -85,21 +87,20 @@ namespace Avalonia.FreeDesktop
return null; return null;
} }
private static PlatformThemeVariant ReadAsColorScheme(DBusVariantItem value) private static PlatformThemeVariant ToColorScheme(uint value)
{ {
/* /*
<member>0: No preference</member> <member>0: No preference</member>
<member>1: Prefer dark appearance</member> <member>1: Prefer dark appearance</member>
<member>2: Prefer light appearance</member> <member>2: Prefer light appearance</member>
*/ */
var isDark = ((value.Value as DBusVariantItem)!.Value as DBusUInt32Item)!.Value == 1; var isDark = value == 1;
return isDark ? PlatformThemeVariant.Dark : PlatformThemeVariant.Light; 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 = value.Split(',');
var rgb = colorStr.Split(',');
return new Color(255, byte.Parse(rgb[0]), byte.Parse(rgb[1]), byte.Parse(rgb[2])); return new Color(255, byte.Parse(rgb[0]), byte.Parse(rgb[1]), byte.Parse(rgb[2]));
} }
} }

Loading…
Cancel
Save