Index: apps/gui/statusbar-skinned.c =================================================================== --- apps/gui/statusbar-skinned.c (revision 25799) +++ apps/gui/statusbar-skinned.c (working copy) @@ -86,15 +86,29 @@ } /* hide this viewport, forever */ vp->hidden_flags = VP_NEVER_VISIBLE; + sb_set_info_vp(screen, VP_INFO_LABEL|VP_DEFAULT_LABEL); } if (!success && isfile) sb_create_from_settings(screen); } - +static char infovp_label[NB_SCREENS]; +static char oldinfovp_label[NB_SCREENS]; +void sb_set_info_vp(enum screen_type screen, char label) +{ + infovp_label[screen] = label; +} + struct viewport *sb_skin_get_info_vp(enum screen_type screen) { - return &find_viewport(VP_INFO_LABEL, sb_skin[screen].data)->vp; + if (oldinfovp_label[screen] != infovp_label[screen]) + { + /* UI viewport changed, so force a redraw */ + oldinfovp_label[screen] = infovp_label[screen]; + viewportmanager_theme_enable(screen, false, NULL); + viewportmanager_theme_undo(screen, true); + } + return &find_viewport(infovp_label[screen], sb_skin[screen].data)->vp; } #if (LCD_DEPTH > 1) || (defined(HAVE_REMOTE_LCD) && LCD_REMOTE_DEPTH > 1) Index: apps/gui/statusbar-skinned.h =================================================================== --- apps/gui/statusbar-skinned.h (revision 25799) +++ apps/gui/statusbar-skinned.h (working copy) @@ -36,6 +36,7 @@ void sb_create_from_settings(enum screen_type screen); void sb_skin_init(void) INIT_ATTR; +void sb_set_info_vp(enum screen_type screen, char label); struct viewport *sb_skin_get_info_vp(enum screen_type screen); void sb_skin_update(enum screen_type screen, bool force); Index: apps/gui/skin_engine/skin_parser.c =================================================================== --- apps/gui/skin_engine/skin_parser.c (revision 25799) +++ apps/gui/skin_engine/skin_parser.c (working copy) @@ -370,6 +370,8 @@ { WPS_VIEWPORT_ENABLE, "Vd", WPS_REFRESH_DYNAMIC, parse_viewport_display }, + { WPS_TOKEN_UIVIEWPORT_ENABLE, "VI", WPS_REFRESH_STATIC, + parse_viewport_display }, #ifdef HAVE_LCD_BITMAP { WPS_VIEWPORT_CUSTOMLIST, "Vp", WPS_REFRESH_STATIC, parse_playlistview }, { WPS_TOKEN_LIST_TITLE_TEXT, "Lt", WPS_REFRESH_DYNAMIC, NULL }, @@ -915,9 +917,25 @@ if (*ptr == 'i') { - skin_vp->label = VP_INFO_LABEL; - skin_vp->hidden_flags = VP_NEVER_VISIBLE; - ++ptr; + if (*(ptr+1) == '|') + { + char label = *(ptr+2); + if (label >= 'a' && label <= 'z') + { + skin_vp->hidden_flags = VP_NEVER_VISIBLE; + skin_vp->label = VP_INFO_LABEL|label; + ptr += 3; + } + else + { + skin_vp->label = VP_INFO_LABEL|VP_DEFAULT_LABEL; + skin_vp->hidden_flags = VP_NEVER_VISIBLE; + ++ptr; + } + } + else + return WPS_ERROR_INVALID_PARAM; /* malformed token: e.g. %Cl7 */ + } else if (*ptr == 'l') { Index: apps/gui/skin_engine/skin_display.c =================================================================== --- apps/gui/skin_engine/skin_display.c (revision 25799) +++ apps/gui/skin_engine/skin_display.c (working copy) @@ -775,6 +775,10 @@ } } break; + case WPS_TOKEN_UIVIEWPORT_ENABLE: + sb_set_info_vp(gwps->display->screen_type, + data->tokens[i].value.i|VP_INFO_LABEL); + break; #ifdef HAVE_LCD_BITMAP case WPS_VIEWPORT_CUSTOMLIST: draw_playlist_viewer_list(gwps, data->tokens[i].value.data); Index: apps/gui/skin_engine/skin_tokens.h =================================================================== --- apps/gui/skin_engine/skin_tokens.h (revision 25799) +++ apps/gui/skin_engine/skin_tokens.h (working copy) @@ -55,6 +55,7 @@ /* Viewport display */ WPS_VIEWPORT_ENABLE, WPS_VIEWPORT_CUSTOMLIST, + WPS_TOKEN_UIVIEWPORT_ENABLE, /* Battery */ TOKEN_MARKER_BATTERY, Index: apps/gui/skin_engine/wps_internals.h =================================================================== --- apps/gui/skin_engine/wps_internals.h (revision 25799) +++ apps/gui/skin_engine/wps_internals.h (working copy) @@ -203,7 +203,7 @@ #define VP_NEVER_VISIBLE 0x8 #define VP_DEFAULT_LABEL '|' #define VP_NO_LABEL '-' -#define VP_INFO_LABEL '_' +#define VP_INFO_LABEL 0x80 struct skin_viewport { struct viewport vp; /* The LCD viewport struct */ struct skin_line *lines;