* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
-/* $Id: msgqueue.c,v 1.45 2003/12/14 19:04:51 weiden Exp $
+/* $Id: msgqueue.c,v 1.46 2003/12/14 22:14:45 weiden Exp $
*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS kernel
BOOL STATIC STDCALL
MsqTranslateMouseMessage(HWND hWnd, UINT FilterLow, UINT FilterHigh,
- PUSER_MESSAGE Message, BOOL Remove,
+ PUSER_MESSAGE Message, BOOL Remove, PBOOL Freed,
PWINDOW_OBJECT ScopeWin, PUSHORT HitTest,
PPOINT ScreenPoint, PBOOL MouseClick)
{
Message->Msg.hwnd = Wnd;
Message->Msg.lParam = MAKELONG(Message->Msg.pt.x, Message->Msg.pt.y);
}
+ *Freed = FALSE;
return TRUE;
}
ExFreePool(Message);
+ *Freed = TRUE;
return FALSE;
}
- /*Handle WM_XBUTTONDOWN messages differently too. We need to check to see
- **if the cursor is above an inactive window.
- */
if (Msg == WM_LBUTTONDOWN ||
Msg == WM_MBUTTONDOWN ||
- Msg == WM_RBUTTONDOWN )
+ Msg == WM_RBUTTONDOWN ||
+ Msg == WM_XBUTTONDOWN)
{
*ScreenPoint = Message->Msg.pt;
Wnd = NtUserWindowFromPoint(ScreenPoint->x, ScreenPoint->y);
switch (Result)
{
case MA_NOACTIVATEANDEAT:
+ *Freed = FALSE;
return TRUE;
case MA_NOACTIVATE:
break;
case MA_ACTIVATEANDEAT:
NtUserSetFocus(Wnd);
+ *Freed = FALSE;
return TRUE;
/* case MA_ACTIVATE:
case 0:*/
else
{
ExFreePool(Message);
+ *Freed = TRUE;
return(FALSE);
}
}
if (Window == NULL)
{
ExFreePool(Message);
+ *Freed = TRUE;
return(FALSE);
}
&Message->ListEntry);
ExReleaseFastMutex(&Window->MessageQueue->HardwareLock);
KeSetEvent(&Window->MessageQueue->NewMessages, IO_NO_INCREMENT, FALSE);
+ *Freed = FALSE;
return(FALSE);
}
if (hWnd != NULL && Window->Self != hWnd &&
!IntIsChildWindow(hWnd, Window->Self))
{
+ ExAcquireFastMutex(&Window->MessageQueue->HardwareLock);
+ InsertTailList(&Window->MessageQueue->HardwareMessagesListHead,
+ &Message->ListEntry);
+ ExReleaseFastMutex(&Window->MessageQueue->HardwareLock);
+ KeSetEvent(&Window->MessageQueue->NewMessages, IO_NO_INCREMENT, FALSE);
+ *Freed = FALSE;
return(FALSE);
}
if ((*HitTest) != HTCLIENT)
{
- switch(Msg)
- {
- case WM_XBUTTONDOWN:
- case WM_XBUTTONUP:
- case WM_XBUTTONDBLCLK:
- return FALSE;
- default:
- Msg += WM_NCMOUSEMOVE - WM_MOUSEMOVE;
- Message->Msg.wParam = *HitTest;
- break;
- }
+ Msg += WM_NCMOUSEMOVE - WM_MOUSEMOVE;
+ Message->Msg.wParam = *HitTest;
}
else
{
Message->Msg.message = Msg;
Message->Msg.lParam = MAKELONG(Point.x, Point.y);
}
-
+
+ *Freed = FALSE;
return(TRUE);
}
KIRQL OldIrql;
USHORT HitTest;
POINT ScreenPoint;
- BOOL Accept;
+ BOOL Accept, Freed;
BOOL MouseClick;
PLIST_ENTRY CurrentEntry;
PWINDOW_OBJECT DesktopWindow;
Current->Msg.message <= WM_MOUSELAST)
{
Accept = MsqTranslateMouseMessage(hWnd, FilterLow, FilterHigh,
- Current, Remove,
+ Current, Remove, &Freed,
DesktopWindow, &HitTest,
&ScreenPoint, &MouseClick);
if (Accept)
IntReleaseWindowObject(DesktopWindow);
return(TRUE);
}
- else
- {
- RemoveEntryList(&Current->ListEntry);
- }
+
+ if(Freed)
+ RemoveEntryList(&Current->ListEntry);
}
}
ExReleaseFastMutex(&MessageQueue->HardwareLock);
ExReleaseFastMutex(&HardwareMessageQueueLock);
/* Translate the message. */
Accept = MsqTranslateMouseMessage(hWnd, FilterLow, FilterHigh,
- Current, Remove,
+ Current, Remove, &Freed,
DesktopWindow, &HitTest,
&ScreenPoint, &MouseClick);
ExAcquireFastMutex(&HardwareMessageQueueLock);