diff options
-rw-r--r-- | apps/gui/gwps-common.c | 48 | ||||
-rw-r--r-- | apps/gui/gwps.h | 5 | ||||
-rw-r--r-- | apps/gui/wps_parser.c | 38 | ||||
-rw-r--r-- | manual/appendix/wps_tags.tex | 9 |
4 files changed, 99 insertions, 1 deletions
diff --git a/apps/gui/gwps-common.c b/apps/gui/gwps-common.c index a0e09b8117..bcaebc502b 100644 --- a/apps/gui/gwps-common.c +++ b/apps/gui/gwps-common.c | |||
@@ -26,6 +26,7 @@ | |||
26 | #include <stdlib.h> | 26 | #include <stdlib.h> |
27 | #include "system.h" | 27 | #include "system.h" |
28 | #include "settings.h" | 28 | #include "settings.h" |
29 | #include "settings_list.h" | ||
29 | #include "rbunicode.h" | 30 | #include "rbunicode.h" |
30 | #include "rtc.h" | 31 | #include "rtc.h" |
31 | #include "audio.h" | 32 | #include "audio.h" |
@@ -1402,6 +1403,53 @@ static const char *get_token_value(struct gui_wps *gwps, | |||
1402 | token->value.i * TIMEOUT_UNIT)) | 1403 | token->value.i * TIMEOUT_UNIT)) |
1403 | return "v"; | 1404 | return "v"; |
1404 | return NULL; | 1405 | return NULL; |
1406 | |||
1407 | case WPS_TOKEN_SETTING: | ||
1408 | { | ||
1409 | if (intval) | ||
1410 | { | ||
1411 | /* Handle contionals */ | ||
1412 | const struct settings_list *s = settings+token->value.i; | ||
1413 | switch (s->flags&F_T_MASK) | ||
1414 | { | ||
1415 | case F_T_INT: | ||
1416 | case F_T_UINT: | ||
1417 | if (s->flags&F_RGB) | ||
1418 | /* %?St|name|<#000000|#000001|...|#FFFFFF> */ | ||
1419 | /* shouldn't overflow since colors are stored | ||
1420 | * on 16 bits ... | ||
1421 | * but this is pretty useless anyway */ | ||
1422 | *intval = *(int*)s->setting + 1; | ||
1423 | else if (s->cfg_vals == NULL) | ||
1424 | /* %?St|name|<1st choice|2nd choice|...> */ | ||
1425 | *intval = (*(int*)s->setting-s->int_setting->min) | ||
1426 | /s->int_setting->step + 1; | ||
1427 | else | ||
1428 | /* %?St|name|<1st choice|2nd choice|...> */ | ||
1429 | /* Not sure about this one. cfg_name/vals are | ||
1430 | * indexed from 0 right? */ | ||
1431 | *intval = *(int*)s->setting + 1; | ||
1432 | break; | ||
1433 | case F_T_BOOL: | ||
1434 | /* %?St|name|<if true|if false> */ | ||
1435 | *intval = *(bool*)s->setting?1:2; | ||
1436 | break; | ||
1437 | case F_T_CHARPTR: | ||
1438 | /* %?St|name|<if non empty string|if empty> | ||
1439 | * The string's emptyness discards the setting's | ||
1440 | * prefix and suffix */ | ||
1441 | *intval = ((char*)s->setting)[0]?1:2; | ||
1442 | break; | ||
1443 | default: | ||
1444 | /* This shouldn't happen ... but you never know */ | ||
1445 | *intval = -1; | ||
1446 | break; | ||
1447 | } | ||
1448 | } | ||
1449 | cfg_to_string(token->value.i,buf,buf_size); | ||
1450 | return buf; | ||
1451 | } | ||
1452 | |||
1405 | default: | 1453 | default: |
1406 | return NULL; | 1454 | return NULL; |
1407 | } | 1455 | } |
diff --git a/apps/gui/gwps.h b/apps/gui/gwps.h index ff402a73a9..4cffb0de2c 100644 --- a/apps/gui/gwps.h +++ b/apps/gui/gwps.h | |||
@@ -292,7 +292,10 @@ enum wps_token_type { | |||
292 | WPS_VIEWPORT_ENABLE, | 292 | WPS_VIEWPORT_ENABLE, |
293 | 293 | ||
294 | /* buttons */ | 294 | /* buttons */ |
295 | WPS_TOKEN_BUTTON_VOLUME | 295 | WPS_TOKEN_BUTTON_VOLUME, |
296 | |||
297 | /* Setting option */ | ||
298 | WPS_TOKEN_SETTING, | ||
296 | }; | 299 | }; |
297 | 300 | ||
298 | struct wps_token { | 301 | struct wps_token { |
diff --git a/apps/gui/wps_parser.c b/apps/gui/wps_parser.c index 88601fd9eb..22b161155e 100644 --- a/apps/gui/wps_parser.c +++ b/apps/gui/wps_parser.c | |||
@@ -56,6 +56,7 @@ | |||
56 | 56 | ||
57 | #include "gwps.h" | 57 | #include "gwps.h" |
58 | #include "settings.h" | 58 | #include "settings.h" |
59 | #include "settings_list.h" | ||
59 | 60 | ||
60 | #ifdef HAVE_LCD_BITMAP | 61 | #ifdef HAVE_LCD_BITMAP |
61 | #include "bmp.h" | 62 | #include "bmp.h" |
@@ -137,6 +138,8 @@ static int parse_progressbar(const char *wps_bufptr, | |||
137 | struct wps_token *token, struct wps_data *wps_data); | 138 | struct wps_token *token, struct wps_data *wps_data); |
138 | static int parse_dir_level(const char *wps_bufptr, | 139 | static int parse_dir_level(const char *wps_bufptr, |
139 | struct wps_token *token, struct wps_data *wps_data); | 140 | struct wps_token *token, struct wps_data *wps_data); |
141 | static int parse_setting(const char *wps_bufptr, | ||
142 | struct wps_token *token, struct wps_data *wps_data); | ||
140 | 143 | ||
141 | #ifdef HAVE_LCD_BITMAP | 144 | #ifdef HAVE_LCD_BITMAP |
142 | static int parse_viewport_display(const char *wps_bufptr, | 145 | static int parse_viewport_display(const char *wps_bufptr, |
@@ -342,6 +345,8 @@ static const struct wps_tag all_tags[] = { | |||
342 | #endif | 345 | #endif |
343 | #endif | 346 | #endif |
344 | 347 | ||
348 | { WPS_TOKEN_SETTING, "St", WPS_REFRESH_DYNAMIC, parse_setting }, | ||
349 | |||
345 | { WPS_TOKEN_UNKNOWN, "", 0, NULL } | 350 | { WPS_TOKEN_UNKNOWN, "", 0, NULL } |
346 | /* the array MUST end with an empty string (first char is \0) */ | 351 | /* the array MUST end with an empty string (first char is \0) */ |
347 | }; | 352 | }; |
@@ -726,6 +731,39 @@ static int parse_viewport(const char *wps_bufptr, | |||
726 | return skip_end_of_line(wps_bufptr); | 731 | return skip_end_of_line(wps_bufptr); |
727 | } | 732 | } |
728 | 733 | ||
734 | static int parse_setting(const char *wps_bufptr, | ||
735 | struct wps_token *token, | ||
736 | struct wps_data *wps_data) | ||
737 | { | ||
738 | (void)wps_data; | ||
739 | const char *ptr = wps_bufptr; | ||
740 | const char *end; | ||
741 | int i; | ||
742 | |||
743 | /* Find the setting's cfg_name */ | ||
744 | if (*ptr != '|') | ||
745 | return WPS_ERROR_INVALID_PARAM; | ||
746 | ptr++; | ||
747 | end = strchr(ptr,'|'); | ||
748 | if (!end) | ||
749 | return WPS_ERROR_INVALID_PARAM; | ||
750 | |||
751 | /* Find the setting */ | ||
752 | for (i=0; i<nb_settings; i++) | ||
753 | if (settings[i].cfg_name && | ||
754 | !strncmp(settings[i].cfg_name,ptr,end-ptr) && | ||
755 | /* prevent matches on cfg_name prefixes */ | ||
756 | strlen(settings[i].cfg_name)==end-ptr) break; | ||
757 | if (i == nb_settings) | ||
758 | return WPS_ERROR_INVALID_PARAM; | ||
759 | |||
760 | /* Store the setting number */ | ||
761 | token->value.i = i; | ||
762 | |||
763 | /* Skip the rest of the line */ | ||
764 | return end-ptr+2; | ||
765 | } | ||
766 | |||
729 | 767 | ||
730 | #if (LCD_DEPTH > 1) || (defined(HAVE_REMOTE_LCD) && (LCD_REMOTE_DEPTH > 1)) | 768 | #if (LCD_DEPTH > 1) || (defined(HAVE_REMOTE_LCD) && (LCD_REMOTE_DEPTH > 1)) |
731 | static int parse_image_special(const char *wps_bufptr, | 769 | static int parse_image_special(const char *wps_bufptr, |
diff --git a/manual/appendix/wps_tags.tex b/manual/appendix/wps_tags.tex index 016bf2833e..df43984c6c 100644 --- a/manual/appendix/wps_tags.tex +++ b/manual/appendix/wps_tags.tex | |||
@@ -192,6 +192,15 @@ The example above will display the text ``Volume changing'' if the volume is | |||
192 | being changed and 2.5 secs after the volume button has been released. After | 192 | being changed and 2.5 secs after the volume button has been released. After |
193 | that, it will display the volume value. | 193 | that, it will display the volume value. |
194 | 194 | ||
195 | \section{Settings} | ||
196 | \begin{table} | ||
197 | \begin{tagmap}{}{} | ||
198 | \config{\%St{\textbar}<setting name>{\textbar}} & Display the value of any Rockbox setting\\ | ||
199 | \end{tagmap} | ||
200 | \end{table} | ||
201 | Example: Can be used as a simple tag \config{\%St{\textbar}skip length{\textbar}} or with conditionals | ||
202 | \config{\%?St{\textbar}eq enabled{\textbar}{\textless}Equalizer is enabled{\textbar}Equalizer is disabled{\textgreater}}. | ||
203 | |||
195 | \section{Images} | 204 | \section{Images} |
196 | \begin{table} | 205 | \begin{table} |
197 | \begin{tagmap}{}{} | 206 | \begin{tagmap}{}{} |