diff options
author | Jonathan Gordon <rockbox@jdgordon.info> | 2010-10-28 11:00:36 +0000 |
---|---|---|
committer | Jonathan Gordon <rockbox@jdgordon.info> | 2010-10-28 11:00:36 +0000 |
commit | 943de3ce49e3ff4bbdefa7459dbc3b885fe145ad (patch) | |
tree | 4d0791456aa944700570e7207f6f8717e8c1a667 /lib/skin_parser | |
parent | db2a8ffd30f3c1b5a17f318d4acbbeab54bab4c3 (diff) | |
download | rockbox-943de3ce49e3ff4bbdefa7459dbc3b885fe145ad.tar.gz rockbox-943de3ce49e3ff4bbdefa7459dbc3b885fe145ad.zip |
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
Diffstat (limited to 'lib/skin_parser')
-rw-r--r-- | lib/skin_parser/skin_parser.c | 14 | ||||
-rw-r--r-- | lib/skin_parser/tag_table.c | 7 | ||||
-rw-r--r-- | lib/skin_parser/tag_table.h | 7 |
3 files changed, 21 insertions, 7 deletions
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 | |||
877 | #ifdef ROCKBOX | 877 | #ifdef ROCKBOX |
878 | bool feature_available = true; | 878 | bool feature_available = true; |
879 | const char *false_branch = NULL; | 879 | const char *false_branch = NULL; |
880 | const char *conditional_end = NULL; | ||
880 | #endif | 881 | #endif |
881 | 882 | ||
882 | /* Some conditional tags allow for target feature checking, | 883 | /* Some conditional tags allow for target feature checking, |
@@ -955,6 +956,12 @@ static int skin_parse_conditional(struct skin_element* element, const char** doc | |||
955 | false_branch = cursor+1; | 956 | false_branch = cursor+1; |
956 | children--; | 957 | children--; |
957 | } | 958 | } |
959 | if (element->tag->flags&FEATURE_TAG) | ||
960 | { | ||
961 | if (feature_available) | ||
962 | children--; | ||
963 | } | ||
964 | conditional_end = cursor; | ||
958 | /* if we are skipping the true branch fix that up */ | 965 | /* if we are skipping the true branch fix that up */ |
959 | cursor = false_branch ? false_branch : bookmark; | 966 | cursor = false_branch ? false_branch : bookmark; |
960 | #else | 967 | #else |
@@ -969,7 +976,13 @@ static int skin_parse_conditional(struct skin_element* element, const char** doc | |||
969 | for(i = 0; i < children; i++) | 976 | for(i = 0; i < children; i++) |
970 | { | 977 | { |
971 | element->children[i] = skin_parse_code_as_arg(&cursor); | 978 | element->children[i] = skin_parse_code_as_arg(&cursor); |
979 | if (element->children[i] == NULL) | ||
980 | return 0; | ||
972 | skip_whitespace(&cursor); | 981 | skip_whitespace(&cursor); |
982 | #ifdef ROCKBOX | ||
983 | if ((element->tag->flags&FEATURE_TAG) && feature_available) | ||
984 | cursor = conditional_end; | ||
985 | #endif | ||
973 | 986 | ||
974 | if(i < children - 1 && *cursor != ENUMLISTSEPERATESYM) | 987 | if(i < children - 1 && *cursor != ENUMLISTSEPERATESYM) |
975 | { | 988 | { |
@@ -986,7 +999,6 @@ static int skin_parse_conditional(struct skin_element* element, const char** doc | |||
986 | cursor++; | 999 | cursor++; |
987 | } | 1000 | } |
988 | } | 1001 | } |
989 | |||
990 | *document = cursor; | 1002 | *document = cursor; |
991 | 1003 | ||
992 | return 1; | 1004 | 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[] = | |||
44 | { SKIN_TOKEN_USB_POWERED, "bu", "", SKIN_REFRESH_DYNAMIC }, | 44 | { SKIN_TOKEN_USB_POWERED, "bu", "", SKIN_REFRESH_DYNAMIC }, |
45 | 45 | ||
46 | 46 | ||
47 | { SKIN_TOKEN_RTC_PRESENT, "cc", "", SKIN_REFRESH_STATIC }, | 47 | { SKIN_TOKEN_RTC_PRESENT, "cc", "", FEATURE_TAG }, |
48 | { SKIN_TOKEN_RTC_DAY_OF_MONTH, "cd", "", SKIN_RTC_REFRESH }, | 48 | { SKIN_TOKEN_RTC_DAY_OF_MONTH, "cd", "", SKIN_RTC_REFRESH }, |
49 | { SKIN_TOKEN_RTC_DAY_OF_MONTH_BLANK_PADDED, "ce", "", SKIN_RTC_REFRESH }, | 49 | { SKIN_TOKEN_RTC_DAY_OF_MONTH_BLANK_PADDED, "ce", "", SKIN_RTC_REFRESH }, |
50 | { SKIN_TOKEN_RTC_12HOUR_CFG, "cf", "", SKIN_RTC_REFRESH }, | 50 | { SKIN_TOKEN_RTC_12HOUR_CFG, "cf", "", SKIN_RTC_REFRESH }, |
@@ -146,7 +146,7 @@ static const struct tag_info legal_tags[] = | |||
146 | { SKIN_TOKEN_REPLAYGAIN, "rg", "", SKIN_REFRESH_STATIC }, | 146 | { SKIN_TOKEN_REPLAYGAIN, "rg", "", SKIN_REFRESH_STATIC }, |
147 | { SKIN_TOKEN_CROSSFADE, "xf", "", SKIN_REFRESH_DYNAMIC }, | 147 | { SKIN_TOKEN_CROSSFADE, "xf", "", SKIN_REFRESH_DYNAMIC }, |
148 | 148 | ||
149 | { SKIN_TOKEN_HAVE_TUNER, "tp", "", SKIN_REFRESH_STATIC }, | 149 | { SKIN_TOKEN_HAVE_TUNER, "tp", "", FEATURE_TAG }, |
150 | { SKIN_TOKEN_TUNER_TUNED, "tt", "", SKIN_REFRESH_DYNAMIC }, | 150 | { SKIN_TOKEN_TUNER_TUNED, "tt", "", SKIN_REFRESH_DYNAMIC }, |
151 | { SKIN_TOKEN_TUNER_SCANMODE, "tm", "", SKIN_REFRESH_DYNAMIC }, | 151 | { SKIN_TOKEN_TUNER_SCANMODE, "tm", "", SKIN_REFRESH_DYNAMIC }, |
152 | { SKIN_TOKEN_TUNER_STEREO, "ts", "", SKIN_REFRESH_DYNAMIC }, | 152 | { SKIN_TOKEN_TUNER_STEREO, "ts", "", SKIN_REFRESH_DYNAMIC }, |
@@ -200,8 +200,9 @@ static const struct tag_info legal_tags[] = | |||
200 | { SKIN_TOKEN_LASTTOUCH, "Tl" , "|D", SKIN_REFRESH_DYNAMIC }, | 200 | { SKIN_TOKEN_LASTTOUCH, "Tl" , "|D", SKIN_REFRESH_DYNAMIC }, |
201 | { SKIN_TOKEN_CURRENT_SCREEN, "cs", "", SKIN_REFRESH_DYNAMIC }, | 201 | { SKIN_TOKEN_CURRENT_SCREEN, "cs", "", SKIN_REFRESH_DYNAMIC }, |
202 | { SKIN_TOKEN_TOUCHREGION, "T" , "IIIIS|S", 0|NOBREAK }, | 202 | { SKIN_TOKEN_TOUCHREGION, "T" , "IIIIS|S", 0|NOBREAK }, |
203 | { SKIN_TOKEN_HAVE_TOUCH, "Tp", "", FEATURE_TAG }, | ||
203 | 204 | ||
204 | { SKIN_TOKEN_HAVE_RECORDING, "Rp" , "", SKIN_REFRESH_STATIC }, | 205 | { SKIN_TOKEN_HAVE_RECORDING, "Rp" , "", FEATURE_TAG }, |
205 | { SKIN_TOKEN_IS_RECORDING, "Rr" , "", SKIN_REFRESH_DYNAMIC }, | 206 | { SKIN_TOKEN_IS_RECORDING, "Rr" , "", SKIN_REFRESH_DYNAMIC }, |
206 | { SKIN_TOKEN_REC_FREQ, "Rf" , "", SKIN_REFRESH_DYNAMIC }, | 207 | { SKIN_TOKEN_REC_FREQ, "Rf" , "", SKIN_REFRESH_DYNAMIC }, |
207 | { SKIN_TOKEN_REC_ENCODER, "Re" , "", SKIN_REFRESH_DYNAMIC }, | 208 | { 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" | |||
29 | 29 | ||
30 | #define MAX_TAG_PARAMS 12 | 30 | #define MAX_TAG_PARAMS 12 |
31 | 31 | ||
32 | 32 | #define NOBREAK 0x1 /* Flag to tell the renderer not to insert a line break */ | |
33 | /* Flag to tell the renderer not to insert a line break */ | 33 | #define FEATURE_TAG 0x2 /* Parse time conditional for feature checks (e.g HAVE_RTC) */ |
34 | #define NOBREAK 0x1 | ||
35 | 34 | ||
36 | /* constants used in line_type and as refresh_mode for wps_refresh */ | 35 | /* constants used in line_type and as refresh_mode for wps_refresh */ |
37 | #define SKIN_REFRESH_SHIFT 16 | 36 | #define SKIN_REFRESH_SHIFT 16 |
@@ -214,6 +213,8 @@ enum skin_token_type { | |||
214 | SKIN_TOKEN_BUTTON_VOLUME, | 213 | SKIN_TOKEN_BUTTON_VOLUME, |
215 | SKIN_TOKEN_LASTTOUCH, | 214 | SKIN_TOKEN_LASTTOUCH, |
216 | SKIN_TOKEN_TOUCHREGION, | 215 | SKIN_TOKEN_TOUCHREGION, |
216 | SKIN_TOKEN_HAVE_TOUCH, | ||
217 | |||
217 | /* Virtual LED */ | 218 | /* Virtual LED */ |
218 | SKIN_TOKEN_VLED_HDD, | 219 | SKIN_TOKEN_VLED_HDD, |
219 | /* Volume level */ | 220 | /* Volume level */ |