Browse Source

Merge pull request #11108 from affederaffe/kde-accent-colors

KDE Accent Colors
pull/11111/head
Max Katz 3 years ago
committed by GitHub
parent
commit
813de5745f
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 6
      Avalonia.Desktop.slnf
  2. 78
      src/Avalonia.FreeDesktop/DBusPlatformSettings.cs

6
Avalonia.Desktop.slnf

@ -23,8 +23,6 @@
"src\\Avalonia.Dialogs\\Avalonia.Dialogs.csproj",
"src\\Avalonia.Fonts.Inter\\Avalonia.Fonts.Inter.csproj",
"src\\Avalonia.FreeDesktop\\Avalonia.FreeDesktop.csproj",
"src\\Avalonia.Headless.Vnc\\Avalonia.Headless.Vnc.csproj",
"src\\Avalonia.Headless\\Avalonia.Headless.csproj",
"src\\Avalonia.MicroCom\\Avalonia.MicroCom.csproj",
"src\\Avalonia.Native\\Avalonia.Native.csproj",
"src\\Avalonia.OpenGL\\Avalonia.OpenGL.csproj",
@ -33,6 +31,8 @@
"src\\Avalonia.Themes.Fluent\\Avalonia.Themes.Fluent.csproj",
"src\\Avalonia.Themes.Simple\\Avalonia.Themes.Simple.csproj",
"src\\Avalonia.X11\\Avalonia.X11.csproj",
"src\\Headless\\Avalonia.Headless.Vnc\\Avalonia.Headless.Vnc.csproj",
"src\\Headless\\Avalonia.Headless\\Avalonia.Headless.csproj",
"src\\Linux\\Avalonia.LinuxFramebuffer\\Avalonia.LinuxFramebuffer.csproj",
"src\\Markup\\Avalonia.Markup.Xaml.Loader\\Avalonia.Markup.Xaml.Loader.csproj",
"src\\Markup\\Avalonia.Markup.Xaml\\Avalonia.Markup.Xaml.csproj",
@ -65,4 +65,4 @@
"tests\\Avalonia.UnitTests\\Avalonia.UnitTests.csproj"
]
}
}
}

78
src/Avalonia.FreeDesktop/DBusPlatformSettings.cs

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