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);
 }