[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