Check for busy DCE moved to DCHook16().

This commit is contained in:
Ulrich Weigand 1999-05-08 09:50:52 +00:00 committed by Alexandre Julliard
parent ef61c0b632
commit e6ea9ebb5e
3 changed files with 28 additions and 54 deletions

View File

@ -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 */

View File

@ -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;

View File

@ -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;
} }