Author: mjmartin Date: Sun May 23 13:53:01 2010 New Revision: 47325
URL: http://svn.reactos.org/svn/reactos?rev=47325&view=rev Log: [win32k] - For the Low Level Mouse Hook (WH_MOUSE_LL), input can come from the mouse driver or mouse_event. Both of which result in a call to UserSetCursorPos. UserMode SetCursorPos API also ends up here. Add BOOL parameter that can be used to determine if hooks are to be called. - Move the code related to calling the hook procedure from MsqInsertSystemMessage into UserSetCursorPos and call the hook procedure here if needed. If hook procedure returns non 0 value. Dont insert the system message. - Fixes a recursive call to the hook procedure resulting thread using to much stack exposed by user32 winetest for input.
Modified: trunk/reactos/subsystems/win32/win32k/include/cursoricon.h trunk/reactos/subsystems/win32/win32k/ntuser/cursoricon.c trunk/reactos/subsystems/win32/win32k/ntuser/input.c trunk/reactos/subsystems/win32/win32k/ntuser/msgqueue.c trunk/reactos/subsystems/win32/win32k/ntuser/simplecall.c
Modified: trunk/reactos/subsystems/win32/win32k/include/cursoricon.h URL: http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/win32/win32k/inc... ============================================================================== --- trunk/reactos/subsystems/win32/win32k/include/cursoricon.h [iso-8859-1] (original) +++ trunk/reactos/subsystems/win32/win32k/include/cursoricon.h [iso-8859-1] Sun May 23 13:53:01 2010 @@ -77,7 +77,7 @@ INT cyHeight, UINT istepIfAniCur, HBRUSH hbrFlickerFreeDraw, UINT diFlags); PCURICON_OBJECT FASTCALL UserGetCurIconObject(HCURSOR hCurIcon);
-BOOL UserSetCursorPos( INT x, INT y); +BOOL UserSetCursorPos( INT x, INT y, BOOL CallHooks);
int UserShowCursor(BOOL bShow);
Modified: trunk/reactos/subsystems/win32/win32k/ntuser/cursoricon.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/win32/win32k/ntu... ============================================================================== --- trunk/reactos/subsystems/win32/win32k/ntuser/cursoricon.c [iso-8859-1] (original) +++ trunk/reactos/subsystems/win32/win32k/ntuser/cursoricon.c [iso-8859-1] Sun May 23 13:53:01 2010 @@ -175,10 +175,12 @@ return hOldCursor; }
-BOOL UserSetCursorPos( INT x, INT y) +BOOL UserSetCursorPos( INT x, INT y, BOOL CallHooks) { PWINDOW_OBJECT DesktopWindow; PSYSTEM_CURSORINFO CurInfo; + LARGE_INTEGER LargeTickCount; + MSLLHOOKSTRUCT MouseHookData; HDC hDC; MSG Msg;
@@ -221,6 +223,9 @@ gpsi->ptCursor.x = x; gpsi->ptCursor.y = y;
+ KeQueryTickCount(&LargeTickCount); + Msg.time = MsqCalculateMessageTime(&LargeTickCount); + //Move the mouse pointer GreMovePointer(hDC, x, y);
@@ -229,8 +234,39 @@ Msg.wParam = CurInfo->ButtonsDown; Msg.lParam = MAKELPARAM(x, y); Msg.pt = gpsi->ptCursor; + + MouseHookData.pt.x = LOWORD(Msg.lParam); + MouseHookData.pt.y = HIWORD(Msg.lParam); + switch(Msg.message) + { + case WM_MOUSEWHEEL: + MouseHookData.mouseData = MAKELONG(0, GET_WHEEL_DELTA_WPARAM(Msg.wParam)); + break; + case WM_XBUTTONDOWN: + case WM_XBUTTONUP: + case WM_XBUTTONDBLCLK: + case WM_NCXBUTTONDOWN: + case WM_NCXBUTTONUP: + case WM_NCXBUTTONDBLCLK: + MouseHookData.mouseData = MAKELONG(0, HIWORD(Msg.wParam)); + break; + default: + MouseHookData.mouseData = 0; + break; + } + + MouseHookData.flags = 0; + MouseHookData.time = Msg.time; + MouseHookData.dwExtraInfo = 0; + + if (CallHooks) + { + /* If the hook procedure returned non zero, dont send the message */ + if (co_HOOK_CallHooks(WH_MOUSE_LL, HC_ACTION, Msg.message, (LPARAM) &MouseHookData)) + return FALSE; + } + MsqInsertSystemMessage(&Msg); - return TRUE; }
@@ -814,7 +850,7 @@ CurInfo->CursorClipInfo.Right = min(Rect.right, DesktopWindow->Wnd->rcWindow.right); CurInfo->CursorClipInfo.Bottom = min(Rect.bottom, DesktopWindow->Wnd->rcWindow.bottom);
- UserSetCursorPos(gpsi->ptCursor.x, gpsi->ptCursor.y); + UserSetCursorPos(gpsi->ptCursor.x, gpsi->ptCursor.y, FALSE);
RETURN(TRUE); }
Modified: trunk/reactos/subsystems/win32/win32k/ntuser/input.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/win32/win32k/ntu... ============================================================================== --- trunk/reactos/subsystems/win32/win32k/ntuser/input.c [iso-8859-1] (original) +++ trunk/reactos/subsystems/win32/win32k/ntuser/input.c [iso-8859-1] Sun May 23 13:53:01 2010 @@ -1128,7 +1128,7 @@
if(mi->dwFlags & MOUSEEVENTF_MOVE) { - UserSetCursorPos(MousePos.x, MousePos.y); + UserSetCursorPos(MousePos.x, MousePos.y, TRUE); } if(mi->dwFlags & MOUSEEVENTF_LEFTDOWN) {
Modified: trunk/reactos/subsystems/win32/win32k/ntuser/msgqueue.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/win32/win32k/ntu... ============================================================================== --- trunk/reactos/subsystems/win32/win32k/ntuser/msgqueue.c [iso-8859-1] (original) +++ trunk/reactos/subsystems/win32/win32k/ntuser/msgqueue.c [iso-8859-1] Sun May 23 13:53:01 2010 @@ -171,38 +171,8 @@ VOID FASTCALL MsqInsertSystemMessage(MSG* Msg) { - LARGE_INTEGER LargeTickCount; KIRQL OldIrql; ULONG Prev; - MSLLHOOKSTRUCT MouseHookData; - - KeQueryTickCount(&LargeTickCount); - Msg->time = MsqCalculateMessageTime(&LargeTickCount); - - MouseHookData.pt.x = LOWORD(Msg->lParam); - MouseHookData.pt.y = HIWORD(Msg->lParam); - switch(Msg->message) - { - case WM_MOUSEWHEEL: - MouseHookData.mouseData = MAKELONG(0, GET_WHEEL_DELTA_WPARAM(Msg->wParam)); - break; - case WM_XBUTTONDOWN: - case WM_XBUTTONUP: - case WM_XBUTTONDBLCLK: - case WM_NCXBUTTONDOWN: - case WM_NCXBUTTONUP: - case WM_NCXBUTTONDBLCLK: - MouseHookData.mouseData = MAKELONG(0, HIWORD(Msg->wParam)); - break; - default: - MouseHookData.mouseData = 0; - break; - } - MouseHookData.flags = 0; - MouseHookData.time = Msg->time; - MouseHookData.dwExtraInfo = 0; - if( co_HOOK_CallHooks(WH_MOUSE_LL, HC_ACTION, Msg->message, (LPARAM) &MouseHookData)) - return;
/* * If we got WM_MOUSEMOVE and there are already messages in the
Modified: trunk/reactos/subsystems/win32/win32k/ntuser/simplecall.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/win32/win32k/ntu... ============================================================================== --- trunk/reactos/subsystems/win32/win32k/ntuser/simplecall.c [iso-8859-1] (original) +++ trunk/reactos/subsystems/win32/win32k/ntuser/simplecall.c [iso-8859-1] Sun May 23 13:53:01 2010 @@ -440,7 +440,7 @@ RETURN( (DWORD_PTR)co_IntRegisterLogonProcess((HANDLE)Param1, (BOOL)Param2));
case TWOPARAM_ROUTINE_SETCURSORPOS: - RETURN( (DWORD_PTR)UserSetCursorPos((int)Param1, (int)Param2)); + RETURN( (DWORD_PTR)UserSetCursorPos((int)Param1, (int)Param2, FALSE));
} DPRINT1("Calling invalid routine number 0x%x in NtUserCallTwoParam(), Param1=0x%x Parm2=0x%x\n",