Rob Shearman : comctl32: Don' t get the background colour in ANIMATE_PaintFrame as this can be called inside a critical section .

Alexandre Julliard julliard at winehq.org
Thu Feb 7 07:59:27 CST 2008


Module: wine
Branch: master
Commit: 5c517a20b778cdae2dbb406f35ef1cc2126455ed
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=5c517a20b778cdae2dbb406f35ef1cc2126455ed

Author: Rob Shearman <rob at codeweavers.com>
Date:   Wed Feb  6 16:50:15 2008 +0000

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 files changed, 8 insertions(+), 3 deletions(-)

diff --git a/dlls/comctl32/animate.c b/dlls/comctl32/animate.c
index ee668ae..6ba05bd 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;
     }




More information about the wine-cvs mailing list