diff options
-rw-r--r-- | apps/plugins/credits.c | 417 |
1 files changed, 185 insertions, 232 deletions
diff --git a/apps/plugins/credits.c b/apps/plugins/credits.c index 64475c8e4b..7970d2913b 100644 --- a/apps/plugins/credits.c +++ b/apps/plugins/credits.c @@ -21,124 +21,15 @@ PLUGIN_HEADER -#if (CONFIG_KEYPAD == IRIVER_H100_PAD) || (CONFIG_KEYPAD == IRIVER_H300_PAD) - -#define QUIT BUTTON_OFF -#define UP BUTTON_UP -#define DOWN BUTTON_DOWN - -#elif CONFIG_KEYPAD == ONDIO_PAD - -#define QUIT BUTTON_OFF -#define UP BUTTON_UP -#define DOWN BUTTON_DOWN - -#elif CONFIG_KEYPAD == RECORDER_PAD - -#define QUIT BUTTON_OFF -#define UP BUTTON_UP -#define DOWN BUTTON_DOWN - -#elif CONFIG_KEYPAD == ARCHOS_AV300_PAD - -#define QUIT BUTTON_OFF -#define UP BUTTON_UP -#define DOWN BUTTON_DOWN - -#elif (CONFIG_KEYPAD == IPOD_3G_PAD) || \ - (CONFIG_KEYPAD == IPOD_4G_PAD) - -#define QUIT BUTTON_MENU -#define UP BUTTON_SCROLL_BACK -#define DOWN BUTTON_SCROLL_FWD - -#elif (CONFIG_KEYPAD == GIGABEAT_PAD) - -#define QUIT BUTTON_A -#define UP BUTTON_UP -#define DOWN BUTTON_DOWN - -#elif CONFIG_KEYPAD == IAUDIO_X5M5_PAD /* grayscale at the moment */ - -#define QUIT BUTTON_POWER -#define UP BUTTON_UP -#define DOWN BUTTON_DOWN - -#elif CONFIG_KEYPAD == SANSA_E200_PAD - -#define QUIT BUTTON_POWER -#define UP BUTTON_SCROLL_UP -#define DOWN BUTTON_SCROLL_DOWN - -#elif CONFIG_KEYPAD == IRIVER_H10_PAD /* grayscale at the moment */ - -#define QUIT BUTTON_POWER -#define UP BUTTON_SCROLL_UP -#define DOWN BUTTON_SCROLL_DOWN - -#elif CONFIG_KEYPAD == PLAYER_PAD - -#define QUIT BUTTON_STOP -#define UP BUTTON_LEFT -#define DOWN BUTTON_RIGHT - -#elif CONFIG_KEYPAD == IPOD_1G2G_PAD - -#define QUIT (BUTTON_PLAY|BUTTON_REPEAT) -#define UP BUTTON_SCROLL_BACK -#define DOWN BUTTON_SCROLL_FWD - -#elif CONFIG_KEYPAD == IRIVER_IFP7XX_PAD - -#define QUIT BUTTON_PLAY -#define UP BUTTON_UP -#define DOWN BUTTON_DOWN - -#else -#error Unsupported keypad -#endif - +static struct plugin_api* rb; -void roll_credits(void); const char* const credits[] = { #include "credits.raw" /* generated list of names from docs/CREDITS */ }; -static struct plugin_api* rb; - -enum plugin_status plugin_start(struct plugin_api* api, void* parameter) -{ - int j = 0; - int btn; - - (void)parameter; - rb = api; - - /* Turn off backlight timeout */ - backlight_force_on(rb); /* backlight control in lib/helper.c */ - - rb->show_logo(); -#ifdef HAVE_LCD_CHARCELLS - rb->lcd_double_height(false); -#endif - - /* Show the logo for about 3 secs allowing the user to stop */ - for (j = 0; j < 15; j++) { - rb->sleep((HZ*2)/10); - - btn = rb->button_get(false); - if (btn != BUTTON_NONE && (btn & QUIT)) - goto end_of_proc; - } - - roll_credits(); - -end_of_proc: - /* Turn on backlight timeout (revert to settings) */ - backlight_use_settings(rb); /* backlight control in lib/helper.c */ - - return PLUGIN_OK; -} +#define STOP_AUTOSCROLL(action) ((ACTION_KBD_ABORT == action) || \ + (ACTION_KBD_UP == action) || \ + (ACTION_KBD_DOWN == action)) #ifdef HAVE_LCD_CHARCELLS @@ -165,7 +56,8 @@ void roll_credits(void) int x2; if (x < 0) - rb->lcd_puts(0, line, credits[name] + rb->utf8seek(credits[name], -x)); + rb->lcd_puts(0, line, + credits[name] + rb->utf8seek(credits[name], -x)); else rb->lcd_puts(x, line, credits[name]); @@ -185,7 +77,7 @@ void roll_credits(void) rb->lcd_update(); /* abort on keypress */ - if (rb->button_get_w_tmo(HZ/8) & QUIT) + if(ACTION_KBD_ABORT == rb->get_action(CONTEXT_KEYBOARD,HZ/8)) return; if (++curr_index >= curr_len) @@ -202,8 +94,29 @@ void roll_credits(void) #else +int update_rowpos(int action, int cur_pos, int rows_per_screen, int tot_rows) +{ + switch(action) + { + case ACTION_KBD_UP: + cur_pos--; + break; + case ACTION_KBD_DOWN: + cur_pos++; + break; + } + + if(cur_pos > tot_rows - rows_per_screen) + cur_pos = 0; + if(cur_pos < 0) + cur_pos = tot_rows - rows_per_screen; + + return cur_pos; +} + void roll_credits(void) { + /* to do: use target defines iso keypads to set animation timings */ #if (CONFIG_KEYPAD == RECORDER_PAD) #define PAUSE_TIME 1.2 #define ANIM_SPEED 35 @@ -225,11 +138,15 @@ void roll_credits(void) #define NUM_VISIBLE_LINES (LCD_HEIGHT/font_h - 1) #define CREDITS_TARGETPOS ((LCD_WIDTH/2)-(credits_w/2)) - int i=0, j=0, k=0, namepos=0, offset_dummy, btn; + int i=0, j=0, namepos=0, offset_dummy; int name_w, name_h, name_targetpos=1, font_h; int credits_w, credits_pos; int numnames = (sizeof(credits)/sizeof(char*)); char name[40], elapsednames[20]; + int action = ACTION_NONE; + + /* control if scrolling is automatic (with animation) or manual */ + bool manual_scroll = false; rb->lcd_setfont(FONT_UI); rb->lcd_clear_display(); @@ -264,151 +181,164 @@ void roll_credits(void) i+1, numnames); rb->lcd_getstringsize(elapsednames, &credits_w, NULL); rb->lcd_putsxy(CREDITS_TARGETPOS, 0, elapsednames); + rb->lcd_update_rect(CREDITS_TARGETPOS, 0, credits_w, font_h); for(namepos = 0-name_w; namepos <= name_targetpos; namepos += (name_targetpos - namepos + 14) / 7) { rb->lcd_set_drawmode(DRMODE_SOLID|DRMODE_INVERSEVID); - rb->lcd_fillrect(0, font_h*(i+1), LCD_WIDTH, font_h); /* clear any trails left behind */ + /* clear any trails left behind */ + rb->lcd_fillrect(0, font_h*(i+1), LCD_WIDTH, font_h); rb->lcd_set_drawmode(DRMODE_SOLID); rb->lcd_putsxy(namepos, font_h*(i+1), name); rb->lcd_update_rect(0, font_h*(i+1), LCD_WIDTH, font_h); - rb->lcd_update_rect(CREDITS_TARGETPOS, 0, credits_w, font_h); - /* exit on power key */ - btn = rb->button_get_w_tmo(HZ/ANIM_SPEED); - if (btn != BUTTON_NONE && (btn & QUIT)) - return; + /* exit on abort, switch to manual on up/down */ + action = rb->get_action(CONTEXT_KEYBOARD, HZ/ANIM_SPEED); + if(STOP_AUTOSCROLL(action)) + break; } + if(STOP_AUTOSCROLL(action)) + break; } - j+=i; - - /* pause for a bit if needed */ - btn = rb->button_get_w_tmo(HZ*PAUSE_TIME); /* exit on keypress */ - if (btn != BUTTON_NONE && (btn & QUIT)) + + /* process user actions (if any) */ + if(ACTION_KBD_ABORT == action) return; + if(STOP_AUTOSCROLL(action)) + manual_scroll = true; /* up/down - abort was catched above */ + + if(!manual_scroll) + { + j+= i; + + /* pause for a bit if needed */ + action = rb->get_action(CONTEXT_KEYBOARD, HZ*PAUSE_TIME); + if(ACTION_KBD_ABORT == action) + return; + if(STOP_AUTOSCROLL(action)) + manual_scroll = true; + } - /* now begin looping the in-out animation */ - do { - for(; j < numnames; j+=i) + if(!manual_scroll) + { + while(j < numnames) { - /* just a screen's worth at a time */ - for(i=0; i<NUM_VISIBLE_LINES; i++) + /* just a screen's worth at a time */ + for(i=0; i<NUM_VISIBLE_LINES; i++) { - if(j+i >= numnames) - break; + if(j+i >= numnames) + break; + offset_dummy=1; - offset_dummy=1; - - rb->snprintf(name, sizeof(name), "%s", - credits[(j>=NUM_VISIBLE_LINES)? - j+i-NUM_VISIBLE_LINES:j+i]); - rb->lcd_getstringsize(name, &name_w, &name_h); - - /* fly out an existing line.. */ - while(namepos<LCD_WIDTH+offset_dummy) - { - rb->lcd_set_drawmode(DRMODE_SOLID|DRMODE_INVERSEVID); - rb->lcd_fillrect(0, font_h*(i+1), LCD_WIDTH, font_h); /* clear trails */ - rb->lcd_set_drawmode(DRMODE_SOLID); - rb->lcd_putsxy(namepos, font_h*(i+1), name); - rb->lcd_update_rect(0, font_h*(i+1), LCD_WIDTH, font_h); - - /* exit on keypress, react to scrolling */ - btn = rb->button_get_w_tmo(HZ/ANIM_SPEED); - if (btn != BUTTON_NONE) + rb->snprintf(name, sizeof(name), "%s", + credits[j+i-NUM_VISIBLE_LINES]); + rb->lcd_getstringsize(name, &name_w, &name_h); + + /* fly out an existing line.. */ + while(namepos<LCD_WIDTH+offset_dummy) { - if (btn & QUIT) - return; - else if ((btn & UP) ^ (btn & DOWN)) - { - /* compute the new position */ - j+=((btn & UP)?-1:1)*(NUM_VISIBLE_LINES/2); - if (j+i >= numnames) j=numnames-i-1; - if (j < 0) j = 0; - - /* and refresh the whole screen */ rb->lcd_set_drawmode(DRMODE_SOLID|DRMODE_INVERSEVID); - rb->lcd_fillrect(0, 0, LCD_WIDTH, - font_h * (NUM_VISIBLE_LINES+1)); + /* clear trails */ + rb->lcd_fillrect(0, font_h*(i+1), LCD_WIDTH, font_h); rb->lcd_set_drawmode(DRMODE_SOLID); - - rb->snprintf(elapsednames, sizeof(elapsednames), - "[Credits] %d/%d", j+i+1, numnames); - rb->lcd_getstringsize(elapsednames, &credits_w, NULL); - rb->lcd_putsxy(CREDITS_TARGETPOS, 0, elapsednames); - - for (k=0; k<NUM_VISIBLE_LINES; k++) - if (k!=i) - { - rb->snprintf(name, sizeof(name), "%s", - credits[(j>=NUM_VISIBLE_LINES)? - ((k<i)? - (j+k):(j+k-NUM_VISIBLE_LINES)): - j+k]); - rb->lcd_putsxy(0, font_h*(k+1), name); - } - rb->lcd_update_rect(0, font_h, LCD_WIDTH, - font_h * (NUM_VISIBLE_LINES+1)); + rb->lcd_putsxy(namepos, font_h*(i+1), name); + rb->lcd_update_rect(0, font_h*(i+1), LCD_WIDTH, font_h); + + /* exit on keypress, react to scrolling */ + action = rb->get_action(CONTEXT_KEYBOARD, HZ/ANIM_SPEED); + if(STOP_AUTOSCROLL(action)) + break; + + namepos += offset_dummy; + offset_dummy++; + } /* while(namepos<LCD_WIDTH+offset_dummy) */ + if(STOP_AUTOSCROLL(action)) break; - } + + rb->snprintf(name, sizeof(name), "%s", credits[j+i]); + rb->lcd_getstringsize(name, &name_w, &name_h); + + rb->snprintf(elapsednames, sizeof(elapsednames), + "[Credits] %d/%d", j+i+1, numnames); + rb->lcd_getstringsize(elapsednames, &credits_w, NULL); + rb->lcd_putsxy(CREDITS_TARGETPOS, 0, elapsednames); + if (j+i < NUM_VISIBLE_LINES) /* takes care of trail on loop */ + rb->lcd_update_rect(0, 0, LCD_WIDTH, font_h); + + for(namepos = 0-name_w; namepos <= name_targetpos; + namepos += (name_targetpos - namepos + 14) / 7) + { + rb->lcd_set_drawmode(DRMODE_SOLID|DRMODE_INVERSEVID); + rb->lcd_fillrect(0, font_h*(i+1), LCD_WIDTH, font_h); + rb->lcd_set_drawmode(DRMODE_SOLID); + rb->lcd_putsxy(namepos, font_h*(i+1), name); + rb->lcd_update_rect(0, font_h*(i+1), LCD_WIDTH, font_h); + rb->lcd_update_rect(CREDITS_TARGETPOS, 0, credits_w,font_h); + + /* stop on keypress */ + action = rb->get_action(CONTEXT_KEYBOARD, HZ/ANIM_SPEED); + if(STOP_AUTOSCROLL(action)) + break; } - namepos += offset_dummy; - offset_dummy++; - } - - rb->snprintf(name, sizeof(name), "%s", credits[j+i]); - rb->lcd_getstringsize(name, &name_w, &name_h); - - rb->snprintf(elapsednames, sizeof(elapsednames), "[Credits] %d/%d", - j+i+1, numnames); - rb->lcd_getstringsize(elapsednames, &credits_w, NULL); - rb->lcd_putsxy(CREDITS_TARGETPOS, 0, elapsednames); - if (j+i < NUM_VISIBLE_LINES) /* takes care of trail on loop */ - rb->lcd_update_rect(0, 0, LCD_WIDTH, font_h); - - for(namepos = 0-name_w; namepos <= name_targetpos; - namepos += (name_targetpos - namepos + 14) / 7) - { - rb->lcd_set_drawmode(DRMODE_SOLID|DRMODE_INVERSEVID); - rb->lcd_fillrect(0, font_h*(i+1), LCD_WIDTH, font_h); - rb->lcd_set_drawmode(DRMODE_SOLID); - rb->lcd_putsxy(namepos, font_h*(i+1), name); - rb->lcd_update_rect(0, font_h*(i+1), LCD_WIDTH, font_h); - rb->lcd_update_rect(CREDITS_TARGETPOS, 0, credits_w, font_h); - - /* exit on keypress */ - btn = rb->button_get_w_tmo(HZ/ANIM_SPEED); - if (btn != BUTTON_NONE && (btn & QUIT)) - return; - } - - namepos = name_targetpos; - - /* ..and repeat. */ - } + if(STOP_AUTOSCROLL(action)) + break; + namepos = name_targetpos; + } /* for(i=0; i<NUM_VISIBLE_LINES; i++) */ + if(STOP_AUTOSCROLL(action)) + break; + + action = rb->get_action(CONTEXT_KEYBOARD, HZ*PAUSE_TIME); + if(STOP_AUTOSCROLL(action)) + break; - btn = rb->button_get_w_tmo(HZ*PAUSE_TIME); /* exit on keypress */ - if (btn != BUTTON_NONE && (btn & QUIT)) + j+=i; /* no user intervention, draw the next screen-full */ + } /* while(j < numnames) */ + + /* handle the keypress that we intercepted during autoscroll */ + if(ACTION_KBD_ABORT == action) return; - } + if(STOP_AUTOSCROLL(action)) + manual_scroll = true; + } /* if(!manual_scroll) */ - j = 0; - if(k) { - /* on loop, the new credit line might shorten */ - rb->lcd_set_drawmode(DRMODE_SOLID|DRMODE_INVERSEVID); - rb->lcd_fillrect(0, 0, LCD_WIDTH, font_h); - } - } while(k); /* repeat in-out animation forever if scrolling occured */ - - btn = rb->button_get_w_tmo(HZ*2.5); /* exit on keypress */ - if (btn != BUTTON_NONE && (btn & QUIT)) + if(manual_scroll) + { + /* user went into manual scrolling, handle it here */ + rb->lcd_set_drawmode(DRMODE_SOLID); + while(ACTION_KBD_ABORT != action) + { + rb->lcd_clear_display(); + rb->snprintf(elapsednames, sizeof(elapsednames), + "[Credits] %d/%d", j+NUM_VISIBLE_LINES, numnames); + rb->lcd_getstringsize(elapsednames, &credits_w, NULL); + rb->lcd_putsxy(CREDITS_TARGETPOS, 0, elapsednames); + + for(i=0; i<NUM_VISIBLE_LINES; i++) + { + rb->snprintf(name, sizeof(name), "%s", credits[j+i]); + rb->lcd_putsxy(0, font_h*(i+1), name); + } + rb->lcd_update(); + + /* wait for user action */ + action = rb->get_action(CONTEXT_KEYBOARD, TIMEOUT_BLOCK); + if(ACTION_KBD_ABORT == action) + return; + j = update_rowpos(action, j, NUM_VISIBLE_LINES, numnames); + } + return; /* exit without animation */ + } + + action = rb->get_action(CONTEXT_KEYBOARD, HZ*3); + if(ACTION_KBD_ABORT == action) return; offset_dummy = 1; /* now make the text exit to the right */ - for(credits_pos = (LCD_WIDTH/2)-(credits_w/2); credits_pos <= LCD_WIDTH+offset_dummy; + for(credits_pos = (LCD_WIDTH/2)-(credits_w/2); + credits_pos <= LCD_WIDTH+offset_dummy; credits_pos += offset_dummy, offset_dummy++) { rb->lcd_set_drawmode(DRMODE_SOLID|DRMODE_INVERSEVID); @@ -420,3 +350,26 @@ void roll_credits(void) } #endif + +enum plugin_status plugin_start(struct plugin_api* api, void* parameter) +{ + (void)parameter; + rb = api; + + /* Turn off backlight timeout */ + backlight_force_on(rb); /* backlight control in lib/helper.c */ + + rb->show_logo(); +#ifdef HAVE_LCD_CHARCELLS + rb->lcd_double_height(false); +#endif + + /* Show the logo for about 3 secs allowing the user to stop */ + if(ACTION_KBD_ABORT != rb->get_action(CONTEXT_KEYBOARD,3*HZ)) + roll_credits(); + + /* Turn on backlight timeout (revert to settings) */ + backlight_use_settings(rb); /* backlight control in lib/helper.c */ + + return PLUGIN_OK; +} |