diff --git a/src/Avalonia.Input/Raw/RawPointerEventArgs.cs b/src/Avalonia.Input/Raw/RawPointerEventArgs.cs
index bbd5515da0..62a1dd5d84 100644
--- a/src/Avalonia.Input/Raw/RawPointerEventArgs.cs
+++ b/src/Avalonia.Input/Raw/RawPointerEventArgs.cs
@@ -63,7 +63,7 @@ namespace Avalonia.Input.Raw
///
/// Gets the type of the event.
///
- public RawPointerEventType Type { get; private set; }
+ public RawPointerEventType Type { get; set; }
///
/// Gets the input modifiers.
diff --git a/src/Avalonia.X11/X11Window.cs b/src/Avalonia.X11/X11Window.cs
index 60fd0346a3..478a908951 100644
--- a/src/Avalonia.X11/X11Window.cs
+++ b/src/Avalonia.X11/X11Window.cs
@@ -649,7 +649,27 @@ namespace Avalonia.X11
ScheduleInput(args);
}
- public void ScheduleInput(RawInputEventArgs args)
+ public void ScheduleXI2Input(RawInputEventArgs args)
+ {
+ if (args is RawPointerEventArgs pargs)
+ {
+ if ((pargs.Type == RawPointerEventType.TouchBegin
+ || pargs.Type == RawPointerEventType.TouchUpdate
+ || pargs.Type == RawPointerEventType.LeftButtonDown
+ || pargs.Type == RawPointerEventType.RightButtonDown
+ || pargs.Type == RawPointerEventType.MiddleButtonDown
+ || pargs.Type == RawPointerEventType.NonClientLeftButtonDown)
+ && ActivateTransientChildIfNeeded())
+ return;
+ if (pargs.Type == RawPointerEventType.TouchEnd
+ && ActivateTransientChildIfNeeded())
+ pargs.Type = RawPointerEventType.TouchCancel;
+ }
+
+ ScheduleInput(args);
+ }
+
+ private void ScheduleInput(RawInputEventArgs args)
{
if (args is RawPointerEventArgs mouse)
mouse.Position = mouse.Position / Scaling;
diff --git a/src/Avalonia.X11/XI2Manager.cs b/src/Avalonia.X11/XI2Manager.cs
index ac14efe133..0734532d92 100644
--- a/src/Avalonia.X11/XI2Manager.cs
+++ b/src/Avalonia.X11/XI2Manager.cs
@@ -196,7 +196,7 @@ namespace Avalonia.X11
(ev.Type == XiEventType.XI_TouchUpdate ?
RawPointerEventType.TouchUpdate :
RawPointerEventType.TouchEnd);
- client.ScheduleInput(new RawTouchEventArgs(client.TouchDevice,
+ client.ScheduleXI2Input(new RawTouchEventArgs(client.TouchDevice,
ev.Timestamp, client.InputRoot, type, ev.Position, ev.Modifiers, ev.Detail));
return;
}
@@ -230,10 +230,10 @@ namespace Avalonia.X11
}
if (scrollDelta != default)
- client.ScheduleInput(new RawMouseWheelEventArgs(client.MouseDevice, ev.Timestamp,
+ client.ScheduleXI2Input(new RawMouseWheelEventArgs(client.MouseDevice, ev.Timestamp,
client.InputRoot, ev.Position, scrollDelta, ev.Modifiers));
if (_pointerDevice.HasMotion(ev))
- client.ScheduleInput(new RawPointerEventArgs(client.MouseDevice, ev.Timestamp, client.InputRoot,
+ client.ScheduleXI2Input(new RawPointerEventArgs(client.MouseDevice, ev.Timestamp, client.InputRoot,
RawPointerEventType.Move, ev.Position, ev.Modifiers));
}
@@ -250,7 +250,7 @@ namespace Avalonia.X11
_ => (RawPointerEventType?)null
};
if (type.HasValue)
- client.ScheduleInput(new RawPointerEventArgs(client.MouseDevice, ev.Timestamp, client.InputRoot,
+ client.ScheduleXI2Input(new RawPointerEventArgs(client.MouseDevice, ev.Timestamp, client.InputRoot,
type.Value, ev.Position, ev.Modifiers));
}
@@ -313,7 +313,7 @@ namespace Avalonia.X11
interface IXI2Client
{
IInputRoot InputRoot { get; }
- void ScheduleInput(RawInputEventArgs args);
+ void ScheduleXI2Input(RawInputEventArgs args);
IMouseDevice MouseDevice { get; }
TouchDevice TouchDevice { get; }
}