From b2eb44ce0eb24632a46b0ea8c8c46a8f2ba35e24 Mon Sep 17 00:00:00 2001 From: Jonathan Gordon Date: Wed, 9 Dec 2009 07:25:46 +0000 Subject: FS#10824 - viewport/statusbar API rework. Hopefully the only user visible changes are: - fm and recording screens go by the statusbar setting (sbs or inbuilt) - plugins go back to using the theme as they should for menus and lists - splash screens might get cut a bit... entirely theme and splash dependant.. if there is a problematic one we can look at it later. - hopefully nothing more than very minor screen flickerings... let me know exactly where they are so they can be fixed New GUI screen rules: * Screens assume that the theme (sbs+ui viewport+ maybe background image) are always enabled. They may be disabled on a per display basis, but MUST be re-enabled on exit * Screens must not be coded in a way that requires a statusbar of any type.. the inbuilt bar will be removed shortly. ALWAYS RESPECT THE USERS SETTINGS unless the screen requires the full display to fit. git-svn-id: svn://svn.rockbox.org/rockbox/trunk@23904 a1c6a512-1295-4272-9138-f99709370657 --- apps/gui/statusbar-skinned.c | 97 ++++++++++++-------------------------------- 1 file changed, 25 insertions(+), 72 deletions(-) (limited to 'apps/gui/statusbar-skinned.c') diff --git a/apps/gui/statusbar-skinned.c b/apps/gui/statusbar-skinned.c index 4ef739929a..8bdecef692 100644 --- a/apps/gui/statusbar-skinned.c +++ b/apps/gui/statusbar-skinned.c @@ -41,7 +41,7 @@ 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 void sb_skin_update(void*); + static bool loaded_ok[NB_SCREENS] = { false }; static int update_delay = DEFAULT_UPDATE_DELAY; @@ -68,9 +68,6 @@ void sb_skin_data_load(enum screen_type screen, const char *buf, bool isfile) vp->hidden_flags = VP_NEVER_VISIBLE; } - if (!success) - remove_event(GUI_EVENT_ACTIONUPDATE, sb_skin_update); - loaded_ok[screen] = success; } @@ -96,7 +93,6 @@ struct viewport *sb_skin_get_info_vp(enum screen_type screen) inline bool sb_skin_get_state(enum screen_type screen) { - int skinbars = sb_skin[screen].sync_data->statusbars; /* Temp fix untill the hardcoded bar is removed */ int bar_setting = global_settings.statusbar; #if NB_SCREENS > 1 @@ -106,87 +102,45 @@ inline bool sb_skin_get_state(enum screen_type screen) switch (bar_setting) { case STATUSBAR_CUSTOM: - return loaded_ok[screen] && (skinbars & VP_SB_ONSCREEN(screen)); + return loaded_ok[screen]; case STATUSBAR_TOP: case STATUSBAR_BOTTOM: + return true; case STATUSBAR_OFF: - return (viewportmanager_get_statusbar()&VP_SB_ONSCREEN(screen)); + return false; } return false; /* Should never actually get here */ } - -static void do_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; - /* force timeout in wps main loop, so that the update is instantly */ - queue_post(&button_queue, BUTTON_NONE, 0); -} - - -void sb_skin_set_state(int state, enum screen_type screen) -{ - sb_skin[screen].sync_data->do_full_update = true; - int skinbars = sb_skin[screen].sync_data->statusbars; - if (state && loaded_ok[screen]) - { - skinbars |= VP_SB_ONSCREEN(screen); - } - else - { - skinbars &= ~VP_SB_ONSCREEN(screen); - } - - if (skinbars) - { -#if defined(HAVE_LCD_ENABLE) || defined(HAVE_LCD_SLEEP) - add_event(LCD_EVENT_ACTIVATION, false, do_update_callback); -#endif - add_event(PLAYBACK_EVENT_TRACK_CHANGE, false, - do_update_callback); - add_event(PLAYBACK_EVENT_NEXTTRACKID3_AVAILABLE, false, - do_update_callback); - add_event(GUI_EVENT_ACTIONUPDATE, false, sb_skin_update); - } - else - { -#if defined(HAVE_LCD_ENABLE) || defined(HAVE_LCD_SLEEP) - remove_event(LCD_EVENT_ACTIVATION, do_update_callback); -#endif - remove_event(PLAYBACK_EVENT_TRACK_CHANGE, do_update_callback); - remove_event(PLAYBACK_EVENT_NEXTTRACKID3_AVAILABLE, do_update_callback); - remove_event(GUI_EVENT_ACTIONUPDATE, sb_skin_update); - } - - sb_skin[screen].sync_data->statusbars = skinbars; -} - -static void sb_skin_update(void* param) +void sb_skin_update(enum screen_type screen, bool force) { static long next_update = 0; - int i; - int forced_draw = param || sb_skin[SCREEN_MAIN].sync_data->do_full_update; - if (TIME_AFTER(current_tick, next_update) || forced_draw) + int i = screen; + if (TIME_AFTER(current_tick, next_update) || force) { - FOR_NB_SCREENS(i) + if (sb_skin_get_state(i)) { - if (sb_skin_get_state(i)) - { #if defined(HAVE_LCD_ENABLE) || defined(HAVE_LCD_SLEEP) - /* currently, all remotes are readable without backlight - * so still update those */ - if (lcd_active() || (i != SCREEN_MAIN)) + /* currently, all remotes are readable without backlight + * so still update those */ + if (lcd_active() || (i != SCREEN_MAIN)) #endif - skin_update(&sb_skin[i], forced_draw? - WPS_REFRESH_ALL : WPS_REFRESH_NON_STATIC); - } + skin_update(&sb_skin[i], force? + WPS_REFRESH_ALL : WPS_REFRESH_NON_STATIC); } - next_update = current_tick + update_delay; /* don't update too often */ - sb_skin[SCREEN_MAIN].sync_data->do_full_update = false; } + next_update = current_tick + update_delay; /* don't update too often */ + sb_skin[SCREEN_MAIN].sync_data->do_full_update = false; +} + +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; + /* force timeout in wps main loop, so that the update is instantly */ + queue_post(&button_queue, BUTTON_NONE, 0); } void sb_skin_set_update_delay(int delay) @@ -209,7 +163,6 @@ void sb_skin_init(void) /* Currently no seperate wps_state needed/possible so use the only available ( "global" ) one */ sb_skin[i].state = &wps_state; - sb_skin_sync_data.statusbars = VP_SB_HIDE_ALL; sb_skin[i].sync_data = &sb_skin_sync_data; } } -- cgit v1.2.3