Fix dragging always resulting in wxDragLink on OS X
Commit f40e8bf
uncovered a problem with dragging where when the
NSDragOperationLink bit is set in the drag mask (which by default always
is the case) the result is a wxDragLink operation instead of wxDragCopy
or wxDragMove. To fix this give priority to move and copy instead when
converting the drag mask to a wxDrag result.
This fixes copying through DND in wxRichTextCtrl.
See #13819.
This commit is contained in:
@@ -1173,6 +1173,23 @@ unsigned int wxOnDraggingEnteredOrUpdated(wxWidgetCocoaImpl* viewImpl,
|
|||||||
{
|
{
|
||||||
id <NSDraggingInfo>sender = (id <NSDraggingInfo>) s;
|
id <NSDraggingInfo>sender = (id <NSDraggingInfo>) s;
|
||||||
NSPasteboard *pboard = [sender draggingPasteboard];
|
NSPasteboard *pboard = [sender draggingPasteboard];
|
||||||
|
/*
|
||||||
|
sourceDragMask contains a flag field with drag operations permitted by
|
||||||
|
the source:
|
||||||
|
NSDragOperationCopy = 1,
|
||||||
|
NSDragOperationLink = 2,
|
||||||
|
NSDragOperationGeneric = 4,
|
||||||
|
NSDragOperationPrivate = 8,
|
||||||
|
NSDragOperationMove = 16,
|
||||||
|
NSDragOperationDelete = 32
|
||||||
|
|
||||||
|
By default, pressing modifier keys changes sourceDragMask:
|
||||||
|
Control ANDs it with NSDragOperationLink (2)
|
||||||
|
Option ANDs it with NSDragOperationCopy (1)
|
||||||
|
Command ANDs it with NSDragOperationGeneric (4)
|
||||||
|
|
||||||
|
The end result can be a mask that's 0 (NSDragOperationNone).
|
||||||
|
*/
|
||||||
NSDragOperation sourceDragMask = [sender draggingSourceOperationMask];
|
NSDragOperation sourceDragMask = [sender draggingSourceOperationMask];
|
||||||
|
|
||||||
wxWindow* wxpeer = viewImpl->GetWXPeer();
|
wxWindow* wxpeer = viewImpl->GetWXPeer();
|
||||||
@@ -1183,16 +1200,26 @@ unsigned int wxOnDraggingEnteredOrUpdated(wxWidgetCocoaImpl* viewImpl,
|
|||||||
if ( target == NULL )
|
if ( target == NULL )
|
||||||
return NSDragOperationNone;
|
return NSDragOperationNone;
|
||||||
|
|
||||||
wxDragResult result = wxDragNone;
|
|
||||||
NSPoint nspoint = [viewImpl->GetWXWidget() convertPoint:[sender draggingLocation] fromView:nil];
|
NSPoint nspoint = [viewImpl->GetWXWidget() convertPoint:[sender draggingLocation] fromView:nil];
|
||||||
wxPoint pt = wxFromNSPoint( viewImpl->GetWXWidget(), nspoint );
|
wxPoint pt = wxFromNSPoint( viewImpl->GetWXWidget(), nspoint );
|
||||||
|
|
||||||
if ( sourceDragMask & NSDragOperationLink )
|
/*
|
||||||
result = wxDragLink;
|
Convert the incoming mask to wxDragResult. This is a lossy conversion
|
||||||
else if ( sourceDragMask & NSDragOperationCopy )
|
because wxDragResult contains a single value and not a flag field.
|
||||||
result = wxDragCopy;
|
When dragging the bottom part of the DND sample ("Drag text from here!")
|
||||||
else if ( sourceDragMask & NSDragOperationMove )
|
sourceDragMask contains copy, link, generic, and private flags. Formerly
|
||||||
|
this would result in wxDragLink which is not what is expected for text.
|
||||||
|
Give precedence to the move and copy flag instead.
|
||||||
|
*/
|
||||||
|
wxDragResult result = wxDragNone;
|
||||||
|
|
||||||
|
if (sourceDragMask & NSDragOperationMove)
|
||||||
result = wxDragMove;
|
result = wxDragMove;
|
||||||
|
else if ( sourceDragMask & NSDragOperationCopy
|
||||||
|
|| sourceDragMask & NSDragOperationGeneric)
|
||||||
|
result = wxDragCopy;
|
||||||
|
else if (sourceDragMask & NSDragOperationLink)
|
||||||
|
result = wxDragLink;
|
||||||
|
|
||||||
PasteboardRef pboardRef;
|
PasteboardRef pboardRef;
|
||||||
PasteboardCreate((CFStringRef)[pboard name], &pboardRef);
|
PasteboardCreate((CFStringRef)[pboard name], &pboardRef);
|
||||||
@@ -1276,12 +1303,13 @@ bool wxWidgetCocoaImpl::performDragOperation(void* s, WXWidget WXUNUSED(slf), vo
|
|||||||
NSPoint nspoint = [m_osxView convertPoint:[sender draggingLocation] fromView:nil];
|
NSPoint nspoint = [m_osxView convertPoint:[sender draggingLocation] fromView:nil];
|
||||||
wxPoint pt = wxFromNSPoint( m_osxView, nspoint );
|
wxPoint pt = wxFromNSPoint( m_osxView, nspoint );
|
||||||
|
|
||||||
if ( sourceDragMask & NSDragOperationLink )
|
if (sourceDragMask & NSDragOperationMove)
|
||||||
result = wxDragLink;
|
|
||||||
else if ( sourceDragMask & NSDragOperationCopy )
|
|
||||||
result = wxDragCopy;
|
|
||||||
else if ( sourceDragMask & NSDragOperationMove )
|
|
||||||
result = wxDragMove;
|
result = wxDragMove;
|
||||||
|
else if ( sourceDragMask & NSDragOperationCopy
|
||||||
|
|| sourceDragMask & NSDragOperationGeneric)
|
||||||
|
result = wxDragCopy;
|
||||||
|
else if (sourceDragMask & NSDragOperationLink)
|
||||||
|
result = wxDragLink;
|
||||||
|
|
||||||
PasteboardRef pboardRef;
|
PasteboardRef pboardRef;
|
||||||
PasteboardCreate((CFStringRef)[pboard name], &pboardRef);
|
PasteboardCreate((CFStringRef)[pboard name], &pboardRef);
|
||||||
|
Reference in New Issue
Block a user