--- server/render.c-ok 2007-04-28 23:54:21.000000000 +0200 +++ server/render.c 2007-04-28 23:51:33.000000000 +0200 @@ -170,6 +170,7 @@ int vis_width = right - left; /* width of visible frame area */ int vis_height = bottom - top; /* height of visible frame area */ int /*fx = 0,*/ fy = 0; /* Scrolling offset for the frame... */ + 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=%ld)", @@ -196,6 +197,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') { + int 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); @@ -331,14 +353,10 @@ 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 { @@ -372,32 +390,43 @@ } 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))) + offset = (((timer % (maxeffLength / (w->speed * -1))) * w->speed * -1) - - effLength + 1) * -1; + - maxeffLength + 1) * -1; + if (offset <= waitlen) + offset = 0; + else + offset -= waitlen; } } else { @@ -439,14 +468,12 @@ } } else { - int necessaryTimeUnits = 0; int effLines = lines_required - available_lines + 1; int begin = 0; int i = 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)) @@ -460,7 +487,6 @@ } } 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;