REBAR: on a RB_SETBANDINFO message only redraw the rebar if something changed

Mike McCormack mike at codeweavers.com
Fri Jan 2 09:50:12 CST 2004


This stops IE's toolbar from flickering when moving the mouse over links.

Mike


ChangeLog:
* on a RB_SETBANDINFO message only redraw the rebar if something changed
-------------- next part --------------
Index: dlls/comctl32/rebar.c
===================================================================
RCS file: /home/wine/wine/dlls/comctl32/rebar.c,v
retrieving revision 1.80
diff -u -r1.80 rebar.c
--- dlls/comctl32/rebar.c	9 Nov 2003 00:28:24 -0000	1.80
+++ dlls/comctl32/rebar.c	2 Jan 2004 15:44:18 -0000
@@ -2090,25 +2090,41 @@
 
 }
 
-static void
+static BOOL
 REBAR_CommonSetupBand (HWND hwnd, LPREBARBANDINFOA lprbbi, REBAR_BAND *lpBand)
      /* Function:  This routine copies the supplied values from   */
      /*  user input (lprbbi) to the internal band structure.      */
+     /*  It returns true if something changed and false if not.   */
 {
     lpBand->fMask |= lprbbi->fMask;
+    BOOL bChanged = FALSE;
 
-    if (lprbbi->fMask & RBBIM_STYLE)
+    if( (lprbbi->fMask & RBBIM_STYLE) &&
+        (lpBand->fStyle != lprbbi->fStyle ) )
+    {
 	lpBand->fStyle = lprbbi->fStyle;
+        bChanged = TRUE;
+    }
 
-    if (lprbbi->fMask & RBBIM_COLORS) {
+    if( (lprbbi->fMask & RBBIM_COLORS) &&
+       ( ( lpBand->clrFore != lprbbi->clrFore ) ||
+         ( lpBand->clrBack != lprbbi->clrBack ) ) )
+    {
 	lpBand->clrFore = lprbbi->clrFore;
 	lpBand->clrBack = lprbbi->clrBack;
+        bChanged = TRUE;
     }
 
-    if (lprbbi->fMask & RBBIM_IMAGE)
+    if( (lprbbi->fMask & RBBIM_IMAGE) &&
+       ( lpBand->iImage != lprbbi->iImage ) )
+    {
 	lpBand->iImage = lprbbi->iImage;
+        bChanged = TRUE;
+    }
 
-    if (lprbbi->fMask & RBBIM_CHILD) {
+    if( (lprbbi->fMask & RBBIM_CHILD) &&
+       (lprbbi->hwndChild != lpBand->hwndChild ) )
+    {
 	if (lprbbi->hwndChild) {
 	    lpBand->hwndChild = lprbbi->hwndChild;
 	    lpBand->hwndPrevParent =
@@ -2123,9 +2139,21 @@
 	    lpBand->hwndChild = 0;
 	    lpBand->hwndPrevParent = 0;
 	}
+        bChanged = TRUE;
     }
 
-    if (lprbbi->fMask & RBBIM_CHILDSIZE) {
+    if( (lprbbi->fMask & RBBIM_CHILDSIZE) &&
+        ( (lpBand->cxMinChild != lprbbi->cxMinChild) ||
+          (lpBand->cyMinChild != lprbbi->cyMinChild ) ||
+          ( (lprbbi->cbSize >= sizeof (REBARBANDINFOA)) &&
+            ( (lpBand->cyChild    != lprbbi->cyChild ) ||
+              (lpBand->cyMaxChild != lprbbi->cyMaxChild ) ||
+              (lpBand->cyIntegral != lprbbi->cyIntegral ) ) ) ||
+          ( (lprbbi->cbSize < sizeof (REBARBANDINFOA)) &&
+            ( (lpBand->cyChild || 
+               lpBand->cyMaxChild || 
+               lpBand->cyIntegral ) ) ) ) )
+    {
 	lpBand->cxMinChild = lprbbi->cxMinChild;
 	lpBand->cyMinChild = lprbbi->cyMinChild;
 	if (lprbbi->cbSize >= sizeof (REBARBANDINFOA)) {
@@ -2139,28 +2167,55 @@
 	    lpBand->cyMaxChild = 0;
 	    lpBand->cyIntegral = 0;
 	}
+        bChanged = TRUE;
     }
 
-    if (lprbbi->fMask & RBBIM_SIZE)
+    if( (lprbbi->fMask & RBBIM_SIZE) &&
+        (lpBand->cx != lprbbi->cx ) )
+    {
 	lpBand->cx = lprbbi->cx;
+        bChanged = TRUE;
+    }
 
-    if (lprbbi->fMask & RBBIM_BACKGROUND)
+    if( (lprbbi->fMask & RBBIM_BACKGROUND) &&
+       ( lpBand->hbmBack != lprbbi->hbmBack ) )
+    {
 	lpBand->hbmBack = lprbbi->hbmBack;
+        bChanged = TRUE;
+    }
 
-    if (lprbbi->fMask & RBBIM_ID)
+    if( (lprbbi->fMask & RBBIM_ID) &&
+        (lpBand->wID != lprbbi->wID ) )
+    {
 	lpBand->wID = lprbbi->wID;
+        bChanged = TRUE;
+    }
 
     /* check for additional data */
     if (lprbbi->cbSize >= sizeof (REBARBANDINFOA)) {
-	if (lprbbi->fMask & RBBIM_IDEALSIZE)
+	if( (lprbbi->fMask & RBBIM_IDEALSIZE) &&
+            ( lpBand->cxIdeal != lprbbi->cxIdeal ) )
+        {
 	    lpBand->cxIdeal = lprbbi->cxIdeal;
+            bChanged = TRUE;
+        }
 
-	if (lprbbi->fMask & RBBIM_LPARAM)
+	if( (lprbbi->fMask & RBBIM_LPARAM) &&
+            (lpBand->lParam != lprbbi->lParam ) )
+        {
 	    lpBand->lParam = lprbbi->lParam;
+            bChanged = TRUE;
+        }
 
-	if (lprbbi->fMask & RBBIM_HEADERSIZE)
+	if( (lprbbi->fMask & RBBIM_HEADERSIZE) &&
+            (lpBand->cxHeader != lprbbi->cxHeader ) )
+        {
 	    lpBand->cxHeader = lprbbi->cxHeader;
+            bChanged = TRUE;
+        }
     }
+
+    return bChanged;
 }
 
 static LRESULT
@@ -3430,11 +3485,19 @@
 }
 
 
+/* return TRUE if two strings are different */
+static BOOL
+REBAR_strdifW( LPCWSTR a, LPCWSTR b )
+{
+    return ( (a && !b) || (b && !a) || (a && b && lstrcmpW(a, b) ) );
+}
+
 static LRESULT
 REBAR_SetBandInfoA (REBAR_INFO *infoPtr, WPARAM wParam, LPARAM lParam)
 {
     LPREBARBANDINFOA lprbbi = (LPREBARBANDINFOA)lParam;
     REBAR_BAND *lpBand;
+    BOOL bChanged;
 
     if (lprbbi == NULL)
 	return FALSE;
@@ -3449,27 +3512,39 @@
     /* set band information */
     lpBand = &infoPtr->bands[(UINT)wParam];
 
-    REBAR_CommonSetupBand (infoPtr->hwndSelf, lprbbi, lpBand);
+    bChanged = REBAR_CommonSetupBand (infoPtr->hwndSelf, lprbbi, lpBand);
     if (lprbbi->fMask & RBBIM_TEXT) {
-	if (lpBand->lpText) {
-	    Free (lpBand->lpText);
-	    lpBand->lpText = NULL;
-	}
-	if (lprbbi->lpText) {
-            INT len = MultiByteToWideChar( CP_ACP, 0, lprbbi->lpText, -1, NULL, 0 );
+        LPWSTR wstr = NULL;
+
+        if (lprbbi->lpText)
+        {
+            INT len;
+            len = MultiByteToWideChar( CP_ACP, 0, lprbbi->lpText, -1, NULL, 0 );
             if (len > 1)
-            {
-                lpBand->lpText = (LPWSTR)Alloc (len*sizeof(WCHAR));
-                MultiByteToWideChar( CP_ACP, 0, lprbbi->lpText, -1, lpBand->lpText, len );
-            }
-	}
+                wstr = (LPWSTR)Alloc (len*sizeof(WCHAR));
+            if (wstr)
+                MultiByteToWideChar( CP_ACP, 0, lprbbi->lpText, -1, wstr, len );
+        }
+        if (REBAR_strdifW(lpBand->lpText, wstr)) {
+	    if (lpBand->lpText) {
+	        Free (lpBand->lpText);
+	        lpBand->lpText = NULL;
+	    }
+	    if (wstr) {
+                lpBand->lpText = wstr;
+                wstr = NULL;
+	    }
+            bChanged = TRUE;
+        }
+        if (wstr)
+	    Free (wstr);
     }
 
     REBAR_ValidateBand (infoPtr, lpBand);
 
     REBAR_DumpBand (infoPtr);
 
-    if (lprbbi->fMask & (RBBIM_CHILDSIZE | RBBIM_SIZE)) {
+    if (bChanged && (lprbbi->fMask & (RBBIM_CHILDSIZE | RBBIM_SIZE))) {
 	  REBAR_Layout (infoPtr, NULL, TRUE, FALSE);
 	  InvalidateRect(infoPtr->hwndSelf, 0, 1);
     }
@@ -3477,12 +3552,12 @@
     return TRUE;
 }
 
-
 static LRESULT
 REBAR_SetBandInfoW (REBAR_INFO *infoPtr, WPARAM wParam, LPARAM lParam)
 {
     LPREBARBANDINFOW lprbbi = (LPREBARBANDINFOW)lParam;
     REBAR_BAND *lpBand;
+    BOOL bChanged;
 
     if (lprbbi == NULL)
 	return FALSE;
@@ -3497,8 +3572,9 @@
     /* set band information */
     lpBand = &infoPtr->bands[(UINT)wParam];
 
-    REBAR_CommonSetupBand (infoPtr->hwndSelf, (LPREBARBANDINFOA)lprbbi, lpBand);
-    if (lprbbi->fMask & RBBIM_TEXT) {
+    bChanged = REBAR_CommonSetupBand (infoPtr->hwndSelf, (LPREBARBANDINFOA)lprbbi, lpBand);
+    if( (lprbbi->fMask & RBBIM_TEXT) && 
+        REBAR_strdifW( lpBand->lpText, lprbbi->lpText ) ) {
 	if (lpBand->lpText) {
 	    Free (lpBand->lpText);
 	    lpBand->lpText = NULL;
@@ -3511,13 +3587,14 @@
 	        strcpyW (lpBand->lpText, lprbbi->lpText);
 	    }
 	}
+        bChanged = TRUE;
     }
 
     REBAR_ValidateBand (infoPtr, lpBand);
 
     REBAR_DumpBand (infoPtr);
 
-    if (lprbbi->fMask & (RBBIM_CHILDSIZE | RBBIM_SIZE)) {
+    if ( bChanged && (lprbbi->fMask & (RBBIM_CHILDSIZE | RBBIM_SIZE)) ) {
       REBAR_Layout (infoPtr, NULL, TRUE, FALSE);
       InvalidateRect(infoPtr->hwndSelf, 0, 1);
     }


More information about the wine-patches mailing list