Check if DC is busy before deleting it.
This commit is contained in:
parent
99920819a5
commit
179e8deb6d
|
@ -53,5 +53,6 @@ extern void DCE_FreeWindowDCE( WND* );
|
||||||
extern INT16 DCE_ExcludeRgn( HDC, WND*, HRGN );
|
extern INT16 DCE_ExcludeRgn( HDC, WND*, HRGN );
|
||||||
extern HRGN DCE_GetVisRgn( HWND, WORD, HWND, WORD );
|
extern HRGN DCE_GetVisRgn( HWND, WORD, HWND, WORD );
|
||||||
extern BOOL DCE_InvalidateDCE( WND*, const RECT* );
|
extern BOOL DCE_InvalidateDCE( WND*, const RECT* );
|
||||||
|
extern BOOL DCE_IsDCBusy(HDC hdc);
|
||||||
|
|
||||||
#endif /* __WINE_DCE_H */
|
#endif /* __WINE_DCE_H */
|
||||||
|
|
15
objects/dc.c
15
objects/dc.c
|
@ -657,7 +657,20 @@ BOOL16 WINAPI DeleteDC16( HDC16 hdc )
|
||||||
*/
|
*/
|
||||||
BOOL WINAPI DeleteDC( HDC hdc )
|
BOOL WINAPI DeleteDC( HDC hdc )
|
||||||
{
|
{
|
||||||
DC * dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC );
|
DC * dc;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Windows will not let you delete a DC that is busy
|
||||||
|
* (between GetDC and ReleaseDC)
|
||||||
|
*/
|
||||||
|
if (DCE_IsDCBusy(hdc))
|
||||||
|
{
|
||||||
|
WARN(dc, " Application trying to delete a busy DC\n");
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC );
|
||||||
|
|
||||||
if (!dc) return FALSE;
|
if (!dc) return FALSE;
|
||||||
|
|
||||||
TRACE(dc, "%04x\n", hdc );
|
TRACE(dc, "%04x\n", hdc );
|
||||||
|
|
|
@ -627,6 +627,35 @@ INT16 DCE_ExcludeRgn( HDC hDC, WND* wnd, HRGN hRgn )
|
||||||
return ExtSelectClipRgn( hDC, hRgn, RGN_DIFF );
|
return ExtSelectClipRgn( hDC, hRgn, RGN_DIFF );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/***********************************************************************
|
||||||
|
* DCE_IsDCBusy
|
||||||
|
*
|
||||||
|
* Utility function to determine if a particular DC is currently
|
||||||
|
* in a busy state..
|
||||||
|
*/
|
||||||
|
BOOL DCE_IsDCBusy(HDC hdc)
|
||||||
|
{
|
||||||
|
DCE* dce;
|
||||||
|
BOOL isBusy = FALSE;
|
||||||
|
|
||||||
|
WIN_LockWnds();
|
||||||
|
dce = firstDCE;
|
||||||
|
|
||||||
|
while (dce && (dce->hDC != hdc)) dce = dce->next;
|
||||||
|
|
||||||
|
if ( dce )
|
||||||
|
{
|
||||||
|
if ( dce->DCXflags & DCX_DCEBUSY )
|
||||||
|
{
|
||||||
|
isBusy = TRUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
WIN_UnlockWnds();
|
||||||
|
|
||||||
|
return isBusy;
|
||||||
|
}
|
||||||
|
|
||||||
/***********************************************************************
|
/***********************************************************************
|
||||||
* GetDCEx16 (USER.359)
|
* GetDCEx16 (USER.359)
|
||||||
*/
|
*/
|
||||||
|
|
Loading…
Reference in New Issue