diff --git a/apps/gui/skin_engine/skin_display.c b/apps/gui/skin_engine/skin_display.c index 8e08343..3021715 100644 --- a/apps/gui/skin_engine/skin_display.c +++ b/apps/gui/skin_engine/skin_display.c @@ -80,7 +80,7 @@ void skin_update(struct gui_wps *gwps, unsigned int update_type) { /* This maybe shouldnt be here, * This is also safe for skined screen which dont use the id3 */ - struct mp3entry *id3 = gwps->state->id3; + struct mp3entry *id3 = skin_get_global_state()->id3; bool cuesheet_update = (id3 != NULL ? cuesheet_subtrack_changed(id3) : false); gwps->sync_data->do_full_update |= cuesheet_update; @@ -126,7 +126,7 @@ void draw_progressbar(struct gui_wps *gwps, int line, struct progressbar *pb) { struct screen *display = gwps->display; struct viewport *vp = pb->vp; - struct wps_state *state = gwps->state; + struct wps_state *state = skin_get_global_state(); struct mp3entry *id3 = state->id3; int y = pb->y, height = pb->height; unsigned long length, end; @@ -730,11 +730,10 @@ bool skin_has_sbs(enum screen_type screen, struct wps_data *data) /* do the button loop as often as required for the peak meters to update * with a good refresh rate. - * gwps is really gwps[NB_SCREENS]! don't wrap this if FOR_NB_SCREENS() */ -int skin_wait_for_action(struct gui_wps *gwps, int context, int timeout) +int skin_wait_for_action(enum skinnable_screens skin, int context, int timeout) { - (void)gwps; /* silence charcell warning */ + (void)skin; /* silence charcell warning */ int button = ACTION_NONE; #ifdef HAVE_LCD_BITMAP int i; @@ -745,7 +744,7 @@ int skin_wait_for_action(struct gui_wps *gwps, int context, int timeout) bool pm=false; FOR_NB_SCREENS(i) { - if(gwps[i].data->peak_meter_enabled) + if(skin_get_gwps(skin, i)->data->peak_meter_enabled) pm = true; } @@ -764,8 +763,8 @@ int skin_wait_for_action(struct gui_wps *gwps, int context, int timeout) if (TIME_AFTER(current_tick, next_refresh)) { FOR_NB_SCREENS(i) { - if(gwps[i].data->peak_meter_enabled) - skin_update(&gwps[i], SKIN_REFRESH_PEAK_METER); + if(skin_get_gwps(skin, i)->data->peak_meter_enabled) + skin_update(skin_get_gwps(skin, i), SKIN_REFRESH_PEAK_METER); next_refresh += HZ / PEAK_METER_FPS; } } @@ -782,3 +781,109 @@ int skin_wait_for_action(struct gui_wps *gwps, int context, int timeout) } return button; } + +char* wps_default_skin(enum screen_type screen); +char* default_radio_skin(enum screen_type screen); +int sb_preproccess(enum screen_type screen, struct wps_data *data); +int sb_postproccess(enum screen_type screen, struct wps_data *data); +struct wps_state wps_state = { .id3 = NULL }; +static struct gui_skin_helper { + int (*preproccess)(enum screen_type screen, struct wps_data *data); + int (*postproccess)(enum screen_type screen, struct wps_data *data); + char* (*default_skin)(enum screen_type screen); +} skin_helpers[SKINNABLE_SCREENS_COUNT] = { + [CUSTOM_STATUSBAR] = { sb_preproccess, sb_postproccess, sb_create_from_settings }, + [WPS] = { NULL, NULL, wps_default_skin }, +#if CONFIG_TUNER + [FM_SCREEN] = { NULL, NULL, default_radio_skin } +#endif +}; + +struct gui_skin { + struct gui_wps gui_wps; + struct wps_data data; + char *buffer_start; + size_t buffer_usage; +} skins[SKINNABLE_SCREENS_COUNT][NB_SCREENS]; +static struct wps_sync_data wps_sync_data[SKINNABLE_SCREENS_COUNT]; + + +void gui_sync_skin_init(void) +{ + int i, j; + for(j=0; jstate->id3 ? gwps->state->id3->cuesheet:NULL; + struct cuesheet *cue = skin_get_global_state()->id3 ? + skin_get_global_state()->id3->cuesheet : NULL; cur_pos = playlist_get_display_index(); max = playlist_amount()+1; if (cue) diff --git a/apps/gui/skin_engine/skin_tokens.c b/apps/gui/skin_engine/skin_tokens.c index b555885..82abe62 100644 --- a/apps/gui/skin_engine/skin_tokens.c +++ b/apps/gui/skin_engine/skin_tokens.c @@ -517,14 +517,15 @@ static struct mp3entry* get_mp3entry_from_offset(struct gui_wps *gwps, int offset, char **filename) { struct mp3entry* pid3 = NULL; - struct cuesheet *cue = gwps->state->id3 ? gwps->state->id3->cuesheet:NULL; + struct wps_state *state = skin_get_global_state(); + struct cuesheet *cue = state->id3 ? state->id3->cuesheet : NULL; const char *fname = NULL; if (cue && cue->curr_track_idx + offset < cue->track_count) - pid3 = gwps->state->id3; + pid3 = state->id3; else if (offset == 0) - pid3 = gwps->state->id3; + pid3 = state->id3; else if (offset == 1) - pid3 = gwps->state->nid3; + pid3 = state->nid3; else { static char filename_buf[MAX_PATH + 1]; @@ -566,7 +567,7 @@ const char *get_token_value(struct gui_wps *gwps, return NULL; struct wps_data *data = gwps->data; - struct wps_state *state = gwps->state; + struct wps_state *state = skin_get_global_state(); struct mp3entry *id3; /* Think very carefully about using this. maybe get_id3_token() is the better place? */ const char *out_text = NULL; diff --git a/apps/gui/skin_engine/wps_internals.h b/apps/gui/skin_engine/wps_internals.h index c886a75..62fc62b 100644 --- a/apps/gui/skin_engine/wps_internals.h +++ b/apps/gui/skin_engine/wps_internals.h @@ -320,7 +320,6 @@ struct gui_wps { struct screen *display; struct wps_data *data; - struct wps_state *state; /* must point to the same struct for all screens */ struct wps_sync_data *sync_data; }; diff --git a/apps/gui/statusbar-skinned.c b/apps/gui/statusbar-skinned.c index 8928378..48e32b4 100644 --- a/apps/gui/statusbar-skinned.c +++ b/apps/gui/statusbar-skinned.c @@ -39,13 +39,6 @@ #include "font.h" #include "icon.h" - -/* currently only one wps_state is needed */ -extern struct wps_state wps_state; /* from wps.c */ -static struct gui_wps sb_skin[NB_SCREENS] = {{ .data = NULL }}; -static struct wps_data sb_skin_data[NB_SCREENS] = {{ .wps_loaded = 0 }}; -static struct wps_sync_data sb_skin_sync_data = { .do_full_update = false }; - /* initial setup of wps_data */ static int update_delay = DEFAULT_UPDATE_DELAY; static int set_title_worker(char* title, enum themable_icons icon, @@ -101,26 +94,25 @@ static int set_title_worker(char* title, enum themable_icons icon, bool sb_set_title_text(char* title, enum themable_icons icon, enum screen_type screen) { - bool retval = set_title_worker(title, icon, &sb_skin_data[screen], - sb_skin_data[screen].tree) > 0; + struct wps_data *data = skin_get_gwps(CUSTOM_STATUSBAR, screen)->data; + bool retval = set_title_worker(title, icon, data, data->tree) > 0; return retval; } - -void sb_skin_data_load(enum screen_type screen, const char *buf, bool isfile) +int sb_preproccess(enum screen_type screen, struct wps_data *data) { - struct wps_data *data = sb_skin[screen].data; - - int success; + (void)data; /* We need to disable the theme here or else viewport_set_defaults() * (which is called in the viewport tag parser) will crash because * the theme is enabled but sb_set_info_vp() isnt set untill after the sbs * is parsed. This only affects the default viewport which is ignored * int he sbs anyway */ viewportmanager_theme_enable(screen, false, NULL); - success = buf && skin_data_load(screen, data, buf, isfile); - - if (success) + return 1; +} +int sb_postproccess(enum screen_type screen, struct wps_data *data) +{ + if (data->wps_loaded) { /* hide the sb's default viewport because it has nasty effect with stuff * not part of the statusbar, @@ -132,17 +124,20 @@ void sb_skin_data_load(enum screen_type screen, const char *buf, bool isfile) { if (!next_vp) { /* no second viewport, let parsing fail */ - success = false; + return 0; } /* hide this viewport, forever */ vp->hidden_flags = VP_NEVER_VISIBLE; } sb_set_info_vp(screen, VP_DEFAULT_LABEL); } - - if (!success && isfile) - sb_create_from_settings(screen); viewportmanager_theme_undo(screen, false); + return 1; +} + +void sb_skin_data_load(enum screen_type screen, const char *buf, bool isfile) +{ + skin_load(CUSTOM_STATUSBAR, screen, buf, isfile); } static char *infovp_label[NB_SCREENS]; static char *oldinfovp_label[NB_SCREENS]; @@ -153,6 +148,7 @@ void sb_set_info_vp(enum screen_type screen, char *label) struct viewport *sb_skin_get_info_vp(enum screen_type screen) { + struct wps_data *data = skin_get_gwps(CUSTOM_STATUSBAR, screen)->data; if (oldinfovp_label[screen] && strcmp(oldinfovp_label[screen], infovp_label[screen])) { @@ -161,23 +157,24 @@ struct viewport *sb_skin_get_info_vp(enum screen_type screen) viewportmanager_theme_enable(screen, false, NULL); viewportmanager_theme_undo(screen, true); } - return &find_viewport(infovp_label[screen], true, sb_skin[screen].data)->vp; + return &find_viewport(infovp_label[screen], true, data)->vp; } #if (LCD_DEPTH > 1) || (defined(HAVE_REMOTE_LCD) && LCD_REMOTE_DEPTH > 1) char* sb_get_backdrop(enum screen_type screen) { - return sb_skin[screen].data->backdrop; + return skin_get_gwps(CUSTOM_STATUSBAR, screen)->data->backdrop; } bool sb_set_backdrop(enum screen_type screen, char* filename) { + struct wps_data *data = skin_get_gwps(CUSTOM_STATUSBAR, screen)->data; if (!filename) { - sb_skin[screen].data->backdrop = NULL; + data->backdrop = NULL; return true; } - else if (!sb_skin[screen].data->backdrop) + else if (!data->backdrop) { /* need to make room on the buffer */ size_t buf_size; @@ -187,22 +184,23 @@ bool sb_set_backdrop(enum screen_type screen, char* filename) else #endif buf_size = LCD_BACKDROP_BYTES; - sb_skin[screen].data->backdrop = (char*)skin_buffer_alloc(buf_size); - if (!sb_skin[screen].data->backdrop) + data->backdrop = (char*)skin_buffer_alloc(buf_size); + if (!data->backdrop) return false; } - if (!screens[screen].backdrop_load(filename, sb_skin[screen].data->backdrop)) - sb_skin[screen].data->backdrop = NULL; - return sb_skin[screen].data->backdrop != NULL; + if (!screens[screen].backdrop_load(filename, data->backdrop)) + data->backdrop = NULL; + return data->backdrop != NULL; } #endif void sb_skin_update(enum screen_type screen, bool force) { + struct wps_data *data = skin_get_gwps(CUSTOM_STATUSBAR, screen)->data; static long next_update[NB_SCREENS] = {0}; int i = screen; - if (!sb_skin_data[screen].wps_loaded) + if (!data->wps_loaded) return; if (TIME_AFTER(current_tick, next_update[i]) || force) { @@ -212,11 +210,11 @@ void sb_skin_update(enum screen_type screen, bool force) if (lcd_active() || (i != SCREEN_MAIN)) #endif { - bool full_update = sb_skin[i].sync_data->do_full_update; + bool full_update = skin_get_gwps(CUSTOM_STATUSBAR, screen)->sync_data->do_full_update; #if NB_SCREENS > 1 - if (i==SCREEN_MAIN && sb_skin[i].sync_data->do_full_update) + if (i==SCREEN_MAIN && skin_get_gwps(CUSTOM_STATUSBAR, screen)->sync_data->do_full_update) { - sb_skin[i].sync_data->do_full_update = false; + skin_get_gwps(CUSTOM_STATUSBAR, screen)->sync_data->do_full_update = false; /* we need to make sure the remote gets a full update * next time it is drawn also. so quick n dirty hack */ next_update[SCREEN_REMOTE] = 0; @@ -226,9 +224,9 @@ void sb_skin_update(enum screen_type screen, bool force) full_update = true; } #else - sb_skin[i].sync_data->do_full_update = false; + skin_get_gwps(CUSTOM_STATUSBAR, screen)->sync_data->do_full_update = false; #endif - skin_update(&sb_skin[i], force || full_update? + skin_update(skin_get_gwps(CUSTOM_STATUSBAR, screen), force || full_update? SKIN_REFRESH_ALL : SKIN_REFRESH_NON_STATIC); } next_update[i] = current_tick + update_delay; /* don't update too often */ @@ -240,7 +238,7 @@ void do_sbs_update_callback(void *param) (void)param; /* the WPS handles changing the actual id3 data in the id3 pointers * we imported, we just want a full update */ - sb_skin_sync_data.do_full_update = true; + skin_get_gwps(CUSTOM_STATUSBAR, 0)->sync_data->do_full_update = true; /* force timeout in wps main loop, so that the update is instantly */ queue_post(&button_queue, BUTTON_NONE, 0); } @@ -256,9 +254,10 @@ void sb_skin_set_update_delay(int delay) * - ui viewport * - backdrop */ -void sb_create_from_settings(enum screen_type screen) +char* sb_create_from_settings(enum screen_type screen) { - char buf[128], *ptr, *ptr2; + static char buf[128]; + char *ptr, *ptr2; int len, remaining = sizeof(buf); int bar_position = statusbar_position(screen); ptr = buf; @@ -328,7 +327,7 @@ void sb_create_from_settings(enum screen_type screen) len = snprintf(ptr, remaining, "%%ax%%Vi(-,0,%d,-,%d,1)\n", y, height); } - sb_skin_data_load(screen, buf, false); + return buf; } void sb_skin_init(void) @@ -337,16 +336,6 @@ void sb_skin_init(void) FOR_NB_SCREENS(i) { oldinfovp_label[i] = NULL; -#ifdef HAVE_ALBUMART - sb_skin_data[i].albumart = NULL; - sb_skin_data[i].playback_aa_slot = -1; -#endif - sb_skin[i].data = &sb_skin_data[i]; - sb_skin[i].display = &screens[i]; - /* Currently no seperate wps_state needed/possible - so use the only available ( "global" ) one */ - sb_skin[i].state = &wps_state; - sb_skin[i].sync_data = &sb_skin_sync_data; } } @@ -365,9 +354,9 @@ int sb_touch_to_button(int context) return ACTION_TOUCHSCREEN; if (last_context != context) - skin_disarm_touchregions(&sb_skin_data[SCREEN_MAIN]); + skin_disarm_touchregions(skin_get_gwps(CUSTOM_STATUSBAR, SCREEN_MAIN)->data); last_context = context; - button = skin_get_touchaction(&sb_skin_data[SCREEN_MAIN], &offset); + button = skin_get_touchaction(skin_get_gwps(CUSTOM_STATUSBAR, SCREEN_MAIN)->data, &offset); switch (button) { diff --git a/apps/gui/statusbar-skinned.h b/apps/gui/statusbar-skinned.h index 893d489..983b371 100644 --- a/apps/gui/statusbar-skinned.h +++ b/apps/gui/statusbar-skinned.h @@ -34,7 +34,7 @@ void sb_skin_data_load(enum screen_type screen, const char *buf, bool isfile); -void sb_create_from_settings(enum screen_type screen); +char* sb_create_from_settings(enum screen_type screen); void sb_skin_init(void) INIT_ATTR; void sb_set_info_vp(enum screen_type screen, char *label); struct viewport *sb_skin_get_info_vp(enum screen_type screen); diff --git a/apps/gui/theme_settings.c b/apps/gui/theme_settings.c index a975c21..b340a71 100644 --- a/apps/gui/theme_settings.c +++ b/apps/gui/theme_settings.c @@ -61,6 +61,7 @@ static const struct skin_load_setting skins[] = { #ifdef HAVE_LCD_BITMAP { global_settings.sbs_file, "sbs", sb_skin_data_load}, #endif +#if 0 { global_settings.wps_file, "wps", wps_data_load}, #if CONFIG_TUNER { global_settings.fms_file, "fms", fms_data_load}, @@ -72,6 +73,7 @@ static const struct skin_load_setting skins[] = { { global_settings.rfms_file, "rfms", fms_data_load}, #endif #endif +#endif }; void settings_apply_skins(void) @@ -86,9 +88,6 @@ void settings_apply_skins(void) skin_backdrop_init(); skin_font_init(); #endif -#if CONFIG_TUNER - fms_skin_init(); -#endif for (i=0; i 1 + "%X(d)\n" +#endif + "%s%?it<%?in<%in. |>%it|%fn>\n" + "%s%?ia<%ia|%?d(2)<%d(2)|%(root%)>>\n" + "%s%?id<%id|%?d(1)<%d(1)|%(root%)>> %?iy<%(%iy%)|>\n\n" + "%al%pc/%pt%ar[%pp:%pe]\n" + "%fbkBit %?fv %?iv<%(id3v%iv%)|%(no id3%)>\n" + "%pb\n%pm\n", +#else + "%s%pp/%pe: %?it<%it|%fn> - %?ia<%ia|%d(2)> - %?id<%id|%d(1)>\n" + "%pc%?ps<*|/>%pt\n", +#endif +#ifdef HAVE_REMOTE_LCD +#if LCD_REMOTE_DEPTH > 1 + "%X(d)\n" +#endif + "%s%?ia<%ia|%?d(2)<%d(2)|%(root%)>>\n" + "%s%?it<%?in<%in. |>%it|%fn>\n" + "%al%pc/%pt%ar[%pp:%pe]\n" + "%fbkBit %?fv %?iv<%(id3v%iv%)|%(no id3%)>\n" + "%pb\n", +#endif + }; + return skin_buf[screen]; +} + void wps_data_load(enum screen_type screen, const char *buf, bool isfile) { +#if 0 bool loaded_ok; #ifndef __PCTOOL__ @@ -122,34 +148,11 @@ void wps_data_load(enum screen_type screen, const char *buf, bool isfile) if (!loaded_ok) /* load the hardcoded default */ { - char *skin_buf[NB_SCREENS] = { -#ifdef HAVE_LCD_BITMAP -#if LCD_DEPTH > 1 - "%X(d)\n" -#endif - "%s%?it<%?in<%in. |>%it|%fn>\n" - "%s%?ia<%ia|%?d(2)<%d(2)|%(root%)>>\n" - "%s%?id<%id|%?d(1)<%d(1)|%(root%)>> %?iy<%(%iy%)|>\n\n" - "%al%pc/%pt%ar[%pp:%pe]\n" - "%fbkBit %?fv %?iv<%(id3v%iv%)|%(no id3%)>\n" - "%pb\n%pm\n", -#else - "%s%pp/%pe: %?it<%it|%fn> - %?ia<%ia|%d(2)> - %?id<%id|%d(1)>\n" - "%pc%?ps<*|/>%pt\n", -#endif -#ifdef HAVE_REMOTE_LCD -#if LCD_REMOTE_DEPTH > 1 - "%X(d)\n" -#endif - "%s%?ia<%ia|%?d(2)<%d(2)|%(root%)>>\n" - "%s%?it<%?in<%in. |>%it|%fn>\n" - "%al%pc/%pt%ar[%pp:%pe]\n" - "%fbkBit %?fv %?iv<%(id3v%iv%)|%(no id3%)>\n" - "%pb\n", -#endif - }; + skin_data_load(screen, gui_wps[screen].data, skin_buf[screen], false); } +#endif + skin_load(WPS, screen, buf, isfile); } void fade(bool fade_in, bool updatewps) @@ -158,7 +161,7 @@ void fade(bool fade_in, bool updatewps) int fp_min_vol = sound_min(SOUND_VOLUME) << 8; int fp_step = (fp_global_vol - fp_min_vol) / 30; int i; - wps_state.is_fading = !fade_in; + skin_get_global_state()->is_fading = !fade_in; if (fade_in) { /* fade in */ int fp_volume = fp_min_vol; @@ -175,7 +178,7 @@ void fade(bool fade_in, bool updatewps) if (updatewps) { FOR_NB_SCREENS(i) - skin_update(&gui_wps[i], SKIN_REFRESH_NON_STATIC); + skin_update(skin_get_gwps(WPS, i), SKIN_REFRESH_NON_STATIC); } sleep(1); } @@ -191,12 +194,12 @@ void fade(bool fade_in, bool updatewps) if (updatewps) { FOR_NB_SCREENS(i) - skin_update(&gui_wps[i], SKIN_REFRESH_NON_STATIC); + skin_update(skin_get_gwps(WPS, i), SKIN_REFRESH_NON_STATIC); } sleep(1); } audio_pause(); - wps_state.is_fading = false; + skin_get_global_state()->is_fading = false; #if CONFIG_CODEC != SWCODEC #ifndef SIMULATOR /* let audio thread run and wait for the mas to run out of data */ @@ -249,16 +252,16 @@ static int skintouch_to_wps(struct wps_data *data) return ACTION_WPS_HOTKEY; #endif case WPS_TOUCHREGION_SCROLLBAR: - wps_state.id3->elapsed = wps_state.id3->length*offset/100; - if (!wps_state.paused) + skin_get_global_state()->id3->elapsed = skin_get_global_state()->id3->length*offset/100; + if (!skin_get_global_state()->paused) #if (CONFIG_CODEC == SWCODEC) audio_pre_ff_rewind(); #else audio_pause(); #endif - audio_ff_rewind(wps_state.id3->elapsed); + audio_ff_rewind(skin_get_global_state()->id3->elapsed); #if (CONFIG_CODEC != SWCODEC) - if (!wps_state.paused) + if (!skin_get_global_state()->paused) audio_resume(); #endif return ACTION_TOUCHSCREEN; @@ -299,20 +302,20 @@ bool ffwd_rew(int button) case ACTION_WPS_SEEKFWD: direction = 1; case ACTION_WPS_SEEKBACK: - if (wps_state.ff_rewind) + if (skin_get_global_state()->ff_rewind) { if (direction == 1) { /* fast forwarding, calc max step relative to end */ - max_step = (wps_state.id3->length - - (wps_state.id3->elapsed + + max_step = (skin_get_global_state()->id3->length - + (skin_get_global_state()->id3->elapsed + ff_rewind_count)) * FF_REWIND_MAX_PERCENT / 100; } else { /* rewinding, calc max step relative to start */ - max_step = (wps_state.id3->elapsed + ff_rewind_count) * + max_step = (skin_get_global_state()->id3->elapsed + ff_rewind_count) * FF_REWIND_MAX_PERCENT / 100; } @@ -329,9 +332,9 @@ bool ffwd_rew(int button) else { if ( (audio_status() & AUDIO_STATUS_PLAY) && - wps_state.id3 && wps_state.id3->length ) + skin_get_global_state()->id3 && skin_get_global_state()->id3->length ) { - if (!wps_state.paused) + if (!skin_get_global_state()->paused) #if (CONFIG_CODEC == SWCODEC) audio_pre_ff_rewind(); #else @@ -339,14 +342,14 @@ bool ffwd_rew(int button) #endif #if CONFIG_KEYPAD == PLAYER_PAD FOR_NB_SCREENS(i) - gui_wps[i].display->stop_scroll(); + skin_get_gwps(WPS, i)->display->stop_scroll(); #endif if (direction > 0) status_set_ffmode(STATUS_FASTFORWARD); else status_set_ffmode(STATUS_FASTBACKWARD); - wps_state.ff_rewind = true; + skin_get_global_state()->ff_rewind = true; step = 1000 * global_settings.ff_rewind_min_step; } @@ -355,23 +358,23 @@ bool ffwd_rew(int button) } if (direction > 0) { - if ((wps_state.id3->elapsed + ff_rewind_count) > - wps_state.id3->length) - ff_rewind_count = wps_state.id3->length - - wps_state.id3->elapsed; + if ((skin_get_global_state()->id3->elapsed + ff_rewind_count) > + skin_get_global_state()->id3->length) + ff_rewind_count = skin_get_global_state()->id3->length - + skin_get_global_state()->id3->elapsed; } else { - if ((int)(wps_state.id3->elapsed + ff_rewind_count) < 0) - ff_rewind_count = -wps_state.id3->elapsed; + if ((int)(skin_get_global_state()->id3->elapsed + ff_rewind_count) < 0) + ff_rewind_count = -skin_get_global_state()->id3->elapsed; } /* set the wps state ff_rewind_count so the progess info displays corectly */ - wps_state.ff_rewind_count = (wps_state.wps_time_countup == false)? + skin_get_global_state()->ff_rewind_count = (skin_get_global_state()->wps_time_countup == false)? ff_rewind_count:-ff_rewind_count; FOR_NB_SCREENS(i) { - skin_update(&gui_wps[i], + skin_update(skin_get_gwps(WPS, i), SKIN_REFRESH_PLAYER_PROGRESS | SKIN_REFRESH_DYNAMIC); } @@ -379,18 +382,18 @@ bool ffwd_rew(int button) break; case ACTION_WPS_STOPSEEK: - wps_state.id3->elapsed = wps_state.id3->elapsed+ff_rewind_count; - audio_ff_rewind(wps_state.id3->elapsed); - wps_state.ff_rewind_count = 0; - wps_state.ff_rewind = false; + skin_get_global_state()->id3->elapsed = skin_get_global_state()->id3->elapsed+ff_rewind_count; + audio_ff_rewind(skin_get_global_state()->id3->elapsed); + skin_get_global_state()->ff_rewind_count = 0; + skin_get_global_state()->ff_rewind = false; status_set_ffmode(0); #if (CONFIG_CODEC != SWCODEC) - if (!wps_state.paused) + if (!skin_get_global_state()->paused) audio_resume(); #endif #ifdef HAVE_LCD_CHARCELLS FOR_NB_SCREENS(i) - skin_update(&gui_wps[i], SKIN_REFRESH_ALL); + skin_update(skin_get_gwps(WPS, i), SKIN_REFRESH_ALL); #endif exit = true; break; @@ -408,7 +411,7 @@ bool ffwd_rew(int button) button = get_action(CONTEXT_WPS|ALLOW_SOFTLOCK,TIMEOUT_BLOCK); #ifdef HAVE_TOUCHSCREEN if (button == ACTION_TOUCHSCREEN) - button = skintouch_to_wps(gui_wps[SCREEN_MAIN].data); + button = skintouch_to_wps(skin_get_gwps(WPS, SCREEN_MAIN)->data); if (button != ACTION_WPS_SEEKFWD && button != ACTION_WPS_SEEKBACK) button = ACTION_WPS_STOPSEEK; @@ -423,7 +426,7 @@ void display_keylock_text(bool locked) { int i; FOR_NB_SCREENS(i) - gui_wps[i].display->stop_scroll(); + skin_get_gwps(WPS, i)->display->stop_scroll(); splash(HZ, locked ? ID2P(LANG_KEYLOCK_ON) : ID2P(LANG_KEYLOCK_OFF)); } @@ -489,20 +492,21 @@ static void change_dir(int direction) static void prev_track(unsigned long skip_thresh) { - if (wps_state.id3->elapsed < skip_thresh) + struct wps_state *state = skin_get_global_state(); + if (state->id3->elapsed < skip_thresh) { audio_prev(); return; } else { - if (wps_state.id3->cuesheet) + if (state->id3->cuesheet) { - curr_cuesheet_skip(wps_state.id3->cuesheet, -1, wps_state.id3->elapsed); + curr_cuesheet_skip(state->id3->cuesheet, -1, state->id3->elapsed); return; } - if (!wps_state.paused) + if (!state->paused) #if (CONFIG_CODEC == SWCODEC) audio_pre_ff_rewind(); #else @@ -512,7 +516,7 @@ static void prev_track(unsigned long skip_thresh) audio_ff_rewind(0); #if (CONFIG_CODEC != SWCODEC) - if (!wps_state.paused) + if (!state->paused) audio_resume(); #endif } @@ -520,10 +524,11 @@ static void prev_track(unsigned long skip_thresh) static void next_track(void) { + struct wps_state *state = skin_get_global_state(); /* take care of if we're playing a cuesheet */ - if (wps_state.id3->cuesheet) + if (state->id3->cuesheet) { - if (curr_cuesheet_skip(wps_state.id3->cuesheet, 1, wps_state.id3->elapsed)) + if (curr_cuesheet_skip(state->id3->cuesheet, 1, state->id3->elapsed)) { /* if the result was false, then we really want to skip to the next track */ @@ -536,9 +541,10 @@ static void next_track(void) static void play_hop(int direction) { + struct wps_state *state = skin_get_global_state(); long step = global_settings.skip_length*1000; - long elapsed = wps_state.id3->elapsed; - long remaining = wps_state.id3->length - elapsed; + long elapsed = state->id3->elapsed; + long remaining = state->id3->length - elapsed; if (step < 0) { @@ -582,7 +588,7 @@ static void play_hop(int direction) { elapsed += step * direction; } - if((audio_status() & AUDIO_STATUS_PLAY) && !wps_state.paused) + if((audio_status() & AUDIO_STATUS_PLAY) && !state->paused) { #if (CONFIG_CODEC == SWCODEC) audio_pre_ff_rewind(); @@ -590,9 +596,9 @@ static void play_hop(int direction) audio_pause(); #endif } - audio_ff_rewind(wps_state.id3->elapsed = elapsed); + audio_ff_rewind(state->id3->elapsed = elapsed); #if (CONFIG_CODEC != SWCODEC) - if (!wps_state.paused) + if (!state->paused) audio_resume(); #endif } @@ -607,7 +613,7 @@ static void play_hop(int direction) static void wps_lcd_activation_hook(void *param) { (void)param; - wps_sync_data.do_full_update = true; + skin_get_gwps(WPS, 0)->sync_data->do_full_update = true; /* force timeout in wps main loop, so that the update is instantly */ queue_post(&button_queue, BUTTON_NONE, 0); } @@ -619,11 +625,11 @@ static void gwps_leave_wps(void) FOR_NB_SCREENS(i) { - gui_wps[i].display->stop_scroll(); + skin_get_gwps(WPS, i)->display->stop_scroll(); #if LCD_DEPTH > 1 || defined(HAVE_REMOTE_LCD) && LCD_REMOTE_DEPTH > 1 - gui_wps[i].display->backdrop_show(sb_get_backdrop(i)); + skin_get_gwps(WPS, i)->display->backdrop_show(sb_get_backdrop(i)); #endif - viewportmanager_theme_undo(i, skin_has_sbs(i, gui_wps[i].data)); + viewportmanager_theme_undo(i, skin_has_sbs(i, skin_get_gwps(WPS, i)->data)); } @@ -645,10 +651,10 @@ static void gwps_enter_wps(void) int i; FOR_NB_SCREENS(i) { - struct gui_wps *gwps = &gui_wps[i]; + struct gui_wps *gwps = skin_get_gwps(WPS, i); struct screen *display = gwps->display; display->stop_scroll(); - viewportmanager_theme_enable(i, skin_has_sbs(i, gui_wps[i].data), NULL); + viewportmanager_theme_enable(i, skin_has_sbs(i, skin_get_gwps(WPS, i)->data), NULL); /* Update the values in the first (default) viewport - in case the user has modified the statusbar or colour settings */ @@ -702,6 +708,7 @@ long gui_wps_show(void) bool vol_changed = false; int i; long last_left = 0, last_right = 0; + struct wps_state *state = skin_get_global_state(); #ifdef HAVE_LCD_CHARCELLS status_set_audio(true); @@ -719,19 +726,19 @@ long gui_wps_show(void) bool audio_paused = (audio_status() & AUDIO_STATUS_PAUSE)?true:false; /* did someone else (i.e power thread) change audio pause mode? */ - if (wps_state.paused != audio_paused) { - wps_state.paused = audio_paused; + if (state->paused != audio_paused) { + state->paused = audio_paused; /* if another thread paused audio, we are probably in car mode, about to shut down. lets save the settings. */ - if (wps_state.paused) { + if (state->paused) { settings_save(); #if !defined(HAVE_RTC_RAM) && !defined(HAVE_SW_POWEROFF) call_storage_idle_notifys(true); #endif } } - button = skin_wait_for_action(gui_wps, CONTEXT_WPS|ALLOW_SOFTLOCK, + button = skin_wait_for_action(WPS, CONTEXT_WPS|ALLOW_SOFTLOCK, restore ? 1 : HZ/5); /* Exit if audio has stopped playing. This happens e.g. at end of @@ -778,7 +785,7 @@ long gui_wps_show(void) { bool hotkey = button == ACTION_WPS_HOTKEY; gwps_leave_wps(); - int retval = onplay(wps_state.id3->path, + int retval = onplay(state->id3->path, FILE_ATTR_AUDIO, CONTEXT_WPS, hotkey); /* if music is stopped in the context menu we want to exit the wps */ if (retval == ONPLAY_MAINMENU @@ -807,9 +814,9 @@ long gui_wps_show(void) case ACTION_WPS_PLAY: if (global_settings.party_mode) break; - if ( wps_state.paused ) + if ( state->paused ) { - wps_state.paused = false; + state->paused = false; if ( global_settings.fade_on_stop ) fade(true, true); else @@ -817,7 +824,7 @@ long gui_wps_show(void) } else { - wps_state.paused = true; + state->paused = true; if ( global_settings.fade_on_stop ) fade(false, true); else @@ -844,7 +851,7 @@ long gui_wps_show(void) break; if (current_tick -last_right < HZ) { - if (wps_state.id3->cuesheet) + if (state->id3->cuesheet) { audio_next(); } @@ -864,9 +871,9 @@ long gui_wps_show(void) break; if (current_tick -last_left < HZ) { - if (wps_state.id3->cuesheet) + if (state->id3->cuesheet) { - if (!wps_state.paused) + if (!state->paused) #if (CONFIG_CODEC == SWCODEC) audio_pre_ff_rewind(); #else @@ -894,7 +901,7 @@ long gui_wps_show(void) is past the A marker, jump back to the A marker... */ if ( ab_repeat_mode_enabled() ) { - if ( ab_after_A_marker(wps_state.id3->elapsed) ) + if ( ab_after_A_marker(state->id3->elapsed) ) { ab_jump_to_A_marker(); break; @@ -917,7 +924,7 @@ long gui_wps_show(void) before the A marker, jump to the A marker... */ if ( ab_repeat_mode_enabled() ) { - if ( ab_before_A_marker(wps_state.id3->elapsed) ) + if ( ab_before_A_marker(state->id3->elapsed) ) { ab_jump_to_A_marker(); break; @@ -936,7 +943,7 @@ long gui_wps_show(void) #if defined(AB_REPEAT_ENABLE) if (ab_repeat_mode_enabled()) { - ab_set_B_marker(wps_state.id3->elapsed); + ab_set_B_marker(state->id3->elapsed); ab_jump_to_A_marker(); } else @@ -950,7 +957,7 @@ long gui_wps_show(void) break; #if defined(AB_REPEAT_ENABLE) if (ab_repeat_mode_enabled()) - ab_set_A_marker(wps_state.id3->elapsed); + ab_set_A_marker(state->id3->elapsed); else #endif { @@ -1052,7 +1059,7 @@ long gui_wps_show(void) /* this case is used by the softlock feature * it requests a full update here */ case ACTION_REDRAW: - wps_sync_data.do_full_update = true; + skin_get_gwps(WPS, 0)->sync_data->do_full_update = true; break; case ACTION_NONE: /* Timeout, do a partial update */ update = true; @@ -1087,7 +1094,7 @@ long gui_wps_show(void) setvol(); FOR_NB_SCREENS(i) { - if(update_onvol_change(&gui_wps[i])) + if(update_onvol_change(skin_get_gwps(WPS, i))) res = true; } if (res) { @@ -1109,15 +1116,15 @@ long gui_wps_show(void) /* we remove the update delay since it's not very usable in the wps, * e.g. during volume changing or ffwd/rewind */ sb_skin_set_update_delay(0); - wps_sync_data.do_full_update = update = false; + skin_get_gwps(WPS, 0)->sync_data->do_full_update = update = false; gwps_enter_wps(); } - else if (wps_sync_data.do_full_update || update) + else if (skin_get_gwps(WPS, 0)->sync_data->do_full_update || update) { #if defined(HAVE_BACKLIGHT) || defined(HAVE_REMOTE_LCD) - gwps_caption_backlight(&wps_state); + gwps_caption_backlight(state); #endif - bool full_update = wps_sync_data.do_full_update; + bool full_update = skin_get_gwps(WPS, 0)->sync_data->do_full_update; FOR_NB_SCREENS(i) { #if defined(HAVE_LCD_ENABLE) || defined(HAVE_LCD_SLEEP) @@ -1127,15 +1134,15 @@ long gui_wps_show(void) #endif { #if NB_SCREENS > 1 - if (i==SCREEN_MAIN && wps_sync_data.do_full_update) + if (i==SCREEN_MAIN && skin_get_gwps(WPS, 0)->sync_data->do_full_update) { - wps_sync_data.do_full_update = false; + skin_get_gwps(WPS, 0)->sync_data->do_full_update = false; } #else - wps_sync_data.do_full_update = false; + skin_get_gwps(WPS, 0)->sync_data->do_full_update = false; #endif - skin_update(&gui_wps[i], full_update ? + skin_update(skin_get_gwps(WPS, i), full_update ? SKIN_REFRESH_ALL : SKIN_REFRESH_NON_STATIC); } } @@ -1175,38 +1182,40 @@ long gui_wps_show(void) /* this is called from the playback thread so NO DRAWING! */ static void track_changed_callback(void *param) { - wps_state.id3 = (struct mp3entry*)param; - wps_state.nid3 = audio_next_track(); - if (wps_state.id3->cuesheet) + struct wps_state *state = skin_get_global_state(); + state->id3 = (struct mp3entry*)param; + state->nid3 = audio_next_track(); + if (state->id3->cuesheet) { - cue_find_current_track(wps_state.id3->cuesheet, wps_state.id3->elapsed); + cue_find_current_track(state->id3->cuesheet, state->id3->elapsed); } - wps_sync_data.do_full_update = true; + skin_get_gwps(WPS, 0)->sync_data->do_full_update = true; } static void nextid3available_callback(void* param) { (void)param; - wps_state.nid3 = audio_next_track(); - wps_sync_data.do_full_update = true; + skin_get_global_state()->nid3 = audio_next_track(); + skin_get_gwps(WPS, 0)->sync_data->do_full_update = true; } static void wps_state_init(void) { - wps_state.ff_rewind = false; - wps_state.paused = false; + struct wps_state *state = skin_get_global_state(); + state->ff_rewind = false; + state->paused = false; if(audio_status() & AUDIO_STATUS_PLAY) { - wps_state.id3 = audio_current_track(); - wps_state.nid3 = audio_next_track(); + state->id3 = audio_current_track(); + state->nid3 = audio_next_track(); } else { - wps_state.id3 = NULL; - wps_state.nid3 = NULL; + state->id3 = NULL; + state->nid3 = NULL; } /* We'll be updating due to restore initialized with true */ - wps_sync_data.do_full_update = false; + skin_get_gwps(WPS, 0)->sync_data->do_full_update = true; /* add the WPS track event callbacks */ add_event(PLAYBACK_EVENT_TRACK_CHANGE, false, track_changed_callback); add_event(PLAYBACK_EVENT_NEXTTRACKID3_AVAILABLE, false, nextid3available_callback); @@ -1215,32 +1224,18 @@ static void wps_state_init(void) void gui_sync_wps_init(void) { - int i; - FOR_NB_SCREENS(i) - { -#ifdef HAVE_ALBUMART - wps_datas[i].albumart = NULL; - wps_datas[i].playback_aa_slot = -1; -#endif - gui_wps[i].data = &wps_datas[i]; - gui_wps[i].display = &screens[i]; - /* Currently no seperate wps_state needed/possible - so use the only available ( "global" ) one */ - gui_wps[i].state = &wps_state; - /* must point to the same struct for both screens */ - gui_wps[i].sync_data = &wps_sync_data; - } + gui_sync_skin_init(); } #ifdef IPOD_ACCESSORY_PROTOCOL bool is_wps_fading(void) { - return wps_state.is_fading; + return skin_get_global_state()->is_fading; } int wps_get_ff_rewind_count(void) { - return wps_state.ff_rewind_count; + return skin_get_global_state()->ff_rewind_count; } #endif diff --git a/apps/radio/radio.c b/apps/radio/radio.c index 74bdb4b..8c4d88c 100644 --- a/apps/radio/radio.c +++ b/apps/radio/radio.c @@ -422,7 +422,7 @@ int radio_screen(void) { radio_load_presets(global_settings.fmr_file); } - fms_get(SCREEN_MAIN)->state->id3 = NULL; + skin_get_global_state()->id3 = NULL; #ifdef HAVE_ALBUMART radioart_init(true); #endif diff --git a/apps/radio/radio.h b/apps/radio/radio.h index 7c263ce..f02558f 100644 --- a/apps/radio/radio.h +++ b/apps/radio/radio.h @@ -52,7 +52,6 @@ const struct fmstation *radio_get_preset(int preset); /* skin functions */ void fms_data_load(enum screen_type screen, const char *buf, bool isfile); -void fms_skin_init(void); /* callbacks for the radio settings */ void set_radio_region(int region); diff --git a/apps/radio/radio_skin.c b/apps/radio/radio_skin.c index 26e6dac..4697e11 100644 --- a/apps/radio/radio_skin.c +++ b/apps/radio/radio_skin.c @@ -32,45 +32,42 @@ #include "statusbar-skinned.h" -extern struct wps_state wps_state; /* from wps.c */ -static struct gui_wps fms_skin[NB_SCREENS] = {{ .data = NULL }}; -static struct wps_data fms_skin_data[NB_SCREENS] = {{ .wps_loaded = 0 }}; -static struct wps_sync_data fms_skin_sync_data = { .do_full_update = false }; - -void fms_data_load(enum screen_type screen, const char *buf, bool isfile) +char* default_radio_skin(enum screen_type screen) { - struct wps_data *data = fms_skin[screen].data; - int success; - success = buf && skin_data_load(screen, data, buf, isfile); - - if (!success ) /* load the default */ - { - const char default_fms[] = "%s%?Ti<%Ti. |>%?Tn<%Tn|%Tf>\n" - "%Sx(Station:) %tf MHz\n" - "%?St(force fm mono)<%Sx(Force Mono)|%?ts<%Sx(Stereo)|%Sx(Mono)>>\n" - "%Sx(Mode:) %?tm<%Sx(Scan)|%Sx(Preset)>\n" + (void)screen; + static char default_fms[] = + "%s%?Ti<%Ti. |>%?Tn<%Tn|%Tf>\n" + "%Sx(Station:) %tf MHz\n" + "%?St(force fm mono)<%Sx(Force Mono)|%?ts<%Sx(Stereo)|%Sx(Mono)>>\n" + "%Sx(Mode:) %?tm<%Sx(Scan)|%Sx(Preset)>\n" #if CONFIG_CODEC != SWCODEC && !defined(SIMULATOR) - "%?Rr<%Sx(Time:) %Rh:%Rn:%Rs|%?St(prerecording time)<%pm|%Sx(Prerecord Time) %Rs>>\n" + "%?Rr<%Sx(Time:) %Rh:%Rn:%Rs|%?St(prerecording time)<%pm|%Sx(Prerecord Time) %Rs>>\n" #endif - "%pb\n" + "%pb\n" #ifdef HAVE_RDS_CAP - "\n%s%ty\n" - "%s%tz\n" + "\n%s%ty\n" + "%s%tz\n" #endif - ; - skin_data_load(screen, data, default_fms, false); - } + ; + return default_fms; } + +void fms_data_load(enum screen_type screen, const char *buf, bool isfile) +{ + skin_load(FM_SCREEN, screen, buf, isfile); +} + void fms_fix_displays(enum fms_exiting toggle_state) { int i; FOR_NB_SCREENS(i) { + struct wps_data *data = skin_get_gwps(FM_SCREEN, i)->data; if (toggle_state == FMS_ENTER) { - viewportmanager_theme_enable(i, skin_has_sbs(i, fms_skin[i].data), NULL); + viewportmanager_theme_enable(i, skin_has_sbs(i, data), NULL); #if LCD_DEPTH > 1 || defined(HAVE_REMOTE_LCD) && LCD_REMOTE_DEPTH > 1 - screens[i].backdrop_show(fms_skin[i].data->backdrop); + screens[i].backdrop_show(data->backdrop); #endif screens[i].clear_display(); /* force statusbar/skin update since we just cleared the whole screen */ @@ -82,43 +79,26 @@ void fms_fix_displays(enum fms_exiting toggle_state) #if LCD_DEPTH > 1 || defined(HAVE_REMOTE_LCD) && LCD_REMOTE_DEPTH > 1 screens[i].backdrop_show(sb_get_backdrop(i)); #endif - viewportmanager_theme_undo(i, skin_has_sbs(i, fms_skin[i].data)); + viewportmanager_theme_undo(i, skin_has_sbs(i, data)); } } #ifdef HAVE_TOUCHSCREEN - if (!fms_skin[SCREEN_MAIN].data->touchregions) + if (i==SCREEN_MAIN && !data->touchregions) touchscreen_set_mode(toggle_state == FMS_ENTER ? TOUCHSCREEN_BUTTON : global_settings.touch_mode); #endif } -void fms_skin_init(void) -{ - int i; - FOR_NB_SCREENS(i) - { -#ifdef HAVE_ALBUMART - fms_skin_data[i].albumart = NULL; - fms_skin_data[i].playback_aa_slot = -1; -#endif - fms_skin[i].data = &fms_skin_data[i]; - fms_skin[i].display = &screens[i]; - /* Currently no seperate wps_state needed/possible - so use the only available ( "global" ) one */ - fms_skin[i].state = &wps_state; - fms_skin[i].sync_data = &fms_skin_sync_data; - } -} - int fms_do_button_loop(bool update_screen) { - int button = skin_wait_for_action(fms_skin, CONTEXT_FM, + int button = skin_wait_for_action(FM_SCREEN, CONTEXT_FM, update_screen ? TIMEOUT_NOBLOCK : HZ/5); #ifdef HAVE_TOUCHSCREEN int offset; if (button == ACTION_TOUCHSCREEN) - button = skin_get_touchaction(&fms_skin_data[SCREEN_MAIN], &offset); + button = skin_get_touchaction(skin_get_gwps(FM_SCREEN, SCREEN_MAIN)->data, + &offset); switch (button) { case ACTION_WPS_STOP: @@ -143,5 +123,5 @@ int fms_do_button_loop(bool update_screen) struct gui_wps *fms_get(enum screen_type screen) { - return &fms_skin[screen]; + return skin_get_gwps(FM_SCREEN, screen); }