@ -1,12 +1,10 @@
using System ;
using System.Collections.Generic ;
using System.Linq ;
using System.Reflection ;
using Avalonia.Input.GestureRecognizers ;
using Avalonia.Input.Raw ;
using Avalonia.Interactivity ;
using Avalonia.Metadata ;
using Avalonia.Platform ;
using Avalonia.VisualTree ;
#pragma warning disable CS0618
@ -20,6 +18,7 @@ namespace Avalonia.Input
public class PenDevice : IPenDevice , IDisposable
{
private readonly Dictionary < long , Pointer > _ pointers = new ( ) ;
private readonly bool _ releasePointerOnPenUp ;
private int _ clickCount ;
private Rect _l astClickRect ;
private ulong _l astClickTime ;
@ -27,6 +26,11 @@ namespace Avalonia.Input
private bool _d isposed ;
public PenDevice ( bool releasePointerOnPenUp = false )
{
_ releasePointerOnPenUp = releasePointerOnPenUp ;
}
public void ProcessRawEvent ( RawInputEventArgs e )
{
if ( ! e . Handled & & e is RawPointerEventArgs margs )
@ -52,26 +56,35 @@ namespace Avalonia.Input
var keyModifiers = e . InputModifiers . ToKeyModifiers ( ) ;
bool shouldReleasePointer = false ;
switch ( e . Type )
try
{
case RawPointerEventType . LeaveWindow :
shouldReleasePointer = true ;
break ;
case RawPointerEventType . LeftButtonDown :
e . Handled = PenDown ( pointer , e . Timestamp , e . Root , e . Position , props , keyModifiers , e . InputHitTestResult ) ;
break ;
case RawPointerEventType . LeftButtonUp :
e . Handled = PenUp ( pointer , e . Timestamp , e . Root , e . Position , props , keyModifiers , e . InputHitTestResult ) ;
break ;
case RawPointerEventType . Move :
e . Handled = PenMove ( pointer , e . Timestamp , e . Root , e . Position , props , keyModifiers , e . InputHitTestResult , e . IntermediatePoints ) ;
break ;
switch ( e . Type )
{
case RawPointerEventType . LeaveWindow :
shouldReleasePointer = true ;
break ;
case RawPointerEventType . LeftButtonDown :
e . Handled = PenDown ( pointer , e . Timestamp , e . Root , e . Position , props , keyModifiers , e . InputHitTestResult ) ;
break ;
case RawPointerEventType . LeftButtonUp :
if ( _ releasePointerOnPenUp )
{
shouldReleasePointer = true ;
}
e . Handled = PenUp ( pointer , e . Timestamp , e . Root , e . Position , props , keyModifiers , e . InputHitTestResult ) ;
break ;
case RawPointerEventType . Move :
e . Handled = PenMove ( pointer , e . Timestamp , e . Root , e . Position , props , keyModifiers , e . InputHitTestResult , e . IntermediatePoints ) ;
break ;
}
}
if ( shouldReleasePointer )
finally
{
pointer . Dispose ( ) ;
_ pointers . Remove ( e . RawPointerId ) ;
if ( shouldReleasePointer )
{
pointer . Dispose ( ) ;
_ pointers . Remove ( e . RawPointerId ) ;
}
}
}