Skip to content

Commit d467b61

Browse files
authored
Fix X11 LeaveWindow not raised with software rendering (#22120)
1 parent 486058f commit d467b61

2 files changed

Lines changed: 16 additions & 6 deletions

File tree

src/Avalonia.X11/X11Window.cs

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -605,13 +605,15 @@ private void OnEvent(ref XEvent ev)
605605
else if (ev.type == XEventName.MotionNotify)
606606
MouseEvent(RawPointerEventType.Move, ref ev, ev.MotionEvent.state);
607607
else if (ev.type == XEventName.LeaveNotify)
608-
MouseEvent(RawPointerEventType.LeaveWindow, ref ev, ev.CrossingEvent.state);
608+
{
609+
if (IsHandledLeaveEnterDetail(ev.CrossingEvent.detail))
610+
{
611+
MouseEvent(RawPointerEventType.LeaveWindow, ref ev, ev.CrossingEvent.state);
612+
}
613+
}
609614
else if (ev.type == XEventName.EnterNotify)
610615
{
611-
if (ev.CrossingEvent.detail is
612-
NotifyDetail.NotifyNonlinear or
613-
NotifyDetail.NotifyNonlinearVirtual or
614-
NotifyDetail.NotifyVirtual)
616+
if (IsHandledLeaveEnterDetail(ev.CrossingEvent.detail))
615617
{
616618
MouseEvent(RawPointerEventType.Move, ref ev, ev.CrossingEvent.state);
617619
}
@@ -758,6 +760,13 @@ NotifyDetail.NotifyNonlinearVirtual or
758760
}
759761
}
760762

763+
private static bool IsHandledLeaveEnterDetail(NotifyDetail detail)
764+
=> detail is
765+
NotifyDetail.NotifyNonlinear or
766+
NotifyDetail.NotifyNonlinearVirtual or
767+
NotifyDetail.NotifyVirtual or
768+
NotifyDetail.NotifyAncestor;
769+
761770
private void HandleActivation(bool active)
762771
{
763772
if (active)

src/Avalonia.X11/XI2Manager.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -296,7 +296,8 @@ private void OnEnterLeaveEvent(IXI2Client client, ref XIEnterLeaveEvent ev)
296296
var detail = ev.detail;
297297
if (detail != XiEnterLeaveDetail.XINotifyNonlinearVirtual &&
298298
detail != XiEnterLeaveDetail.XINotifyNonlinear &&
299-
detail != XiEnterLeaveDetail.XINotifyVirtual)
299+
detail != XiEnterLeaveDetail.XINotifyVirtual &&
300+
detail != XiEnterLeaveDetail.XINotifyAncestor)
300301
return;
301302

302303
var buttons = ParsedDeviceEvent.ParseButtonState(ev.buttons.MaskLen, ev.buttons.Mask);

0 commit comments

Comments
 (0)