Browse Source

Merge pull request #11298 from affederaffe/bump-tmds-dbus-sourcegenerator

Fix KDE accent color hot switching
pull/11304/head
Max Katz 3 years ago
committed by GitHub
parent
commit
3dae1ff15e
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 2
      src/Avalonia.FreeDesktop/Avalonia.FreeDesktop.csproj
  2. 53
      src/Avalonia.FreeDesktop/DBusPlatformSettings.cs
  3. 2
      src/Avalonia.FreeDesktop/DBusSystemDialog.cs

2
src/Avalonia.FreeDesktop/Avalonia.FreeDesktop.csproj

@ -13,7 +13,7 @@
<ItemGroup> <ItemGroup>
<PackageReference Include="Tmds.DBus.Protocol" Version="0.15.0" /> <PackageReference Include="Tmds.DBus.Protocol" Version="0.15.0" />
<PackageReference Include="Tmds.DBus.SourceGenerator" Version="0.0.6" PrivateAssets="All" /> <PackageReference Include="Tmds.DBus.SourceGenerator" Version="0.0.7" PrivateAssets="All" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>

53
src/Avalonia.FreeDesktop/DBusPlatformSettings.cs

@ -1,8 +1,8 @@
using System; using System;
using System.Threading.Tasks; using System.Threading.Tasks;
using Avalonia.Logging;
using Avalonia.Media; using Avalonia.Media;
using Avalonia.Platform; using Avalonia.Platform;
using Tmds.DBus.Protocol;
using Tmds.DBus.SourceGenerator; using Tmds.DBus.SourceGenerator;
namespace Avalonia.FreeDesktop namespace Avalonia.FreeDesktop
@ -22,39 +22,47 @@ namespace Avalonia.FreeDesktop
_settings = new OrgFreedesktopPortalSettings(DBusHelper.Connection, "org.freedesktop.portal.Desktop", "/org/freedesktop/portal/desktop"); _settings = new OrgFreedesktopPortalSettings(DBusHelper.Connection, "org.freedesktop.portal.Desktop", "/org/freedesktop/portal/desktop");
_ = _settings.WatchSettingChangedAsync(SettingsChangedHandler); _ = _settings.WatchSettingChangedAsync(SettingsChangedHandler);
_ = TryGetInitialValueAsync(); _ = TryGetInitialValuesAsync();
} }
public override PlatformColorValues GetColorValues() => _lastColorValues ?? base.GetColorValues(); 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<PlatformThemeVariant?> TryGetThemeVariantAsync()
{ {
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); 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<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 (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) if (exception is not null)
return; return;
@ -62,12 +70,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 +89,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]));
} }
} }

2
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"); var dbusFileChooser = new OrgFreedesktopPortalFileChooser(DBusHelper.Connection, "org.freedesktop.portal.Desktop", "/org/freedesktop/portal/desktop");
try try
{ {
await dbusFileChooser.GetVersionAsync(); await dbusFileChooser.GetVersionPropertyAsync();
} }
catch catch
{ {

Loading…
Cancel
Save