--- 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;