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; j<SKINNABLE_SCREENS_COUNT; j++)
+ {
+ FOR_NB_SCREENS(i)
+ {
+#ifdef HAVE_ALBUMART
+ skins[j][i].data.albumart = NULL;
+ skins[j][i].data.playback_aa_slot = -1;
+#endif
+ skins[j][i].gui_wps.data = &skins[j][i].data;
+ skins[j][i].gui_wps.display = &screens[i];
+ /* must point to the same struct for both screens */
+ skins[j][i].gui_wps.sync_data = &wps_sync_data[j];
+ }
+ }
+}
+
+void skin_load(enum skinnable_screens skin, enum screen_type screen,
+ const char *buf, bool isfile)
+{
+ bool loaded = false;
+ int i;
+ /* First step should be to unload all skins which are after this one.
+ for (i=skin; i<
+ */
+
+ if (skin_helpers[skin].preproccess)
+ skin_helpers[skin].preproccess(screen, &skins[skin][screen].data);
+
+ loaded = skin_data_load(screen, &skins[skin][screen].data, buf, isfile);
+ if (!loaded)
+ loaded = skin_data_load(screen, &skins[skin][screen].data,
+ skin_helpers[skin].default_skin(screen), false);
+ if (skin_helpers[skin].postproccess)
+ skin_helpers[skin].postproccess(screen, &skins[skin][screen].data);
+}
+
+struct gui_wps *skin_get_gwps(enum skinnable_screens skin, enum screen_type screen)
+{
+ if (skins[skin][screen].data.wps_loaded == false)
+ {
+ char buf[MAX_PATH*2], path[MAX_PATH];
+ char *setting, *ext;
+ switch (skin)
+ {
+ case CUSTOM_STATUSBAR:
+ return &skins[skin][screen].gui_wps;
+ break;
+ case WPS:
+ setting = global_settings.wps_file;
+ ext = "wps";
+ break;
+#if CONFIG_TUNER
+ case FM_SCREEN:
+ setting = global_settings.fms_file;
+ ext = "fms";
+ break;
+#endif
+ default:
+ return NULL;
+ }
+ snprintf(buf, sizeof buf, "%s/%s.%s",
+ get_user_file_path(WPS_DIR, false, path, sizeof(path)),
+ setting, ext);
+ skin_load(skin, screen, buf, true);
+ }
+
+ return &skins[skin][screen].gui_wps;
+}
+
+struct wps_state *skin_get_global_state(void)
+{
+ return &wps_state;
+}
+
+
+
diff --git a/apps/gui/skin_engine/skin_engine.h b/apps/gui/skin_engine/skin_engine.h
index 9845d8c..be61414 100644
--- a/apps/gui/skin_engine/skin_engine.h
+++ b/apps/gui/skin_engine/skin_engine.h
@@ -97,7 +97,12 @@ void skin_backdrop_init(void);
* with a good refresh rate.
* gwps is really gwps[NB_SCREENS]! don't wrap this in 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);
#endif
+void skin_load(enum skinnable_screens skin, enum screen_type screen,
+ const char *buf, bool isfile);
+struct gui_wps *skin_get_gwps(enum skinnable_screens skin, enum screen_type screen);
+struct wps_state *skin_get_global_state(void);
+
#endif
diff --git a/apps/gui/skin_engine/skin_render.c b/apps/gui/skin_engine/skin_render.c
index 0c18848..5b504f0 100644
--- a/apps/gui/skin_engine/skin_render.c
+++ b/apps/gui/skin_engine/skin_render.c
@@ -706,7 +706,8 @@ static void skin_render_playlistviewer(struct playlistviewer* viewer,
else
#endif
{
- struct cuesheet *cue = gwps->state->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<ARRAYLEN(skins); i++)
{
#ifdef HAVE_REMOTE_LCD
diff --git a/apps/gui/wps.c b/apps/gui/wps.c
index 6ab016f..a59e1af 100644
--- a/apps/gui/wps.c
+++ b/apps/gui/wps.c
@@ -74,12 +74,6 @@
/* 3% of 30min file == 54s step size */
#define MIN_FF_REWIND_STEP 500
-/* currently only one wps_state is needed, initialize to 0 */
- struct wps_state wps_state = { .id3 = NULL };
-static struct gui_wps gui_wps[NB_SCREENS] = {{ .data = NULL }};
-static struct wps_data wps_datas[NB_SCREENS] = {{ .wps_loaded = 0 }};
-static struct wps_sync_data wps_sync_data = { .do_full_update = false };
-
/* initial setup of wps_data */
static void wps_state_init(void);
static void track_changed_callback(void *param);
@@ -94,8 +88,40 @@ static void nextid3available_callback(void* param);
#define DEFAULT_WPS(screen) (WPS_DEFAULTCFG)
#endif
+char* wps_default_skin(enum screen_type screen)
+{
+ static 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<avg|> %?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<avg|> %?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<avg|> %?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<avg|> %?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);
}