|
|
@ -399,26 +399,10 @@ namespace Avalonia.Win32 |
|
|
case WindowsMessage.WM_NCPOINTERUP: |
|
|
case WindowsMessage.WM_NCPOINTERUP: |
|
|
case WindowsMessage.WM_POINTERDOWN: |
|
|
case WindowsMessage.WM_POINTERDOWN: |
|
|
case WindowsMessage.WM_POINTERUP: |
|
|
case WindowsMessage.WM_POINTERUP: |
|
|
{ |
|
|
|
|
|
var pointerId = (uint)(ToInt32(wParam) & 0xFFFF); |
|
|
|
|
|
GetDeviceInfo(wParam, out var device, out var info, ref timestamp); |
|
|
|
|
|
var eventType = GetEventType(message, info); |
|
|
|
|
|
var point = PointToClient(new PixelPoint(info.ptPixelLocationX, info.ptPixelLocationY)); |
|
|
|
|
|
var modifiers = GetInputModifiers(info.dwKeyStates); |
|
|
|
|
|
|
|
|
|
|
|
if (device is TouchDevice) |
|
|
|
|
|
{ |
|
|
|
|
|
e = new RawTouchEventArgs(_touchDevice, timestamp, _owner, eventType, point, modifiers, info.pointerId); |
|
|
|
|
|
} |
|
|
|
|
|
else |
|
|
|
|
|
{ |
|
|
|
|
|
e = new RawPointerEventArgs(device, timestamp, _owner, eventType, point, modifiers); |
|
|
|
|
|
} |
|
|
|
|
|
break; |
|
|
|
|
|
} |
|
|
|
|
|
case WindowsMessage.WM_POINTERUPDATE: |
|
|
case WindowsMessage.WM_POINTERUPDATE: |
|
|
{ |
|
|
{ |
|
|
GetDeviceInfo(wParam, out var device, out var info, ref timestamp); |
|
|
GetDevicePointerInfo(wParam, out var device, out var info, ref timestamp); |
|
|
|
|
|
var eventType = GetEventType(message, info); |
|
|
var point = PointToClient(new PixelPoint(info.ptPixelLocationX, info.ptPixelLocationY)); |
|
|
var point = PointToClient(new PixelPoint(info.ptPixelLocationX, info.ptPixelLocationY)); |
|
|
var modifiers = GetInputModifiers(info.dwKeyStates); |
|
|
var modifiers = GetInputModifiers(info.dwKeyStates); |
|
|
|
|
|
|
|
|
@ -428,13 +412,11 @@ namespace Avalonia.Win32 |
|
|
{ |
|
|
{ |
|
|
break; |
|
|
break; |
|
|
} |
|
|
} |
|
|
e = new RawTouchEventArgs(_touchDevice, timestamp, _owner, |
|
|
e = new RawTouchEventArgs(_touchDevice, timestamp, _owner, eventType, point, modifiers, info.pointerId); |
|
|
RawPointerEventType.TouchUpdate, point, modifiers, info.pointerId); |
|
|
|
|
|
} |
|
|
} |
|
|
else |
|
|
else |
|
|
{ |
|
|
{ |
|
|
e = new RawPointerEventArgs(device, timestamp, _owner, |
|
|
e = new RawPointerEventArgs(device, timestamp, _owner, eventType, point, modifiers); |
|
|
RawPointerEventType.Move, point, modifiers); |
|
|
|
|
|
} |
|
|
} |
|
|
break; |
|
|
break; |
|
|
} |
|
|
} |
|
|
@ -449,7 +431,7 @@ namespace Avalonia.Win32 |
|
|
} |
|
|
} |
|
|
case WindowsMessage.WM_POINTERLEAVE: |
|
|
case WindowsMessage.WM_POINTERLEAVE: |
|
|
{ |
|
|
{ |
|
|
GetDeviceInfo(wParam, out var device, out var info, ref timestamp); |
|
|
GetDevicePointerInfo(wParam, out var device, out var info, ref timestamp); |
|
|
var point = PointToClient(new PixelPoint(info.ptPixelLocationX, info.ptPixelLocationY)); |
|
|
var point = PointToClient(new PixelPoint(info.ptPixelLocationX, info.ptPixelLocationY)); |
|
|
var modifiers = GetInputModifiers(info.dwKeyStates); |
|
|
var modifiers = GetInputModifiers(info.dwKeyStates); |
|
|
|
|
|
|
|
|
@ -457,6 +439,18 @@ namespace Avalonia.Win32 |
|
|
device, timestamp, _owner, RawPointerEventType.LeaveWindow, point, modifiers); |
|
|
device, timestamp, _owner, RawPointerEventType.LeaveWindow, point, modifiers); |
|
|
break; |
|
|
break; |
|
|
} |
|
|
} |
|
|
|
|
|
case WindowsMessage.WM_POINTERWHEEL: |
|
|
|
|
|
case WindowsMessage.WM_POINTERHWHEEL: |
|
|
|
|
|
{ |
|
|
|
|
|
GetDevicePointerInfo(wParam, out var device, out var info, ref timestamp); |
|
|
|
|
|
|
|
|
|
|
|
var point = PointToClient(new PixelPoint(info.ptPixelLocationX, info.ptPixelLocationY)); |
|
|
|
|
|
var modifiers = GetInputModifiers(info.dwKeyStates); |
|
|
|
|
|
var val = (ToInt32(wParam) >> 16) / wheelDelta; |
|
|
|
|
|
var delta = message == WindowsMessage.WM_POINTERHWHEEL ? new Vector(0, val) : new Vector(val, 0); |
|
|
|
|
|
e = new RawMouseWheelEventArgs(device, timestamp, _owner, point, delta, modifiers); |
|
|
|
|
|
break; |
|
|
|
|
|
} |
|
|
case WindowsMessage.WM_POINTERACTIVATE: |
|
|
case WindowsMessage.WM_POINTERACTIVATE: |
|
|
{ |
|
|
{ |
|
|
//occurs when a pointer activates an inactive window.
|
|
|
//occurs when a pointer activates an inactive window.
|
|
|
@ -469,26 +463,6 @@ namespace Avalonia.Win32 |
|
|
_mouseDevice.Capture(null); |
|
|
_mouseDevice.Capture(null); |
|
|
return IntPtr.Zero; |
|
|
return IntPtr.Zero; |
|
|
} |
|
|
} |
|
|
case WindowsMessage.WM_POINTERWHEEL: |
|
|
|
|
|
{ |
|
|
|
|
|
GetDeviceInfo(wParam, out var device, out var info, ref timestamp); |
|
|
|
|
|
|
|
|
|
|
|
var point = PointToClient(new PixelPoint(info.ptPixelLocationX, info.ptPixelLocationY)); |
|
|
|
|
|
var modifiers = GetInputModifiers(info.dwKeyStates); |
|
|
|
|
|
var delta = new Vector(0, (ToInt32(wParam) >> 16) / wheelDelta); |
|
|
|
|
|
e = new RawMouseWheelEventArgs(device, timestamp, _owner, point, delta, modifiers); |
|
|
|
|
|
break; |
|
|
|
|
|
} |
|
|
|
|
|
case WindowsMessage.WM_POINTERHWHEEL: |
|
|
|
|
|
{ |
|
|
|
|
|
GetDeviceInfo(wParam, out var device, out var info, ref timestamp); |
|
|
|
|
|
|
|
|
|
|
|
var point = PointToClient(new PixelPoint(info.ptPixelLocationX, info.ptPixelLocationY)); |
|
|
|
|
|
var modifiers = GetInputModifiers(info.dwKeyStates); |
|
|
|
|
|
var delta = new Vector((ToInt32(wParam) >> 16) / wheelDelta, 0); |
|
|
|
|
|
e = new RawMouseWheelEventArgs(device, timestamp, _owner, point, delta, modifiers); |
|
|
|
|
|
break; |
|
|
|
|
|
} |
|
|
|
|
|
case WindowsMessage.DM_POINTERHITTEST: |
|
|
case WindowsMessage.DM_POINTERHITTEST: |
|
|
{ |
|
|
{ |
|
|
//DM stands for direct manipulation.
|
|
|
//DM stands for direct manipulation.
|
|
|
@ -724,7 +698,7 @@ namespace Avalonia.Win32 |
|
|
_penDevice.Twist = penInfo.rotation; |
|
|
_penDevice.Twist = penInfo.rotation; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
private void GetDeviceInfo(IntPtr wParam, out IInputDevice device, out POINTER_INFO info, ref uint timestamp) |
|
|
private void GetDevicePointerInfo(IntPtr wParam, out IInputDevice device, out POINTER_INFO info, ref uint timestamp) |
|
|
{ |
|
|
{ |
|
|
var pointerId = (uint)(ToInt32(wParam) & 0xFFFF); |
|
|
var pointerId = (uint)(ToInt32(wParam) & 0xFFFF); |
|
|
GetPointerType(pointerId, out var type); |
|
|
GetPointerType(pointerId, out var type); |
|
|
@ -757,6 +731,12 @@ namespace Avalonia.Win32 |
|
|
|
|
|
|
|
|
private static RawPointerEventType GetEventType(WindowsMessage message, POINTER_INFO info) |
|
|
private static RawPointerEventType GetEventType(WindowsMessage message, POINTER_INFO info) |
|
|
{ |
|
|
{ |
|
|
|
|
|
if (message == WindowsMessage.WM_POINTERUPDATE) |
|
|
|
|
|
{ |
|
|
|
|
|
return info.pointerType == PointerInputType.PT_TOUCH |
|
|
|
|
|
? RawPointerEventType.TouchUpdate |
|
|
|
|
|
: RawPointerEventType.Move; |
|
|
|
|
|
} |
|
|
switch (info.pointerType) |
|
|
switch (info.pointerType) |
|
|
{ |
|
|
{ |
|
|
case PointerInputType.PT_PEN: |
|
|
case PointerInputType.PT_PEN: |
|
|
|