Browse Source

x11 - prevent window from receiving input when disabled

pull/10919/head
Emmanuel Hansen 3 years ago
parent
commit
bd023ae06f
  1. 26
      src/Avalonia.X11/X11Window.cs
  2. 3
      src/Avalonia.X11/XI2Manager.cs
  3. 3
      src/Avalonia.X11/XLib.cs

26
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
@ -772,7 +773,7 @@ namespace Avalonia.X11
private void MouseEvent(RawPointerEventType type, ref XEvent ev, XModifierMask mods)
{
if (_inputRoot is null)
if (_inputRoot is null || _disabled)
return;
var mev = new RawPointerEventArgs(
_mouse, (ulong)ev.ButtonEvent.time.ToInt64(), _inputRoot,
@ -1201,6 +1202,27 @@ namespace Avalonia.X11
public void SetEnabled(bool enable)
{
_disabled = !enable;
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 = enable ? 1 : 0;
XSetWMHints(_x11.Display, _handle, ref hints);
if (wmHintsPtr != IntPtr.Zero)
{
XFree(wmHintsPtr);
}
}
public void SetExtendClientAreaToDecorationsHint(bool extendIntoClientAreaHint)
@ -1290,6 +1312,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

@ -217,6 +217,8 @@ namespace Avalonia.X11
private void OnDeviceEvent(IXI2Client client, ParsedDeviceEvent ev)
{
if (!client.IsEnabled)
return;
if (ev.Type == XiEventType.XI_TouchBegin
|| ev.Type == XiEventType.XI_TouchUpdate
|| ev.Type == XiEventType.XI_TouchEnd)
@ -370,6 +372,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