summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorJonathan Gordon <rockbox@jdgordon.info>2010-10-28 11:00:36 +0000
committerJonathan Gordon <rockbox@jdgordon.info>2010-10-28 11:00:36 +0000
commit943de3ce49e3ff4bbdefa7459dbc3b885fe145ad (patch)
tree4d0791456aa944700570e7207f6f8717e8c1a667 /lib
parentdb2a8ffd30f3c1b5a17f318d4acbbeab54bab4c3 (diff)
downloadrockbox-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')
-rw-r--r--lib/skin_parser/skin_parser.c14
-rw-r--r--lib/skin_parser/tag_table.c7
-rw-r--r--lib/skin_parser/tag_table.h7
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 */