Index: apps/gui/statusbar-skinned.c =================================================================== --- apps/gui/statusbar-skinned.c (revision 24254) +++ apps/gui/statusbar-skinned.c (working copy) @@ -41,8 +41,6 @@ static struct wps_sync_data sb_skin_sync_data = { .do_full_update = false }; /* initial setup of wps_data */ - -static bool loaded_ok[NB_SCREENS] = { false }; static int update_delay = DEFAULT_UPDATE_DELAY; @@ -66,68 +64,61 @@ } /* hide this viewport, forever */ vp->hidden_flags = VP_NEVER_VISIBLE; + + /* fix up overlapping ui viewport and sbs %vi viewports */ +#if NB_SCREENS > 1 + if (screen == SCREEN_REMOTE) + buf = global_settings.remote_ui_vp_config; +#endif + buf = global_settings.ui_vp_config; + if (isfile && buf[0]) + { + struct viewport uivp, *sbsvp = sb_skin_get_info_vp(screen); + if (viewport_parse_viewport(&uivp, screen, buf, ',')) + { + /* if ui vp and info vp overlap, intersect */ + struct viewport *a = &uivp, *b = sbsvp; + if (a->x < b->x + b->width && + a->x + a->width > b->x && + a->y < b->y + b->height && + a->y + a->height > b->y) + { + sbsvp->x = MAX(a->x, b->x); + sbsvp->y = MAX(a->y, b->y); + sbsvp->width = MIN(a->x + a->width, b->x + b->width) - sbsvp->x; + sbsvp->height = MIN(a->y + a->height, b->y + b->height) - sbsvp->y; + } + /* ui viewport colour settings always override %Vi from a loaded .sbs */ +#if (LCD_DEPTH > 1) || (defined(HAVE_REMOTE_LCD) && LCD_REMOTE_DEPTH > 1) + sbsvp->fg_pattern = uivp.fg_pattern; + sbsvp->bg_pattern = uivp.bg_pattern; +#endif /* LCD_DEPTH > 1 || LCD_REMOTE_DEPTH > 1 */ + } + } } - loaded_ok[screen] = success; + if (!success) + sb_create_from_settings(screen); } -/* temporary viewport structs while the non-skinned bar is in the build */ -static struct viewport inbuilt[NB_SCREENS]; struct viewport *sb_skin_get_info_vp(enum screen_type screen) { - int bar_setting = statusbar_position(screen); - if (bar_setting == STATUSBAR_CUSTOM) - return &find_viewport(VP_INFO_LABEL, sb_skin[screen].data)->vp; - else if (bar_setting == STATUSBAR_OFF) - return NULL; - else - { - viewport_set_fullscreen(&inbuilt[screen], screen); - /* WE need to return the UI area.. NOT the statusbar area! */ - if (bar_setting == STATUSBAR_TOP) - inbuilt[screen].y = STATUSBAR_HEIGHT; - inbuilt[screen].height -= STATUSBAR_HEIGHT; - return &inbuilt[screen]; - } + return &find_viewport(VP_INFO_LABEL, sb_skin[screen].data)->vp; } -inline bool sb_skin_get_state(enum screen_type screen) -{ - /* Temp fix untill the hardcoded bar is removed */ - int bar_setting = global_settings.statusbar; -#if NB_SCREENS > 1 - if (screen == SCREEN_REMOTE) - bar_setting = global_settings.remote_statusbar; -#endif - switch (bar_setting) - { - case STATUSBAR_CUSTOM: - return loaded_ok[screen]; - case STATUSBAR_TOP: - case STATUSBAR_BOTTOM: - return true; - case STATUSBAR_OFF: - return false; - } - return false; /* Should never actually get here */ -} - void sb_skin_update(enum screen_type screen, bool force) { static long next_update = 0; int i = screen; if (TIME_AFTER(current_tick, next_update) || force) { - 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], force? - 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; } @@ -148,6 +139,58 @@ update_delay = delay; } +/* This creates and loads a ".sbs" based on the user settings for: + * - regular statusbar + * - colours + * - ui viewport + * - backdrop + */ +void sb_create_from_settings(enum screen_type screen) +{ + char buf[128], *ptr, *ptr2; + int len, remaining = sizeof(buf); + + ptr = buf; + +#if LCD_DEPTH > 1 + /* backdrop */ + if (screen == SCREEN_MAIN && global_settings.backdrop_file[0]) + { + len = snprintf(ptr, remaining, "%%X|%s.bmp|\n", global_settings.backdrop_file); + ptr += len; + remaining -= len; + } +#endif + /* %Vi viewport, colours handled by the parser */ +#if NB_SCREENS > 1 + if (screen == SCREEN_REMOTE) + ptr2 = global_settings.remote_ui_vp_config; +#endif + ptr2 = global_settings.ui_vp_config; + + if (ptr2[0]) /* from ui viewport setting */ + { + len = snprintf(ptr, remaining, "%%Vi|%s\n", ptr2); + while ((ptr2 = strchr(ptr, ','))) + *ptr2 = '|'; + } + else + { + int y = 0, height; + switch (statusbar_position(screen)) + { + case STATUSBAR_TOP: + y = STATUSBAR_HEIGHT; + case STATUSBAR_BOTTOM: + height = LCD_HEIGHT - STATUSBAR_HEIGHT; + break; + default: + height = LCD_HEIGHT; + } + len = snprintf(ptr, remaining, "%%Vi|0|%d|-|%d|1|-|-|\n", y, height); + } + sb_skin_data_load(screen, buf, false); +} void sb_skin_init(void) { Index: apps/gui/statusbar-skinned.h =================================================================== --- apps/gui/statusbar-skinned.h (revision 24254) +++ apps/gui/statusbar-skinned.h (working copy) @@ -33,8 +33,7 @@ void sb_skin_data_load(enum screen_type screen, const char *buf, bool isfile); -/* probably temporary, to shut the classic statusbar up */ -bool sb_skin_get_state(enum screen_type screen); +void sb_create_from_settings(enum screen_type screen); void sb_skin_init(void); struct viewport *sb_skin_get_info_vp(enum screen_type screen); void sb_skin_update(enum screen_type screen, bool force); @@ -46,7 +45,7 @@ #define sb_skin_data_load(a,b,c) #define sb_skin_set_update_delay(a) #define sb_skin_set_state(a,b) -#define sb_skin_get_state(a) +#define sb_create_from_settings(a) #endif void do_sbs_update_callback(void *param); #endif /* __STATUSBAR_SKINNED_H__ */ Index: apps/gui/viewport.c =================================================================== --- apps/gui/viewport.c (revision 24254) +++ apps/gui/viewport.c (working copy) @@ -185,11 +185,6 @@ int top = theme_stack_top[screen]; return theme_stack[screen][top].enabled; } - -static bool custom_vp_loaded_ok[NB_SCREENS]; -static struct viewport custom_vp[NB_SCREENS]; - -static unsigned viewport_init_ui_vp(void); #endif /* HAVE_LCD_BITMAP */ int viewport_get_nb_lines(const struct viewport *vp) @@ -244,7 +239,6 @@ #endif if (which & THEME_UI_VIEWPORT) { - viewport_init_ui_vp(); } if (which & THEME_LANGUAGE) { @@ -262,34 +256,6 @@ send_event(GUI_EVENT_THEME_CHANGED, NULL); } -/* - * (re)parse the UI vp from the settings - * - Returns - * 0 if no UI vp is used at all - * else the bit for the screen (1<x < b->x + b->width && - a->x + a->width > b->x && - a->y < b->y + b->height && - a->y + a->height > b->y) - { - /* copy from ui vp first (for other field),fix coordinates after */ - *vp = *user_setting; - set_default_align_flags(vp); - vp->x = MAX(a->x, b->x); - vp->y = MAX(a->y, b->y); - vp->width = MIN(a->x + a->width, b->x + b->width) - vp->x; - vp->height = MIN(a->y + a->height, b->y + b->height) - vp->y; - return; - } - /* else (no overlap at all) fall back to info vp from sbs, that - * has no redraw problems */ } - - /* if only one is active use it - * or if the above check for overlapping failed, use info vp then, because - * that doesn't give redraw problems */ + sbs_area = sb_skin_get_info_vp(screen); + if (sbs_area) *vp = *sbs_area; - else if (user_setting) - *vp = *user_setting; - /* have neither so its fullscreen which was fixed at the beginning */ else #endif /* HAVE_LCD_BITMAP */ viewport_set_fullscreen(vp, screen);