From e6ea9ebb5e977a4dce56dc7c53903b278b9bd804 Mon Sep 17 00:00:00 2001 From: Ulrich Weigand Date: Sat, 8 May 1999 09:50:52 +0000 Subject: [PATCH] Check for busy DCE moved to DCHook16(). --- include/dce.h | 1 - objects/dc.c | 23 ++++++++------------ windows/dce.c | 58 +++++++++++++++++---------------------------------- 3 files changed, 28 insertions(+), 54 deletions(-) diff --git a/include/dce.h b/include/dce.h index 2f7cae4b2d4..3fa10cb5557 100644 --- a/include/dce.h +++ b/include/dce.h @@ -53,6 +53,5 @@ extern void DCE_FreeWindowDCE( WND* ); extern INT16 DCE_ExcludeRgn( HDC, WND*, HRGN ); extern HRGN DCE_GetVisRgn( HWND, WORD, HWND, WORD ); extern BOOL DCE_InvalidateDCE( WND*, const RECT* ); -extern BOOL DCE_IsDCBusy(HDC hdc); #endif /* __WINE_DCE_H */ diff --git a/objects/dc.c b/objects/dc.c index 7c746ed102b..48997179efb 100644 --- a/objects/dc.c +++ b/objects/dc.c @@ -657,24 +657,19 @@ BOOL16 WINAPI DeleteDC16( HDC16 hdc ) */ BOOL WINAPI DeleteDC( HDC hdc ) { - 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 ); - + DC * dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC ); if (!dc) return FALSE; 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) { DC * dcs; diff --git a/windows/dce.c b/windows/dce.c index c8979a56563..2f4c171a03a 100644 --- a/windows/dce.c +++ b/windows/dce.c @@ -17,6 +17,7 @@ * DCX_WINDOWPAINT - BeginPaint() is in effect */ +#include #include "desktop.h" #include "options.h" #include "dce.h" @@ -627,34 +628,6 @@ INT16 DCE_ExcludeRgn( HDC hDC, WND* wnd, HRGN hRgn ) 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) @@ -988,21 +961,19 @@ INT WINAPI ReleaseDC( */ BOOL16 WINAPI DCHook16( HDC16 hDC, WORD code, DWORD data, LPARAM lParam ) { + BOOL retv = TRUE; HRGN hVisRgn; - DCE *dce; + DCE *dce = (DCE *)data; DC *dc; WND *wndPtr; - /* Grab the windows lock before doing anything else */ - WIN_LockWnds(); - - dce = firstDCE; - 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 ) { @@ -1050,16 +1021,25 @@ BOOL16 WINAPI DCHook16( HDC16 hDC, WORD code, DWORD data, LPARAM lParam ) WARN(dc, "DC is not in use!\n"); 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; default: FIXME(dc,"unknown code\n"); } -END: WIN_UnlockWnds(); /* Release the wnd lock */ - return 0; + return retv; }