Jelajahi Sumber

fix: DBus tray icon NRE when change visible (#19742)

* fix: TrayIcon NRE when change visible

* fix: DBus tray icon duplicated click event

---------

Co-authored-by: Max Katz <[email protected]>
memorydream 1 hari lalu
induk
melakukan
6cf9b87a95
1 mengubah file dengan 8 tambahan dan 1 penghapusan
  1. 8 1
      src/Avalonia.FreeDesktop/DBusTrayIconImpl.cs

+ 8 - 1
src/Avalonia.FreeDesktop/DBusTrayIconImpl.cs

@@ -58,6 +58,7 @@ namespace Avalonia.FreeDesktop
             _statusNotifierItemDbusObj = new StatusNotifierItemDbusObj(_connection, dbusMenuPath);
             _pathHandler.Add(_statusNotifierItemDbusObj);
             _connection.AddMethodHandler(_pathHandler);
+            _statusNotifierItemDbusObj.ActivationDelegate += () => OnClicked?.Invoke();
 
             WatchAsync();
         }
@@ -112,13 +113,19 @@ namespace Avalonia.FreeDesktop
 #endif
             var tid = s_trayIconInstanceId++;
 
+            // make sure not to add the path handle and connection method handler twice
+            if (_statusNotifierItemDbusObj!.PathHandler is null)
+                _pathHandler.Add(_statusNotifierItemDbusObj!);
+
+            _connection.RemoveMethodHandler(_pathHandler.Path);
+            _connection.AddMethodHandler(_pathHandler);
+
             _sysTrayServiceName = FormattableString.Invariant($"org.kde.StatusNotifierItem-{pid}-{tid}");
             await _dBus!.RequestNameAsync(_sysTrayServiceName, 0);
             await _statusNotifierWatcher.RegisterStatusNotifierItemAsync(_sysTrayServiceName);
 
             _statusNotifierItemDbusObj!.SetTitleAndTooltip(_tooltipText);
             _statusNotifierItemDbusObj.SetIcon(_icon);
-            _statusNotifierItemDbusObj.ActivationDelegate += OnClicked;
         }
 
         private void DestroyTrayIcon()