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