Check for busy DCE moved to DCHook16().
This commit is contained in:
parent
ef61c0b632
commit
e6ea9ebb5e
|
@ -53,6 +53,5 @@ 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 */
|
||||||
|
|
23
objects/dc.c
23
objects/dc.c
|
@ -657,24 +657,19 @@ BOOL16 WINAPI DeleteDC16( HDC16 hdc )
|
||||||
*/
|
*/
|
||||||
BOOL WINAPI DeleteDC( HDC hdc )
|
BOOL WINAPI DeleteDC( HDC hdc )
|
||||||
{
|
{
|
||||||
DC * dc;
|
DC * dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC );
|
||||||
|
|
||||||
/*
|
|
||||||
* 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 );
|
||||||
|
|
||||||
|
/* Call hook procedure to check whether is it OK to delete this DC */
|
||||||
|
if ( dc->hookProc && !(dc->w.flags & (DC_SAVED | DC_MEMORY))
|
||||||
|
&& dc->hookProc( hdc, DCHC_DELETEDC, dc->dwHookData, 0 ) == FALSE )
|
||||||
|
{
|
||||||
|
GDI_HEAP_UNLOCK( hdc );
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
while (dc->saveLevel)
|
while (dc->saveLevel)
|
||||||
{
|
{
|
||||||
DC * dcs;
|
DC * dcs;
|
||||||
|
|
|
@ -17,6 +17,7 @@
|
||||||
* DCX_WINDOWPAINT - BeginPaint() is in effect
|
* DCX_WINDOWPAINT - BeginPaint() is in effect
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include <assert.h>
|
||||||
#include "desktop.h"
|
#include "desktop.h"
|
||||||
#include "options.h"
|
#include "options.h"
|
||||||
#include "dce.h"
|
#include "dce.h"
|
||||||
|
@ -627,34 +628,6 @@ 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)
|
||||||
|
@ -988,21 +961,19 @@ INT WINAPI ReleaseDC(
|
||||||
*/
|
*/
|
||||||
BOOL16 WINAPI DCHook16( HDC16 hDC, WORD code, DWORD data, LPARAM lParam )
|
BOOL16 WINAPI DCHook16( HDC16 hDC, WORD code, DWORD data, LPARAM lParam )
|
||||||
{
|
{
|
||||||
|
BOOL retv = TRUE;
|
||||||
HRGN hVisRgn;
|
HRGN hVisRgn;
|
||||||
DCE *dce;
|
DCE *dce = (DCE *)data;
|
||||||
DC *dc;
|
DC *dc;
|
||||||
WND *wndPtr;
|
WND *wndPtr;
|
||||||
|
|
||||||
/* Grab the windows lock before doing anything else */
|
|
||||||
WIN_LockWnds();
|
|
||||||
|
|
||||||
dce = firstDCE;
|
|
||||||
|
|
||||||
TRACE(dc,"hDC = %04x, %i\n", hDC, code);
|
TRACE(dc,"hDC = %04x, %i\n", hDC, code);
|
||||||
|
|
||||||
while (dce && (dce->hDC != hDC)) dce = dce->next;
|
if (!dce) return 0;
|
||||||
|
assert(dce->hDC == hDC);
|
||||||
|
|
||||||
if (!dce) goto END;
|
/* Grab the windows lock before doing anything else */
|
||||||
|
WIN_LockWnds();
|
||||||
|
|
||||||
switch( code )
|
switch( code )
|
||||||
{
|
{
|
||||||
|
@ -1050,16 +1021,25 @@ BOOL16 WINAPI DCHook16( HDC16 hDC, WORD code, DWORD data, LPARAM lParam )
|
||||||
WARN(dc, "DC is not in use!\n");
|
WARN(dc, "DC is not in use!\n");
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case DCHC_DELETEDC: /* FIXME: ?? */
|
case DCHC_DELETEDC:
|
||||||
|
/*
|
||||||
|
* Windows will not let you delete a DC that is busy
|
||||||
|
* (between GetDC and ReleaseDC)
|
||||||
|
*/
|
||||||
|
|
||||||
|
if ( dce->DCXflags & DCX_DCEBUSY )
|
||||||
|
{
|
||||||
|
WARN(dc, "Application trying to delete a busy DC\n");
|
||||||
|
retv = FALSE;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
FIXME(dc,"unknown code\n");
|
FIXME(dc,"unknown code\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
END:
|
|
||||||
WIN_UnlockWnds(); /* Release the wnd lock */
|
WIN_UnlockWnds(); /* Release the wnd lock */
|
||||||
return 0;
|
return retv;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue