diff --git a/src/Avalonia.FreeDesktop/Avalonia.FreeDesktop.csproj b/src/Avalonia.FreeDesktop/Avalonia.FreeDesktop.csproj index 3401da2d4a..31b65dcc02 100644 --- a/src/Avalonia.FreeDesktop/Avalonia.FreeDesktop.csproj +++ b/src/Avalonia.FreeDesktop/Avalonia.FreeDesktop.csproj @@ -13,7 +13,7 @@ - + diff --git a/src/Avalonia.FreeDesktop/DBusPlatformSettings.cs b/src/Avalonia.FreeDesktop/DBusPlatformSettings.cs index 8b2b38bb82..c7552823d4 100644 --- a/src/Avalonia.FreeDesktop/DBusPlatformSettings.cs +++ b/src/Avalonia.FreeDesktop/DBusPlatformSettings.cs @@ -1,8 +1,8 @@ using System; using System.Threading.Tasks; -using Avalonia.Logging; using Avalonia.Media; using Avalonia.Platform; +using Tmds.DBus.Protocol; using Tmds.DBus.SourceGenerator; namespace Avalonia.FreeDesktop @@ -22,39 +22,47 @@ namespace Avalonia.FreeDesktop _settings = new OrgFreedesktopPortalSettings(DBusHelper.Connection, "org.freedesktop.portal.Desktop", "/org/freedesktop/portal/desktop"); _ = _settings.WatchSettingChangedAsync(SettingsChangedHandler); - _ = TryGetInitialValueAsync(); + _ = TryGetInitialValuesAsync(); } public override PlatformColorValues GetColorValues() => _lastColorValues ?? base.GetColorValues(); - private async Task TryGetInitialValueAsync() + private async Task TryGetInitialValuesAsync() + { + _themeVariant = await TryGetThemeVariantAsync(); + _accentColor = await TryGetAccentColorAsync(); + _lastColorValues = BuildPlatformColorValues(); + if (_lastColorValues is not null) + OnColorValuesChanged(_lastColorValues); + } + + private async Task TryGetThemeVariantAsync() { try { var value = await _settings!.ReadAsync("org.freedesktop.appearance", "color-scheme"); - _themeVariant = ReadAsColorScheme(value); + return ToColorScheme(((value.Value as DBusVariantItem)!.Value as DBusUInt32Item)!.Value); } - catch (Exception ex) + catch (DBusException) { - Logger.TryGet(LogEventLevel.Error, LogArea.FreeDesktopPlatform)?.Log(this, "Unable to get org.freedesktop.appearance.color-scheme value", ex); + return null; } + } + 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) + catch (DBusException) { - 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 +70,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 +89,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])); } } diff --git a/src/Avalonia.FreeDesktop/DBusSystemDialog.cs b/src/Avalonia.FreeDesktop/DBusSystemDialog.cs index 20583dd6ac..cd6f829d7a 100644 --- a/src/Avalonia.FreeDesktop/DBusSystemDialog.cs +++ b/src/Avalonia.FreeDesktop/DBusSystemDialog.cs @@ -21,7 +21,7 @@ namespace Avalonia.FreeDesktop var dbusFileChooser = new OrgFreedesktopPortalFileChooser(DBusHelper.Connection, "org.freedesktop.portal.Desktop", "/org/freedesktop/portal/desktop"); try { - await dbusFileChooser.GetVersionAsync(); + await dbusFileChooser.GetVersionPropertyAsync(); } catch {