Suspend the window locks before DefKeybEventProc and
DefMouseEventProc.
diff --git a/windows/keyboard.c b/windows/keyboard.c
index fa39c62..e941485 100644
--- a/windows/keyboard.c
+++ b/windows/keyboard.c
@@ -79,6 +79,7 @@
DWORD posX, DWORD posY, DWORD time )
{
WINE_KEYBDEVENT wke;
+ int iWndsLocks;
if ( !DefKeybEventProc ) return;
@@ -89,7 +90,11 @@
wke.posY = posY;
wke.time = time;
+ /* To avoid deadlocks, we have to suspend all locks on windows structures
+ before the program control is passed to the keyboard driver */
+ iWndsLocks = WIN_SuspendWndsLock();
DefKeybEventProc( bVk, bScan, dwFlags, (DWORD)&wke );
+ WIN_RestoreWndsLock(iWndsLocks);
}
/**********************************************************************
diff --git a/windows/mouse.c b/windows/mouse.c
index cfd59f1..7a47283 100644
--- a/windows/mouse.c
+++ b/windows/mouse.c
@@ -58,6 +58,7 @@
{
int width = MONITOR_GetWidth (&MONITOR_PrimaryMonitor);
int height = MONITOR_GetHeight(&MONITOR_PrimaryMonitor);
+ int iWndsLocks;
WINE_MOUSEEVENT wme;
BOOL bOldWarpPointer;
@@ -75,6 +76,10 @@
wme.hWnd = hWnd;
bOldWarpPointer = MOUSE_Driver->pEnableWarpPointer(FALSE);
+ /* To avoid deadlocks, we have to suspend all locks on windows structures
+ before the program control is passed to the mouse driver */
+ iWndsLocks = WIN_SuspendWndsLock();
DefMouseEventProc( mouseStatus, posX, posY, 0, (DWORD)&wme );
+ WIN_RestoreWndsLock(iWndsLocks);
MOUSE_Driver->pEnableWarpPointer(bOldWarpPointer);
}