From 7b6cabe6085409ad0d86bbe4bf777663c7c557ca Mon Sep 17 00:00:00 2001
From: affederaffe <68356204+affederaffe@users.noreply.github.com>
Date: Tue, 28 Mar 2023 17:24:52 +0200
Subject: [PATCH 1/9] Fix TrayIcons on Gnome
---
.../Avalonia.FreeDesktop.csproj | 10 ++++-----
src/Avalonia.FreeDesktop/DBusMenuExporter.cs | 21 ++++++++++---------
src/Avalonia.FreeDesktop/DBusTrayIconImpl.cs | 13 ++++++++++--
3 files changed, 27 insertions(+), 17 deletions(-)
diff --git a/src/Avalonia.FreeDesktop/Avalonia.FreeDesktop.csproj b/src/Avalonia.FreeDesktop/Avalonia.FreeDesktop.csproj
index da9add1fa4..da6ae9e856 100644
--- a/src/Avalonia.FreeDesktop/Avalonia.FreeDesktop.csproj
+++ b/src/Avalonia.FreeDesktop/Avalonia.FreeDesktop.csproj
@@ -5,20 +5,20 @@
enable
-
+
-
+
-
+
-
-
+
+
diff --git a/src/Avalonia.FreeDesktop/DBusMenuExporter.cs b/src/Avalonia.FreeDesktop/DBusMenuExporter.cs
index 3073ea580c..77f9d31273 100644
--- a/src/Avalonia.FreeDesktop/DBusMenuExporter.cs
+++ b/src/Avalonia.FreeDesktop/DBusMenuExporter.cs
@@ -38,7 +38,7 @@ namespace Avalonia.FreeDesktop
private bool _resetQueued;
private int _nextId = 1;
- public DBusMenuExporterImpl(Connection connection, IntPtr xid)
+ public DBusMenuExporterImpl(Connection connection, IntPtr xid) : this()
{
Connection = connection;
_xid = (uint)xid.ToInt32();
@@ -47,7 +47,7 @@ namespace Avalonia.FreeDesktop
_ = InitializeAsync();
}
- public DBusMenuExporterImpl(Connection connection, string path)
+ public DBusMenuExporterImpl(Connection connection, string path) : this()
{
Connection = connection;
_appMenu = false;
@@ -56,6 +56,13 @@ namespace Avalonia.FreeDesktop
_ = InitializeAsync();
}
+ private DBusMenuExporterImpl()
+ {
+ BackingProperties.Status = string.Empty;
+ BackingProperties.TextDirection = string.Empty;
+ BackingProperties.IconThemePath = Array.Empty();
+ }
+
protected override Connection Connection { get; }
public override string Path { get; }
@@ -202,15 +209,9 @@ namespace Avalonia.FreeDesktop
return id;
}
- private void OnMenuItemsChanged(object? sender, NotifyCollectionChangedEventArgs e)
- {
- QueueReset();
- }
+ private void OnMenuItemsChanged(object? sender, NotifyCollectionChangedEventArgs e) => QueueReset();
- private void OnItemPropertyChanged(object? sender, AvaloniaPropertyChangedEventArgs e)
- {
- QueueReset();
- }
+ private void OnItemPropertyChanged(object? sender, AvaloniaPropertyChangedEventArgs e) => QueueReset();
private static readonly string[] s_allProperties = {
"type", "label", "enabled", "visible", "shortcut", "toggle-type", "children-display", "toggle-state", "icon-data"
diff --git a/src/Avalonia.FreeDesktop/DBusTrayIconImpl.cs b/src/Avalonia.FreeDesktop/DBusTrayIconImpl.cs
index fed8b87bc9..43ae48341c 100644
--- a/src/Avalonia.FreeDesktop/DBusTrayIconImpl.cs
+++ b/src/Avalonia.FreeDesktop/DBusTrayIconImpl.cs
@@ -220,6 +220,16 @@ namespace Avalonia.FreeDesktop
{
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);
InvalidateAll();
}
@@ -234,7 +244,7 @@ namespace Avalonia.FreeDesktop
protected override ValueTask OnActivateAsync(int x, int y)
{
- Dispatcher.UIThread.Post(() => ActivationDelegate?.Invoke());
+ ActivationDelegate?.Invoke();
return new ValueTask();
}
@@ -267,7 +277,6 @@ namespace Avalonia.FreeDesktop
BackingProperties.Category = "ApplicationStatus";
BackingProperties.Status = text;
BackingProperties.Title = text;
- BackingProperties.ToolTip = (string.Empty, Array.Empty<(int, int, byte[])>(), text, string.Empty);
InvalidateAll();
}
}
From b2a4e85e23b78ec031be0bb6b12fffc1b8cd5528 Mon Sep 17 00:00:00 2001
From: Benedikt Stebner
Date: Wed, 29 Mar 2023 14:20:46 +0200
Subject: [PATCH 2/9] Only bypass WM_CHAR if previous composition is not empty
---
src/Windows/Avalonia.Win32/WindowImpl.AppWndProc.cs | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/Windows/Avalonia.Win32/WindowImpl.AppWndProc.cs b/src/Windows/Avalonia.Win32/WindowImpl.AppWndProc.cs
index 39bdb942e1..84f27f080e 100644
--- a/src/Windows/Avalonia.Win32/WindowImpl.AppWndProc.cs
+++ b/src/Windows/Avalonia.Win32/WindowImpl.AppWndProc.cs
@@ -729,7 +729,7 @@ namespace Avalonia.Win32
{
case GCS.GCS_RESULTSTR:
{
- if(ToInt32(wParam) >= 32)
+ if(!string.IsNullOrEmpty(previousComposition) && ToInt32(wParam) >= 32)
{
Imm32InputMethod.Current.Composition = previousComposition;
From 7bb6d06ac50f393c667715eb3393a36b282b78e4 Mon Sep 17 00:00:00 2001
From: Steven Kirk
Date: Wed, 29 Mar 2023 15:24:29 +0200
Subject: [PATCH 3/9] Added failing test for #10626 and #10718.
---
.../MenuItemTests.cs | 44 +++++++++++++++++++
1 file changed, 44 insertions(+)
diff --git a/tests/Avalonia.Controls.UnitTests/MenuItemTests.cs b/tests/Avalonia.Controls.UnitTests/MenuItemTests.cs
index 1049ff2678..909b65853c 100644
--- a/tests/Avalonia.Controls.UnitTests/MenuItemTests.cs
+++ b/tests/Avalonia.Controls.UnitTests/MenuItemTests.cs
@@ -3,7 +3,9 @@ using System.Collections.Generic;
using System.Text;
using System.Windows.Input;
using Avalonia.Collections;
+using Avalonia.Controls.Presenters;
using Avalonia.Controls.Primitives;
+using Avalonia.Controls.Templates;
using Avalonia.Data;
using Avalonia.Input;
using Avalonia.Platform;
@@ -348,6 +350,46 @@ namespace Avalonia.Controls.UnitTests
}
}
+ [Fact]
+ public void Menu_ItemTemplate_Should_Be_Applied_To_TopLevel_MenuItem_Header()
+ {
+ using var app = Application();
+
+ var items = new[]
+ {
+ new MenuViewModel("Foo"),
+ new MenuViewModel("Bar"),
+ };
+
+ var itemTemplate = new FuncDataTemplate((x, _) =>
+ new TextBlock { Text = x.Header });
+
+ var menu = new Menu
+ {
+ ItemTemplate = itemTemplate,
+ ItemsSource = items,
+ };
+
+ var window = new Window { Content = menu };
+ window.LayoutManager.ExecuteInitialLayoutPass();
+
+ var panel = Assert.IsType(menu.Presenter.Panel);
+ Assert.Equal(2, panel.Children.Count);
+
+ for (var i = 0; i < panel.Children.Count; i++)
+ {
+ var menuItem = Assert.IsType