Browse Source

[X11] XI2 fix

xi2-leave-event
Nikita Tsukanov 5 years ago
parent
commit
ce38f30bbd
  1. 18
      src/Avalonia.X11/XI2Manager.cs

18
src/Avalonia.X11/XI2Manager.cs

@ -13,7 +13,8 @@ namespace Avalonia.X11
{
XiEventType.XI_Motion,
XiEventType.XI_ButtonPress,
XiEventType.XI_ButtonRelease
XiEventType.XI_ButtonRelease,
XiEventType.XI_Leave
};
private static readonly XiEventType[] MultiTouchEventTypes = new XiEventType[]
@ -177,9 +178,10 @@ namespace Avalonia.X11
_pointerDevice.Update(changed->Classes, changed->NumClasses);
}
if ((xev->evtype >= XiEventType.XI_ButtonPress && xev->evtype <= XiEventType.XI_Motion)
|| (xev->evtype>=XiEventType.XI_TouchBegin&&xev->evtype<=XiEventType.XI_TouchEnd))
|| (xev->evtype >= XiEventType.XI_TouchBegin && xev->evtype <= XiEventType.XI_TouchEnd)
|| xev->evtype == XiEventType.XI_Leave)
{
var dev = (XIDeviceEvent*)xev;
if (_clients.TryGetValue(dev->EventWindow, out var client))
@ -306,7 +308,7 @@ namespace Avalonia.X11
if (state.HasFlag(XModifierMask.Mod4Mask))
Modifiers |= RawInputModifiers.Meta;
if (ev->buttons.MaskLen > 0)
if (ev->buttons.MaskLen > 1 && Type != XiEventType.XI_Leave)
{
var buttons = ev->buttons.Mask;
if (XIMaskIsSet(buttons, 1))
@ -324,9 +326,11 @@ namespace Avalonia.X11
Valuators = new Dictionary<int, double>();
Position = new Point(ev->event_x, ev->event_y);
var values = ev->valuators.Values;
for (var c = 0; c < ev->valuators.MaskLen * 8; c++)
if (XIMaskIsSet(ev->valuators.Mask, c))
Valuators[c] = *values++;
if(ev->valuators.Mask != null)
for (var c = 0; c < ev->valuators.MaskLen * 8; c++)
if (XIMaskIsSet(ev->valuators.Mask, c))
Valuators[c] = *values++;
if (Type == XiEventType.XI_ButtonPress || Type == XiEventType.XI_ButtonRelease)
Button = ev->detail;
Detail = ev->detail;

Loading…
Cancel
Save