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;