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