From 0a4e0b66aa6be96f5ef669e07ecd62abc5785855 Mon Sep 17 00:00:00 2001 From: Jumar Macato <16554748+jmacato@users.noreply.github.com> Date: Wed, 26 Jun 2024 08:11:48 +0800 Subject: [PATCH 1/4] Reapply "Bump DBus stack (#15568)" (#15656) This reverts commit e787bb4e641faa5c3ba7f2ffba989464efc66818. --- .../Avalonia.FreeDesktop.csproj | 4 +- .../DBusIme/Fcitx/FcitxICWrapper.cs | 4 +- .../DBusIme/Fcitx/FcitxX11TextInputMethod.cs | 2 +- .../DBusIme/IBus/IBusX11TextInputMethod.cs | 21 ++-- src/Avalonia.FreeDesktop/DBusMenuExporter.cs | 85 +++++++------- .../DBusPlatformSettings.cs | 36 +++--- src/Avalonia.FreeDesktop/DBusSystemDialog.cs | 109 ++++++++---------- src/Avalonia.FreeDesktop/DBusTrayIconImpl.cs | 27 ++--- 8 files changed, 125 insertions(+), 163 deletions(-) diff --git a/src/Avalonia.FreeDesktop/Avalonia.FreeDesktop.csproj b/src/Avalonia.FreeDesktop/Avalonia.FreeDesktop.csproj index 76bd8275b1f..f4bdae4d030 100644 --- a/src/Avalonia.FreeDesktop/Avalonia.FreeDesktop.csproj +++ b/src/Avalonia.FreeDesktop/Avalonia.FreeDesktop.csproj @@ -12,8 +12,8 @@ - - + + diff --git a/src/Avalonia.FreeDesktop/DBusIme/Fcitx/FcitxICWrapper.cs b/src/Avalonia.FreeDesktop/DBusIme/Fcitx/FcitxICWrapper.cs index 94709926e79..8cb5d5761c5 100644 --- a/src/Avalonia.FreeDesktop/DBusIme/Fcitx/FcitxICWrapper.cs +++ b/src/Avalonia.FreeDesktop/DBusIme/Fcitx/FcitxICWrapper.cs @@ -45,7 +45,7 @@ public ValueTask WatchCommitStringAsync(Action public ValueTask WatchForwardKeyAsync(Action handler) => _old?.WatchForwardKeyAsync(handler) - ?? _modern?.WatchForwardKeyAsync((e, ev) => handler.Invoke(e, (ev.keyval, ev.state, ev.type ? 1 : 0))) + ?? _modern?.WatchForwardKeyAsync((e, ev) => handler.Invoke(e, (ev.Keyval, ev.State, ev.Type ? 1 : 0))) ?? new ValueTask(Disposable.Empty); public ValueTask WatchUpdateFormattedPreeditAsync( @@ -53,7 +53,7 @@ public ValueTask WatchUpdateFormattedPreeditAsync( _old?.WatchUpdateFormattedPreeditAsync(handler!) ?? _modern?.WatchUpdateFormattedPreeditAsync(handler!) ?? new ValueTask(Disposable.Empty); - + public Task SetCapacityAsync(uint flags) => _old?.SetCapacityAsync(flags) ?? _modern?.SetCapabilityAsync(flags) ?? Task.CompletedTask; } diff --git a/src/Avalonia.FreeDesktop/DBusIme/Fcitx/FcitxX11TextInputMethod.cs b/src/Avalonia.FreeDesktop/DBusIme/Fcitx/FcitxX11TextInputMethod.cs index efd173d9a6a..eaa5c8f13e2 100644 --- a/src/Avalonia.FreeDesktop/DBusIme/Fcitx/FcitxX11TextInputMethod.cs +++ b/src/Avalonia.FreeDesktop/DBusIme/Fcitx/FcitxX11TextInputMethod.cs @@ -29,7 +29,7 @@ protected override async Task Connect(string name) var resp = await method.CreateICv3Async(GetAppName(), Process.GetCurrentProcess().Id); - var proxy = new OrgFcitxFcitxInputContext(Connection, name, $"/inputcontext_{resp.icid}"); + var proxy = new OrgFcitxFcitxInputContext(Connection, name, $"/inputcontext_{resp.Icid}"); _context = new FcitxICWrapper(proxy); } else diff --git a/src/Avalonia.FreeDesktop/DBusIme/IBus/IBusX11TextInputMethod.cs b/src/Avalonia.FreeDesktop/DBusIme/IBus/IBusX11TextInputMethod.cs index 35dc18288a1..d81d2d73942 100644 --- a/src/Avalonia.FreeDesktop/DBusIme/IBus/IBusX11TextInputMethod.cs +++ b/src/Avalonia.FreeDesktop/DBusIme/IBus/IBusX11TextInputMethod.cs @@ -51,17 +51,16 @@ private void OnShowPreedit(Exception? obj) Client.SetPreeditText(_preeditText, _preeditText == null ? null : _preeditCursor); } - private void OnUpdatePreedit(Exception? arg1, (DBusVariantItem text, uint cursor_pos, bool visible) preeditComponents) + private void OnUpdatePreedit(Exception? arg1, (VariantValue Text, uint CursorPos, bool Visible) preeditComponents) { - if (preeditComponents.text is { Value: DBusStructItem { Count: >= 3 } structItem } && - structItem[2] is DBusStringItem stringItem) + if (preeditComponents.Text is { Type: VariantValueType.Struct, Count: >= 3 } structItem && structItem.GetItem(2) is { Type: VariantValueType.String} stringItem) { - _preeditText = stringItem.Value; + _preeditText = stringItem.GetString(); _preeditCursor = _preeditText != null ? Utf16Utils.CharacterOffsetToStringOffset(_preeditText, - (int)Math.Min(preeditComponents.cursor_pos, int.MaxValue), false) + (int)Math.Min(preeditComponents.CursorPos, int.MaxValue), false) : 0; - + _preeditShown = true; } else @@ -102,13 +101,13 @@ private void OnForwardKey(Exception? e, (uint keyval, uint keycode, uint state) }); } - private void OnCommitText(Exception? e, DBusVariantItem variantItem) + private void OnCommitText(Exception? e, VariantValue variantItem) { - if (_insideReset > 0) + if (_insideReset > 0) { // For some reason iBus can trigger a CommitText while being reset. // Thankfully the signal is sent _during_ Reset call processing, - // so it arrives on-the-wire before Reset call result, so we can + // so it arrives on-the-wire before Reset call result, so we can // check if we have any pending Reset calls and ignore the signal here return; } @@ -118,8 +117,8 @@ private void OnCommitText(Exception? e, DBusVariantItem variantItem) return; } - if (variantItem.Value is DBusStructItem { Count: >= 3 } structItem && structItem[2] is DBusStringItem stringItem) - FireCommit(stringItem.Value); + if (variantItem.Count >= 3 && variantItem.GetItem(2) is { Type: VariantValueType.String } stringItem) + FireCommit(stringItem.GetString()); } protected override Task DisconnectAsync() => _service?.DestroyAsync() ?? Task.CompletedTask; diff --git a/src/Avalonia.FreeDesktop/DBusMenuExporter.cs b/src/Avalonia.FreeDesktop/DBusMenuExporter.cs index e7bd23e9658..07801c6f70c 100644 --- a/src/Avalonia.FreeDesktop/DBusMenuExporter.cs +++ b/src/Avalonia.FreeDesktop/DBusMenuExporter.cs @@ -60,17 +60,14 @@ public DBusMenuExporterImpl(Connection connection, string path) private void InitBackingProperties() { - BackingProperties.Version = 4; - BackingProperties.Status = string.Empty; - BackingProperties.TextDirection = string.Empty; - BackingProperties.IconThemePath = Array.Empty(); + Version = 4; } protected override Connection Connection { get; } public override string Path { get; } - protected override ValueTask<(uint revision, (int, Dictionary, DBusVariantItem[]) layout)> OnGetLayoutAsync(int parentId, int recursionDepth, string[] propertyNames) + protected override ValueTask<(uint Revision, (int, Dictionary, Variant[]) Layout)> OnGetLayoutAsync(int parentId, int recursionDepth, string[] propertyNames) { var menu = GetMenu(parentId); var layout = GetLayout(menu.item, menu.menu, recursionDepth, propertyNames); @@ -80,22 +77,22 @@ private void InitBackingProperties() OnIsNativeMenuExportedChanged?.Invoke(this, EventArgs.Empty); } - return new ValueTask<(uint, (int, Dictionary, DBusVariantItem[]))>((_revision, layout)); + return new ValueTask<(uint, (int, Dictionary, Variant[]))>((_revision, layout)); } - protected override ValueTask<(int, Dictionary)[]> OnGetGroupPropertiesAsync(int[] ids, string[] propertyNames) + protected override ValueTask<(int, Dictionary)[]> OnGetGroupPropertiesAsync(int[] ids, string[] propertyNames) => new(ids.Select(id => (id, GetProperties(GetMenu(id), propertyNames))).ToArray()); - protected override ValueTask OnGetPropertyAsync(int id, string name) => - new(GetProperty(GetMenu(id), name) ?? new DBusVariantItem("i", new DBusInt32Item(0))); + protected override ValueTask OnGetPropertyAsync(int id, string name) => + new(GetProperty(GetMenu(id), name) ?? new Variant(0)); - protected override ValueTask OnEventAsync(int id, string eventId, DBusVariantItem data, uint timestamp) + protected override ValueTask OnEventAsync(int id, string eventId, VariantValue data, uint timestamp) { HandleEvent(id, eventId); return new ValueTask(); } - protected override ValueTask OnEventGroupAsync((int, string, DBusVariantItem, uint)[] events) + protected override ValueTask OnEventGroupAsync((int, string, VariantValue, uint)[] events) { foreach (var e in events) HandleEvent(e.Item1, e.Item2); @@ -104,7 +101,7 @@ protected override ValueTask OnEventGroupAsync((int, string, DBusVariantI protected override ValueTask OnAboutToShowAsync(int id) => new(false); - protected override ValueTask<(int[] updatesNeeded, int[] idErrors)> OnAboutToShowGroupAsync(int[] ids) => + protected override ValueTask<(int[] UpdatesNeeded, int[] IdErrors)> OnAboutToShowGroupAsync(int[] ids) => new((Array.Empty(), Array.Empty())); private async Task InitializeAsync() @@ -220,35 +217,32 @@ private int GetId(NativeMenuItemBase item) "type", "label", "enabled", "visible", "shortcut", "toggle-type", "children-display", "toggle-state", "icon-data" }; - private static DBusVariantItem? GetProperty((NativeMenuItemBase? item, NativeMenu? menu) i, string name) + private static Variant? GetProperty((NativeMenuItemBase? item, NativeMenu? menu) i, string name) { var (it, menu) = i; if (it is NativeMenuItemSeparator) { if (name == "type") - return new DBusVariantItem("s", new DBusStringItem("separator")); + return new Variant("separator"); } else if (it is NativeMenuItem item) { if (name == "type") return null; if (name == "label") - return new DBusVariantItem("s", new DBusStringItem(item.Header ?? "")); + return new Variant(item.Header ?? ""); if (name == "enabled") { if (item.Menu is not null && item.Menu.Items.Count == 0) - return new DBusVariantItem("b", new DBusBoolItem(false)); + return new Variant(false); if (!item.IsEnabled) - return new DBusVariantItem("b", new DBusBoolItem(false)); + return new Variant(false); return null; } - if (name == "visible") { - if (!item.IsVisible) - return new DBusVariantItem("b", new DBusBoolItem(false)); - return new DBusVariantItem("b", new DBusBoolItem(true)); - } + if (name == "visible") + return new Variant(item.IsVisible); if (name == "shortcut") { @@ -256,30 +250,30 @@ private int GetId(NativeMenuItemBase item) return null; if (item.Gesture.KeyModifiers == 0) return null; - var lst = new List(); + var lst = new Array(); var mod = item.Gesture; if (mod.KeyModifiers.HasAllFlags(KeyModifiers.Control)) - lst.Add(new DBusStringItem("Control")); + lst.Add(new Variant("Control")); if (mod.KeyModifiers.HasAllFlags(KeyModifiers.Alt)) - lst.Add(new DBusStringItem("Alt")); + lst.Add(new Variant("Alt")); if (mod.KeyModifiers.HasAllFlags(KeyModifiers.Shift)) - lst.Add(new DBusStringItem("Shift")); + lst.Add(new Variant("Shift")); if (mod.KeyModifiers.HasAllFlags(KeyModifiers.Meta)) - lst.Add(new DBusStringItem("Super")); - lst.Add(new DBusStringItem(item.Gesture.Key.ToString())); - return new DBusVariantItem("aas", new DBusArrayItem(DBusType.Array, new[] { new DBusArrayItem(DBusType.String, lst) })); + lst.Add(new Variant("Super")); + lst.Add(new Variant(item.Gesture.Key.ToString())); + return Variant.FromArray(new Array>(new[] { lst })); } if (name == "toggle-type") { if (item.ToggleType == NativeMenuItemToggleType.CheckBox) - return new DBusVariantItem("s", new DBusStringItem("checkmark")); + return new Variant("checkmark"); if (item.ToggleType == NativeMenuItemToggleType.Radio) - return new DBusVariantItem("s", new DBusStringItem("radio")); + return new Variant("radio"); } if (name == "toggle-state" && item.ToggleType != NativeMenuItemToggleType.None) - return new DBusVariantItem("i", new DBusInt32Item(item.IsChecked ? 1 : 0)); + return new Variant(item.IsChecked ? 1 : 0); if (name == "icon-data") { @@ -292,50 +286,49 @@ private int GetId(NativeMenuItemBase item) var icon = loader.LoadIcon(item.Icon.PlatformImpl.Item); using var ms = new MemoryStream(); icon.Save(ms); - return new DBusVariantItem("ay", new DBusByteArrayItem(ms.ToArray())); + return Variant.FromArray(new Array(ms.ToArray())); } } } if (name == "children-display") - return menu is not null ? new DBusVariantItem("s", new DBusStringItem("submenu")) : null; + { + if (menu is not null) + return new Variant("submenu"); + return null; + } } return null; } - private static Dictionary GetProperties((NativeMenuItemBase? item, NativeMenu? menu) i, string[] names) + private static Dictionary GetProperties((NativeMenuItemBase? item, NativeMenu? menu) i, string[] names) { if (names.Length == 0) names = s_allProperties; - var properties = new Dictionary(); + var properties = new Dictionary(); foreach (var n in names) { var v = GetProperty(i, n); - if (v is not null) - properties.Add(n, v); + if (v.HasValue) + properties.Add(n, v.Value); } return properties; } - private (int, Dictionary, DBusVariantItem[]) GetLayout(NativeMenuItemBase? item, NativeMenu? menu, int depth, string[] propertyNames) + private (int, Dictionary, Variant[]) GetLayout(NativeMenuItemBase? item, NativeMenu? menu, int depth, string[] propertyNames) { var id = item is null ? 0 : GetId(item); var props = GetProperties((item, menu), propertyNames); - var children = depth == 0 || menu is null ? Array.Empty() : new DBusVariantItem[menu.Items.Count]; + var children = depth == 0 || menu is null ? Array.Empty() : new Variant[menu.Items.Count]; if (menu is not null) { for (var c = 0; c < children.Length; c++) { var ch = menu.Items[c]; var layout = GetLayout(ch, (ch as NativeMenuItem)?.Menu, depth == -1 ? -1 : depth - 1, propertyNames); - children[c] = new DBusVariantItem("(ia{sv}av)", new DBusStructItem(new DBusItem[] - { - new DBusInt32Item(layout.Item1), - new DBusArrayItem(DBusType.DictEntry, layout.Item2.Select(static x => new DBusDictEntryItem(new DBusStringItem(x.Key), x.Value)).ToArray()), - new DBusArrayItem(DBusType.Variant, layout.Item3) - })); + children[c] = Variant.FromStruct(Struct.Create(layout.Item1, new Dict(layout.Item2), new Array(layout.Item3))); } } diff --git a/src/Avalonia.FreeDesktop/DBusPlatformSettings.cs b/src/Avalonia.FreeDesktop/DBusPlatformSettings.cs index ee59982ba70..affa50a8e0d 100644 --- a/src/Avalonia.FreeDesktop/DBusPlatformSettings.cs +++ b/src/Avalonia.FreeDesktop/DBusPlatformSettings.cs @@ -43,14 +43,12 @@ private async Task TryGetInitialValuesAsync() try { var version = await _settings!.GetVersionPropertyAsync(); - DBusVariantItem value; + VariantValue value; if (version >= 2) value = await _settings!.ReadOneAsync("org.freedesktop.appearance", "color-scheme"); else - value = (DBusVariantItem)(await _settings!.ReadAsync("org.freedesktop.appearance", "color-scheme")).Value; - if (value.Value is DBusUInt32Item dBusUInt32Item) - return ToColorScheme(dBusUInt32Item.Value); - return null; + value = (await _settings!.ReadAsync("org.freedesktop.appearance", "color-scheme")).GetItem(0); + return ToColorScheme(value.GetUInt32()); } catch (DBusException) { @@ -63,14 +61,12 @@ private async Task TryGetInitialValuesAsync() try { var version = await _settings!.GetVersionPropertyAsync(); - DBusVariantItem value; + VariantValue value; if (version >= 2) value = await _settings!.ReadOneAsync("org.freedesktop.appearance", "accent-color"); else - value = (DBusVariantItem)(await _settings!.ReadAsync("org.freedesktop.appearance", "accent-color")).Value; - if (value.Value is DBusStructItem dBusStructItem) - return ToAccentColor(dBusStructItem); - return null; + value = (await _settings!.ReadAsync("org.freedesktop.appearance", "accent-color")).GetItem(0); + return ToAccentColor(value); } catch (DBusException) { @@ -78,20 +74,20 @@ private async Task TryGetInitialValuesAsync() } } - private void SettingsChangedHandler(Exception? exception, (string @namespace, string key, DBusVariantItem value) valueTuple) + private void SettingsChangedHandler(Exception? exception, (string Namespace, string Key, VariantValue Value) tuple) { if (exception is not null) return; - switch (valueTuple) + switch (tuple) { - case ("org.freedesktop.appearance", "color-scheme", { } colorScheme): - _themeVariant = ToColorScheme((colorScheme.Value as DBusUInt32Item)!.Value); + case ("org.freedesktop.appearance", "color-scheme", var colorScheme): + _themeVariant = ToColorScheme(colorScheme.GetUInt32()); _lastColorValues = BuildPlatformColorValues(); OnColorValuesChanged(_lastColorValues!); break; - case ("org.freedesktop.appearance", "accent-color", { } accentColor): - _accentColor = ToAccentColor((accentColor.Value as DBusStructItem)!); + case ("org.freedesktop.appearance", "accent-color", var accentColor): + _accentColor = ToAccentColor(accentColor); _lastColorValues = BuildPlatformColorValues(); OnColorValuesChanged(_lastColorValues!); break; @@ -120,16 +116,16 @@ private static PlatformThemeVariant ToColorScheme(uint value) return isDark ? PlatformThemeVariant.Dark : PlatformThemeVariant.Light; } - private static Color? ToAccentColor(DBusStructItem value) + private static Color? ToAccentColor(VariantValue value) { /* Indicates the system's preferred accent color as a tuple of RGB values in the sRGB color space, in the range [0,1]. Out-of-range RGB values should be treated as an unset accent color. */ - var r = (value[0] as DBusDoubleItem)!.Value; - var g = (value[1] as DBusDoubleItem)!.Value; - var b = (value[2] as DBusDoubleItem)!.Value; + var r = value.GetItem(0).GetDouble(); + var g = value.GetItem(1).GetDouble(); + var b = value.GetItem(2).GetDouble(); if (r is < 0 or > 1 || g is < 0 or > 1 || b is < 0 or > 1) return null; return Color.FromRgb((byte)(r * 255), (byte)(g * 255), (byte)(b * 255)); diff --git a/src/Avalonia.FreeDesktop/DBusSystemDialog.cs b/src/Avalonia.FreeDesktop/DBusSystemDialog.cs index 50033fff298..c4663878ccd 100644 --- a/src/Avalonia.FreeDesktop/DBusSystemDialog.cs +++ b/src/Avalonia.FreeDesktop/DBusSystemDialog.cs @@ -59,14 +59,15 @@ public override async Task> OpenFilePickerAsync(File { var parentWindow = $"x11:{_handle.Handle:X}"; ObjectPath objectPath; - var chooserOptions = new Dictionary(); - var filters = ParseFilters(options.FileTypeFilter); - if (filters is not null) + var chooserOptions = new Dictionary(); + + if (TryParseFilters(options.FileTypeFilter, out var filters)) chooserOptions.Add("filters", filters); if (options.SuggestedStartLocation?.TryGetLocalPath() is { } folderPath) - chooserOptions.Add("current_folder", new DBusVariantItem("ay", new DBusByteArrayItem(Encoding.UTF8.GetBytes(folderPath + "\0")))); - chooserOptions.Add("multiple", new DBusVariantItem("b", new DBusBoolItem(options.AllowMultiple))); + chooserOptions.Add("current_folder", Variant.FromArray(new Array(Encoding.UTF8.GetBytes(folderPath + "\0")))); + + chooserOptions.Add("multiple", new Variant(options.AllowMultiple)); objectPath = await _fileChooser.OpenFileAsync(parentWindow, options.Title ?? string.Empty, chooserOptions); @@ -77,7 +78,7 @@ public override async Task> OpenFilePickerAsync(File if (e is not null) tsc.TrySetException(e); else - tsc.TrySetResult((x.results["uris"].Value as DBusArrayItem)?.Select(static y => (y as DBusStringItem)!.Value).ToArray()); + tsc.TrySetResult(x.Results["uris"].GetArray()); }); var uris = await tsc.Task ?? Array.Empty(); @@ -88,15 +89,14 @@ public override async Task> OpenFilePickerAsync(File { var parentWindow = $"x11:{_handle.Handle:X}"; ObjectPath objectPath; - var chooserOptions = new Dictionary(); - var filters = ParseFilters(options.FileTypeChoices); - if (filters is not null) + var chooserOptions = new Dictionary(); + if (TryParseFilters(options.FileTypeChoices, out var filters)) chooserOptions.Add("filters", filters); if (options.SuggestedFileName is { } currentName) - chooserOptions.Add("current_name", new DBusVariantItem("s", new DBusStringItem(currentName))); + chooserOptions.Add("current_name", new Variant(currentName)); if (options.SuggestedStartLocation?.TryGetLocalPath() is { } folderPath) - chooserOptions.Add("current_folder", new DBusVariantItem("ay", new DBusByteArrayItem(Encoding.UTF8.GetBytes(folderPath + "\0")))); + chooserOptions.Add("current_folder", Variant.FromArray(new Array(Encoding.UTF8.GetBytes(folderPath + "\0")))); objectPath = await _fileChooser.SaveFileAsync(parentWindow, options.Title ?? string.Empty, chooserOptions); var request = new OrgFreedesktopPortalRequest(_connection, "org.freedesktop.portal.Desktop", objectPath); @@ -105,41 +105,31 @@ public override async Task> OpenFilePickerAsync(File using var disposable = await request.WatchResponseAsync((e, x) => { if (e is not null) + { tsc.TrySetException(e); + } else { - if(x.results.TryGetValue("current_filter", out var value)) + if (x.Results.TryGetValue("current_filter", out var currentFilter)) { - var currentFilter = value.Value as DBusStructItem; - if(currentFilter != null) + var name = currentFilter.GetItem(0).GetString(); + selectedType = new FilePickerFileType(name); + var patterns = new List(); + var mimeTypes = new List(); + var types = currentFilter.GetItem(1).GetArray(); + foreach(var t in types) { - var name = (currentFilter[0] as DBusStringItem)?.Value.ToString() ?? ""; - selectedType = new FilePickerFileType(name); - if(currentFilter[1] is DBusArrayItem types) - { - List filters = new List(); - List mimeTypes = new List(); - foreach(var t in types) - { - if(t is DBusStructItem filter) - { - if((filter[0] as DBusUInt32Item)?.Value == 1) - { - mimeTypes.Add((filter[1] as DBusStringItem)?.Value.ToString() ?? ""); - } - else - { - filters.Add((filter[1] as DBusStringItem)?.Value.ToString() ?? ""); - } - } - } - - selectedType.Patterns = filters; - selectedType.MimeTypes = mimeTypes; - } + if (t.GetItem(0).GetUInt32() == 1) + mimeTypes.Add(t.GetItem(1).GetString()); + else + patterns.Add(t.GetItem(1).GetString()); } + + selectedType.Patterns = patterns; + selectedType.MimeTypes = mimeTypes; } - tsc.TrySetResult((x.results["uris"].Value as DBusArrayItem)?.Select(static y => (y as DBusStringItem)!.Value).ToArray()); + + tsc.TrySetResult(x.Results["uris"].GetArray()); } }); @@ -160,16 +150,16 @@ public override async Task> OpenFolderPickerAsync( return Array.Empty(); var parentWindow = $"x11:{_handle.Handle:X}"; - var chooserOptions = new Dictionary + var chooserOptions = new Dictionary { - { "directory", new DBusVariantItem("b", new DBusBoolItem(true)) }, - { "multiple", new DBusVariantItem("b", new DBusBoolItem(options.AllowMultiple)) } + { "directory", new Variant(true) }, + { "multiple", new Variant(options.AllowMultiple) } }; if (options.SuggestedFileName is { } currentName) - chooserOptions.Add("current_name", new DBusVariantItem("s", new DBusStringItem(currentName))); + chooserOptions.Add("current_name", new Variant(currentName)); if (options.SuggestedStartLocation?.TryGetLocalPath() is { } folderPath) - chooserOptions.Add("current_folder", new DBusVariantItem("ay", new DBusByteArrayItem(Encoding.UTF8.GetBytes(folderPath + "\0")))); + chooserOptions.Add("current_folder", Variant.FromArray(new Array(Encoding.UTF8.GetBytes(folderPath + "\0")))); var objectPath = await _fileChooser.OpenFileAsync(parentWindow, options.Title ?? string.Empty, chooserOptions); var request = new OrgFreedesktopPortalRequest(_connection, "org.freedesktop.portal.Desktop", objectPath); @@ -179,7 +169,7 @@ public override async Task> OpenFolderPickerAsync( if (e is not null) tsc.TrySetException(e); else - tsc.TrySetResult((x.results["uris"].Value as DBusArrayItem)?.Select(static y => (y as DBusStringItem)!.Value).ToArray()); + tsc.TrySetResult(x.Results["uris"].GetArray()); }); var uris = await tsc.Task ?? Array.Empty(); @@ -190,40 +180,35 @@ public override async Task> OpenFolderPickerAsync( .Select(static path => new BclStorageFolder(new DirectoryInfo(path))).ToList(); } - private static DBusVariantItem? ParseFilters(IReadOnlyList? fileTypes) + private static bool TryParseFilters(IReadOnlyList? fileTypes, out Variant result) { const uint GlobStyle = 0u; const uint MimeStyle = 1u; // Example: [('Images', [(0, '*.ico'), (1, 'image/png')]), ('Text', [(0, '*.txt')])] if (fileTypes is null) - return null; + { + result = default; + return false; + } - var filters = new List(); + var filters = new Array>>>(); foreach (var fileType in fileTypes) { - var extensions = new List(); + var extensions = new List>(); if (fileType.Patterns?.Count > 0) - extensions.AddRange( - fileType.Patterns.Select(static pattern => - new DBusStructItem(new DBusItem[] { new DBusUInt32Item(GlobStyle), new DBusStringItem(pattern) }))); + extensions.AddRange(fileType.Patterns.Select(static pattern => Struct.Create(GlobStyle, pattern))); else if (fileType.MimeTypes?.Count > 0) - extensions.AddRange( - fileType.MimeTypes.Select(static mimeType => - new DBusStructItem(new DBusItem[] { new DBusUInt32Item(MimeStyle), new DBusStringItem(mimeType) }))); + extensions.AddRange(fileType.MimeTypes.Select(static mimeType => Struct.Create(MimeStyle, mimeType))); else continue; - filters.Add(new DBusStructItem( - new DBusItem[] - { - new DBusStringItem(fileType.Name), - new DBusArrayItem(DBusType.Struct, extensions) - })); + filters.Add(Struct.Create(fileType.Name, new Array>(extensions))); } - return filters.Count > 0 ? new DBusVariantItem("a(sa(us))", new DBusArrayItem(DBusType.Struct, filters)) : null; + result = Variant.FromArray(filters); + return true; } } } diff --git a/src/Avalonia.FreeDesktop/DBusTrayIconImpl.cs b/src/Avalonia.FreeDesktop/DBusTrayIconImpl.cs index d6773559ddf..09dc3eaf321 100644 --- a/src/Avalonia.FreeDesktop/DBusTrayIconImpl.cs +++ b/src/Avalonia.FreeDesktop/DBusTrayIconImpl.cs @@ -84,7 +84,7 @@ private void OnNameChange(string name, string? newOwner) if (_isDisposed || _connection is null || name != "org.kde.StatusNotifierWatcher") return; - if (!_serviceConnected & newOwner is not null) + if (!_serviceConnected && newOwner is not null) { _serviceConnected = true; _statusNotifierWatcher = new OrgKdeStatusNotifierWatcher(_connection, "org.kde.StatusNotifierWatcher", "/StatusNotifierWatcher"); @@ -216,18 +216,7 @@ internal class StatusNotifierItemDbusObj : OrgKdeStatusNotifierItem public StatusNotifierItemDbusObj(Connection connection, ObjectPath dbusMenuPath) { Connection = connection; - BackingProperties.Menu = dbusMenuPath; - BackingProperties.Category = string.Empty; - BackingProperties.Status = string.Empty; - BackingProperties.Id = string.Empty; - BackingProperties.Title = string.Empty; - BackingProperties.IconPixmap = Array.Empty<(int, int, byte[])>(); - BackingProperties.AttentionIconName = string.Empty; - BackingProperties.AttentionIconPixmap = Array.Empty<(int, int, byte[])>(); - BackingProperties.AttentionMovieName = string.Empty; - BackingProperties.OverlayIconName = string.Empty; - BackingProperties.OverlayIconPixmap = Array.Empty<(int, int, byte[])>(); - BackingProperties.ToolTip = (string.Empty, Array.Empty<(int, int, byte[])>(), string.Empty, string.Empty); + Menu = dbusMenuPath; InvalidateAll(); } @@ -256,12 +245,12 @@ public void InvalidateAll() EmitNewAttentionIcon(); EmitNewOverlayIcon(); EmitNewToolTip(); - EmitNewStatus(BackingProperties.Status); + EmitNewStatus(Status); } public void SetIcon((int, int, byte[]) dbusPixmap) { - BackingProperties.IconPixmap = new[] { dbusPixmap }; + IconPixmap = new[] { dbusPixmap }; InvalidateAll(); } @@ -270,10 +259,10 @@ public void SetTitleAndTooltip(string? text) if (text is null) return; - BackingProperties.Id = text; - BackingProperties.Category = "ApplicationStatus"; - BackingProperties.Status = text; - BackingProperties.Title = text; + Id = text; + Category = "ApplicationStatus"; + Status = text; + Title = text; InvalidateAll(); } } From 659771d5991a17b88ddd59bcc8fb4270672fa6fb Mon Sep 17 00:00:00 2001 From: Jumar Macato <16554748+jmacato@users.noreply.github.com> Date: Wed, 26 Jun 2024 08:16:08 +0800 Subject: [PATCH 2/4] Bump dbus libs versions again --- src/Avalonia.FreeDesktop/Avalonia.FreeDesktop.csproj | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Avalonia.FreeDesktop/Avalonia.FreeDesktop.csproj b/src/Avalonia.FreeDesktop/Avalonia.FreeDesktop.csproj index f4bdae4d030..fe008cb1881 100644 --- a/src/Avalonia.FreeDesktop/Avalonia.FreeDesktop.csproj +++ b/src/Avalonia.FreeDesktop/Avalonia.FreeDesktop.csproj @@ -12,8 +12,8 @@ - - + + From c3618bb392602cb5e76e7ea1d5a973dc8ceaea4e Mon Sep 17 00:00:00 2001 From: Jumar Macato <16554748+jmacato@users.noreply.github.com> Date: Wed, 26 Jun 2024 08:31:33 +0800 Subject: [PATCH 3/4] Fix PathHandler usages --- src/Avalonia.FreeDesktop/DBusMenuExporter.cs | 18 +++++++++++------- src/Avalonia.FreeDesktop/DBusTrayIconImpl.cs | 9 ++++----- 2 files changed, 15 insertions(+), 12 deletions(-) diff --git a/src/Avalonia.FreeDesktop/DBusMenuExporter.cs b/src/Avalonia.FreeDesktop/DBusMenuExporter.cs index 07801c6f70c..e330e7de584 100644 --- a/src/Avalonia.FreeDesktop/DBusMenuExporter.cs +++ b/src/Avalonia.FreeDesktop/DBusMenuExporter.cs @@ -43,7 +43,10 @@ public DBusMenuExporterImpl(Connection connection, IntPtr xid) InitBackingProperties(); Connection = connection; _xid = (uint)xid.ToInt32(); - Path = GenerateDBusMenuObjPath; + + PathHandler = new PathHandler(GenerateDBusMenuObjPath); + PathHandler.Add(this); + SetNativeMenu(new NativeMenu()); _ = InitializeAsync(); } @@ -53,7 +56,10 @@ public DBusMenuExporterImpl(Connection connection, string path) InitBackingProperties(); Connection = connection; _appMenu = false; - Path = path; + + PathHandler = new PathHandler(path); + PathHandler.Add(this); + SetNativeMenu(new NativeMenu()); _ = InitializeAsync(); } @@ -63,9 +69,7 @@ private void InitBackingProperties() Version = 4; } - protected override Connection Connection { get; } - - public override string Path { get; } + public override Connection Connection { get; } protected override ValueTask<(uint Revision, (int, Dictionary, Variant[]) Layout)> OnGetLayoutAsync(int parentId, int recursionDepth, string[] propertyNames) { @@ -106,7 +110,7 @@ protected override ValueTask OnEventGroupAsync((int, string, VariantValue private async Task InitializeAsync() { - Connection.AddMethodHandler(this); + Connection.AddMethodHandler(this.PathHandler!); if (!_appMenu) return; @@ -114,7 +118,7 @@ private async Task InitializeAsync() try { if (!_disposed) - await _registrar.RegisterWindowAsync(_xid, Path); + await _registrar.RegisterWindowAsync(_xid, this.PathHandler!.Path); } catch { diff --git a/src/Avalonia.FreeDesktop/DBusTrayIconImpl.cs b/src/Avalonia.FreeDesktop/DBusTrayIconImpl.cs index 09dc3eaf321..73444704b8d 100644 --- a/src/Avalonia.FreeDesktop/DBusTrayIconImpl.cs +++ b/src/Avalonia.FreeDesktop/DBusTrayIconImpl.cs @@ -58,7 +58,7 @@ public DBusTrayIconImpl() MenuExporter = DBusMenuExporter.TryCreateDetachedNativeMenu(_dbusMenuPath, _connection); _statusNotifierItemDbusObj = new StatusNotifierItemDbusObj(_connection, _dbusMenuPath); - _connection.AddMethodHandler(_statusNotifierItemDbusObj); + _connection.AddMethodHandler(_statusNotifierItemDbusObj.PathHandler!); WatchAsync(); } @@ -217,15 +217,14 @@ public StatusNotifierItemDbusObj(Connection connection, ObjectPath dbusMenuPath) { Connection = connection; Menu = dbusMenuPath; + PathHandler = new PathHandler("/StatusNotifierItem"); + PathHandler.Add(this); InvalidateAll(); } - protected override Connection Connection { get; } - - public override string Path => "/StatusNotifierItem"; - public event Action? ActivationDelegate; + public override Connection Connection { get; } protected override ValueTask OnContextMenuAsync(int x, int y) => new(); protected override ValueTask OnActivateAsync(int x, int y) From 035b4e3b6b0676c32013a1261bbaaed13b9f3b0a Mon Sep 17 00:00:00 2001 From: Jumar Macato <16554748+jmacato@users.noreply.github.com> Date: Wed, 26 Jun 2024 10:05:01 +0800 Subject: [PATCH 4/4] Add suppression for FreeDesktop lib --- api/Avalonia.FreeDesktop.nupkg.xml | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 api/Avalonia.FreeDesktop.nupkg.xml diff --git a/api/Avalonia.FreeDesktop.nupkg.xml b/api/Avalonia.FreeDesktop.nupkg.xml new file mode 100644 index 00000000000..f5fcb60bc8e --- /dev/null +++ b/api/Avalonia.FreeDesktop.nupkg.xml @@ -0,0 +1,10 @@ + + + + + CP0001 + T:Tmds.DBus.SourceGenerator.PropertyChanges`1 + baseline/netstandard2.0/Avalonia.FreeDesktop.dll + target/netstandard2.0/Avalonia.FreeDesktop.dll + + \ No newline at end of file