Browse Source

Respond to WM_CAPTURECHANGED (#19685)

* Respond to WM_CAPTURECHANGED

* Addressing PR feedback

---------

Co-authored-by: Jan Kučera <miloush@users.noreply.github.com>
release/11.3.7
Jan Kučera 4 months ago
committed by Julien Lebosquain
parent
commit
fe09ad9eb7
  1. 5
      src/Avalonia.Base/Input/MouseDevice.cs
  2. 18
      src/Avalonia.Base/Input/Pointer.cs
  3. 3
      src/Avalonia.Base/Input/Raw/RawPointerEventArgs.cs
  4. 20
      src/Windows/Avalonia.Win32/WindowImpl.AppWndProc.cs

5
src/Avalonia.Base/Input/MouseDevice.cs

@ -104,6 +104,9 @@ namespace Avalonia.Input
case RawPointerEventType.Swipe:
e.Handled = GestureSwipe(mouse, e.Timestamp, e.Root, e.Position, props, ((RawPointerGestureEventArgs)e).Delta, keyModifiers, e.InputHitTestResult.firstEnabledAncestor);
break;
case RawPointerEventType.CancelCapture:
PlatformCaptureLost();
break;
}
}
@ -308,7 +311,7 @@ namespace Avalonia.Input
internal void PlatformCaptureLost()
{
_pointer.Capture(null);
_pointer.PlatformCaptureLost();
}
}
}

18
src/Avalonia.Base/Input/Pointer.cs

@ -32,14 +32,28 @@ namespace Avalonia.Input
{
}
internal void PlatformCaptureLost()
{
if (Captured != null)
Capture(null, platformInitiated: true);
}
public void Capture(IInputElement? control)
{
Capture(control, platformInitiated: false);
}
private void Capture(IInputElement? control, bool platformInitiated)
{
if (Captured is Visual v1)
v1.DetachedFromVisualTree -= OnCaptureDetached;
var oldCapture = Captured;
Captured = control;
PlatformCapture(control);
if (!platformInitiated)
PlatformCapture(control);
if (oldCapture is Visual v2)
{
var commonParent = FindCommonParent(control, oldCapture);

3
src/Avalonia.Base/Input/Raw/RawPointerEventArgs.cs

@ -26,7 +26,8 @@ namespace Avalonia.Input.Raw
TouchCancel,
Magnify,
Rotate,
Swipe
Swipe,
CancelCapture
}
/// <summary>

20
src/Windows/Avalonia.Win32/WindowImpl.AppWndProc.cs

@ -394,6 +394,26 @@ namespace Avalonia.Win32
break;
}
case WindowsMessage.WM_CAPTURECHANGED:
{
if (IsMouseInPointerEnabled)
{
break;
}
if (_hwnd != lParam)
{
_trackingMouse = false;
e = new RawPointerEventArgs(
_mouseDevice,
timestamp,
Owner,
RawPointerEventType.CancelCapture,
new Point(-1, -1),
WindowsKeyboardDevice.Instance.Modifiers);
}
break;
}
case WindowsMessage.WM_NCLBUTTONDOWN:
case WindowsMessage.WM_NCRBUTTONDOWN:
case WindowsMessage.WM_NCMBUTTONDOWN:

Loading…
Cancel
Save