Fix queuing of mouse move messages. Modified: branches/win32k rewrite attempt/win32k/ntuser/msgqueue.c _____
Modified: branches/win32k rewrite attempt/win32k/ntuser/msgqueue.c --- branches/win32k rewrite attempt/win32k/ntuser/msgqueue.c 2005-08-07 11:59:43 UTC (rev 17162) +++ branches/win32k rewrite attempt/win32k/ntuser/msgqueue.c 2005-08-07 12:10:54 UTC (rev 17163) @@ -31,7 +31,7 @@
#include <w32k.h>
-//#define NDEBUG +#define NDEBUG #include <debug.h>
/* GLOBALS *******************************************************************/ @@ -42,7 +42,6 @@ static ULONG SystemMessageQueueHead = 0; static ULONG SystemMessageQueueTail = 0; static ULONG SystemMessageQueueCount = 0; -static ULONG SystemMessageQueueMouseMove = -1; static KSPIN_LOCK SystemMessageQueueLock;
static ULONG volatile HardwareMessageQueueStamp = 0; @@ -129,27 +128,15 @@ VOID FASTCALL MsqIncPaintCountQueue(PUSER_MESSAGE_QUEUE Queue) { - Queue->PaintCount++; - //FIXME: PaintPosted ust go away. QS_PAINT is used instead! - Queue->PaintPosted = TRUE; - MsqSetQueueBits(Queue, QS_PAINT); + if (Queue->PaintCount++ == 0) + MsqSetQueueBits(Queue, QS_PAINT); }
VOID FASTCALL MsqDecPaintCountQueue(PUSER_MESSAGE_QUEUE Queue) { - Queue->PaintCount--; - - /* wine checks for this... */ - if (Queue->PaintCount < 0) - Queue->PaintCount = 0; - - if (Queue->PaintCount == 0) - { - //FIXME: PaintPosted ust go away. QS_PAINT is used instead! - Queue->PaintPosted = FALSE; + if (--Queue->PaintCount == 0) MsqClearQueueBits(Queue, QS_PAINT); - } }
@@ -178,44 +165,34 @@ { LARGE_INTEGER LargeTickCount; KIRQL OldIrql; - ULONG mmov = (ULONG)-1; + ULONG Prev;
KeQueryTickCount(&LargeTickCount); Msg->time = LargeTickCount.u.LowPart;
IntLockSystemMessageQueue(OldIrql);
- /* only insert WM_MOUSEMOVE messages if not already in system message queue */ - if(Msg->message == WM_MOUSEMOVE) - mmov = SystemMessageQueueMouseMove; - - if(mmov != (ULONG)-1) + if (SystemMessageQueueCount == SYSTEM_MESSAGE_QUEUE_SIZE) { - /* insert message at the queue head */ - while (mmov != SystemMessageQueueHead ) - { - ULONG prev = mmov ? mmov - 1 : SYSTEM_MESSAGE_QUEUE_SIZE - 1; - ASSERT((LONG) mmov >= 0); - ASSERT(mmov < SYSTEM_MESSAGE_QUEUE_SIZE); - SystemMessageQueue[mmov] = SystemMessageQueue[prev]; - mmov = prev; - } - SystemMessageQueue[SystemMessageQueueHead] = *Msg; + IntUnLockSystemMessageQueue(OldIrql); + return; } - else + if(Msg->message == WM_MOUSEMOVE && SystemMessageQueueCount) { - if (SystemMessageQueueCount == SYSTEM_MESSAGE_QUEUE_SIZE) + if (SystemMessageQueueTail == 0) + Prev = SYSTEM_MESSAGE_QUEUE_SIZE - 1; + else + Prev = SystemMessageQueueTail - 1; + if (SystemMessageQueue[Prev].message == WM_MOUSEMOVE) { - IntUnLockSystemMessageQueue(OldIrql); - return; + SystemMessageQueueTail = Prev; + SystemMessageQueueCount--; } - SystemMessageQueue[SystemMessageQueueTail] = *Msg; - if(Msg->message == WM_MOUSEMOVE) - SystemMessageQueueMouseMove = SystemMessageQueueTail; - SystemMessageQueueTail = - (SystemMessageQueueTail + 1) % SYSTEM_MESSAGE_QUEUE_SIZE; - SystemMessageQueueCount++; } + SystemMessageQueue[SystemMessageQueueTail] = *Msg; + SystemMessageQueueTail = + (SystemMessageQueueTail + 1) % SYSTEM_MESSAGE_QUEUE_SIZE; + SystemMessageQueueCount++; IntUnLockSystemMessageQueue(OldIrql);
/* wakes all waiters FIXME: wake all? why??*/ @@ -589,11 +566,6 @@ } IntLockSystemMessageQueue(OldIrql); } - /* - * we could set this to -1 conditionally if we find one, but - * this is more efficient and just as effective. - */ - SystemMessageQueueMouseMove = -1; HardwareMessageQueueStamp++; IntUnLockSystemMessageQueue(OldIrql);
@@ -1348,7 +1320,6 @@ KeQueryTickCount(&LargeTickCount); MessageQueue->LastMsgRead = LargeTickCount.u.LowPart; // MessageQueue->FocusWindow = NULL; - MessageQueue->PaintPosted = FALSE; MessageQueue->PaintCount = 0; MessageQueue->WakeMask = ~0; //FIXME! MessageQueue->NewMessagesHandle = NULL;