https://bugs.winehq.org/show_bug.cgi?id=26865
--- Comment #10 from Damjan Jovanovic damjan.jov@gmail.com --- The essence of the drag loop is in dlls/ole32/ole2.c's DoDragDrop(), and the real work is done in OLEDD_TrackStateChange(). Hacking the latter to print which window is returned from WindowFromPoint() shows it always returns the "desktop window" when dragging to an X11 window outside Wine. This shows us the first problem with dragging to native windows - Wine is completely unaware that there are windows in the display other than its own.
The implications of this are dire - even currently. Open up 2 instances of 7-Zip and drag a file from the one to the other: it works. Now open an X11 window so it partially overlaps the 7-Zip window you are dropping into, and drag a file around to see the cursor's icon in different places. What you see is that the obscuring X11 window is ignored: you are dropping *through* the X11 window that Wine doesn't see, into Wine's 7-Zip window.
This leads me to believe the only way forward is to reimplement OLEDD_TrackStateChange() in winex11.drv, with it looking at X11 windows and using XQueryPointer() instead of WindowFromPoint(), XQueryTree() instead of GetParent(), while also somehow dealing with Wine's windows and their non-X11 child windows.