summaryrefslogtreecommitdiff
path: root/apps/radio
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
parent0928cdf074c8991f470fa0d96e6d4f828998b643 (diff)
downloadrockbox-9928e3418f67fe6d2f82292ddbddcf56ae20b8f6.tar.gz
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')
-rw-r--r--apps/radio/radio.c6
-rw-r--r--apps/radio/radio.h4
-rw-r--r--apps/radio/radio_skin.c73
3 files changed, 27 insertions, 56 deletions
diff --git a/apps/radio/radio.c b/apps/radio/radio.c
index 74bdb4bc75..e5badb10a8 100644
--- a/apps/radio/radio.c
+++ b/apps/radio/radio.c
@@ -422,7 +422,7 @@ int radio_screen(void)
422 { 422 {
423 radio_load_presets(global_settings.fmr_file); 423 radio_load_presets(global_settings.fmr_file);
424 } 424 }
425 fms_get(SCREEN_MAIN)->state->id3 = NULL; 425 skin_get_global_state()->id3 = NULL;
426#ifdef HAVE_ALBUMART 426#ifdef HAVE_ALBUMART
427 radioart_init(true); 427 radioart_init(true);
428#endif 428#endif
@@ -469,7 +469,7 @@ int radio_screen(void)
469#endif 469#endif
470 fms_fix_displays(FMS_ENTER); 470 fms_fix_displays(FMS_ENTER);
471 FOR_NB_SCREENS(i) 471 FOR_NB_SCREENS(i)
472 skin_update(fms_get(i), SKIN_REFRESH_ALL); 472 skin_update(FM_SCREEN, i, SKIN_REFRESH_ALL);
473 473
474 if(radio_preset_count() < 1 && yesno_pop(ID2P(LANG_FM_FIRST_AUTOSCAN))) 474 if(radio_preset_count() < 1 && yesno_pop(ID2P(LANG_FM_FIRST_AUTOSCAN)))
475 presets_scan(NULL); 475 presets_scan(NULL);
@@ -800,7 +800,7 @@ int radio_screen(void)
800 { 800 {
801#endif 801#endif
802 FOR_NB_SCREENS(i) 802 FOR_NB_SCREENS(i)
803 skin_update(fms_get(i), update_type); 803 skin_update(FM_SCREEN, i, update_type);
804 } 804 }
805 } 805 }
806 update_type = 0; 806 update_type = 0;
diff --git a/apps/radio/radio.h b/apps/radio/radio.h
index 7c263ce218..daeaee9ca7 100644
--- a/apps/radio/radio.h
+++ b/apps/radio/radio.h
@@ -50,10 +50,6 @@ int radio_current_preset(void);
50int radio_preset_count(void); 50int radio_preset_count(void);
51const struct fmstation *radio_get_preset(int preset); 51const struct fmstation *radio_get_preset(int preset);
52 52
53/* skin functions */
54void fms_data_load(enum screen_type screen, const char *buf, bool isfile);
55void fms_skin_init(void);
56
57/* callbacks for the radio settings */ 53/* callbacks for the radio settings */
58void set_radio_region(int region); 54void set_radio_region(int region);
59void toggle_mono_mode(bool mono); 55void toggle_mono_mode(bool mono);
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 @@
33#include "option_select.h" 33#include "option_select.h"
34 34
35 35
36extern struct wps_state wps_state; /* from wps.c */ 36char* default_radio_skin(enum screen_type screen)
37static struct gui_wps fms_skin[NB_SCREENS] = {{ .data = NULL }};
38static struct wps_data fms_skin_data[NB_SCREENS] = {{ .wps_loaded = 0 }};
39static struct wps_sync_data fms_skin_sync_data = { .do_full_update = false };
40
41void fms_data_load(enum screen_type screen, const char *buf, bool isfile)
42{ 37{
43 struct wps_data *data = fms_skin[screen].data; 38 (void)screen;
44 int success; 39 static char default_fms[] =
45 success = buf && skin_data_load(screen, data, buf, isfile); 40 "%s%?Ti<%Ti. |>%?Tn<%Tn|%Tf>\n"
46 41 "%Sx(Station:) %tf MHz\n"
47 if (!success ) /* load the default */ 42 "%?St(force fm mono)<%Sx(Force Mono)|%?ts<%Sx(Stereo)|%Sx(Mono)>>\n"
48 { 43 "%Sx(Mode:) %?tm<%Sx(Scan)|%Sx(Preset)>\n"
49 const char default_fms[] = "%s%?Ti<%Ti. |>%?Tn<%Tn|%Tf>\n"
50 "%Sx(Station:) %tf MHz\n"
51 "%?St(force fm mono)<%Sx(Force Mono)|%?ts<%Sx(Stereo)|%Sx(Mono)>>\n"
52 "%Sx(Mode:) %?tm<%Sx(Scan)|%Sx(Preset)>\n"
53#if CONFIG_CODEC != SWCODEC && !defined(SIMULATOR) 44#if CONFIG_CODEC != SWCODEC && !defined(SIMULATOR)
54 "%?Rr<%Sx(Time:) %Rh:%Rn:%Rs|%?St(prerecording time)<%pm|%Sx(Prerecord Time) %Rs>>\n" 45 "%?Rr<%Sx(Time:) %Rh:%Rn:%Rs|%?St(prerecording time)<%pm|%Sx(Prerecord Time) %Rs>>\n"
55#endif 46#endif
56 "%pb\n" 47 "%pb\n"
57#ifdef HAVE_RDS_CAP 48#ifdef HAVE_RDS_CAP
58 "\n%s%ty\n" 49 "\n%s%ty\n"
59 "%s%tz\n" 50 "%s%tz\n"
60#endif 51#endif
61 ; 52 ;
62 skin_data_load(screen, data, default_fms, false); 53 return default_fms;
63 }
64} 54}
55
65void fms_fix_displays(enum fms_exiting toggle_state) 56void fms_fix_displays(enum fms_exiting toggle_state)
66{ 57{
67 int i; 58 int i;
68 FOR_NB_SCREENS(i) 59 FOR_NB_SCREENS(i)
69 { 60 {
61 struct wps_data *data = skin_get_gwps(FM_SCREEN, i)->data;
70 if (toggle_state == FMS_ENTER) 62 if (toggle_state == FMS_ENTER)
71 { 63 {
72 viewportmanager_theme_enable(i, skin_has_sbs(i, fms_skin[i].data), NULL); 64 viewportmanager_theme_enable(i, skin_has_sbs(i, data), NULL);
73#if LCD_DEPTH > 1 || defined(HAVE_REMOTE_LCD) && LCD_REMOTE_DEPTH > 1 65#if LCD_DEPTH > 1 || defined(HAVE_REMOTE_LCD) && LCD_REMOTE_DEPTH > 1
74 screens[i].backdrop_show(fms_skin[i].data->backdrop); 66 skin_backdrop_show(data->backdrop_id);
75#endif 67#endif
76 screens[i].clear_display(); 68 screens[i].clear_display();
77 /* force statusbar/skin update since we just cleared the whole screen */ 69 /* force statusbar/skin update since we just cleared the whole screen */
@@ -81,46 +73,29 @@ void fms_fix_displays(enum fms_exiting toggle_state)
81 { 73 {
82 screens[i].stop_scroll(); 74 screens[i].stop_scroll();
83#if LCD_DEPTH > 1 || defined(HAVE_REMOTE_LCD) && LCD_REMOTE_DEPTH > 1 75#if LCD_DEPTH > 1 || defined(HAVE_REMOTE_LCD) && LCD_REMOTE_DEPTH > 1
84 screens[i].backdrop_show(sb_get_backdrop(i)); 76 skin_backdrop_show(sb_get_backdrop(i));
85#endif 77#endif
86 viewportmanager_theme_undo(i, skin_has_sbs(i, fms_skin[i].data)); 78 viewportmanager_theme_undo(i, skin_has_sbs(i, data));
87 } 79 }
88 } 80 }
89#ifdef HAVE_TOUCHSCREEN 81#ifdef HAVE_TOUCHSCREEN
90 if (!fms_skin[SCREEN_MAIN].data->touchregions) 82 if (i==SCREEN_MAIN && !data->touchregions)
91 touchscreen_set_mode(toggle_state == FMS_ENTER ? 83 touchscreen_set_mode(toggle_state == FMS_ENTER ?
92 TOUCHSCREEN_BUTTON : global_settings.touch_mode); 84 TOUCHSCREEN_BUTTON : global_settings.touch_mode);
93#endif 85#endif
94} 86}
95 87
96 88
97void fms_skin_init(void)
98{
99 int i;
100 FOR_NB_SCREENS(i)
101 {
102#ifdef HAVE_ALBUMART
103 fms_skin_data[i].albumart = NULL;
104 fms_skin_data[i].playback_aa_slot = -1;
105#endif
106 fms_skin[i].data = &fms_skin_data[i];
107 fms_skin[i].display = &screens[i];
108 /* Currently no seperate wps_state needed/possible
109 so use the only available ( "global" ) one */
110 fms_skin[i].state = &wps_state;
111 fms_skin[i].sync_data = &fms_skin_sync_data;
112 }
113}
114
115int fms_do_button_loop(bool update_screen) 89int fms_do_button_loop(bool update_screen)
116{ 90{
117 int button = skin_wait_for_action(fms_skin, CONTEXT_FM, 91 int button = skin_wait_for_action(FM_SCREEN, CONTEXT_FM,
118 update_screen ? TIMEOUT_NOBLOCK : HZ/5); 92 update_screen ? TIMEOUT_NOBLOCK : HZ/5);
119#ifdef HAVE_TOUCHSCREEN 93#ifdef HAVE_TOUCHSCREEN
120 struct touchregion *region; 94 struct touchregion *region;
121 int offset; 95 int offset;
122 if (button == ACTION_TOUCHSCREEN) 96 if (button == ACTION_TOUCHSCREEN)
123 button = skin_get_touchaction(&fms_skin_data[SCREEN_MAIN], &offset, &region); 97 button = skin_get_touchaction(skin_get_gwps(FM_SCREEN, SCREEN_MAIN)->data,
98 &offset, &region)
124 switch (button) 99 switch (button)
125 { 100 {
126 case ACTION_WPS_STOP: 101 case ACTION_WPS_STOP:
@@ -152,5 +127,5 @@ int fms_do_button_loop(bool update_screen)
152 127
153struct gui_wps *fms_get(enum screen_type screen) 128struct gui_wps *fms_get(enum screen_type screen)
154{ 129{
155 return &fms_skin[screen]; 130 return skin_get_gwps(FM_SCREEN, screen);
156} 131}