
Я использую библиотеку Tmds.DBus и создаю простое консольное приложение для тестирования:
Код: Выделить всё
using Tmds.DBus.Protocol;
try
{
var connection = new DBusConnection(DBusAddress.Session!);
await connection.ConnectAsync();
var writer = connection.GetMessageWriter();
writer.WriteMethodCallHeader(
destination: "org.freedesktop.portal.Desktop",
path: "/org/freedesktop/portal/desktop",
@interface: "org.freedesktop.portal.Settings",
member: "ReadOne",
signature: "ss");
writer.WriteString("org.freedesktop.appearance");
writer.WriteString("accent-color");
var message = writer.CreateMessage();
var reply = await connection.CallMethodAsync(message,
(result, _) => result);
var reader = reply.GetBodyReader();
reader.AlignStruct();
reader.ReadInt64();
var red = (int)(reader.ReadDouble() * 255);
var green = (int)(reader.ReadDouble() * 255);
var blue = (int)(reader.ReadDouble() * 255);
Console.WriteLine($"RGB: {red}, {green}, {blue}");
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
Код: Выделить всё
RGB: 53, 168, 84
System.ArgumentOutOfRangeException: указанный аргумент находился вне диапазона допустимых значений.
в Tmds.DBus.Protocol.Reader..ctor(Boolean isBigEndian, ReadOnlySequence`1 последовательность, Дескрипторы UnixFdCollection, Int32 handleCount)
в Tmds.DBus.Protocol.Message.GetBodyReader()
в GMenu.Modules.LinuxSystem.LinuxThemeLoader.GetThemeHexAsync() в /home/themakarik/RiderProjects/g-menu/src/GMenu/Modules/LinuxSystem/LinuxThemeLoader.cs:line 27
Это код:
Код: Выделить всё
public async Task GetThemeHexAsync()
{
try
{
var connection = new DBusConnection(DBusAddress.Session!);
await connection.ConnectAsync();
var writer = connection.GetMessageWriter();
writer.WriteMethodCallHeader(
destination: "org.freedesktop.portal.Desktop",
path: "/org/freedesktop/portal/desktop",
@interface: "org.freedesktop.portal.Settings",
member: "ReadOne",
signature: "ss");
writer.WriteString("org.freedesktop.appearance");
writer.WriteString("accent-color");
var message = writer.CreateMessage();
var reply = await connection.CallMethodAsync(message,
(result, _) => result);
var reader = reply.GetBodyReader();
reader.AlignStruct();
reader.ReadInt64();
var red = (int)(reader.ReadDouble() * 255);
var green = (int)(reader.ReadDouble() * 255);
var blue = (int)(reader.ReadDouble() * 255);
return new Rgb(red, green, blue);
}
catch (Exception e)
{
logger.Error("Exception: {exception}", e);
return null;
}
}
Код: Выделить всё
public override async void OnFrameworkInitializationCompleted()
{
try
{
//https://stackoverflow.com/questions/79933121/avaloniaui-strange-async-application-loading
var provider = Services;
LoadLocalization(provider);
var logger = provider.GetRequiredService();
logger.Information("Initializing GMenu...");
await LoadMaterialThemeAsync(provider);
logger.Information("Desktop files paths: {paths}", StaticConfiguration.PathToDesktopFiles);
logger.Information("Desktop files icons path: {paths}", StaticConfiguration.PathsToRefineIcon);
if (ApplicationLifetime is IClassicDesktopStyleApplicationLifetime desktop)
desktop.MainWindow = new MainWindow { DataContext = Services.GetRequiredService() };
await LoadConfigurationAsync(provider).ConfigureAwait(false);
base.OnFrameworkInitializationCompleted();
}
catch (Exception e)
{
Services.GetRequiredService().Error(e, "An error occured while initializing the application.");
Console.WriteLine(e);
Environment.Exit(-1);
}
}
private async Task LoadMaterialThemeAsync(IServiceProvider provider)
{
using var scope = provider.CreateScope();
var themeLoader = scope.ServiceProvider.GetRequiredService();
var rgb = await themeLoader.GetThemeHexAsync();
var color = new Color(255, (byte)rgb.Red, (byte)rgb.Green, (byte)rgb.Blue );
var materialTheme = this.LocateMaterialTheme();
materialTheme.BaseTheme = BaseThemeMode.Inherit;
materialTheme.PrimaryColor = color;
materialTheme.SecondaryColor = color;
this.Resources["AccentColor"] = materialTheme.PrimaryColor;
}