summaryrefslogtreecommitdiffstats
path: root/apps/radio/radio_skin.c
diff options
context:
space:
mode:
authorJonathan Gordon <rockbox@jdgordon.info>2010-09-14 11:56:50 +0000
committerJonathan Gordon <rockbox@jdgordon.info>2010-09-14 11:56:50 +0000
commit9928e3418f67fe6d2f82292ddbddcf56ae20b8f6 (patch)
tree397b13a537a476feb77b7d052250b98055924aec /apps/radio/radio_skin.c
parent0928cdf074c8991f470fa0d96e6d4f828998b643 (diff)
downloadrockbox-9928e3418f67fe6d2f82292ddbddcf56ae20b8f6.tar.gz
rockbox-9928e3418f67fe6d2f82292ddbddcf56ae20b8f6.tar.bz2
rockbox-9928e3418f67fe6d2f82292ddbddcf56ae20b8f6.zip
Another major skin backend update/hopefully bugfix:
Skins are now more self contained in the skin manager which in the future might allow on demand skin loading (i.e smaller skin buffers) Skin backdrops are also managed more intelegently (fixes a bug where you can get a crazy backdrop loaded if a .sbs fails to load) the rockbox_default rescue theme is now called rockbox_failsafe to better express what it actually is. This commit hopefully/maybe fixes the heavily reported data aborts, so please check if you are getting them git-svn-id: svn://svn.rockbox.org/rockbox/trunk@28073 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'apps/radio/radio_skin.c')
-rw-r--r--apps/radio/radio_skin.c73
1 files changed, 24 insertions, 49 deletions
diff --git a/apps/radio/radio_skin.c b/apps/radio/radio_skin.c
index 28bd784ad4..0217c83f92 100644
--- a/apps/radio/radio_skin.c
+++ b/apps/radio/radio_skin.c
@@ -33,45 +33,37 @@
#include "option_select.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_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);
+ skin_backdrop_show(data->backdrop_id);
#endif
screens[i].clear_display();
/* force statusbar/skin update since we just cleared the whole screen */
@@ -81,46 +73,29 @@ void fms_fix_displays(enum fms_exiting toggle_state)
{
screens[i].stop_scroll();
#if LCD_DEPTH > 1 || defined(HAVE_REMOTE_LCD) && LCD_REMOTE_DEPTH > 1
- screens[i].backdrop_show(sb_get_backdrop(i));
+ skin_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
struct touchregion *region;
int offset;
if (button == ACTION_TOUCHSCREEN)
- button = skin_get_touchaction(&fms_skin_data[SCREEN_MAIN], &offset, &region);
+ button = skin_get_touchaction(skin_get_gwps(FM_SCREEN, SCREEN_MAIN)->data,
+ &offset, &region)
switch (button)
{
case ACTION_WPS_STOP:
@@ -152,5 +127,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);
}