reactos/subsys/win32k/eng
diff -u -r1.66 -r1.67
--- mouse.c 16 Apr 2004 18:53:53 -0000 1.66
+++ mouse.c 30 Apr 2004 22:17:59 -0000 1.67
@@ -16,7 +16,7 @@
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
-/* $Id: mouse.c,v 1.66 2004/04/16 18:53:53 weiden Exp $
+/* $Id: mouse.c,v 1.67 2004/04/30 22:17:59 weiden Exp $
*
* PROJECT: ReactOS kernel
* PURPOSE: Mouse
@@ -45,45 +45,65 @@
#include "include/eng.h"
#include "include/tags.h"
#include <include/mouse.h>
+#include <include/input.h>
#define NDEBUG
#include <debug.h>
-#define GETSYSCURSOR(x) ((x) - OCR_NORMAL)
-
/* FUNCTIONS *****************************************************************/
BOOL FASTCALL
IntIsPrimarySurface(PSURFGDI SurfGDI);
-
-BOOL FASTCALL
-IntCheckClipCursor(LONG *x, LONG *y, PSYSTEM_CURSORINFO CurInfo)
+VOID FASTCALL
+EnableMouse(HDC hDisplayDC)
{
- if(CurInfo->CursorClipInfo.IsClipped)
+ PDC dc;
+ SURFOBJ *SurfObj;
+ PSURFGDI SurfGDI;
+
+ if( hDisplayDC && InputWindowStation)
{
- if(*x > CurInfo->CursorClipInfo.Right)
- *x = CurInfo->CursorClipInfo.Right;
- if(*x < CurInfo->CursorClipInfo.Left)
- *x = CurInfo->CursorClipInfo.Left;
- if(*y > CurInfo->CursorClipInfo.Bottom)
- *y = CurInfo->CursorClipInfo.Bottom;
- if(*y < CurInfo->CursorClipInfo.Top)
- *y = CurInfo->CursorClipInfo.Top;
- return TRUE;
- }
- return TRUE;
-}
+ if(!IntGetWindowStationObject(InputWindowStation))
+ {
+ InputWindowStation->SystemCursor.Enabled = FALSE;
+ return;
+ }
+
+ dc = DC_LockDc(hDisplayDC);
+ SurfObj = (SURFOBJ*)AccessUserObject((ULONG) dc->Surface);
+ SurfGDI = (PSURFGDI)AccessInternalObject((ULONG) dc->Surface);
+ DC_UnlockDc( hDisplayDC );
+
+ IntSetCursor(InputWindowStation, NULL, TRUE);
+
+ InputWindowStation->SystemCursor.Enabled = (SPS_ACCEPT_EXCLUDE == SurfGDI->PointerStatus ||
+ SPS_ACCEPT_NOEXCLUDE == SurfGDI->PointerStatus);
+
+ /* Move the cursor to the screen center */
+ DPRINT("Setting Cursor up at 0x%x, 0x%x\n", SurfObj->sizlBitmap.cx / 2, SurfObj->sizlBitmap.cy / 2);
+ #if 0
+ ExAcquireFastMutex(&CurInfo->CursorMutex);
+ MouseMoveCursor(SurfObj->sizlBitmap.cx / 2, SurfObj->sizlBitmap.cy / 2);
+ ExReleaseFastMutex(&CurInfo->CursorMutex);
+ #endif
-BOOL FASTCALL
-IntSwapMouseButton(PWINSTATION_OBJECT WinStaObject, BOOL Swap)
-{
- BOOL res = WinStaObject->SystemCursor.SwapButtons;
- WinStaObject->SystemCursor.SwapButtons = Swap;
- return res;
+ ObDereferenceObject(InputWindowStation);
+ }
+ else
+ {
+ if(IntGetWindowStationObject(InputWindowStation))
+ {
+ IntSetCursor(InputWindowStation, NULL, TRUE);
+ InputWindowStation->SystemCursor.Enabled = FALSE;
+ InputWindowStation->SystemCursor.CursorClipInfo.IsClipped = FALSE;
+ ObDereferenceObject(InputWindowStation);
+ return;
+ }
+ }
}
-INT STDCALL
+INT FASTCALL
MouseSafetyOnDrawStart(SURFOBJ *SurfObj, PSURFGDI SurfGDI, LONG HazardX1,
LONG HazardY1, LONG HazardX2, LONG HazardY2)
/*
@@ -166,7 +186,7 @@
return(TRUE);
}
-STATIC VOID FASTCALL
+VOID FASTCALL
SetPointerRect(PSYSTEM_CURSORINFO CurInfo, PRECTL PointerRect)
{
CurInfo->PointerRectLeft = PointerRect->left;
@@ -237,306 +257,101 @@
return(TRUE);
}
-BOOL FASTCALL
-MouseMoveCursor(LONG X, LONG Y)
-{
- HDC hDC;
- PDC dc;
- BOOL res = FALSE;
- SURFOBJ *SurfObj;
- PSURFGDI SurfGDI;
- PSYSTEM_CURSORINFO CurInfo;
- MSG Msg;
- LARGE_INTEGER LargeTickCount;
- ULONG TickCount;
- RECTL PointerRect;
-
- if(!InputWindowStation)
- return FALSE;
-
- if(IntGetWindowStationObject(InputWindowStation))
- {
- CurInfo = &InputWindowStation->SystemCursor;
- if(!CurInfo->Enabled)
- {
- ObDereferenceObject(InputWindowStation);
- return FALSE;
- }
- hDC = IntGetScreenDC();
- if(!hDC)
- {
- ObDereferenceObject(InputWindowStation);
- return FALSE;
- }
- dc = DC_LockDc(hDC);
- SurfObj = (SURFOBJ*)AccessUserObject((ULONG) dc->Surface);
- SurfGDI = (PSURFGDI)AccessInternalObject((ULONG) dc->Surface);
- DC_UnlockDc( hDC );
- IntCheckClipCursor(&X, &Y, CurInfo);
- if((X != CurInfo->x) || (Y != CurInfo->y))
- {
- /* move cursor */
- CurInfo->x = X;
- CurInfo->y = Y;
- if(CurInfo->Enabled)
- {
- ExAcquireFastMutex(&CurInfo->CursorMutex);
- IntLockGDIDriver(SurfGDI);
- if (SurfGDI->MovePointer != NULL)
- SurfGDI->MovePointer(SurfObj, CurInfo->x, CurInfo->y, &PointerRect);
- IntUnLockGDIDriver(SurfGDI);
- SetPointerRect(CurInfo, &PointerRect);
- ExReleaseFastMutex(&CurInfo->CursorMutex);
- }
- /* send MOUSEMOVE message */
- KeQueryTickCount(&LargeTickCount);
- TickCount = LargeTickCount.u.LowPart;
- Msg.wParam = CurInfo->ButtonsDown;
- Msg.lParam = MAKELPARAM(X, Y);
- Msg.message = WM_MOUSEMOVE;
- Msg.time = TickCount;
- Msg.pt.x = X;
- Msg.pt.y = Y;
- MsqInsertSystemMessage(&Msg);
- res = TRUE;
- }
-
- ObDereferenceObject(InputWindowStation);
- return res;
- }
- else
- return FALSE;
-}
+#define ClearMouseInput(mi) \
+ mi.dx = 0; \
+ mi.dy = 0; \
+ mi.mouseData = 0; \
+ mi.dwFlags = 0;
+
+#define SendMouseEvent(mi) \
+ if(mi.dx != 0 || mi.dy != 0) \
+ mi.dwFlags |= MOUSEEVENTF_MOVE; \
+ if(mi.dwFlags) \
+ IntMouseInput(&mi); \
+ ClearMouseInput(mi);
VOID /* STDCALL */
MouseGDICallBack(PMOUSE_INPUT_DATA Data, ULONG InputCount)
-/*
- * FUNCTION: Call by the mouse driver when input events occur.
- */
{
+ PMOUSE_INPUT_DATA mid;
+ MOUSEINPUT mi;
ULONG i;
- PSYSTEM_CURSORINFO CurInfo;
- BOOL MouseEnabled = FALSE;
- BOOL Moved = FALSE;
- LONG mouse_ox, mouse_oy;
- LONG mouse_cx = 0, mouse_cy = 0;
- LONG dScroll = 0;
- HDC hDC;
- PDC dc;
- SURFOBJ *SurfObj;
- PSURFGDI SurfGDI;
- MSG Msg;
- RECTL PointerRect;
-
- hDC = IntGetScreenDC();
- if(!hDC || !InputWindowStation)
- return;
-
- if(IntGetWindowStationObject(InputWindowStation))
+ ClearMouseInput(mi);
+ mi.time = 0;
+ mi.dwExtraInfo = 0;
+ for(i = 0; i < InputCount; i++)
{
- CurInfo = &InputWindowStation->SystemCursor;
- MouseEnabled = CurInfo->Enabled;
- if(!MouseEnabled)
- {
- ObDereferenceObject(InputWindowStation);
- return;
- }
- mouse_ox = CurInfo->x;
- mouse_oy = CurInfo->y;
- }
- else
- return;
-
- dc = DC_LockDc(hDC);
- SurfObj = (SURFOBJ*)AccessUserObject((ULONG) dc->Surface);
- SurfGDI = (PSURFGDI)AccessInternalObject((ULONG) dc->Surface);
- DC_UnlockDc( hDC );
-
- /* Compile the total mouse movement change and dispatch button events. */
- for (i = 0; i < InputCount; i++)
- {
- mouse_cx += Data[i].LastX;
- mouse_cy += Data[i].LastY;
-
- CurInfo->x += Data[i].LastX;
- CurInfo->y += Data[i].LastY;
-
- CurInfo->x = max(CurInfo->x, 0);
- CurInfo->y = max(CurInfo->y, 0);
- CurInfo->x = min(CurInfo->x, SurfObj->sizlBitmap.cx - 1);
- CurInfo->y = min(CurInfo->y, SurfObj->sizlBitmap.cy - 1);
+ mid = (Data + i);
+ mi.dx += mid->LastX;
+ mi.dy += mid->LastY;
- IntCheckClipCursor(&CurInfo->x, &CurInfo->y, CurInfo);
-
- Msg.wParam = CurInfo->ButtonsDown;
- Msg.lParam = MAKELPARAM(CurInfo->x, CurInfo->y);
- Msg.message = WM_MOUSEMOVE;
- Msg.pt.x = CurInfo->x;
- Msg.pt.y = CurInfo->y;
-
- if (Data[i].ButtonFlags != 0)
+ if(mid->ButtonFlags)
{
- if ((Data[i].ButtonFlags & MOUSE_LEFT_BUTTON_DOWN) > 0)
+ if(mid->ButtonFlags & MOUSE_LEFT_BUTTON_DOWN)
{
- CurInfo->ButtonsDown |= (CurInfo->SwapButtons ? MK_RBUTTON : MK_LBUTTON);
- Msg.message = (CurInfo->SwapButtons ? WM_RBUTTONDOWN : WM_LBUTTONDOWN);
+ mi.dwFlags |= MOUSEEVENTF_LEFTDOWN;
+ SendMouseEvent(mi);
}
- if ((Data[i].ButtonFlags & MOUSE_MIDDLE_BUTTON_DOWN) > 0)
+ if(mid->ButtonFlags & MOUSE_LEFT_BUTTON_UP)
{
- CurInfo->ButtonsDown |= MK_MBUTTON;
- Msg.message = WM_MBUTTONDOWN;
+ mi.dwFlags |= MOUSEEVENTF_LEFTUP;
+ SendMouseEvent(mi);
}
- if ((Data[i].ButtonFlags & MOUSE_RIGHT_BUTTON_DOWN) > 0)
+ if(mid->ButtonFlags & MOUSE_MIDDLE_BUTTON_DOWN)
{
- CurInfo->ButtonsDown |= (CurInfo->SwapButtons ? MK_LBUTTON : MK_RBUTTON);
- Msg.message = (CurInfo->SwapButtons ? WM_LBUTTONDOWN : WM_RBUTTONDOWN);
+ mi.dwFlags |= MOUSEEVENTF_MIDDLEDOWN;
+ SendMouseEvent(mi);
}
-
- if ((Data[i].ButtonFlags & MOUSE_BUTTON_4_DOWN) > 0)
+ if(mid->ButtonFlags & MOUSE_MIDDLE_BUTTON_UP)
{
- CurInfo->ButtonsDown |= MK_XBUTTON1;
- Msg.message = WM_XBUTTONDOWN;
+ mi.dwFlags |= MOUSEEVENTF_MIDDLEUP;
+ SendMouseEvent(mi);
}
- if ((Data[i].ButtonFlags & MOUSE_BUTTON_5_DOWN) > 0)
- {
- CurInfo->ButtonsDown |= MK_XBUTTON2;
- Msg.message = WM_XBUTTONDOWN;
- }
-
- if ((Data[i].ButtonFlags & MOUSE_LEFT_BUTTON_UP) > 0)
+ if(mid->ButtonFlags & MOUSE_RIGHT_BUTTON_DOWN)
{
- CurInfo->ButtonsDown &= (CurInfo->SwapButtons ? ~MK_RBUTTON : ~MK_LBUTTON);
- Msg.message = (CurInfo->SwapButtons ? WM_RBUTTONUP : WM_LBUTTONUP);
+ mi.dwFlags |= MOUSEEVENTF_RIGHTDOWN;
+ SendMouseEvent(mi);
}
- if ((Data[i].ButtonFlags & MOUSE_MIDDLE_BUTTON_UP) > 0)
+ if(mid->ButtonFlags & MOUSE_RIGHT_BUTTON_UP)
{
- CurInfo->ButtonsDown &= ~MK_MBUTTON;
- Msg.message = WM_MBUTTONUP;
+ mi.dwFlags |= MOUSEEVENTF_RIGHTUP;
+ SendMouseEvent(mi);
}
- if ((Data[i].ButtonFlags & MOUSE_RIGHT_BUTTON_UP) > 0)
+ if(mid->ButtonFlags & MOUSE_BUTTON_4_DOWN)
{
- CurInfo->ButtonsDown &= (CurInfo->SwapButtons ? ~MK_LBUTTON : ~MK_RBUTTON);
- Msg.message = (CurInfo->SwapButtons ? WM_LBUTTONUP : WM_RBUTTONUP);
+ mi.mouseData |= XBUTTON1;
+ mi.dwFlags |= MOUSEEVENTF_XDOWN;
+ SendMouseEvent(mi);
}
- if ((Data[i].ButtonFlags & MOUSE_BUTTON_4_UP) > 0)
+ if(mid->ButtonFlags & MOUSE_BUTTON_4_UP)
{
- CurInfo->ButtonsDown &= ~MK_XBUTTON1;
- Msg.message = WM_XBUTTONUP;
+ mi.mouseData |= XBUTTON1;
+ mi.dwFlags |= MOUSEEVENTF_XUP;
+ SendMouseEvent(mi);
}
- if ((Data[i].ButtonFlags & MOUSE_BUTTON_5_UP) > 0)
+ if(mid->ButtonFlags & MOUSE_BUTTON_5_DOWN)
{
- CurInfo->ButtonsDown &= ~MK_XBUTTON2;
- Msg.message = WM_XBUTTONUP;
+ mi.mouseData |= XBUTTON2;
+ mi.dwFlags |= MOUSEEVENTF_XDOWN;
+ SendMouseEvent(mi);
}
- if ((Data[i].ButtonFlags & MOUSE_WHEEL) > 0)
+ if(mid->ButtonFlags & MOUSE_BUTTON_5_UP)
{
- dScroll += (LONG)Data[i].ButtonData;
+ mi.mouseData |= XBUTTON2;
+ mi.dwFlags |= MOUSEEVENTF_XUP;
+ SendMouseEvent(mi);
}
-
- if (Data[i].ButtonFlags != MOUSE_WHEEL)
+ if(mid->ButtonFlags & MOUSE_WHEEL)
{
- Moved = (0 != mouse_cx) || (0 != mouse_cy);
- if(Moved && MouseEnabled)
- {
- if (!CurInfo->SafetySwitch && 0 == CurInfo->SafetyRemoveCount &&
- ((mouse_ox != CurInfo->x) || (mouse_oy != CurInfo->y)))
- {
- ExAcquireFastMutex(&CurInfo->CursorMutex);
- IntLockGDIDriver(SurfGDI);
- SurfGDI->MovePointer(SurfObj, CurInfo->x, CurInfo->y, &PointerRect);
- IntUnLockGDIDriver(SurfGDI);
- SetPointerRect(CurInfo, &PointerRect);
- ExReleaseFastMutex(&CurInfo->CursorMutex);
- mouse_cx = 0;
- mouse_cy = 0;
- }
- }
-
- Msg.wParam = CurInfo->ButtonsDown;
- MsqInsertSystemMessage(&Msg);
+ mi.mouseData = mid->ButtonData;
+ mi.dwFlags |= MOUSEEVENTF_WHEEL;
+ SendMouseEvent(mi);
}
}
}
-
- /* If the mouse moved then move the pointer. */
- if ((mouse_cx != 0 || mouse_cy != 0) && MouseEnabled)
- {
- Msg.wParam = CurInfo->ButtonsDown;
- Msg.message = WM_MOUSEMOVE;
- Msg.pt.x = CurInfo->x;
- Msg.pt.y = CurInfo->y;
- Msg.lParam = MAKELPARAM(CurInfo->x, CurInfo->y);
- MsqInsertSystemMessage(&Msg);
-
- if (!CurInfo->SafetySwitch && 0 == CurInfo->SafetyRemoveCount &&
- ((mouse_ox != CurInfo->x) || (mouse_oy != CurInfo->y)))
- {
- ExAcquireFastMutex(&CurInfo->CursorMutex);
- IntLockGDIDriver(SurfGDI);
- SurfGDI->MovePointer(SurfObj, CurInfo->x, CurInfo->y, &PointerRect);
- IntUnLockGDIDriver(SurfGDI);
- SetPointerRect(CurInfo, &PointerRect);
- ExReleaseFastMutex(&CurInfo->CursorMutex);
- }
- }
- /* send WM_MOUSEWHEEL message */
- if(dScroll && MouseEnabled)
- {
- Msg.message = WM_MOUSEWHEEL;
- Msg.wParam = MAKEWPARAM(CurInfo->ButtonsDown, dScroll);
- Msg.lParam = MAKELPARAM(CurInfo->x, CurInfo->y);
- Msg.pt.x = CurInfo->x;
- Msg.pt.y = CurInfo->y;
- MsqInsertSystemMessage(&Msg);
- }
-
- ObDereferenceObject(InputWindowStation);
-}
-
-VOID FASTCALL
-EnableMouse(HDC hDisplayDC)
-{
- PDC dc;
- SURFOBJ *SurfObj;
- PSURFGDI SurfGDI;
-
- if( hDisplayDC && InputWindowStation)
- {
- if(!IntGetWindowStationObject(InputWindowStation))
- {
- InputWindowStation->SystemCursor.Enabled = FALSE;
- return;
- }
-
- dc = DC_LockDc(hDisplayDC);
- SurfObj = (SURFOBJ*)AccessUserObject((ULONG) dc->Surface);
- SurfGDI = (PSURFGDI)AccessInternalObject((ULONG) dc->Surface);
- DC_UnlockDc( hDisplayDC );
-
- IntSetCursor(InputWindowStation, NULL, TRUE);
-
- InputWindowStation->SystemCursor.Enabled = (SPS_ACCEPT_EXCLUDE == SurfGDI->PointerStatus ||
- SPS_ACCEPT_NOEXCLUDE == SurfGDI->PointerStatus);
-
- /* Move the cursor to the screen center */
- DPRINT("Setting Cursor up at 0x%x, 0x%x\n", SurfObj->sizlBitmap.cx / 2, SurfObj->sizlBitmap.cy / 2);
- MouseMoveCursor(SurfObj->sizlBitmap.cx / 2, SurfObj->sizlBitmap.cy / 2);
-
- ObDereferenceObject(InputWindowStation);
- }
- else
- {
- if(IntGetWindowStationObject(InputWindowStation))
- {
- IntSetCursor(InputWindowStation, NULL, TRUE);
- InputWindowStation->SystemCursor.Enabled = FALSE;
- InputWindowStation->SystemCursor.CursorClipInfo.IsClipped = FALSE;
- ObDereferenceObject(InputWindowStation);
- return;
- }
- }
+ SendMouseEvent(mi);
}
/* SOFTWARE MOUSE POINTER IMPLEMENTATION **************************************/
reactos/subsys/win32k/ntuser
diff -u -r1.29 -r1.30
--- input.c 29 Apr 2004 20:41:03 -0000 1.29
+++ input.c 30 Apr 2004 22:18:00 -0000 1.30
@@ -16,7 +16,7 @@
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
-/* $Id: input.c,v 1.29 2004/04/29 20:41:03 weiden Exp $
+/* $Id: input.c,v 1.30 2004/04/30 22:18:00 weiden Exp $
*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS kernel
@@ -41,6 +41,7 @@
#include <include/mouse.h>
#include <include/input.h>
#include <include/hotkey.h>
+#include <include/eng.h>
#include <rosrtl/string.h>
#define NDEBUG
@@ -523,9 +524,227 @@
}
BOOL FASTCALL
+IntSwapMouseButton(PWINSTATION_OBJECT WinStaObject, BOOL Swap)
+{
+ BOOL res = WinStaObject->SystemCursor.SwapButtons;
+ WinStaObject->SystemCursor.SwapButtons = Swap;
+ return res;
+}
+
+BOOL FASTCALL
IntMouseInput(MOUSEINPUT *mi)
{
- return FALSE;
+ const UINT SwapBtnMsg[2][2] = {{WM_LBUTTONDOWN, WM_RBUTTONDOWN},
+ {WM_LBUTTONUP, WM_RBUTTONUP}};
+ const WPARAM SwapBtn[2] = {MK_LBUTTON, MK_RBUTTON};
+ POINT MousePos;
+ PSYSTEM_CURSORINFO CurInfo;
+ PWINSTATION_OBJECT WinSta;
+ BOOL DoMove, SwapButtons;
+ MSG Msg;
+ SURFOBJ *SurfObj;
+ PSURFGDI SurfGDI;
+ PDC dc;
+ RECTL PointerRect;
+
+#if 1
+ HDC hDC;
+
+ /* FIXME - get the screen dc from the window station or desktop */
+ if(!(hDC = IntGetScreenDC()))
+ {
+ return FALSE;
+ }
+#endif
+
+ ASSERT(mi);
+#if 0
+ WinSta = PsGetWin32Process()->WindowStation;
+#else
+ /* FIXME - ugly hack but as long as we're using this dumb callback from the
+ mouse class driver, we can't access the window station from the calling
+ process */
+ WinSta = InputWindowStation;
+#endif
+ ASSERT(WinSta);
+
+ CurInfo = &WinSta->SystemCursor;
+
+ dc = DC_LockDc(hDC);
+ SurfObj = (SURFOBJ*)AccessUserObject((ULONG) dc->Surface);
+ SurfGDI = (PSURFGDI)AccessInternalObject((ULONG) dc->Surface);
+ DC_UnlockDc(hDC);
+ ASSERT(SurfObj);
+ ASSERT(SurfGDI);
+
+ if(!mi->time)
+ {
+ LARGE_INTEGER LargeTickCount;
+ KeQueryTickCount(&LargeTickCount);
+ mi->time = LargeTickCount.u.LowPart;
+ }
+
+ SwapButtons = WinSta->SystemCursor.SwapButtons;
+ DoMove = FALSE;
+ ExAcquireFastMutex(&CurInfo->CursorMutex);
+ MousePos.x = CurInfo->x;
+ MousePos.y = CurInfo->y;
+ if(mi->dwFlags & MOUSEEVENTF_MOVE)
+ {
+ if(mi->dwFlags & MOUSEEVENTF_ABSOLUTE)
+ {
+ MousePos.x = mi->dx;
+ MousePos.y = mi->dy;
+ }
+ else
+ {
+ MousePos.x += mi->dx;
+ MousePos.y += mi->dy;
+ }
+
+ if(CurInfo->CursorClipInfo.IsClipped)
+ {
+ /* The mouse cursor needs to be clipped */
+
+ if(MousePos.x > CurInfo->CursorClipInfo.Right)
+ MousePos.x = CurInfo->CursorClipInfo.Right;
+ if(MousePos.x <= CurInfo->CursorClipInfo.Left)
+ MousePos.x = CurInfo->CursorClipInfo.Left;
+ if(MousePos.y > CurInfo->CursorClipInfo.Bottom)
+ MousePos.y = CurInfo->CursorClipInfo.Bottom;
+ if(MousePos.y <= CurInfo->CursorClipInfo.Top)
+ MousePos.y = CurInfo->CursorClipInfo.Top;
+ }
+
+ if(MousePos.x < 0)
+ MousePos.x = 0;
+ if(MousePos.y < 0)
+ MousePos.y = 0;
+ if(MousePos.x >= SurfObj->sizlBitmap.cx)
+ MousePos.x = SurfObj->sizlBitmap.cx - 1;
+ if(MousePos.y >= SurfObj->sizlBitmap.cy)
+ MousePos.y = SurfObj->sizlBitmap.cy - 1;
+
+ if((DoMove = (MousePos.x != CurInfo->x || MousePos.y != CurInfo->y)))
+ {
+ CurInfo->x = MousePos.x;
+ CurInfo->y = MousePos.y;
+ if(SurfGDI->MovePointer)
+ {
+ IntLockGDIDriver(SurfGDI);
+ SurfGDI->MovePointer(SurfObj, CurInfo->x, CurInfo->y, &PointerRect);
+ IntUnLockGDIDriver(SurfGDI);
+ }
+ else
+ {
+ IntLockGDIDriver(SurfGDI);
+ EngMovePointer(SurfObj, CurInfo->x, CurInfo->y, &PointerRect);
+ IntUnLockGDIDriver(SurfGDI);
+ }
+ SetPointerRect(CurInfo, &PointerRect);
+ }
+ }
+
+ ExReleaseFastMutex(&CurInfo->CursorMutex);
+
+ /*
+ * Insert the messages into the system queue
+ */
+
+ Msg.wParam = CurInfo->ButtonsDown;
+ Msg.lParam = MAKELPARAM(MousePos.x, MousePos.y);
+ Msg.pt = MousePos;
+ if(DoMove)
+ {
+ Msg.message = WM_MOUSEMOVE;
+ MsqInsertSystemMessage(&Msg);
+ }
+
+ Msg.message = 0;
+ if(mi->dwFlags & MOUSEEVENTF_LEFTDOWN)
+ {
+ Msg.message = SwapBtnMsg[0][SwapButtons];
+ CurInfo->ButtonsDown |= SwapBtn[SwapButtons];
+ MsqInsertSystemMessage(&Msg);
+ }
+ else if(mi->dwFlags & MOUSEEVENTF_LEFTUP)
+ {
+ Msg.message = SwapBtnMsg[1][SwapButtons];
+ CurInfo->ButtonsDown &= ~SwapBtn[SwapButtons];
+ MsqInsertSystemMessage(&Msg);
+ }
+ if(mi->dwFlags & MOUSEEVENTF_MIDDLEDOWN)
+ {
+ Msg.message = WM_MBUTTONDOWN;
+ CurInfo->ButtonsDown |= MK_MBUTTON;
+ MsqInsertSystemMessage(&Msg);
+ }
+ else if(mi->dwFlags & MOUSEEVENTF_MIDDLEUP)
+ {
+ Msg.message = WM_MBUTTONUP;
+ CurInfo->ButtonsDown &= ~MK_MBUTTON;
+ MsqInsertSystemMessage(&Msg);
+ }
+ if(mi->dwFlags & MOUSEEVENTF_RIGHTDOWN)
+ {
+ Msg.message = SwapBtnMsg[0][!SwapButtons];
+ CurInfo->ButtonsDown |= SwapBtn[!SwapButtons];
+ MsqInsertSystemMessage(&Msg);
+ }
+ else if(mi->dwFlags & MOUSEEVENTF_RIGHTUP)
+ {
+ Msg.message = SwapBtnMsg[1][!SwapButtons];
+ CurInfo->ButtonsDown &= ~SwapBtn[!SwapButtons];
+ MsqInsertSystemMessage(&Msg);
+ }
+
+ if((mi->dwFlags & (MOUSEEVENTF_XDOWN | MOUSEEVENTF_XUP)) &&
+ (mi->dwFlags & MOUSEEVENTF_WHEEL))
+ {
+ /* fail because both types of events use the mouseData field */
+ return FALSE;
+ }
+
+ if(mi->dwFlags & MOUSEEVENTF_XDOWN)
+ {
+ Msg.message = WM_XBUTTONDOWN;
+ if(mi->mouseData & XBUTTON1)
+ {
+ Msg.wParam = MAKEWPARAM(CurInfo->ButtonsDown, XBUTTON1);
+ CurInfo->ButtonsDown |= XBUTTON1;
+ MsqInsertSystemMessage(&Msg);
+ }
+ if(mi->mouseData & XBUTTON2)
+ {
+ Msg.wParam = MAKEWPARAM(CurInfo->ButtonsDown, XBUTTON2);
+ CurInfo->ButtonsDown |= XBUTTON2;
+ MsqInsertSystemMessage(&Msg);
+ }
+ }
+ else if(mi->dwFlags & MOUSEEVENTF_XUP)
+ {
+ Msg.message = WM_XBUTTONUP;
+ if(mi->mouseData & XBUTTON1)
+ {
+ Msg.wParam = MAKEWPARAM(CurInfo->ButtonsDown, XBUTTON1);
+ CurInfo->ButtonsDown &= ~XBUTTON1;
+ MsqInsertSystemMessage(&Msg);
+ }
+ if(mi->mouseData & XBUTTON2)
+ {
+ Msg.wParam = MAKEWPARAM(CurInfo->ButtonsDown, XBUTTON2);
+ CurInfo->ButtonsDown &= ~XBUTTON2;
+ MsqInsertSystemMessage(&Msg);
+ }
+ }
+ if(mi->dwFlags & MOUSEEVENTF_WHEEL)
+ {
+ Msg.message = WM_MOUSEWHEEL;
+ Msg.wParam = MAKEWPARAM(CurInfo->ButtonsDown, mi->mouseData);
+ MsqInsertSystemMessage(&Msg);
+ }
+
+ return TRUE;
}
BOOL FASTCALL
reactos/subsys/win32k/objects
diff -u -r1.53 -r1.54
--- cursoricon.c 9 Apr 2004 20:03:20 -0000 1.53
+++ cursoricon.c 30 Apr 2004 22:18:00 -0000 1.54
@@ -16,7 +16,7 @@
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
-/* $Id: cursoricon.c,v 1.53 2004/04/09 20:03:20 navaraf Exp $ */
+/* $Id: cursoricon.c,v 1.54 2004/04/30 22:18:00 weiden Exp $ */
#undef WIN32_LEAN_AND_MEAN
@@ -32,6 +32,7 @@
#include <include/error.h>
#include <include/mouse.h>
#include <include/window.h>
+#include <include/input.h>
#include <include/cursoricon.h>
#include <include/inteng.h>
#include <include/surface.h>
@@ -81,15 +82,6 @@
return ret;
}
-STATIC VOID FASTCALL
-SetPointerRect(PSYSTEM_CURSORINFO CurInfo, PRECTL PointerRect)
-{
- CurInfo->PointerRectLeft = PointerRect->left;
- CurInfo->PointerRectRight = PointerRect->right;
- CurInfo->PointerRectTop = PointerRect->top;
- CurInfo->PointerRectBottom = PointerRect->bottom;
-}
-
#define COLORCURSORS_ALLOWED FALSE
HCURSOR FASTCALL
IntSetCursor(PWINSTATION_OBJECT WinStaObject, PCURICON_OBJECT NewCursor,
@@ -740,6 +732,8 @@
if((Rect.right > Rect.left) && (Rect.bottom > Rect.top)
&& DesktopWindow)
{
+ MOUSEINPUT mi;
+
CurInfo->CursorClipInfo.IsClipped = TRUE;
CurInfo->CursorClipInfo.Left = max(Rect.left, DesktopWindow->WindowRect.left);
CurInfo->CursorClipInfo.Top = max(Rect.top, DesktopWindow->WindowRect.top);
@@ -747,11 +741,18 @@
CurInfo->CursorClipInfo.Bottom = min(Rect.bottom - 1, DesktopWindow->WindowRect.bottom - 1);
IntReleaseWindowObject(DesktopWindow);
- MouseMoveCursor(CurInfo->x, CurInfo->y);
- }
- else
- WinStaObject->SystemCursor.CursorClipInfo.IsClipped = FALSE;
+ mi.dx = CurInfo->x;
+ mi.dy = CurInfo->y;
+ mi.mouseData = 0;
+ mi.dwFlags = MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_MOVE;
+ mi.time = 0;
+ mi.dwExtraInfo = 0;
+ IntMouseInput(&mi);
+ return TRUE;
+ }
+
+ WinStaObject->SystemCursor.CursorClipInfo.IsClipped = FALSE;
ObDereferenceObject(WinStaObject);
return TRUE;