diff --git a/src/Avalonia.FreeDesktop/Avalonia.FreeDesktop.csproj b/src/Avalonia.FreeDesktop/Avalonia.FreeDesktop.csproj
index 8791efd313..da9add1fa4 100644
--- a/src/Avalonia.FreeDesktop/Avalonia.FreeDesktop.csproj
+++ b/src/Avalonia.FreeDesktop/Avalonia.FreeDesktop.csproj
@@ -13,7 +13,7 @@
-
+
diff --git a/src/Avalonia.FreeDesktop/DBusMenuExporter.cs b/src/Avalonia.FreeDesktop/DBusMenuExporter.cs
index d08828f796..3073ea580c 100644
--- a/src/Avalonia.FreeDesktop/DBusMenuExporter.cs
+++ b/src/Avalonia.FreeDesktop/DBusMenuExporter.cs
@@ -60,38 +60,42 @@ namespace Avalonia.FreeDesktop
public override string Path { get; }
- protected override (uint revision, (int, Dictionary, DBusVariantItem[]) layout) OnGetLayout(int parentId, int recursionDepth, string[] propertyNames)
+ protected override ValueTask<(uint revision, (int, Dictionary, DBusVariantItem[]) layout)> OnGetLayoutAsync(int parentId, int recursionDepth, string[] propertyNames)
{
var menu = GetMenu(parentId);
var layout = GetLayout(menu.item, menu.menu, recursionDepth, propertyNames);
if (!IsNativeMenuExported)
{
IsNativeMenuExported = true;
- Dispatcher.UIThread.Post(() => OnIsNativeMenuExportedChanged?.Invoke(this, EventArgs.Empty));
+ OnIsNativeMenuExportedChanged?.Invoke(this, EventArgs.Empty);
}
- return (_revision, layout);
+ return new ValueTask<(uint, (int, Dictionary, DBusVariantItem[]))>((_revision, layout));
}
- protected override (int, Dictionary)[] OnGetGroupProperties(int[] ids, string[] propertyNames) =>
- ids.Select(id => (id, GetProperties(GetMenu(id), propertyNames))).ToArray();
+ protected override ValueTask<(int, Dictionary)[]> OnGetGroupPropertiesAsync(int[] ids, string[] propertyNames)
+ => new(ids.Select(id => (id, GetProperties(GetMenu(id), propertyNames))).ToArray());
- protected override DBusVariantItem OnGetProperty(int id, string name) => GetProperty(GetMenu(id), name) ?? new DBusVariantItem("i", new DBusInt32Item(0));
+ protected override ValueTask OnGetPropertyAsync(int id, string name) =>
+ new(GetProperty(GetMenu(id), name) ?? new DBusVariantItem("i", new DBusInt32Item(0)));
- protected override void OnEvent(int id, string eventId, DBusVariantItem data, uint timestamp) =>
- Dispatcher.UIThread.Post(() => HandleEvent(id, eventId));
+ protected override ValueTask OnEventAsync(int id, string eventId, DBusVariantItem data, uint timestamp)
+ {
+ HandleEvent(id, eventId);
+ return new ValueTask();
+ }
- protected override int[] OnEventGroup((int, string, DBusVariantItem, uint)[] events)
+ protected override ValueTask OnEventGroupAsync((int, string, DBusVariantItem, uint)[] events)
{
foreach (var e in events)
- Dispatcher.UIThread.Post(() => HandleEvent(e.Item1, e.Item2));
- return Array.Empty();
+ HandleEvent(e.Item1, e.Item2);
+ return new ValueTask(Array.Empty());
}
- protected override bool OnAboutToShow(int id) => false;
+ protected override ValueTask OnAboutToShowAsync(int id) => new(false);
- protected override (int[] updatesNeeded, int[] idErrors) OnAboutToShowGroup(int[] ids) =>
- (Array.Empty(), Array.Empty());
+ protected override ValueTask<(int[] updatesNeeded, int[] idErrors)> OnAboutToShowGroupAsync(int[] ids) =>
+ new((Array.Empty(), Array.Empty()));
private async Task InitializeAsync()
{
diff --git a/src/Avalonia.FreeDesktop/DBusTrayIconImpl.cs b/src/Avalonia.FreeDesktop/DBusTrayIconImpl.cs
index afbee77067..fed8b87bc9 100644
--- a/src/Avalonia.FreeDesktop/DBusTrayIconImpl.cs
+++ b/src/Avalonia.FreeDesktop/DBusTrayIconImpl.cs
@@ -1,8 +1,10 @@
using System;
using System.Diagnostics;
+using System.Threading.Tasks;
using Avalonia.Controls.Platform;
using Avalonia.Logging;
using Avalonia.Platform;
+using Avalonia.Threading;
using Tmds.DBus.Protocol;
using Tmds.DBus.SourceGenerator;
@@ -219,13 +221,6 @@ namespace Avalonia.FreeDesktop
Connection = connection;
BackingProperties.Menu = dbusMenuPath;
BackingProperties.ToolTip = (string.Empty, Array.Empty<(int, int, byte[])>(), string.Empty, string.Empty);
- BackingProperties.IconName = string.Empty;
- BackingProperties.AttentionIconName = string.Empty;
- BackingProperties.AttentionIconPixmap = new []{ DBusTrayIconImpl.EmptyPixmap };
- BackingProperties.AttentionMovieName = string.Empty;
- BackingProperties.IconThemePath = string.Empty;
- BackingProperties.OverlayIconName = string.Empty;
- BackingProperties.OverlayIconPixmap = new []{ DBusTrayIconImpl.EmptyPixmap };
InvalidateAll();
}
@@ -235,13 +230,17 @@ namespace Avalonia.FreeDesktop
public event Action? ActivationDelegate;
- protected override void OnContextMenu(int x, int y) { }
+ protected override ValueTask OnContextMenuAsync(int x, int y) => new();
- protected override void OnActivate(int x, int y) => ActivationDelegate?.Invoke();
+ protected override ValueTask OnActivateAsync(int x, int y)
+ {
+ Dispatcher.UIThread.Post(() => ActivationDelegate?.Invoke());
+ return new ValueTask();
+ }
- protected override void OnSecondaryActivate(int x, int y) { }
+ protected override ValueTask OnSecondaryActivateAsync(int x, int y) => new();
- protected override void OnScroll(int delta, string orientation) { }
+ protected override ValueTask OnScrollAsync(int delta, string orientation) => new();
public void InvalidateAll()
{
diff --git a/src/Avalonia.Themes.Fluent/Controls/Menu.xaml b/src/Avalonia.Themes.Fluent/Controls/Menu.xaml
index 692bac958a..039482d70f 100644
--- a/src/Avalonia.Themes.Fluent/Controls/Menu.xaml
+++ b/src/Avalonia.Themes.Fluent/Controls/Menu.xaml
@@ -37,6 +37,7 @@
MinWidth="{Binding Bounds.Width, RelativeSource={RelativeSource TemplatedParent}}"
IsLightDismissEnabled="True"
IsOpen="{TemplateBinding IsSubMenuOpen, Mode=TwoWay}"
+ PlacementMode="BottomEdgeAlignedLeft"
OverlayInputPassThroughElement="{Binding $parent[Menu]}">