Explorar el Código

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 hace 1 día
padre
commit
6cf9b87a95
Se han modificado 1 ficheros con 8 adiciones y 1 borrados
  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()