Browse Source

Add AccentColor support for KDE

pull/11108/head
affederaffe 3 years ago
parent
commit
1117332e4d
  1. 78
      src/Avalonia.FreeDesktop/DBusPlatformSettings.cs

78
src/Avalonia.FreeDesktop/DBusPlatformSettings.cs

@ -1,6 +1,7 @@
using System; using System;
using System.Threading.Tasks; using System.Threading.Tasks;
using Avalonia.Logging; using Avalonia.Logging;
using Avalonia.Media;
using Avalonia.Platform; using Avalonia.Platform;
using Tmds.DBus.SourceGenerator; using Tmds.DBus.SourceGenerator;
@ -9,7 +10,10 @@ namespace Avalonia.FreeDesktop
internal class DBusPlatformSettings : DefaultPlatformSettings internal class DBusPlatformSettings : DefaultPlatformSettings
{ {
private readonly OrgFreedesktopPortalSettings? _settings; private readonly OrgFreedesktopPortalSettings? _settings;
private PlatformColorValues? _lastColorValues; private PlatformColorValues? _lastColorValues;
private PlatformThemeVariant? _themeVariant;
private Color? _accentColor;
public DBusPlatformSettings() public DBusPlatformSettings()
{ {
@ -21,24 +25,33 @@ namespace Avalonia.FreeDesktop
_ = TryGetInitialValueAsync(); _ = TryGetInitialValueAsync();
} }
public override PlatformColorValues GetColorValues() public override PlatformColorValues GetColorValues() => _lastColorValues ?? base.GetColorValues();
{
return _lastColorValues ?? base.GetColorValues();
}
private async Task TryGetInitialValueAsync() private async Task TryGetInitialValueAsync()
{ {
try try
{ {
var value = await _settings!.ReadAsync("org.freedesktop.appearance", "color-scheme"); var value = await _settings!.ReadAsync("org.freedesktop.appearance", "color-scheme");
_lastColorValues = GetColorValuesFromSetting(value); _themeVariant = ReadAsColorScheme(value);
OnColorValuesChanged(_lastColorValues); }
catch (Exception ex)
{
Logger.TryGet(LogEventLevel.Error, LogArea.FreeDesktopPlatform)?.Log(this, "Unable to get org.freedesktop.appearance.color-scheme value", ex);
}
try
{
var value = await _settings!.ReadAsync("org.kde.kdeglobals.General", "AccentColor");
_accentColor = ReadAsAccentColor(value);
} }
catch (Exception ex) catch (Exception ex)
{ {
_lastColorValues = base.GetColorValues(); 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 setting value", ex);
} }
_lastColorValues = BuildPlatformColorValues();
if (_lastColorValues is not null)
OnColorValuesChanged(_lastColorValues);
} }
private void SettingsChangedHandler(Exception? exception, (string @namespace, string key, DBusVariantItem value) valueTuple) private void SettingsChangedHandler(Exception? exception, (string @namespace, string key, DBusVariantItem value) valueTuple)
@ -46,25 +59,48 @@ namespace Avalonia.FreeDesktop
if (exception is not null) if (exception is not null)
return; return;
if (valueTuple is ("org.freedesktop.appearance", "color-scheme", { } value)) switch (valueTuple)
{ {
/* case ("org.freedesktop.appearance", "color-scheme", { } colorScheme):
<member>0: No preference</member> /*
<member>1: Prefer dark appearance</member> <member>0: No preference</member>
<member>2: Prefer light appearance</member> <member>1: Prefer dark appearance</member>
*/ <member>2: Prefer light appearance</member>
_lastColorValues = GetColorValuesFromSetting(value); */
OnColorValuesChanged(_lastColorValues); _themeVariant = ReadAsColorScheme(colorScheme);
_lastColorValues = BuildPlatformColorValues();
OnColorValuesChanged(_lastColorValues!);
break;
case ("org.kde.kdeglobals.General", "AccentColor", { } accentColor):
_accentColor = ReadAsAccentColor(accentColor);
_lastColorValues = BuildPlatformColorValues();
OnColorValuesChanged(_lastColorValues!);
break;
} }
} }
private static PlatformColorValues GetColorValuesFromSetting(DBusVariantItem value) private PlatformColorValues? BuildPlatformColorValues()
{
if (_themeVariant is { } themeVariant && _accentColor is { } accentColor)
return new PlatformColorValues { ThemeVariant = themeVariant, AccentColor1 = accentColor };
if (_themeVariant is { } themeVariant1)
return new PlatformColorValues { ThemeVariant = themeVariant1 };
if (_accentColor is { } accentColor1)
return new PlatformColorValues { AccentColor1 = accentColor1 };
return null;
}
private static PlatformThemeVariant ReadAsColorScheme(DBusVariantItem value)
{ {
var isDark = ((value.Value as DBusVariantItem)!.Value as DBusUInt32Item)!.Value == 1; var isDark = ((value.Value as DBusVariantItem)!.Value as DBusUInt32Item)!.Value == 1;
return new PlatformColorValues return isDark ? PlatformThemeVariant.Dark : PlatformThemeVariant.Light;
{ }
ThemeVariant = isDark ? PlatformThemeVariant.Dark : PlatformThemeVariant.Light
}; private static Color ReadAsAccentColor(DBusVariantItem value)
{
var colorStr = ((value.Value as DBusVariantItem)!.Value as DBusStringItem)!.Value;
var rgb = colorStr.Split(',');
return new Color(255, byte.Parse(rgb[0]), byte.Parse(rgb[1]), byte.Parse(rgb[2]));
} }
} }
} }

Loading…
Cancel
Save