Call EVENT_Pending() to flush X11 output queue before blocking in MsgWaitForMultipleObjects(). Don't call EVENT_WaitNetEvent in MSG_PeekHardwareMsg. Protect system queue access in hardware_event().
diff --git a/windows/message.c b/windows/message.c index f4e92e8..acb89ff 100644 --- a/windows/message.c +++ b/windows/message.c
@@ -502,10 +502,12 @@ qmsg = sysMsgQueue->firstMsg; +#if 0 /* If the queue is empty, attempt to fill it */ if (!sysMsgQueue->msgCount && THREAD_IsWin16( THREAD_Current() ) && EVENT_Pending()) EVENT_WaitNetEvent( FALSE, FALSE ); +#endif for ( kbd_msg = 0; qmsg; qmsg = nextqmsg) { @@ -1820,6 +1822,8 @@ handles[i] = pHandles[i]; handles[nCount] = msgQueue->hEvent; + EVENT_Pending(); + ret = WaitForMultipleObjects( nCount+1, handles, fWaitAll, dwMilliseconds ); }
diff --git a/windows/queue.c b/windows/queue.c index 125b18b..5ead0ce 100644 --- a/windows/queue.c +++ b/windows/queue.c
@@ -1146,12 +1146,15 @@ int xPos, int yPos, DWORD time, DWORD extraInfo ) { MSG *msg; - QMSG *qmsg = sysMsgQueue->lastMsg; + QMSG *qmsg; int mergeMsg = 0; if (!sysMsgQueue) return; - /* Merge with previous event if possible */ + EnterCriticalSection( &sysMsgQueue->cSection ); + + /* Merge with previous event if possible */ + qmsg = sysMsgQueue->lastMsg; if ((message == WM_MOUSEMOVE) && sysMsgQueue->lastMsg) { @@ -1173,7 +1176,10 @@ /* Don't merge allocate a new msg in the global heap */ if (!(qmsg = (QMSG *) HeapAlloc( SystemHeap, 0, sizeof(QMSG) ) )) - return; + { + LeaveCriticalSection( &sysMsgQueue->cSection ); + return; + } /* put message at the end of the linked list */ qmsg->nextMsg = 0; @@ -1201,6 +1207,8 @@ msg->pt.y = yPos; qmsg->extraInfo = extraInfo; + LeaveCriticalSection( &sysMsgQueue->cSection ); + QUEUE_WakeSomeone( message ); }