[PATCH] winex11.drv: Avoid freezing when dropping from native into Wine application that shows modal dialog.

Roman Pišl rpisl at seznam.cz
Tue Dec 8 12:39:15 CST 2020


https://bugs.winehq.org/show_bug.cgi?id=46522
Signed-off-by: Roman Pišl <rpisl at seznam.cz>
---
 dlls/winex11.drv/window.c |  3 +++
 dlls/winex11.drv/x11drv.h |  4 +++-
 dlls/winex11.drv/xdnd.c   | 17 +++++++++++++++++
 3 files changed, 23 insertions(+), 1 deletion(-)

diff --git a/dlls/winex11.drv/window.c b/dlls/winex11.drv/window.c
index f46cbfb088a..cdebd87823e 100644
--- a/dlls/winex11.drv/window.c
+++ b/dlls/winex11.drv/window.c
@@ -2791,6 +2791,9 @@ LRESULT CDECL X11DRV_WindowMessage( HWND hwnd, UINT msg, WPARAM wp, LPARAM lp )
         return clip_cursor_notify( hwnd, (HWND)wp, (HWND)lp );
     case WM_X11DRV_CLIP_CURSOR_REQUEST:
         return clip_cursor_request( hwnd, (BOOL)wp, (BOOL)lp );
+    case WM_X11DRV_DROP_EVENT:
+        X11DRV_XDND_DropEventProcess( hwnd, (XClientMessageEvent*)lp );
+        return 0;
     default:
         FIXME( "got window msg %x hwnd %p wp %lx lp %lx\n", msg, hwnd, wp, lp );
         return 0;
diff --git a/dlls/winex11.drv/x11drv.h b/dlls/winex11.drv/x11drv.h
index 45855976607..ae6901059ec 100644
--- a/dlls/winex11.drv/x11drv.h
+++ b/dlls/winex11.drv/x11drv.h
@@ -242,6 +242,7 @@ extern void IME_SetResultString(LPWSTR lpResult, DWORD dwResultlen) DECLSPEC_HID
 
 extern void X11DRV_XDND_EnterEvent( HWND hWnd, XClientMessageEvent *event ) DECLSPEC_HIDDEN;
 extern void X11DRV_XDND_PositionEvent( HWND hWnd, XClientMessageEvent *event ) DECLSPEC_HIDDEN;
+extern void X11DRV_XDND_DropEventProcess( HWND hWnd, XClientMessageEvent *event ) DECLSPEC_HIDDEN;
 extern void X11DRV_XDND_DropEvent( HWND hWnd, XClientMessageEvent *event ) DECLSPEC_HIDDEN;
 extern void X11DRV_XDND_LeaveEvent( HWND hWnd, XClientMessageEvent *event ) DECLSPEC_HIDDEN;
 extern void X11DRV_CLIPBOARD_ImportSelection( Display *display, Window win, Atom selection,
@@ -539,7 +540,8 @@ enum x11drv_window_messages
     WM_X11DRV_RESIZE_DESKTOP,
     WM_X11DRV_SET_CURSOR,
     WM_X11DRV_CLIP_CURSOR_NOTIFY,
-    WM_X11DRV_CLIP_CURSOR_REQUEST
+    WM_X11DRV_CLIP_CURSOR_REQUEST,
+    WM_X11DRV_DROP_EVENT
 };
 
 /* _NET_WM_STATE properties that we keep track of */
diff --git a/dlls/winex11.drv/xdnd.c b/dlls/winex11.drv/xdnd.c
index 0cd2ad88924..7536f578d19 100644
--- a/dlls/winex11.drv/xdnd.c
+++ b/dlls/winex11.drv/xdnd.c
@@ -406,6 +406,22 @@ void X11DRV_XDND_PositionEvent( HWND hWnd, XClientMessageEvent *event )
  * Handle an XdndDrop event.
  */
 void X11DRV_XDND_DropEvent( HWND hWnd, XClientMessageEvent *event )
+{
+    XClientMessageEvent *drop_event = HeapAlloc(GetProcessHeap(), 0, sizeof(*drop_event));
+    if (!drop_event)
+        return;
+
+    memcpy(drop_event, event, sizeof(*drop_event));
+    if (!PostMessageW(hWnd, WM_X11DRV_DROP_EVENT, 0, (LPARAM)drop_event))
+        HeapFree(GetProcessHeap(), 0, drop_event);
+}
+
+/**************************************************************************
+ * X11DRV_XDND_DropEventProcess
+ *
+ * Process an XdndDrop event.
+ */
+void X11DRV_XDND_DropEventProcess( HWND hWnd, XClientMessageEvent *event )
 {
     XClientMessageEvent e;
     IDropTarget *dropTarget;
@@ -492,6 +508,7 @@ void X11DRV_XDND_DropEvent( HWND hWnd, XClientMessageEvent *event )
     else
         e.data.l[2] = None;
     XSendEvent(event->display, event->data.l[0], False, NoEventMask, (XEvent*)&e);
+    HeapFree(GetProcessHeap(), 0, event);
 }
 
 /**************************************************************************
-- 
2.20.1




More information about the wine-devel mailing list