From a7d784b1d5912b68ca9d921961639fe948404811 Mon Sep 17 00:00:00 2001 From: Jonathan Gordon Date: Wed, 4 Nov 2009 05:10:53 +0000 Subject: Fix viewport "UI area" to work based on what was agreed on last week in the mailing lists and IRC: * viewport_set_defaults() will always set the viewport to the intersection of the user setting and any sbs set user viewport * viewport_set_fullscreen() will always set the viewport to the full display, take care to disable the statusbars if you use this! This patch is from FS#10709 and contains code which will be removed once the current inbuilt statusbar is finally removed. This *may* break themes which dont use the %we or %wd token.. follow up commit to fix this coming... git-svn-id: svn://svn.rockbox.org/rockbox/trunk@23507 a1c6a512-1295-4272-9138-f99709370657 --- apps/gui/skin_engine/skin_display.c | 2 +- apps/gui/statusbar-skinned.c | 38 +++++++++++++++++++-- apps/gui/viewport.c | 67 +++++++++++++++++++++++-------------- 3 files changed, 79 insertions(+), 28 deletions(-) diff --git a/apps/gui/skin_engine/skin_display.c b/apps/gui/skin_engine/skin_display.c index 51f86e5686..460101a17b 100644 --- a/apps/gui/skin_engine/skin_display.c +++ b/apps/gui/skin_engine/skin_display.c @@ -108,7 +108,7 @@ void skin_statusbar_changed(struct gui_wps *skin) const int screen = display->screen_type; struct viewport *vp = &find_viewport(VP_DEFAULT_LABEL, data)->vp; - viewport_set_fullscreen(vp, screen); + viewport_set_defaults(vp, screen); if (data->wps_sb_tag) { /* fix up the default viewport */ diff --git a/apps/gui/statusbar-skinned.c b/apps/gui/statusbar-skinned.c index 9756401ccb..ba46253f5d 100644 --- a/apps/gui/statusbar-skinned.c +++ b/apps/gui/statusbar-skinned.c @@ -77,15 +77,49 @@ void sb_skin_data_load(enum screen_type screen, const char *buf, bool isfile) loaded_ok[screen] = success; } +/* 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) { - return &find_viewport(VP_INFO_LABEL, sb_skin[screen].data)->vp; + int bar_setting = global_settings.statusbar; +#if NB_SCREENS > 1 + if (screen == SCREEN_REMOTE) + bar_setting = global_settings.remote_statusbar; +#endif + 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]; + } } inline bool sb_skin_get_state(enum screen_type screen) { int skinbars = sb_skin[screen].sync_data->statusbars; - return loaded_ok[screen] && (skinbars & VP_SB_ONSCREEN(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] && (skinbars & VP_SB_ONSCREEN(screen)); + case STATUSBAR_TOP: + case STATUSBAR_BOTTOM: + case STATUSBAR_OFF: + return (VP_SB_ONSCREEN(screen)); + } + return false; /* Should never actually get here */ } diff --git a/apps/gui/viewport.c b/apps/gui/viewport.c index b5696842e3..5c6caebbc5 100644 --- a/apps/gui/viewport.c +++ b/apps/gui/viewport.c @@ -102,28 +102,9 @@ void viewport_set_fullscreen(struct viewport *vp, const enum screen_type screen) { vp->x = 0; + vp->y = 0; vp->width = screens[screen].lcdwidth; - -#ifdef HAVE_LCD_BITMAP - struct viewport *sb_skin_vp = sb_skin_get_info_vp(screen); - if (sb_skin_vp && sb_skin_get_state(screen) - && statusbar_enabled & VP_SB_ONSCREEN(screen)) - { - *vp = *sb_skin_vp; - } - else - { - if (statusbar_position(screen) != STATUSBAR_BOTTOM && showing_bars(screen)) - vp->y = STATUSBAR_HEIGHT; - else - vp->y = 0; -#else - { - vp->y = 0; -#endif - vp->height = screens[screen].lcdheight - - (showing_bars(screen)?STATUSBAR_HEIGHT:0); - } + vp->height = screens[screen].lcdheight; #ifdef HAVE_LCD_BITMAP set_default_align_flags(vp); @@ -158,13 +139,49 @@ void viewport_set_fullscreen(struct viewport *vp, void viewport_set_defaults(struct viewport *vp, const enum screen_type screen) { + /* Reposition: + 1) If the "ui viewport" setting is set, and a sbs is loaded which specifies a %Vi + return the intersection of those two viewports + 2) If only one of the "ui viewport" setting, or sbs %Vi is set + return it + 3) No user viewports set + return the full display + */ #ifdef HAVE_LCD_BITMAP + + struct viewport *sbs_area = NULL, *user_setting = NULL; + /* get the two viewports */ if (ui_vp_info.active[screen]) - *vp = ui_vp_info.vp[screen]; + user_setting = &ui_vp_info.vp[screen]; + if (sb_skin_get_state(screen)) + sbs_area = sb_skin_get_info_vp(screen); + /* have both? get their intersection */ + if (sbs_area && user_setting) + { + struct viewport *a = sbs_area, *b = user_setting; + /* make sure they do actually overlap, + * if they dont its user error, so use the full display + * and live with redraw problems */ + 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) + { + 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; + } + } + /* only one so use it */ + else 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 - viewport_set_fullscreen(vp, screen); - + viewport_set_fullscreen(vp, screen); +#endif /* HAVE_LCD_BITMAP */ } void viewportmanager_init(void) -- cgit v1.2.3