* 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.19 2003/03/09 15:00:51 jfilby Exp $
+/* $Id: mouse.c,v 1.20 2003/03/11 00:21:41 gvg Exp $
*
* PROJECT: ReactOS kernel
* PURPOSE: Mouse
#include <win32k/dc.h>
#include "objects.h"
#include "include/msgqueue.h"
+#include "include/object.h"
+#include "include/winsta.h"
#define NDEBUG
#include <debug.h>
static BOOLEAN MouseEnabled = FALSE;
static LONG mouse_x, mouse_y;
static UINT mouse_width = 0, mouse_height = 0;
+static ULONG PointerStatus;
static UCHAR DefaultCursor[256] = {
+ 0x3F, 0xFF, 0xFF, 0xFF,
+ 0x1F, 0xFF, 0xFF, 0xFF,
+ 0x0F, 0xFF, 0xFF, 0xFF,
+ 0x07, 0xFF, 0xFF, 0xFF,
+ 0x03, 0xFF, 0xFF, 0xFF,
+ 0x01, 0xFF, 0xFF, 0xFF,
+ 0x00, 0xFF, 0xFF, 0xFF,
+ 0x00, 0x7F, 0xFF, 0xFF,
+ 0x00, 0x3F, 0xFF, 0xFF,
+ 0x00, 0x1F, 0xFF, 0xFF,
+ 0x00, 0x0F, 0xFF, 0xFF,
+ 0x00, 0xFF, 0xFF, 0xFF,
+ 0x00, 0xFF, 0xFF, 0xFF,
+ 0x18, 0x7F, 0xFF, 0xFF,
+ 0x38, 0x7F, 0xFF, 0xFF,
+ 0x7C, 0x3F, 0xFF, 0xFF,
+ 0xFC, 0x3F, 0xFF, 0xFF,
+ 0xFE, 0x1F, 0xFF, 0xFF,
+ 0xFE, 0x1F, 0xFF, 0xFF,
+ 0xFF, 0x3F, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF,
+
0x00, 0x00, 0x00, 0x00,
+ 0x40, 0x00, 0x00, 0x00,
+ 0x60, 0x00, 0x00, 0x00,
+ 0x70, 0x00, 0x00, 0x00,
+ 0x78, 0x00, 0x00, 0x00,
+ 0x7C, 0x00, 0x00, 0x00,
+ 0x7E, 0x00, 0x00, 0x00,
+ 0x7F, 0x00, 0x00, 0x00,
+ 0x7F, 0x80, 0x00, 0x00,
+ 0x7F, 0xC0, 0x00, 0x00,
+ 0x7E, 0x00, 0x00, 0x00,
+ 0x76, 0x00, 0x00, 0x00,
+ 0x76, 0x00, 0x00, 0x00,
+ 0x43, 0x00, 0x00, 0x00,
+ 0x03, 0x00, 0x00, 0x00,
+ 0x01, 0x80, 0x00, 0x00,
+ 0x01, 0x80, 0x00, 0x00,
+ 0x00, 0xC0, 0x00, 0x00,
+ 0x00, 0xC0, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
- 0x00, 0xC0, 0x00, 0x00,
- 0x00, 0xC0, 0x00, 0x00,
- 0x01, 0x80, 0x00, 0x00,
- 0x01, 0x80, 0x00, 0x00,
- 0x03, 0x00, 0x00, 0x00,
- 0x43, 0x00, 0x00, 0x00,
- 0x66, 0x00, 0x00, 0x00,
- 0x76, 0x00, 0x00, 0x00,
- 0x7E, 0x00, 0x00, 0x00,
- 0x7F, 0xC0, 0x00, 0x00,
- 0x7F, 0x80, 0x00, 0x00,
- 0x7F, 0x00, 0x00, 0x00,
- 0x7E, 0x00, 0x00, 0x00,
- 0x7C, 0x00, 0x00, 0x00,
- 0x78, 0x00, 0x00, 0x00,
- 0x70, 0x00, 0x00, 0x00,
- 0x60, 0x00, 0x00, 0x00,
- 0x40, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00,
-
- 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0x3F, 0xFF, 0xFF,
- 0xFE, 0x1F, 0xFF, 0xFF,
- 0xFE, 0x1F, 0xFF, 0xFF,
- 0xFC, 0x3F, 0xFF, 0xFF,
- 0x7C, 0x3F, 0xFF, 0xFF,
- 0x38, 0x7F, 0xFF, 0xFF,
- 0x18, 0x7F, 0xFF, 0xFF,
- 0x00, 0xFF, 0xFF, 0xFF,
- 0x00, 0xFF, 0xFF, 0xFF,
- 0x00, 0x0F, 0xFF, 0xFF,
- 0x00, 0x1F, 0xFF, 0xFF,
- 0x00, 0x3F, 0xFF, 0xFF,
- 0x00, 0x7F, 0xFF, 0xFF,
- 0x00, 0xFF, 0xFF, 0xFF,
- 0x01, 0xFF, 0xFF, 0xFF,
- 0x03, 0xFF, 0xFF, 0xFF,
- 0x07, 0xFF, 0xFF, 0xFF,
- 0x0F, 0xFF, 0xFF, 0xFF,
- 0x1F, 0xFF, 0xFF, 0xFF,
- 0x3F, 0xFF, 0xFF, 0xFF};
+ 0x00, 0x00, 0x00, 0x00};
/* FUNCTIONS *****************************************************************/
RECTL MouseRect;
LONG tmp;
+
/* Mouse is not allowed to move if GDI is busy drawing */
SafetySwitch2 = TRUE;
return(FALSE);
}
+ if (SPS_ACCEPT_NOEXCLUDE == PointerStatus)
+ {
+ /* Hardware cursor, no need to remove it */
+ return(FALSE);
+ }
+
if (HazardX1 > HazardX2)
{
tmp = HazardX2; HazardX2 = HazardX1; HazardX1 = tmp;
if (SurfObj == NULL)
{
+ SafetySwitch2 = FALSE;
return(FALSE);
}
if (SurfObj->iType != STYPE_DEVICE || MouseEnabled == FALSE)
{
+ SafetySwitch2 = FALSE;
+ return(FALSE);
+ }
+
+ if (SPS_ACCEPT_NOEXCLUDE == PointerStatus)
+ {
+ /* Hardware cursor, it wasn't removed so need to restore it */
+ SafetySwitch2 = FALSE;
return(FALSE);
}
PSURFGDI SurfGDI;
RECTL MouseRect;
MSG Msg;
- ULONG j;
LARGE_INTEGER LargeTickCount;
ULONG TickCount;
static ULONG ButtonsDown = 0;
- const UINT MouseButtonDownMessage[3] =
- {WM_RBUTTONDOWN, WM_MBUTTONDOWN, WM_LBUTTONDOWN};
- const UINT MouseButtonUpMessage[3] =
- {WM_RBUTTONUP, WM_MBUTTONUP, WM_LBUTTONUP};
- const ULONG MouseButtonFlag[3] = {MK_RBUTTON, MK_MBUTTON, MK_LBUTTON};
KeQueryTickCount(&LargeTickCount);
TickCount = LargeTickCount.u.LowPart;
}
dc = DC_HandleToPtr(hDC);
- SurfObj = (PSURFOBJ)AccessUserObject(dc->Surface);
- SurfGDI = (PSURFGDI)AccessInternalObject(dc->Surface);
+ SurfObj = (PSURFOBJ)AccessUserObject((ULONG) dc->Surface);
+ SurfGDI = (PSURFGDI)AccessInternalObject((ULONG) dc->Surface);
DC_ReleasePtr( hDC );
/* Compile the total mouse movement change and dispatch button events. */
dc = DC_HandleToPtr(hDisplayDC);
if( dc ){
- SurfObj = (PSURFOBJ)AccessUserObject(dc->Surface);
- SurfGDI = (PSURFGDI)AccessInternalObject(dc->Surface);
+ SurfObj = (PSURFOBJ)AccessUserObject((ULONG) dc->Surface);
+ SurfGDI = (PSURFGDI)AccessInternalObject((ULONG) dc->Surface);
DC_ReleasePtr( hDisplayDC );
/* Create the default mouse cursor. */
mouse_height = 32;
MouseSize.cx = 32;
MouseSize.cy = 64;
- hMouseSurf = EngCreateBitmap(MouseSize, 4, BMF_1BPP, 0, DefaultCursor);
- MouseSurf = (PSURFOBJ)AccessUserObject(hMouseSurf);
+ hMouseSurf = EngCreateBitmap(MouseSize, 4, BMF_1BPP, BMF_TOPDOWN, DefaultCursor);
+ MouseSurf = (PSURFOBJ)AccessUserObject((ULONG) hMouseSurf);
/* Tell the display driver to set the pointer shape. */
- SurfGDI->SetPointerShape(SurfObj, MouseSurf, NULL, NULL, 0, 0, 320, 240,
- &MouseRect, 0);
-
- mouse_x = 320;
- mouse_y = 240;
- MouseEnabled = TRUE;
+#if 0
+ mouse_x = SurfObj->sizlBitmap.cx / 2;
+ mouse_y = SurfObj->sizlBitmap.cy / 2;
+#else
+ mouse_x = 320;
+ mouse_y = 240;
+#endif
+ PointerStatus = SurfGDI->SetPointerShape(SurfObj, MouseSurf, NULL, NULL,
+ 0, 0, mouse_x, mouse_y, &MouseRect,
+ SPS_CHANGE);
+
+ MouseEnabled = (SPS_ACCEPT_EXCLUDE == PointerStatus ||
+ SPS_ACCEPT_NOEXCLUDE == PointerStatus);
}
else{
MouseEnabled = FALSE;