diff --git a/src/Avalonia.FreeDesktop/DBusMenuExporter.cs b/src/Avalonia.FreeDesktop/DBusMenuExporter.cs index 0ab949ee69..911dc82e96 100644 --- a/src/Avalonia.FreeDesktop/DBusMenuExporter.cs +++ b/src/Avalonia.FreeDesktop/DBusMenuExporter.cs @@ -33,6 +33,7 @@ namespace Avalonia.FreeDesktop private NativeMenu _menu; private Dictionary _idsToItems = new Dictionary(); private Dictionary _itemsToIds = new Dictionary(); + private readonly HashSet _menus = new HashSet(); private bool _resetQueued; private int _nextId = 1; public DBusMenuExporterImpl(Connection dbus, IntPtr xid) @@ -104,12 +105,11 @@ namespace Avalonia.FreeDesktop void DoLayoutReset() { _resetQueued = false; - foreach (var i in _idsToItems.Values) - { + foreach (var i in _idsToItems.Values) i.PropertyChanged -= OnItemPropertyChanged; - if (i is NativeMenuItem nmi) - ((INotifyCollectionChanged)nmi.Menu.Items).CollectionChanged -= OnMenuItemsChanged; - } + foreach(var menu in _menus) + ((INotifyCollectionChanged)menu.Items).CollectionChanged -= OnMenuItemsChanged; + _menus.Clear(); _idsToItems.Clear(); _itemsToIds.Clear(); _revision++; @@ -132,6 +132,12 @@ namespace Avalonia.FreeDesktop return (item, (item as NativeMenuItem)?.Menu); } + private void EnsureSubscribed(NativeMenu menu) + { + if(menu!=null && _menus.Add(menu)) + ((INotifyCollectionChanged)menu.Items).CollectionChanged += OnMenuItemsChanged; + } + private int GetId(NativeMenuItemBase item) { if (_itemsToIds.TryGetValue(item, out var id)) @@ -141,7 +147,7 @@ namespace Avalonia.FreeDesktop _itemsToIds[item] = id; item.PropertyChanged += OnItemPropertyChanged; if (item is NativeMenuItem nmi) - ((INotifyCollectionChanged)nmi.Menu.Items).CollectionChanged += OnMenuItemsChanged; + EnsureSubscribed(nmi.Menu); return id; } @@ -190,12 +196,15 @@ namespace Avalonia.FreeDesktop { var (it, menu) = i; - if (it is NativeMenuItem item) + if (it is NativeMenuItemSeperator) + { + if (name == "type") + return "separator"; + } + else if (it is NativeMenuItem item) { if (name == "type") { - if (item != null && item.Header == null) - return "separator"; return null; } if (name == "label")