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
* 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
* PURPOSE: Mouse
@ -218,6 +218,7 @@ MouseGDICallBack(PMOUSE_INPUT_DATA Data, ULONG InputCount)
dc = DC_HandleToPtr(hDC);
SurfObj = (PSURFOBJ)AccessUserObject(dc->Surface);
SurfGDI = (PSURFGDI)AccessInternalObject(dc->Surface);
DC_ReleasePtr( hDC );
/* Compile the total mouse movement change and dispatch button events. */
for (i = 0; i < InputCount; i++)
@ -276,28 +277,38 @@ MouseGDICallBack(PMOUSE_INPUT_DATA Data, ULONG InputCount)
VOID
EnableMouse(HDC hDisplayDC)
{
PDC dc = DC_HandleToPtr(hDisplayDC);
PSURFOBJ SurfObj = (PSURFOBJ)AccessUserObject(dc->Surface);
PSURFGDI SurfGDI = (PSURFGDI)AccessInternalObject(dc->Surface);
PDC dc;
PSURFOBJ SurfObj;
PSURFGDI SurfGDI;
HBITMAP hMouseSurf;
PSURFOBJ MouseSurf;
SIZEL MouseSize;
RECTL MouseRect;
/* Create the default mouse cursor. */
mouse_width = 32;
mouse_height = 32;
MouseSize.cx = 32;
MouseSize.cy = 64;
hMouseSurf = EngCreateBitmap(MouseSize, 4, BMF_1BPP, 0, DefaultCursor);
MouseSurf = (PSURFOBJ)AccessUserObject(hMouseSurf);
dc = DC_HandleToPtr(hDisplayDC);
if( dc ){
SurfObj = (PSURFOBJ)AccessUserObject(dc->Surface);
SurfGDI = (PSURFGDI)AccessInternalObject(dc->Surface);
DC_ReleasePtr( hDisplayDC );
/* Tell the display driver to set the pointer shape. */
SurfGDI->SetPointerShape(SurfObj, MouseSurf, NULL, NULL, 0, 0, 320, 240,
&MouseRect, 0);
/* Create the default mouse cursor. */
mouse_width = 32;
mouse_height = 32;
MouseSize.cx = 32;
MouseSize.cy = 64;
hMouseSurf = EngCreateBitmap(MouseSize, 4, BMF_1BPP, 0, DefaultCursor);
MouseSurf = (PSURFOBJ)AccessUserObject(hMouseSurf);
mouse_x = 320;
mouse_y = 240;
MouseEnabled = TRUE;
/* 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;
}
else{
MouseEnabled = FALSE;
}
}

View file

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