diff options
author | Jonathan Gordon <rockbox@jdgordon.info> | 2010-09-14 11:56:50 +0000 |
---|---|---|
committer | Jonathan Gordon <rockbox@jdgordon.info> | 2010-09-14 11:56:50 +0000 |
commit | 9928e3418f67fe6d2f82292ddbddcf56ae20b8f6 (patch) | |
tree | 397b13a537a476feb77b7d052250b98055924aec /apps/radio | |
parent | 0928cdf074c8991f470fa0d96e6d4f828998b643 (diff) | |
download | rockbox-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.c | 6 | ||||
-rw-r--r-- | apps/radio/radio.h | 4 | ||||
-rw-r--r-- | apps/radio/radio_skin.c | 73 |
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); | |||
50 | int radio_preset_count(void); | 50 | int radio_preset_count(void); |
51 | const struct fmstation *radio_get_preset(int preset); | 51 | const struct fmstation *radio_get_preset(int preset); |
52 | 52 | ||
53 | /* skin functions */ | ||
54 | void fms_data_load(enum screen_type screen, const char *buf, bool isfile); | ||
55 | void fms_skin_init(void); | ||
56 | |||
57 | /* callbacks for the radio settings */ | 53 | /* callbacks for the radio settings */ |
58 | void set_radio_region(int region); | 54 | void set_radio_region(int region); |
59 | void toggle_mono_mode(bool mono); | 55 | void 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 | ||
36 | extern struct wps_state wps_state; /* from wps.c */ | 36 | char* default_radio_skin(enum screen_type screen) |
37 | static struct gui_wps fms_skin[NB_SCREENS] = {{ .data = NULL }}; | ||
38 | static struct wps_data fms_skin_data[NB_SCREENS] = {{ .wps_loaded = 0 }}; | ||
39 | static struct wps_sync_data fms_skin_sync_data = { .do_full_update = false }; | ||
40 | |||
41 | void 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 | |||
65 | void fms_fix_displays(enum fms_exiting toggle_state) | 56 | void 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 | ||
97 | void 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 | |||
115 | int fms_do_button_loop(bool update_screen) | 89 | int 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, ®ion); | 97 | button = skin_get_touchaction(skin_get_gwps(FM_SCREEN, SCREEN_MAIN)->data, |
98 | &offset, ®ion) | ||
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 | ||
153 | struct gui_wps *fms_get(enum screen_type screen) | 128 | struct 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 | } |