Browse Source

Merge pull request #10919 from AvaloniaUI/x11-disable-input

X11 - Prevent window from receiving input when disabled
pull/11024/head
Dan Walmsley 3 years ago
committed by GitHub
parent
commit
773831ef4b
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 33
      src/Avalonia.X11/X11Window.cs
  2. 3
      src/Avalonia.X11/XI2Manager.cs
  3. 3
      src/Avalonia.X11/XLib.cs

33
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<XWMHints>(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;

3
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; }

3
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);

Loading…
Cancel
Save