LCDproc development and user support list

Text archives Help


[Lcdproc] [Patch] Synchronised scrollers


Chronological Thread 
  • From: steve AT nexusuk.org (Steve Hill)
  • Subject: [Lcdproc] [Patch] Synchronised scrollers
  • Date: Tue Sep 19 19:02:01 2006


Multiple scrollers on the same screen are not synchronised with eachother - some may be scrolling in the opposite direction to others. I find that this makes the display look messy and harder to read.

The attached patch addresses this problem by ensuring the scrollers are all going in the same direction. All scrollers on the screen now wait once they reach the end of their travel until the longer scrollers catch up.

At the moment this has not been done as an autoconf option - I'm not sure what the consensus is on whether this sort of thing should be optional or not?

--

- Steve

xmpp:steve AT nexusuk.org

sip:steve AT nexusuk.org
http://www.nexusuk.org/

Servatis a periculum, servatis a maleficum - Whisper, Evanescence
Index: server/render.c
===================================================================
--- server/render.c (revision 78)
+++ server/render.c (revision 79)
@@ -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);

@@ -343,13 +365,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;
@@ -380,28 +398,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;
@@ -440,13 +469,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))
@@ -458,7 +485,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;



Archive powered by MHonArc 2.6.18.

Top of page