--- server/render.c
+++ server/render.c
@@ -176,6 +176,7 @@
int length, speed;
int str_length = BUFSIZE-1;
int reset = 1;
+ int max_scroller_len = 0;
debug(RPT_DEBUG, "%s(list=%p, fscroll='%c', left=%d, top=%d, "
"right=%d, bottom=%d, fwid=%d, fhgt=%d, fspeed=%d, timer=%d)",
@@ -202,6 +203,27 @@
/* TODO: Frames don't scroll horizontally yet! */
}
+ /* loop through the widgets before starting to render to pull out data we need before starting */
+ LL_Rewind(list);
+ do {
+ Widget *w = (Widget *) LL_Get(list);
+ if (!w)
+ break;
+
+ switch (w->type) {
+ case WID_SCROLLER:
+ /* length is really direction(!) */
+ if (w->length == 'h') {
+ length = strlen(w->text) + 1;
+ if (max_scroller_len < length)
+ max_scroller_len = length;
+ }
+ break;
+ default:
+ break;
+ }
+ } while (LL_Next(list) == 0);
+
/* reset widget list */
LL_Rewind(list);
@@ -341,13 +363,9 @@
/* it fits within the box, just render it */
drivers_string(w->left, w->top, w->text);
} else {
- int necessaryTimeUnits = 0;
-
if (w->speed > 0) {
- necessaryTimeUnits = length * w->speed;
offset = (timer % (length * w->speed)) / w->speed;
} else if (w->speed < 0) {
- necessaryTimeUnits = length / (w->speed * -1);
offset = (timer % (length / (w->speed * -1))) * w->speed * -1;
} else {
offset = 0;
@@ -378,28 +396,39 @@
drivers_string(w->left, w->top, w->text);
} else {
int effLength = length - screen_width;
- int necessaryTimeUnits = 0;
+ int maxeffLength = max_scroller_len - screen_width;
+ int waitlen = maxeffLength - effLength;
if (w->speed > 0) {
- necessaryTimeUnits = effLength * w->speed;
- if (((timer / (effLength * w->speed)) % 2) == 0) {
+ if (((timer / (maxeffLength * w->speed)) % 2) == 0) {
/*wiggle one way*/
- offset = (timer % (effLength * w->speed))
+ offset = (timer % (maxeffLength * w->speed))
/ w->speed;
+ if (offset >= effLength)
+ offset = effLength - 1;
} else {
/*wiggle the other*/
- offset = (((timer % (effLength * w->speed))
- - (effLength * w->speed) + 1)
+ offset = (((timer % (maxeffLength * w->speed))
+ - (maxeffLength * w->speed) + 1)
/ w->speed) * -1;
+ if (offset <= waitlen)
+ offset = 0;
+ else
+ offset -= waitlen;
}
} else if (w->speed < 0) {
- necessaryTimeUnits = effLength / (w->speed * -1);
- if (((timer / (effLength / (w->speed * -1))) % 2) == 0) {
- offset = (timer % (effLength / (w->speed * -1)))
+ if (((timer / (maxeffLength / (w->speed * -1))) % 2) == 0) {
+ offset = (timer % (maxeffLength / (w->speed * -1)))
* w->speed * -1;
+ if (offset >= effLength)
+ offset = effLength - 1;
} else {
- offset = (((timer % (effLength / (w->speed * -1)))
- * w->speed * -1) - effLength + 1) * -1;
+ offset = (((timer % (maxeffLength / (w->speed * -1)))
+ * w->speed * -1) - maxeffLength + 1) * -1;
+ if (offset <= waitlen)
+ offset = 0;
+ else
+ offset -= waitlen;
}
} else {
offset = 0;
@@ -438,13 +467,11 @@
drivers_string (w->left, w->top + i, str);
}
} else {
- int necessaryTimeUnits = 0;
int effLines = lines_required - available_lines + 1;
int begin = 0;
/*debug(RPT_DEBUG, "length: %d sw: %d lines req: %d avail lines: %d effLines: %d ",length,screen_width,lines_required,available_lines,effLines);*/
if (w->speed > 0) {
- necessaryTimeUnits = effLines * w->speed;
if (((timer / (effLines * w->speed)) % 2) == 0) {
/*debug(RPT_DEBUG, "up ");*/
begin = (timer % (effLines * w->speed))
@@ -456,7 +483,6 @@
* -1;
}
} else if (w->speed < 0) {
- necessaryTimeUnits = effLines / (w->speed * -1);
if (((timer / (effLines / (w->speed * -1))) % 2) == 0) {
begin = (timer % (effLines / (w->speed * -1)))
* w->speed * -1;
syntax highlighted by Code2HTML, v. 0.9.1