diff --git a/src/Avalonia.X11/X11Window.cs b/src/Avalonia.X11/X11Window.cs index eab373de6d..38af1b6d7b 100644 --- a/src/Avalonia.X11/X11Window.cs +++ b/src/Avalonia.X11/X11Window.cs @@ -24,6 +24,7 @@ using Avalonia.X11.Glx; using Avalonia.X11.NativeDialogs; using static Avalonia.X11.XLib; using Avalonia.Input.Platform; +using System.Runtime.InteropServices; // ReSharper disable IdentifierTypo // ReSharper disable StringLiteralTypo @@ -737,6 +738,10 @@ namespace Avalonia.X11 { if (_inputRoot is null) return; + + if (_disabled && args is RawPointerEventArgs pargs && pargs.Type == RawPointerEventType.Move) + return; + Input?.Invoke(args); if (!args.Handled && args is RawKeyEventArgsWithText text && !string.IsNullOrEmpty(text.Text)) Input?.Invoke(new RawTextInputEventArgs(_keyboard, args.Timestamp, _inputRoot, text.Text)); @@ -1203,6 +1208,32 @@ namespace Avalonia.X11 public void SetEnabled(bool enable) { _disabled = !enable; + + UpdateWMHints(); + } + + private void UpdateWMHints() + { + var wmHintsPtr = XGetWMHints(_x11.Display, _handle); + + XWMHints hints = default; + + if (wmHintsPtr != IntPtr.Zero) + { + hints = Marshal.PtrToStructure(wmHintsPtr); + } + + var flags = hints.flags.ToInt64(); + flags |= (long)XWMHintsFlags.InputHint; + hints.flags = (IntPtr)flags; + hints.input = !_disabled ? 1 : 0; + + XSetWMHints(_x11.Display, _handle, ref hints); + + if (wmHintsPtr != IntPtr.Zero) + { + XFree(wmHintsPtr); + } } public void SetExtendClientAreaToDecorationsHint(bool extendIntoClientAreaHint) @@ -1292,6 +1323,8 @@ namespace Avalonia.X11 public bool NeedsManagedDecorations => false; + public bool IsEnabled => !_disabled; + public class SurfacePlatformHandle : IPlatformNativeSurfaceHandle { private readonly X11Window _owner; diff --git a/src/Avalonia.X11/XI2Manager.cs b/src/Avalonia.X11/XI2Manager.cs index f66616f2aa..b066f9d827 100644 --- a/src/Avalonia.X11/XI2Manager.cs +++ b/src/Avalonia.X11/XI2Manager.cs @@ -231,7 +231,7 @@ namespace Avalonia.X11 return; } - if (_multitouch && ev.Emulated) + if (!client.IsEnabled || (_multitouch && ev.Emulated)) return; if (ev.Type == XiEventType.XI_Motion) @@ -370,6 +370,7 @@ namespace Avalonia.X11 internal interface IXI2Client { + bool IsEnabled { get; } IInputRoot InputRoot { get; } void ScheduleXI2Input(RawInputEventArgs args); IMouseDevice MouseDevice { get; } diff --git a/src/Avalonia.X11/XLib.cs b/src/Avalonia.X11/XLib.cs index 7a43cd378b..641adde7e2 100644 --- a/src/Avalonia.X11/XLib.cs +++ b/src/Avalonia.X11/XLib.cs @@ -375,6 +375,9 @@ namespace Avalonia.X11 [DllImport(libX11)] public static extern void XSetWMHints(IntPtr display, IntPtr window, ref XWMHints wmhints); + [DllImport(libX11)] + public static extern IntPtr XGetWMHints(IntPtr display, IntPtr window); + [DllImport(libX11)] public static extern int XGetIconSizes(IntPtr display, IntPtr window, out IntPtr size_list, out int count);