5 changed files with 95 additions and 1 deletions
@ -0,0 +1,74 @@ |
|||
using System; |
|||
using System.Threading.Tasks; |
|||
using Avalonia.Logging; |
|||
using Avalonia.Platform; |
|||
|
|||
namespace Avalonia.FreeDesktop; |
|||
|
|||
internal class DBusPlatformSettings : DefaultPlatformSettings |
|||
{ |
|||
private readonly IDBusSettings? _settings; |
|||
private PlatformColorValues? _lastColorValues; |
|||
|
|||
public DBusPlatformSettings() |
|||
{ |
|||
_settings = DBusHelper.TryInitialize()? |
|||
.CreateProxy<IDBusSettings>("org.freedesktop.portal.Desktop", "/org/freedesktop/portal/desktop"); |
|||
|
|||
if (_settings is not null) |
|||
{ |
|||
_ = _settings.WatchSettingChangedAsync(SettingsChangedHandler); |
|||
|
|||
_ = TryGetInitialValue(); |
|||
} |
|||
} |
|||
|
|||
public override PlatformColorValues GetColorValues() |
|||
{ |
|||
return _lastColorValues ?? base.GetColorValues(); |
|||
} |
|||
|
|||
private async Task TryGetInitialValue() |
|||
{ |
|||
var colorSchemeTask = _settings!.ReadAsync("org.freedesktop.appearance", "color-scheme"); |
|||
if (colorSchemeTask.Status == TaskStatus.RanToCompletion) |
|||
{ |
|||
_lastColorValues = GetColorValuesFromSetting(colorSchemeTask.Result); |
|||
} |
|||
else |
|||
{ |
|||
try |
|||
{ |
|||
var value = await colorSchemeTask; |
|||
_lastColorValues = GetColorValuesFromSetting(value); |
|||
OnColorValuesChanged(_lastColorValues.Value); |
|||
} |
|||
catch (Exception ex) |
|||
{ |
|||
_lastColorValues = base.GetColorValues(); |
|||
Logger.TryGet(LogEventLevel.Error, LogArea.FreeDesktopPlatform)?.Log(this, "Unable to get setting value", ex); |
|||
} |
|||
} |
|||
} |
|||
|
|||
private void SettingsChangedHandler((string @namespace, string key, object value) tuple) |
|||
{ |
|||
if (tuple.@namespace == "org.freedesktop.appearance" |
|||
&& tuple.key == "color-scheme") |
|||
{ |
|||
/* |
|||
<member>0: No preference</member> |
|||
<member>1: Prefer dark appearance</member> |
|||
<member>2: Prefer light appearance</member> |
|||
*/ |
|||
_lastColorValues = GetColorValuesFromSetting(tuple.value); |
|||
OnColorValuesChanged(_lastColorValues.Value); |
|||
} |
|||
} |
|||
|
|||
private static PlatformColorValues GetColorValuesFromSetting(object value) |
|||
{ |
|||
var isDark = value?.ToString() == "1"; |
|||
return new PlatformColorValues(isDark ? PlatformThemeVariant.Dark : PlatformThemeVariant.Light); |
|||
} |
|||
} |
|||
@ -0,0 +1,16 @@ |
|||
using System; |
|||
using System.Collections.Generic; |
|||
using System.Threading.Tasks; |
|||
using Tmds.DBus; |
|||
|
|||
namespace Avalonia.FreeDesktop; |
|||
|
|||
[DBusInterface("org.freedesktop.portal.Settings")] |
|||
internal interface IDBusSettings : IDBusObject |
|||
{ |
|||
Task<(string @namespace, IDictionary<string, object>)> ReadAllAsync(string[] namespaces); |
|||
|
|||
Task<object> ReadAsync(string @namespace, string key); |
|||
|
|||
Task<IDisposable> WatchSettingChangedAsync(Action<(string @namespace, string key, object value)> handler, Action<Exception>? onError = null); |
|||
} |
|||
Loading…
Reference in new issue