Fixed: locking GDI objects twice when running wm_paint test.

svn path=/trunk/; revision=4062
This commit is contained in:
Eugene Ingerman 2003-01-24 23:25:34 +00:00
parent 4b0f9d9631
commit 2f26431f71
2 changed files with 129 additions and 147 deletions

View file

@ -16,7 +16,7 @@
* along with this program; if not, write to the Free Software * along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/ */
/* $Id: mouse.c,v 1.15 2002/11/01 11:29:57 dwelch Exp $ /* $Id: mouse.c,v 1.16 2003/01/24 23:25:34 ei Exp $
* *
* PROJECT: ReactOS kernel * PROJECT: ReactOS kernel
* PURPOSE: Mouse * PURPOSE: Mouse
@ -43,76 +43,76 @@ static LONG mouse_x, mouse_y;
static UINT mouse_width = 0, mouse_height = 0; static UINT mouse_width = 0, mouse_height = 0;
static UCHAR DefaultCursor[256] = { static UCHAR DefaultCursor[256] = {
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, 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, 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, 0x00, 0x00, 0x00,
0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x01, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x01, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x43, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x66, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x00,
0x76, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x00,
0x7E, 0x00, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00,
0x7F, 0xC0, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00,
0x7F, 0x80, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00,
0x7F, 0x00, 0x00, 0x00, 0x43, 0x00, 0x00, 0x00,
0x7E, 0x00, 0x00, 0x00, 0x66, 0x00, 0x00, 0x00,
0x7C, 0x00, 0x00, 0x00, 0x76, 0x00, 0x00, 0x00,
0x78, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x00,
0x70, 0x00, 0x00, 0x00, 0x7F, 0xC0, 0x00, 0x00,
0x60, 0x00, 0x00, 0x00, 0x7F, 0x80, 0x00, 0x00,
0x40, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00,
0x00, 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, 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, 0xFF, 0x3F, 0xFF, 0xFF,
0xFE, 0x1F, 0xFF, 0xFF, 0xFE, 0x1F, 0xFF, 0xFF,
0xFE, 0x1F, 0xFF, 0xFF, 0xFE, 0x1F, 0xFF, 0xFF,
0xFC, 0x3F, 0xFF, 0xFF, 0xFC, 0x3F, 0xFF, 0xFF,
0x7C, 0x3F, 0xFF, 0xFF, 0x7C, 0x3F, 0xFF, 0xFF,
0x38, 0x7F, 0xFF, 0xFF, 0x38, 0x7F, 0xFF, 0xFF,
0x18, 0x7F, 0xFF, 0xFF, 0x18, 0x7F, 0xFF, 0xFF,
0x00, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF,
0x00, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF,
0x00, 0x0F, 0xFF, 0xFF, 0x00, 0x0F, 0xFF, 0xFF,
0x00, 0x1F, 0xFF, 0xFF, 0x00, 0x1F, 0xFF, 0xFF,
0x00, 0x3F, 0xFF, 0xFF, 0x00, 0x3F, 0xFF, 0xFF,
0x00, 0x7F, 0xFF, 0xFF, 0x00, 0x7F, 0xFF, 0xFF,
0x00, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF,
0x01, 0xFF, 0xFF, 0xFF, 0x01, 0xFF, 0xFF, 0xFF,
0x03, 0xFF, 0xFF, 0xFF, 0x03, 0xFF, 0xFF, 0xFF,
0x07, 0xFF, 0xFF, 0xFF, 0x07, 0xFF, 0xFF, 0xFF,
0x0F, 0xFF, 0xFF, 0xFF, 0x0F, 0xFF, 0xFF, 0xFF,
0x1F, 0xFF, 0xFF, 0xFF, 0x1F, 0xFF, 0xFF, 0xFF,
0x3F, 0xFF, 0xFF, 0xFF}; 0x3F, 0xFF, 0xFF, 0xFF};
/* FUNCTIONS *****************************************************************/ /* FUNCTIONS *****************************************************************/
INT INT
MouseSafetyOnDrawStart(PSURFOBJ SurfObj, PSURFGDI SurfGDI, LONG HazardX1, MouseSafetyOnDrawStart(PSURFOBJ SurfObj, PSURFGDI SurfGDI, LONG HazardX1,
LONG HazardY1, LONG HazardX2, LONG HazardY2) LONG HazardY1, LONG HazardX2, LONG HazardY2)
/* /*
* FUNCTION: Notify the mouse driver that drawing is about to begin in * FUNCTION: Notify the mouse driver that drawing is about to begin in
@ -122,23 +122,23 @@ MouseSafetyOnDrawStart(PSURFOBJ SurfObj, PSURFGDI SurfGDI, LONG HazardX1,
RECTL MouseRect; RECTL MouseRect;
LONG tmp; LONG tmp;
if (SurfObj == NULL) if (SurfObj == NULL)
{ {
return(FALSE); return(FALSE);
} }
if (SurfObj->iType != STYPE_DEVICE || MouseEnabled == FALSE) if (SurfObj->iType != STYPE_DEVICE || MouseEnabled == FALSE)
{ {
return(FALSE); return(FALSE);
} }
if (HazardX1 > HazardX2) if (HazardX1 > HazardX2)
{ {
tmp = HazardX2; HazardX2 = HazardX1; HazardX1 = tmp; tmp = HazardX2; HazardX2 = HazardX1; HazardX1 = tmp;
} }
if (HazardY1 > HazardY2) if (HazardY1 > HazardY2)
{ {
tmp = HazardY2; HazardY2 = HazardY1; HazardY1 = tmp; tmp = HazardY2; HazardY2 = HazardY1; HazardY1 = tmp;
} }
if (((mouse_x + mouse_width) >= HazardX1) && (mouse_x <= HazardX2) && if (((mouse_x + mouse_width) >= HazardX1) && (mouse_x <= HazardX2) &&
@ -154,7 +154,7 @@ MouseSafetyOnDrawStart(PSURFOBJ SurfObj, PSURFGDI SurfGDI, LONG HazardX1,
return(TRUE); return(TRUE);
} }
INT INT
MouseSafetyOnDrawEnd(PSURFOBJ SurfObj, PSURFGDI SurfGDI) MouseSafetyOnDrawEnd(PSURFOBJ SurfObj, PSURFGDI SurfGDI)
/* /*
* FUNCTION: Notify the mouse driver that drawing has finished on a surface. * FUNCTION: Notify the mouse driver that drawing has finished on a surface.
@ -162,12 +162,12 @@ MouseSafetyOnDrawEnd(PSURFOBJ SurfObj, PSURFGDI SurfGDI)
{ {
RECTL MouseRect; RECTL MouseRect;
if (SurfObj == NULL) if (SurfObj == NULL)
{ {
return(FALSE); return(FALSE);
} }
if (SurfObj->iType != STYPE_DEVICE || MouseEnabled == FALSE) if (SurfObj->iType != STYPE_DEVICE || MouseEnabled == FALSE)
{ {
return(FALSE); return(FALSE);
} }
@ -177,7 +177,7 @@ MouseSafetyOnDrawEnd(PSURFOBJ SurfObj, PSURFGDI SurfGDI)
SurfGDI->MovePointer(SurfObj, mouse_x, mouse_y, &MouseRect); SurfGDI->MovePointer(SurfObj, mouse_x, mouse_y, &MouseRect);
SafetySwitch = FALSE; SafetySwitch = FALSE;
} }
SafetySwitch2 = FALSE; SafetySwitch2 = FALSE;
return(TRUE); return(TRUE);
@ -195,13 +195,13 @@ MouseGDICallBack(PMOUSE_INPUT_DATA Data, ULONG InputCount)
PDC dc; PDC dc;
PSURFOBJ SurfObj; PSURFOBJ SurfObj;
PSURFGDI SurfGDI; PSURFGDI SurfGDI;
RECTL MouseRect; RECTL MouseRect;
MSG Msg; MSG Msg;
ULONG j; ULONG j;
LARGE_INTEGER LargeTickCount; LARGE_INTEGER LargeTickCount;
ULONG TickCount; ULONG TickCount;
static ULONG ButtonsDown = 0; static ULONG ButtonsDown = 0;
const UINT MouseButtonDownMessage[3] = const UINT MouseButtonDownMessage[3] =
{WM_RBUTTONDOWN, WM_MBUTTONDOWN, WM_LBUTTONDOWN}; {WM_RBUTTONDOWN, WM_MBUTTONDOWN, WM_LBUTTONDOWN};
const UINT MouseButtonUpMessage[3] = const UINT MouseButtonUpMessage[3] =
{WM_RBUTTONUP, WM_MBUTTONUP, WM_LBUTTONUP}; {WM_RBUTTONUP, WM_MBUTTONUP, WM_LBUTTONUP};
@ -218,7 +218,8 @@ MouseGDICallBack(PMOUSE_INPUT_DATA Data, ULONG InputCount)
dc = DC_HandleToPtr(hDC); dc = DC_HandleToPtr(hDC);
SurfObj = (PSURFOBJ)AccessUserObject(dc->Surface); SurfObj = (PSURFOBJ)AccessUserObject(dc->Surface);
SurfGDI = (PSURFGDI)AccessInternalObject(dc->Surface); SurfGDI = (PSURFGDI)AccessInternalObject(dc->Surface);
DC_ReleasePtr( hDC );
/* Compile the total mouse movement change and dispatch button events. */ /* Compile the total mouse movement change and dispatch button events. */
for (i = 0; i < InputCount; i++) for (i = 0; i < InputCount; i++)
{ {
@ -232,7 +233,7 @@ MouseGDICallBack(PMOUSE_INPUT_DATA Data, ULONG InputCount)
Msg.pt.x = mouse_x + mouse_cx; Msg.pt.x = mouse_x + mouse_cx;
Msg.pt.y = mouse_y + mouse_cy; Msg.pt.y = mouse_y + mouse_cy;
MsqInsertSystemMessage(&Msg); MsqInsertSystemMessage(&Msg);
for (j = 0; j < 3; j++) for (j = 0; j < 3; j++)
{ {
ULONG Flag = MouseButtonFlag[j]; ULONG Flag = MouseButtonFlag[j];
@ -245,8 +246,8 @@ MouseGDICallBack(PMOUSE_INPUT_DATA Data, ULONG InputCount)
MsqInsertSystemMessage(&Msg); MsqInsertSystemMessage(&Msg);
} }
if (!(Data[i].ButtonData & (1 << j)) && (ButtonsDown & Flag)) if (!(Data[i].ButtonData & (1 << j)) && (ButtonsDown & Flag))
{ {
ButtonsDown &= ~Flag; ButtonsDown &= ~Flag;
Msg.wParam = ButtonsDown; Msg.wParam = ButtonsDown;
Msg.message = MouseButtonUpMessage[j]; Msg.message = MouseButtonUpMessage[j];
@ -257,9 +258,9 @@ MouseGDICallBack(PMOUSE_INPUT_DATA Data, ULONG InputCount)
/* If the mouse moved then move the pointer. */ /* If the mouse moved then move the pointer. */
if (mouse_cx != 0 || mouse_cy != 0) if (mouse_cx != 0 || mouse_cy != 0)
{ {
mouse_x += mouse_cx; mouse_x += mouse_cx;
mouse_y += mouse_cy; mouse_y += mouse_cy;
mouse_x = max(mouse_x, 0); mouse_x = max(mouse_x, 0);
mouse_y = max(mouse_y, 0); mouse_y = max(mouse_y, 0);
@ -268,36 +269,46 @@ MouseGDICallBack(PMOUSE_INPUT_DATA Data, ULONG InputCount)
if (SafetySwitch == FALSE && SafetySwitch2 == FALSE) if (SafetySwitch == FALSE && SafetySwitch2 == FALSE)
{ {
SurfGDI->MovePointer(SurfObj, mouse_x, mouse_y, &MouseRect); SurfGDI->MovePointer(SurfObj, mouse_x, mouse_y, &MouseRect);
} }
} }
} }
VOID VOID
EnableMouse(HDC hDisplayDC) EnableMouse(HDC hDisplayDC)
{ {
PDC dc = DC_HandleToPtr(hDisplayDC); PDC dc;
PSURFOBJ SurfObj = (PSURFOBJ)AccessUserObject(dc->Surface); PSURFOBJ SurfObj;
PSURFGDI SurfGDI = (PSURFGDI)AccessInternalObject(dc->Surface); PSURFGDI SurfGDI;
HBITMAP hMouseSurf; HBITMAP hMouseSurf;
PSURFOBJ MouseSurf; PSURFOBJ MouseSurf;
SIZEL MouseSize; SIZEL MouseSize;
RECTL MouseRect; RECTL MouseRect;
/* Create the default mouse cursor. */ dc = DC_HandleToPtr(hDisplayDC);
mouse_width = 32; if( dc ){
mouse_height = 32; SurfObj = (PSURFOBJ)AccessUserObject(dc->Surface);
MouseSize.cx = 32; SurfGDI = (PSURFGDI)AccessInternalObject(dc->Surface);
MouseSize.cy = 64; DC_ReleasePtr( hDisplayDC );
hMouseSurf = EngCreateBitmap(MouseSize, 4, BMF_1BPP, 0, DefaultCursor);
MouseSurf = (PSURFOBJ)AccessUserObject(hMouseSurf);
/* Tell the display driver to set the pointer shape. */ /* Create the default mouse cursor. */
SurfGDI->SetPointerShape(SurfObj, MouseSurf, NULL, NULL, 0, 0, 320, 240, mouse_width = 32;
&MouseRect, 0); mouse_height = 32;
MouseSize.cx = 32;
MouseSize.cy = 64;
hMouseSurf = EngCreateBitmap(MouseSize, 4, BMF_1BPP, 0, DefaultCursor);
MouseSurf = (PSURFOBJ)AccessUserObject(hMouseSurf);
mouse_x = 320; /* Tell the display driver to set the pointer shape. */
mouse_y = 240; SurfGDI->SetPointerShape(SurfObj, MouseSurf, NULL, NULL, 0, 0, 320, 240,
MouseEnabled = TRUE; &MouseRect, 0);
mouse_x = 320;
mouse_y = 240;
MouseEnabled = TRUE;
}
else{
MouseEnabled = FALSE;
}
} }

View file

@ -314,35 +314,23 @@ empty:
*/ */
HRGN REGION_CropRgn(HRGN hDst, HRGN hSrc, const PRECT lpRect, PPOINT lpPt) HRGN REGION_CropRgn(HRGN hDst, HRGN hSrc, const PRECT lpRect, PPOINT lpPt)
{ {
PROSRGNDATA objSrc = RGNDATA_LockRgn(hSrc); PROSRGNDATA objSrc, rgnDst;
HRGN hNewDst; HRGN hNewDst, hRet = NULL;
GDIMULTILOCK Lock[2] = {{hDst, 0, GO_REGION_MAGIC}, {hSrc, 0, GO_REGION_MAGIC}};
if(objSrc) if( !hDst ){
{
PROSRGNDATA rgnDst;
if(hDst)
{
if(!(rgnDst = RGNDATA_LockRgn(hDst)))
{
hDst = 0;
goto done;
}
}
else{
if( !( hNewDst = RGNDATA_AllocRgn(1) ) ){ if( !( hNewDst = RGNDATA_AllocRgn(1) ) ){
RGNDATA_UnlockRgn( hSrc );
return 0; return 0;
} }
Lock[0].hObj = hNewDst;
}
if(!(rgnDst = RGNDATA_LockRgn(hNewDst))) GDIOBJ_LockMultipleObj( &Lock, 2 );
{ rgnDst = Lock[0].pObj;
RGNDATA_FreeRgn( hNewDst ); objSrc = Lock[1].pObj;
RGNDATA_UnlockRgn( hSrc );
return 0;
}
}
if( objSrc && rgnDst )
{
if(rgnDst) if(rgnDst)
{ {
POINT pt = { 0, 0 }; POINT pt = { 0, 0 };
@ -352,32 +340,15 @@ HRGN REGION_CropRgn(HRGN hDst, HRGN hSrc, const PRECT lpRect, PPOINT lpPt)
if(REGION_CropAndOffsetRegion(lpPt, lpRect, objSrc, rgnDst) == FALSE) if(REGION_CropAndOffsetRegion(lpPt, lpRect, objSrc, rgnDst) == FALSE)
{ // ve failed cleanup and return { // ve failed cleanup and return
RGNDATA_UnlockRgn( hSrc ); hRet = NULL;
if(hDst) // unlock new region if allocated
RGNDATA_UnlockRgn( hDst );
else
RGNDATA_UnlockRgn( hNewDst );
return 0;
} }
else{ // ve are fine. unlock the correct pointer and return correct handle else{ // ve are fine. unlock the correct pointer and return correct handle
RGNDATA_UnlockRgn( hSrc ); hRet = Lock[0].hObj;
if(hDst == 0){
RGNDATA_UnlockRgn( hNewDst );
return hNewDst;
}
else {
RGNDATA_UnlockRgn( hDst );
return hDst;
}
} }
} }
done:
RGNDATA_UnlockRgn( hSrc );
} }
return 0; GDIOBJ_UnlockMultipleObj( &Lock, 2 );
return hRet;
} }
/*! /*!