Browse Source

feat: Support Pressure in X11 platform (#15283)

release/11.1.0-beta2
lindexi 2 years ago
committed by Max Katz
parent
commit
4802fa3a5d
  1. 27
      src/Avalonia.X11/XI2Manager.cs

27
src/Avalonia.X11/XI2Manager.cs

@ -96,6 +96,8 @@ namespace Avalonia.X11
private PointerDeviceInfo _pointerDevice;
private AvaloniaX11Platform _platform;
private XIValuatorClassInfo? _pressureXIValuatorClassInfo;
public bool Init(AvaloniaX11Platform platform)
{
_platform = platform;
@ -113,6 +115,13 @@ namespace Avalonia.X11
}
if(_pointerDevice == null)
return false;
if (_multitouch)
{
var pressureAtom = XInternAtom(_x11.Display, "Abs MT Pressure", false);
_pressureXIValuatorClassInfo = _pointerDevice.Valuators.FirstOrDefault(t => t.Label == pressureAtom);
}
/*
int mask = 0;
@ -226,8 +235,24 @@ namespace Avalonia.X11
(ev.Type == XiEventType.XI_TouchUpdate ?
RawPointerEventType.TouchUpdate :
RawPointerEventType.TouchEnd);
var rawPointerPoint = new RawPointerPoint()
{
Position = ev.Position
};
if (_pressureXIValuatorClassInfo is {} valuatorClassInfo)
{
if (ev.Valuators.TryGetValue(valuatorClassInfo.Number, out var pressureValue))
{
// In our API we use range from 0.0 to 1.0.
var pressure = (pressureValue - valuatorClassInfo.Min) / (valuatorClassInfo.Max - valuatorClassInfo.Min);
rawPointerPoint.Pressure = (float)pressure;
}
}
client.ScheduleXI2Input(new RawTouchEventArgs(client.TouchDevice,
ev.Timestamp, client.InputRoot, type, ev.Position, ev.Modifiers, ev.Detail));
ev.Timestamp, client.InputRoot, type, rawPointerPoint, ev.Modifiers, ev.Detail));
return;
}

Loading…
Cancel
Save