From 49fb9ff34c21d453c76a5e1893dbecc8460712cd Mon Sep 17 00:00:00 2001 From: Julien Lebosquain Date: Wed, 18 Sep 2024 12:08:20 +0200 Subject: [PATCH] [macOS] Fixes stuck mouse buttons after drag (#17035) * Reset pressed mouse buttons on drag on macOS * Make draggable borders easier to click in ControlCatalog --- native/Avalonia.Native/src/OSX/AvnView.h | 1 + native/Avalonia.Native/src/OSX/AvnView.mm | 9 ++++++++ .../Avalonia.Native/src/OSX/WindowBaseImpl.mm | 1 + .../ControlCatalog/Pages/DragAndDropPage.xaml | 22 +++++++++++-------- 4 files changed, 24 insertions(+), 9 deletions(-) diff --git a/native/Avalonia.Native/src/OSX/AvnView.h b/native/Avalonia.Native/src/OSX/AvnView.h index 030330c908..c80805a15c 100644 --- a/native/Avalonia.Native/src/OSX/AvnView.h +++ b/native/Avalonia.Native/src/OSX/AvnView.h @@ -19,6 +19,7 @@ -(AvnPoint) translateLocalPoint:(AvnPoint)pt; -(void) onClosed; -(void) setModifiers:(NSEventModifierFlags)modifierFlags; +-(void) resetPressedMouseButtons; -(AvnPlatformResizeReason) getResizeReason; -(void) setResizeReason:(AvnPlatformResizeReason)reason; diff --git a/native/Avalonia.Native/src/OSX/AvnView.mm b/native/Avalonia.Native/src/OSX/AvnView.mm index 664ac81e2f..dad670c3d1 100644 --- a/native/Avalonia.Native/src/OSX/AvnView.mm +++ b/native/Avalonia.Native/src/OSX/AvnView.mm @@ -485,6 +485,15 @@ _modifierState = [self getModifiers:modifierFlags]; } +- (void)resetPressedMouseButtons +{ + _isLeftPressed = false; + _isRightPressed = false; + _isMiddlePressed = false; + _isXButton1Pressed = false; + _isXButton2Pressed = false; +} + - (void)flagsChanged:(NSEvent *)event { auto newModifierState = [self getModifiers:[event modifierFlags]]; diff --git a/native/Avalonia.Native/src/OSX/WindowBaseImpl.mm b/native/Avalonia.Native/src/OSX/WindowBaseImpl.mm index afae6d6b5b..0335d9e409 100644 --- a/native/Avalonia.Native/src/OSX/WindowBaseImpl.mm +++ b/native/Avalonia.Native/src/OSX/WindowBaseImpl.mm @@ -430,6 +430,7 @@ HRESULT WindowBaseImpl::BeginDragAndDropOperation(AvnDragDropEffects effects, Av op |= NSDragOperationLink; if ((ieffects & (int) AvnDragDropEffects::Move) != 0) op |= NSDragOperationMove; + [View resetPressedMouseButtons]; [View beginDraggingSessionWithItems:@[dragItem] event:nsevent source:CreateDraggingSource((NSDragOperation) op, cb, sourceHandle)]; return S_OK; diff --git a/samples/ControlCatalog/Pages/DragAndDropPage.xaml b/samples/ControlCatalog/Pages/DragAndDropPage.xaml index 390fa32b9c..d01cd8b1df 100644 --- a/samples/ControlCatalog/Pages/DragAndDropPage.xaml +++ b/samples/ControlCatalog/Pages/DragAndDropPage.xaml @@ -1,6 +1,16 @@ + + + + + Example of Drag+Drop capabilities @@ -8,21 +18,15 @@ + Classes="draggable"> Drag Me (text) + Classes="draggable"> Drag Me (files) + Classes="draggable"> Drag Me (custom)