From 943de3ce49e3ff4bbdefa7459dbc3b885fe145ad Mon Sep 17 00:00:00 2001 From: Jonathan Gordon Date: Thu, 28 Oct 2010 11:00:36 +0000 Subject: skin_parser: Change the way hardware conditionals are done (i.e %?cc) They now only parse the correct branch (so only the true branch, or only the false branch). This shuold allow you to load different images/backdrops with the same id's depending on the targets hardware. Add a new %Tp - "touchscreen present?" tag to check if the target has a touchscreen git-svn-id: svn://svn.rockbox.org/rockbox/trunk@28370 a1c6a512-1295-4272-9138-f99709370657 --- lib/skin_parser/skin_parser.c | 14 +++++++++++++- lib/skin_parser/tag_table.c | 7 ++++--- lib/skin_parser/tag_table.h | 7 ++++--- 3 files changed, 21 insertions(+), 7 deletions(-) (limited to 'lib/skin_parser') diff --git a/lib/skin_parser/skin_parser.c b/lib/skin_parser/skin_parser.c index 64ac462c2c..f574d3f7a2 100644 --- a/lib/skin_parser/skin_parser.c +++ b/lib/skin_parser/skin_parser.c @@ -877,6 +877,7 @@ static int skin_parse_conditional(struct skin_element* element, const char** doc #ifdef ROCKBOX bool feature_available = true; const char *false_branch = NULL; + const char *conditional_end = NULL; #endif /* Some conditional tags allow for target feature checking, @@ -955,6 +956,12 @@ static int skin_parse_conditional(struct skin_element* element, const char** doc false_branch = cursor+1; children--; } + if (element->tag->flags&FEATURE_TAG) + { + if (feature_available) + children--; + } + conditional_end = cursor; /* if we are skipping the true branch fix that up */ cursor = false_branch ? false_branch : bookmark; #else @@ -969,7 +976,13 @@ static int skin_parse_conditional(struct skin_element* element, const char** doc for(i = 0; i < children; i++) { element->children[i] = skin_parse_code_as_arg(&cursor); + if (element->children[i] == NULL) + return 0; skip_whitespace(&cursor); +#ifdef ROCKBOX + if ((element->tag->flags&FEATURE_TAG) && feature_available) + cursor = conditional_end; +#endif if(i < children - 1 && *cursor != ENUMLISTSEPERATESYM) { @@ -986,7 +999,6 @@ static int skin_parse_conditional(struct skin_element* element, const char** doc cursor++; } } - *document = cursor; return 1; diff --git a/lib/skin_parser/tag_table.c b/lib/skin_parser/tag_table.c index 8b31adab2c..9a68834589 100644 --- a/lib/skin_parser/tag_table.c +++ b/lib/skin_parser/tag_table.c @@ -44,7 +44,7 @@ static const struct tag_info legal_tags[] = { SKIN_TOKEN_USB_POWERED, "bu", "", SKIN_REFRESH_DYNAMIC }, - { SKIN_TOKEN_RTC_PRESENT, "cc", "", SKIN_REFRESH_STATIC }, + { SKIN_TOKEN_RTC_PRESENT, "cc", "", FEATURE_TAG }, { SKIN_TOKEN_RTC_DAY_OF_MONTH, "cd", "", SKIN_RTC_REFRESH }, { SKIN_TOKEN_RTC_DAY_OF_MONTH_BLANK_PADDED, "ce", "", SKIN_RTC_REFRESH }, { SKIN_TOKEN_RTC_12HOUR_CFG, "cf", "", SKIN_RTC_REFRESH }, @@ -146,7 +146,7 @@ static const struct tag_info legal_tags[] = { SKIN_TOKEN_REPLAYGAIN, "rg", "", SKIN_REFRESH_STATIC }, { SKIN_TOKEN_CROSSFADE, "xf", "", SKIN_REFRESH_DYNAMIC }, - { SKIN_TOKEN_HAVE_TUNER, "tp", "", SKIN_REFRESH_STATIC }, + { SKIN_TOKEN_HAVE_TUNER, "tp", "", FEATURE_TAG }, { SKIN_TOKEN_TUNER_TUNED, "tt", "", SKIN_REFRESH_DYNAMIC }, { SKIN_TOKEN_TUNER_SCANMODE, "tm", "", SKIN_REFRESH_DYNAMIC }, { SKIN_TOKEN_TUNER_STEREO, "ts", "", SKIN_REFRESH_DYNAMIC }, @@ -200,8 +200,9 @@ static const struct tag_info legal_tags[] = { SKIN_TOKEN_LASTTOUCH, "Tl" , "|D", SKIN_REFRESH_DYNAMIC }, { SKIN_TOKEN_CURRENT_SCREEN, "cs", "", SKIN_REFRESH_DYNAMIC }, { SKIN_TOKEN_TOUCHREGION, "T" , "IIIIS|S", 0|NOBREAK }, + { SKIN_TOKEN_HAVE_TOUCH, "Tp", "", FEATURE_TAG }, - { SKIN_TOKEN_HAVE_RECORDING, "Rp" , "", SKIN_REFRESH_STATIC }, + { SKIN_TOKEN_HAVE_RECORDING, "Rp" , "", FEATURE_TAG }, { SKIN_TOKEN_IS_RECORDING, "Rr" , "", SKIN_REFRESH_DYNAMIC }, { SKIN_TOKEN_REC_FREQ, "Rf" , "", SKIN_REFRESH_DYNAMIC }, { SKIN_TOKEN_REC_ENCODER, "Re" , "", SKIN_REFRESH_DYNAMIC }, diff --git a/lib/skin_parser/tag_table.h b/lib/skin_parser/tag_table.h index f16709d133..a7ac164e10 100644 --- a/lib/skin_parser/tag_table.h +++ b/lib/skin_parser/tag_table.h @@ -29,9 +29,8 @@ extern "C" #define MAX_TAG_PARAMS 12 - - /* Flag to tell the renderer not to insert a line break */ -#define NOBREAK 0x1 +#define NOBREAK 0x1 /* Flag to tell the renderer not to insert a line break */ +#define FEATURE_TAG 0x2 /* Parse time conditional for feature checks (e.g HAVE_RTC) */ /* constants used in line_type and as refresh_mode for wps_refresh */ #define SKIN_REFRESH_SHIFT 16 @@ -214,6 +213,8 @@ enum skin_token_type { SKIN_TOKEN_BUTTON_VOLUME, SKIN_TOKEN_LASTTOUCH, SKIN_TOKEN_TOUCHREGION, + SKIN_TOKEN_HAVE_TOUCH, + /* Virtual LED */ SKIN_TOKEN_VLED_HDD, /* Volume level */ -- cgit v1.2.3