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