diff --git a/Avalonia.Desktop.slnf b/Avalonia.Desktop.slnf
index 76620e8b93..73e38f8cb9 100644
--- a/Avalonia.Desktop.slnf
+++ b/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"
]
}
-}
\ No newline at end of file
+}
diff --git a/src/Avalonia.FreeDesktop/DBusPlatformSettings.cs b/src/Avalonia.FreeDesktop/DBusPlatformSettings.cs
index a25bb68458..8b2b38bb82 100644
--- a/src/Avalonia.FreeDesktop/DBusPlatformSettings.cs
+++ b/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)
{
- /*
- 0: No preference
- 1: Prefer dark appearance
- 2: Prefer light appearance
- */
- _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)
{
+ /*
+ 0: No preference
+ 1: Prefer dark appearance
+ 2: Prefer light appearance
+ */
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]));
}
}
}