From 5c517a20b778cdae2dbb406f35ef1cc2126455ed Mon Sep 17 00:00:00 2001 From: Rob Shearman Date: Wed, 6 Feb 2008 16:50:15 +0000 Subject: [PATCH] comctl32: Don't get the background colour in ANIMATE_PaintFrame as this can be called inside a critical section. This could therefore create a deadlock if the processing for WM_CTLCOLORSTATIC ends up sending certain messages to the animate control. So move the retrieval of the background colour into the callers of ANIMATE_PaintFrame but outside of any critical section. --- dlls/comctl32/animate.c | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/dlls/comctl32/animate.c b/dlls/comctl32/animate.c index ee668aece53..6ba05bd166a 100644 --- a/dlls/comctl32/animate.c +++ b/dlls/comctl32/animate.c @@ -317,9 +317,6 @@ static BOOL ANIMATE_PaintFrame(ANIMATE_INFO* infoPtr, HDC hDC) rect.right = nWidth; rect.bottom = nHeight; - infoPtr->hbrushBG = (HBRUSH)SendMessageW(infoPtr->hwndNotify, - WM_CTLCOLORSTATIC, - (WPARAM)hDC, (LPARAM)infoPtr->hwndSelf); if(!infoPtr->hbrushBG) infoPtr->hbrushBG = GetCurrentObject(hDC, OBJ_BRUSH); @@ -403,6 +400,10 @@ static DWORD CALLBACK ANIMATE_AnimationThread(LPVOID ptr_) while(1) { + if (infoPtr->dwStyle & ACS_TRANSPARENT) + infoPtr->hbrushBG = (HBRUSH)SendMessageW(infoPtr->hwndNotify, + WM_CTLCOLORSTATIC, + 0, (LPARAM)infoPtr->hwndSelf); EnterCriticalSection(&infoPtr->cs); ANIMATE_DrawFrame(infoPtr); timeout = infoPtr->mah.dwMicroSecPerFrame; @@ -451,6 +452,10 @@ static LRESULT ANIMATE_Play(ANIMATE_INFO *infoPtr, UINT cRepeat, WORD wFrom, WOR * does it send a notification */ if (infoPtr->nFromFrame == infoPtr->nToFrame) { + if (infoPtr->dwStyle & ACS_TRANSPARENT) + infoPtr->hbrushBG = (HBRUSH)SendMessageW(infoPtr->hwndNotify, + WM_CTLCOLORSTATIC, + 0, (LPARAM)infoPtr->hwndSelf); ANIMATE_DrawFrame(infoPtr); return TRUE; }