From f011f28b2a1aba4a17cd4c191e8639bde5031fad Mon Sep 17 00:00:00 2001 From: Vladyslav Lubenskyi Date: Fri, 1 Sep 2023 13:23:56 +0300 Subject: [PATCH] Clean up the focus proxy window --- src/Avalonia.X11/X11FocusProxy.cs | 18 ++++++++++++++---- src/Avalonia.X11/X11Window.cs | 4 +--- 2 files changed, 15 insertions(+), 7 deletions(-) diff --git a/src/Avalonia.X11/X11FocusProxy.cs b/src/Avalonia.X11/X11FocusProxy.cs index 0aab77a68c..1681abbb74 100644 --- a/src/Avalonia.X11/X11FocusProxy.cs +++ b/src/Avalonia.X11/X11FocusProxy.cs @@ -25,6 +25,7 @@ namespace Avalonia.X11 private readonly (int Width, int Height) _smallest = (1, 1); internal readonly IntPtr _handle; + private readonly AvaloniaX11Platform _platform; private readonly X11PlatformThreading.EventHandler _ownerEventHandler; /// @@ -34,22 +35,31 @@ namespace Avalonia.X11 /// The X11 platform. /// The parent window to proxy the focus for. /// An event handler that will handle X events that come to the proxy. - public X11FocusProxy(AvaloniaX11Platform platform, IntPtr parent, + internal X11FocusProxy(AvaloniaX11Platform platform, IntPtr parent, X11PlatformThreading.EventHandler eventHandler) { _handle = PrepareXWindow(platform.Info.Display, parent); + _platform = platform; _ownerEventHandler = eventHandler; - platform.Windows[_handle] = OnEvent; + _platform.Windows[_handle] = OnEvent; + } + + internal void CleanUp() + { + if (_handle != IntPtr.Zero) + { + _platform.Windows.Remove(_handle); + } } private void OnEvent(ref XEvent ev) { - if (ev.type == XEventName.FocusIn || ev.type == XEventName.FocusOut) + if (ev.type is XEventName.FocusIn or XEventName.FocusOut) { this._ownerEventHandler(ref ev); } - if (ev.type == XEventName.KeyPress || ev.type == XEventName.KeyRelease) + if (ev.type is XEventName.KeyPress or XEventName.KeyRelease) { this._ownerEventHandler(ref ev); } diff --git a/src/Avalonia.X11/X11Window.cs b/src/Avalonia.X11/X11Window.cs index f06fdb9268..6f7c789eb8 100644 --- a/src/Avalonia.X11/X11Window.cs +++ b/src/Avalonia.X11/X11Window.cs @@ -931,9 +931,7 @@ namespace Avalonia.X11 _renderHandle = IntPtr.Zero; } - if (_focusProxy != null) { - _focusProxy = null; - } + _focusProxy.CleanUp(); } private bool ActivateTransientChildIfNeeded()