[PATCH] winex11.drv: Don't hard-lock when dropping from native into Wine application that shows modal dialog.
Roman Pišl
rpisl at seznam.cz
Thu Feb 20 15:32:52 CST 2020
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=46522
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=46452
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 | 25 +++++++++++++++++++------
3 files changed, 25 insertions(+), 7 deletions(-)
diff --git a/dlls/winex11.drv/window.c b/dlls/winex11.drv/window.c
index 99e4094ebd..6ff0f6027d 100644
--- a/dlls/winex11.drv/window.c
+++ b/dlls/winex11.drv/window.c
@@ -2740,6 +2740,9 @@ LRESULT CDECL X11DRV_WindowMessage( HWND hwnd, UINT msg, WPARAM wp, LPARAM lp )
return 0;
case WM_X11DRV_CLIP_CURSOR:
return clip_cursor_notify( hwnd, (HWND)wp, (HWND)lp );
+ case WM_X11DRV_DROPEVENT:
+ X11DRV_XDND_DropEventProcess( hwnd );
+ 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 98cab8947b..10cb7b74a2 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 );
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,
@@ -537,7 +538,8 @@ enum x11drv_window_messages
WM_X11DRV_SET_WIN_REGION,
WM_X11DRV_RESIZE_DESKTOP,
WM_X11DRV_SET_CURSOR,
- WM_X11DRV_CLIP_CURSOR
+ WM_X11DRV_CLIP_CURSOR,
+ WM_X11DRV_DROPEVENT
};
/* _NET_WM_STATE properties that we keep track of */
diff --git a/dlls/winex11.drv/xdnd.c b/dlls/winex11.drv/xdnd.c
index 0cd2ad8892..49a2b7650a 100644
--- a/dlls/winex11.drv/xdnd.c
+++ b/dlls/winex11.drv/xdnd.c
@@ -400,12 +400,14 @@ void X11DRV_XDND_PositionEvent( HWND hWnd, XClientMessageEvent *event )
XSendEvent(event->display, event->data.l[0], False, NoEventMask, (XEvent*)&e);
}
+static XClientMessageEvent dropEvent;
+
/**************************************************************************
- * X11DRV_XDND_DropEvent
+ * X11DRV_XDND_DropEventProcess
*
* Handle an XdndDrop event.
*/
-void X11DRV_XDND_DropEvent( HWND hWnd, XClientMessageEvent *event )
+void X11DRV_XDND_DropEventProcess( HWND hWnd )
{
XClientMessageEvent e;
IDropTarget *dropTarget;
@@ -481,17 +483,28 @@ void X11DRV_XDND_DropEvent( HWND hWnd, XClientMessageEvent *event )
/* Tell the target we are finished. */
memset(&e, 0, sizeof(e));
e.type = ClientMessage;
- e.display = event->display;
- e.window = event->data.l[0];
+ e.display = dropEvent.display;
+ e.window = dropEvent.data.l[0];
e.message_type = x11drv_atom(XdndFinished);
e.format = 32;
- e.data.l[0] = event->window;
+ e.data.l[0] = dropEvent.window;
e.data.l[1] = accept;
if (accept)
e.data.l[2] = X11DRV_XDND_DROPEFFECTToXdndAction(effect);
else
e.data.l[2] = None;
- XSendEvent(event->display, event->data.l[0], False, NoEventMask, (XEvent*)&e);
+ XSendEvent(dropEvent.display, dropEvent.data.l[0], False, NoEventMask, (XEvent*)&e);
+}
+
+/**************************************************************************
+ * X11DRV_XDND_DropEvent
+ *
+ * Notify a XdndDrop event.
+ */
+void X11DRV_XDND_DropEvent( HWND hWnd, XClientMessageEvent *event )
+{
+ memcpy(&dropEvent, event, sizeof(*event));
+ PostMessageW(hWnd, WM_X11DRV_DROPEVENT, 0, 0);
}
/**************************************************************************
--
2.20.1
More information about the wine-devel
mailing list