Sorry, this patch should compile.
Index: dlls/comctl32/progress.c
===================================================================
RCS file: /home/wine/wine/dlls/comctl32/progress.c,v
retrieving revision 1.36
diff -u -r1.36 progress.c
--- dlls/comctl32/progress.c 11 Mar 2004 00:39:53 -0000 1.36
+++ dlls/comctl32/progress.c 25 Jul 2004 12:26:33 -0000
@@ -26,9 +26,6 @@
* Unless otherwise noted, we believe this code to be complete, as per
* the specification mentioned above.
* If you discover missing features, or bugs, please note them below.
- *
- * TODO
- * --support PBS_MARQUE
*
*/
@@ -59,7 +56,9 @@
/* Control configuration constants */
-#define LED_GAP 2
+#define LED_GAP 2
+#define MARQUEE_LEDS 5
+#define ID_MARQUEE_TIMER 1
/***********************************************************************
* PROGRESS_Invalidate
@@ -156,51 +155,215 @@
{
if (dwStyle & PBS_VERTICAL)
{
- INT old_top = rect.top;
- rect.top = rightBar;
- FillRect(hdc, &rect, hbrBar);
- rect.bottom = rect.top;
- rect.top = old_top;
- FillRect(hdc, &rect, hbrBk);
+ if (dwStyle & PBS_MARQUEE)
+ {
+ INT old_top, old_bottom;
+ old_top = rect.top;
+ old_bottom = rect.bottom;
+
+ leds = rect.bottom - rect.top;
+ ledMStart = (infoPtr->MarqueePos + MARQUEE_LEDS) - leds;
+
+ if(ledMStart > 0)
+ {
+ rect.top = max(rect.bottom - ledMStart, old_top);
+ FillRect(hdc, &rect, hbrBar);
+ rect.bottom = rect.top;
+ }
+ if(infoPtr->MarqueePos > 0)
+ {
+ rect.top = max(old_bottom - infoPtr->MarqueePos, old_top);
+ FillRect(hdc, &rect, hbrBk);
+ rect.bottom = rect.top;
+ }
+ if(rect.top >= old_top)
+ {
+ rect.top = max(rect.bottom - MARQUEE_LEDS, old_top);
+ FillRect(hdc, &rect, hbrBar);
+ rect.bottom = rect.top;
+ }
+ if(rect.top >= old_top)
+ {
+ rect.top = old_top;
+ FillRect(hdc, &rect, hbrBk);
+ }
+ }
+ else
+ {
+ INT old_top = rect.top;
+ rect.top = rightBar;
+ FillRect(hdc, &rect, hbrBar);
+ rect.bottom = rect.top;
+ rect.top = old_top;
+ FillRect(hdc, &rect, hbrBk);
+ }
}
else
{
- INT old_right = rect.right;
- rect.right = rightBar;
- FillRect(hdc, &rect, hbrBar);
- rect.left = rect.right;
- rect.right = old_right;
- FillRect(hdc, &rect, hbrBk);
+ if (dwStyle & PBS_MARQUEE)
+ {
+ INT old_left, old_right;
+ old_left = rect.left;
+ old_right = rect.right;
+
+ leds = rect.right - rect.left;
+ ledMStart = (infoPtr->MarqueePos + MARQUEE_LEDS) - leds;
+ rect.right = rect.left;
+
+ if(ledMStart > 0)
+ {
+ rect.right = min(rect.left + ledMStart, old_right);
+ FillRect(hdc, &rect, hbrBar);
+ rect.left = rect.right;
+ }
+ if(infoPtr->MarqueePos > 0)
+ {
+ rect.right = min(old_left + infoPtr->MarqueePos, old_right);
+ FillRect(hdc, &rect, hbrBk);
+ rect.left = rect.right;
+ }
+ if(rect.right < old_right)
+ {
+ rect.right = min(rect.left + MARQUEE_LEDS, old_right);
+ FillRect(hdc, &rect, hbrBar);
+ rect.left = rect.right;
+ }
+ if(rect.right < old_right)
+ {
+ rect.right = old_right;
+ FillRect(hdc, &rect, hbrBk);
+ }
+ }
+ else
+ {
+ INT old_right = rect.right;
+ rect.right = rightBar;
+ FillRect(hdc, &rect, hbrBar);
+ rect.left = rect.right;
+ rect.right = old_right;
+ FillRect(hdc, &rect, hbrBk);
+ }
}
} else {
if (dwStyle & PBS_VERTICAL) {
- while(rect.bottom > rightBar) {
- rect.top = rect.bottom - ledWidth;
- if (rect.top < rightMost)
- rect.top = rightMost;
- FillRect(hdc, &rect, hbrBar);
- rect.bottom = rect.top;
- rect.top -= LED_GAP;
- if (rect.top <= rightBar) break;
- FillRect(hdc, &rect, hbrBk);
- rect.bottom = rect.top;
+ if (dwStyle & PBS_MARQUEE)
+ {
+ INT i, old_top, old_bottom;
+ old_top = rect.top;
+ old_bottom = rect.bottom;
+
+ leds = ((rect.bottom - rect.top) + (ledWidth + LED_GAP) - 1) / (ledWidth + LED_GAP);
+ ledMStart = (infoPtr->MarqueePos + MARQUEE_LEDS) - leds;
+
+ while(ledMStart > 0)
+ {
+ rect.top = max(rect.bottom - ledWidth, old_top);
+ FillRect(hdc, &rect, hbrBar);
+ rect.bottom = rect.top;
+ rect.top -= LED_GAP;
+ if (rect.top <= old_top) break;
+ FillRect(hdc, &rect, hbrBk);
+ rect.bottom = rect.top;
+ ledMStart--;
+ }
+ if(infoPtr->MarqueePos > 0)
+ {
+ rect.top = max(old_bottom - (infoPtr->MarqueePos * (ledWidth + LED_GAP)), old_top);
+ FillRect(hdc, &rect, hbrBk);
+ rect.bottom = rect.top;
+ }
+ for(i = 0; i < MARQUEE_LEDS && rect.top >= old_top; i++)
+ {
+ rect.top = max(rect.bottom - ledWidth, old_top);
+ FillRect(hdc, &rect, hbrBar);
+ rect.bottom = rect.top;
+ rect.top -= LED_GAP;
+ if (rect.top <= old_top) break;
+ FillRect(hdc, &rect, hbrBk);
+ rect.bottom = rect.top;
+ }
+ if(rect.top >= old_top)
+ {
+ rect.top = old_top;
+ FillRect(hdc, &rect, hbrBk);
+ }
+ }
+ else
+ {
+ while(rect.bottom > rightBar) {
+ rect.top = rect.bottom - ledWidth;
+ if (rect.top < rightMost)
+ rect.top = rightMost;
+ FillRect(hdc, &rect, hbrBar);
+ rect.bottom = rect.top;
+ rect.top -= LED_GAP;
+ if (rect.top <= rightBar) break;
+ FillRect(hdc, &rect, hbrBk);
+ rect.bottom = rect.top;
+ }
}
rect.top = rightMost;
FillRect(hdc, &rect, hbrBk);
} else {
- while(rect.left < rightBar) {
- rect.right = rect.left + ledWidth;
- if (rect.right > rightMost)
- rect.right = rightMost;
- FillRect(hdc, &rect, hbrBar);
- rect.left = rect.right;
- rect.right += LED_GAP;
- if (rect.right >= rightBar) break;
+ if (dwStyle & PBS_MARQUEE)
+ {
+ INT i, old_right, old_left;
+ old_left = rect.left;
+ old_right = rect.right;
+
+ leds = ((rect.right - rect.left) + ledWidth - 1) / (ledWidth + LED_GAP);
+ ledMStart = (infoPtr->MarqueePos + MARQUEE_LEDS) - leds;
+ rect.right = rect.left;
+
+ while(ledMStart > 0)
+ {
+ rect.right = min(rect.left + ledWidth, old_right);
+ FillRect(hdc, &rect, hbrBar);
+ rect.left = rect.right;
+ rect.right += LED_GAP;
+ if (rect.right > old_right) break;
+ FillRect(hdc, &rect, hbrBk);
+ rect.left = rect.right;
+ ledMStart--;
+ }
+ if(infoPtr->MarqueePos > 0)
+ {
+ rect.right = min(old_left + (infoPtr->MarqueePos * (ledWidth + LED_GAP)), old_right);
+ FillRect(hdc, &rect, hbrBk);
+ rect.left = rect.right;
+ }
+ for(i = 0; i < MARQUEE_LEDS && rect.right < old_right; i++)
+ {
+ rect.right = min(rect.left + ledWidth, old_right);
+ FillRect(hdc, &rect, hbrBar);
+ rect.left = rect.right;
+ rect.right += LED_GAP;
+ if (rect.right > old_right) break;
+ FillRect(hdc, &rect, hbrBk);
+ rect.left = rect.right;
+ }
+ if(rect.right < old_right)
+ {
+ rect.right = old_right;
+ FillRect(hdc, &rect, hbrBk);
+ }
+ }
+ else
+ {
+ while(rect.left < rightBar) {
+ rect.right = rect.left + ledWidth;
+ if (rect.right > rightMost)
+ rect.right = rightMost;
+ FillRect(hdc, &rect, hbrBar);
+ rect.left = rect.right;
+ rect.right += LED_GAP;
+ if (rect.right >= rightBar) break;
+ FillRect(hdc, &rect, hbrBk);
+ rect.left = rect.right;
+ }
+ rect.right = rightMost;
FillRect(hdc, &rect, hbrBk);
- rect.left = rect.right;
}
- rect.right = rightMost;
- FillRect(hdc, &rect, hbrBk);
}
}
@@ -229,6 +392,63 @@
/***********************************************************************
+ * PROGRESS_Timer
+ * Handle the marquee timer messages
+ */
+static LRESULT PROGRESS_Timer (PROGRESS_INFO *infoPtr, INT idTimer)
+{
+ if(idTimer == ID_MARQUEE_TIMER)
+ {
+ LONG style = GetWindowLongW (infoPtr->Self, GWL_STYLE);
+ RECT rect;
+ int ledWidth, leds;
+
+ GetClientRect (infoPtr->Self, &rect);
+ InflateRect(&rect, -1, -1);
+
+ if(!(style & PBS_SMOOTH))
+ {
+ int width, height;
+
+ if(style & PBS_VERTICAL)
+ {
+ width = rect.bottom - rect.top;
+ height = rect.right - rect.left;
+ }
+ else
+ {
+ height = rect.bottom - rect.top;
+ width = rect.right - rect.left;
+ }
+ ledWidth = MulDiv (height, 2, 3);
+ leds = (width + ledWidth - 1) / (ledWidth + LED_GAP);
+ }
+ else
+ {
+ ledWidth = 1;
+ if(style & PBS_VERTICAL)
+ {
+ leds = rect.bottom - rect.top;
+ }
+ else
+ {
+ leds = rect.right - rect.left;
+ }
+ }
+
+ /* increment the marquee progress */
+ if(++infoPtr->MarqueePos >= leds)
+ {
+ infoPtr->MarqueePos = 0;
+ }
+
+ InvalidateRect(infoPtr->Self, &rect, TRUE);
+ }
+ return 0;
+}
+
+
+/***********************************************************************
* PROGRESS_CoercePos
* Makes sure the current position (CurVal) is within bounds.
*/
@@ -304,6 +524,8 @@
infoPtr->MaxVal = 100;
infoPtr->CurVal = 0;
infoPtr->Step = 10;
+ infoPtr->MarqueePos = 0;
+ infoPtr->Marquee = FALSE;
infoPtr->ColorBar = CLR_DEFAULT;
infoPtr->ColorBk = CLR_DEFAULT;
infoPtr->Font = 0;
@@ -326,6 +548,9 @@
case WM_PAINT:
return PROGRESS_Paint (infoPtr, (HDC)wParam);
+ case WM_TIMER:
+ return PROGRESS_Timer (infoPtr, (INT)wParam);
+
case PBM_DELTAPOS:
{
INT oldVal;
@@ -400,6 +625,19 @@
infoPtr->ColorBk = (COLORREF)lParam;
InvalidateRect(hwnd, NULL, TRUE);
return 0;
+
+ case PBM_SETMARQUEE:
+ if(wParam != 0)
+ {
+ infoPtr->Marquee = TRUE;
+ SetTimer(infoPtr->Self, ID_MARQUEE_TIMER, (UINT)lParam, NULL);
+ }
+ else
+ {
+ infoPtr->Marquee = FALSE;
+ KillTimer(infoPtr->Self, ID_MARQUEE_TIMER);
+ }
+ return infoPtr->Marquee;
default:
if ((message >= WM_USER) && (message < WM_APP))
Index: include/commctrl.h
===================================================================
RCS file: /home/wine/wine/include/commctrl.h,v
retrieving revision 1.134
diff -u -r1.134 commctrl.h
--- include/commctrl.h 6 Jul 2004 21:02:36 -0000 1.134
+++ include/commctrl.h 25 Jul 2004 12:13:28 -0000
@@ -456,10 +456,12 @@
#define PBM_GETRANGE (WM_USER+7)
#define PBM_GETPOS (WM_USER+8)
#define PBM_SETBARCOLOR (WM_USER+9)
+#define PBM_SETMARQUEE (WM_USER+10)
#define PBM_SETBKCOLOR CCM_SETBKCOLOR
#define PBS_SMOOTH 0x01
#define PBS_VERTICAL 0x04
+#define PBS_MARQUEE 0x08
typedef struct
{