summaryrefslogtreecommitdiff
path: root/firmware/drivers
diff options
context:
space:
mode:
authorKjell Ericson <kjell@haxx.se>2003-05-22 06:42:14 +0000
committerKjell Ericson <kjell@haxx.se>2003-05-22 06:42:14 +0000
commit53f156a6fcec07301a6b29a3f647fff43520af7a (patch)
treee780f297944fedf31f6cafce3a1d00d4dc989993 /firmware/drivers
parent231ddff4bd3e9d0214b520726ef9235117c87b31 (diff)
New feature for player: Jump scroll!
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@3693 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'firmware/drivers')
-rw-r--r--firmware/drivers/lcd-player.c65
1 files changed, 52 insertions, 13 deletions
diff --git a/firmware/drivers/lcd-player.c b/firmware/drivers/lcd-player.c
index c5915af9fa..2496fb6f66 100644
--- a/firmware/drivers/lcd-player.c
+++ b/firmware/drivers/lcd-player.c
@@ -70,6 +70,7 @@ struct scrollinfo {
int starty;
long scroll_start_tick;
int direction; /* +1 for right or -1 for left*/
+ int jump_scroll;
};
#define MAX_CURSOR_CHARS 8
@@ -91,6 +92,7 @@ static int scroll_delay = HZ/2; /* delay before starting scroll */
static char scroll_spacing = 3; /* spaces between end and start of text */
static bool allow_bidirectional_scrolling = true;
static int bidir_limit = 50; /* percent */
+static int jump_scroll = 0; /* 0=off, 1=once, 2=always */
static struct scrollinfo scroll[SCROLLABLE_LINES];
@@ -498,6 +500,11 @@ void lcd_init (void)
sizeof(scroll_stack), scroll_name);
}
+void lcd_jump_scroll (int mode) /* 0=off, 1=once, 2=always */
+{
+ jump_scroll=mode;
+}
+
void lcd_bidir_scroll(int percent)
{
bidir_limit = percent;
@@ -522,6 +529,9 @@ void lcd_puts_scroll(int x, int y, unsigned char* string )
s->startx=x;
s->starty=y;
s->direction=+1;
+ s->jump_scroll=0;
+ if (jump_scroll && scroll_delay/2<(HZ/scroll_speed)*(s->textlen-11+x))
+ s->jump_scroll=11-x;
strncpy(s->text,string,sizeof s->text);
s->turn_offset=-1;
if (bidir_limit && (s->textlen < ((11-x)*(100+bidir_limit))/100)) {
@@ -596,18 +606,40 @@ static void scroll_thread(void)
if ( TIME_AFTER(current_tick, s->scroll_start_tick) ) {
char buffer[12];
update = true;
- if ( s->offset < s->textlen-1 ) {
- s->offset+=s->direction;
- if (s->offset==0) {
- s->direction=+1;
- s->scroll_start_tick = current_tick + scroll_delay;
- } else if (s->offset==s->turn_offset) {
- s->direction=-1;
- s->scroll_start_tick = current_tick + scroll_delay;
+ if (s->jump_scroll) {
+ s->offset+=s->jump_scroll;
+ s->scroll_start_tick = current_tick +
+ scroll_delay/2;
+ /* Eat space */
+ while (s->offset < s->textlen &&
+ s->text[s->offset] == ' ') {
+ s->offset++;
+ }
+ if (s->offset >= s->textlen) {
+ s->offset=0;
+ if (jump_scroll!=2) {
+ s->jump_scroll=0;
+ s->direction=1;
+ }
+ }
+ } else {
+ if ( s->offset < s->textlen-1 ) {
+ s->offset+=s->direction;
+ if (s->offset==0) {
+ s->direction=+1;
+ s->scroll_start_tick = current_tick +
+ scroll_delay;
+ } else {
+ if (s->offset == s->turn_offset) {
+ s->direction=-1;
+ s->scroll_start_tick = current_tick +
+ scroll_delay;
+ }
+ }
+ }
+ else {
+ s->offset = 0;
}
- }
- else {
- s->offset = 0;
}
i=0;
@@ -618,10 +650,17 @@ static void scroll_thread(void)
break;
}
o=0;
- while (i<11) {
- buffer[i++]=s->text[o++];
+ if (s->turn_offset == -1 && !s->jump_scroll) {
+ while (i<11) {
+ buffer[i++]=s->text[o++];
+ }
+ } else {
+ while (i<11) {
+ buffer[i++]=' ';
+ }
}
buffer[11]=0;
+
lcd_puts_cont_scroll(s->startx, s->starty, buffer);
}
}