summaryrefslogtreecommitdiff
path: root/apps/gui/skin_engine/skin_parser.c
diff options
context:
space:
mode:
Diffstat (limited to 'apps/gui/skin_engine/skin_parser.c')
-rw-r--r--apps/gui/skin_engine/skin_parser.c111
1 files changed, 106 insertions, 5 deletions
diff --git a/apps/gui/skin_engine/skin_parser.c b/apps/gui/skin_engine/skin_parser.c
index 468f6808c4..2370a38eab 100644
--- a/apps/gui/skin_engine/skin_parser.c
+++ b/apps/gui/skin_engine/skin_parser.c
@@ -119,7 +119,7 @@ static void add_to_ll_chain(struct skin_token_list **list, struct skin_token_lis
119 119
120 120
121void *skin_find_item(const char *label, enum skin_find_what what, 121void *skin_find_item(const char *label, enum skin_find_what what,
122 struct wps_data *data) 122 struct wps_data *data)
123{ 123{
124 const char *itemlabel = NULL; 124 const char *itemlabel = NULL;
125 union { 125 union {
@@ -145,6 +145,11 @@ void *skin_find_item(const char *label, enum skin_find_what what,
145 list.linkedlist = data->touchregions; 145 list.linkedlist = data->touchregions;
146 break; 146 break;
147#endif 147#endif
148#ifdef HAVE_SKIN_VARIABLES
149 case SKIN_VARIABLE:
150 list.linkedlist = data->skinvars;
151 break;
152#endif
148 } 153 }
149 154
150 while (list.linkedlist) 155 while (list.linkedlist)
@@ -171,6 +176,13 @@ void *skin_find_item(const char *label, enum skin_find_what what,
171 itemlabel = ((struct touchregion *)ret)->label; 176 itemlabel = ((struct touchregion *)ret)->label;
172 break; 177 break;
173#endif 178#endif
179#ifdef HAVE_SKIN_VARIABLES
180 case SKIN_VARIABLE:
181 ret = list.linkedlist->token->value.data;
182 itemlabel = ((struct skin_var *)ret)->label;
183 break;
184#endif
185
174 } 186 }
175 if (!skip && itemlabel && !strcmp(itemlabel, label)) 187 if (!skip && itemlabel && !strcmp(itemlabel, label))
176 return ret; 188 return ret;
@@ -718,7 +730,7 @@ static int parse_progressbar_tag(struct skin_element* element,
718 curr_param++; 730 curr_param++;
719 param++; 731 param++;
720 pb->slider = skin_find_item(param->data.text, 732 pb->slider = skin_find_item(param->data.text,
721 SKIN_FIND_IMAGE, wps_data); 733 SKIN_FIND_IMAGE, wps_data);
722 } 734 }
723 else /* option needs the next param */ 735 else /* option needs the next param */
724 return -1; 736 return -1;
@@ -742,7 +754,7 @@ static int parse_progressbar_tag(struct skin_element* element,
742 curr_param++; 754 curr_param++;
743 param++; 755 param++;
744 pb->backdrop = skin_find_item(param->data.text, 756 pb->backdrop = skin_find_item(param->data.text,
745 SKIN_FIND_IMAGE, wps_data); 757 SKIN_FIND_IMAGE, wps_data);
746 758
747 } 759 }
748 else /* option needs the next param */ 760 else /* option needs the next param */
@@ -915,7 +927,86 @@ static int parse_albumart_load(struct skin_element* element,
915} 927}
916 928
917#endif /* HAVE_ALBUMART */ 929#endif /* HAVE_ALBUMART */
918 930#ifdef HAVE_SKIN_VARIABLES
931static struct skin_var* find_or_add_var(const char* label,
932 struct wps_data *data)
933{
934 struct skin_var* ret = skin_find_item(label, SKIN_VARIABLE, data);
935 if (!ret)
936 {
937 ret = (struct skin_var*)skin_buffer_alloc(sizeof(struct skin_var));
938 if (!ret)
939 return NULL;
940 ret->label = label;
941 ret->value = 1;
942 ret->last_changed = 0xffff;
943 struct skin_token_list *item = new_skin_token_list_item(NULL, ret);
944 if (!item)
945 return NULL;
946 add_to_ll_chain(&data->skinvars, item);
947 }
948 return ret;
949}
950static int parse_skinvar( struct skin_element *element,
951 struct wps_token *token,
952 struct wps_data *wps_data)
953{
954 const char* label = element->params[0].data.text;
955 struct skin_var* var = find_or_add_var(label, wps_data);
956 if (!var)
957 return WPS_ERROR_INVALID_PARAM;
958 switch (token->type)
959 {
960 case SKIN_TOKEN_VAR_GETVAL:
961 token->value.data = var;
962 break;
963 case SKIN_TOKEN_VAR_SET:
964 {
965 struct skin_var_changer *data =
966 (struct skin_var_changer*)skin_buffer_alloc(
967 sizeof(struct skin_var_changer));
968 if (!data)
969 return WPS_ERROR_INVALID_PARAM;
970 data->var = var;
971 data->newval = element->params[2].data.number;
972 data->max = 0;
973 if (!strcmp(element->params[1].data.text, "set"))
974 data->direct = true;
975 else if (!strcmp(element->params[1].data.text, "inc"))
976 {
977 data->direct = false;
978 }
979 else if (!strcmp(element->params[1].data.text, "dec"))
980 {
981 data->direct = false;
982 data->newval *= -1;
983 }
984 if (element->params_count > 3)
985 data->max = element->params[3].data.number;
986 token->value.data = data;
987 }
988 break;
989 case SKIN_TOKEN_VAR_TIMEOUT:
990 {
991 struct skin_var_lastchange *data =
992 (struct skin_var_lastchange*)skin_buffer_alloc(
993 sizeof(struct skin_var_lastchange));
994 if (!data)
995 return WPS_ERROR_INVALID_PARAM;
996 data->var = var;
997 data->timeout = 10;
998 if (element->params_count > 1)
999 data->timeout = element->params[1].data.number;
1000 data->timeout *= TIMEOUT_UNIT;
1001 token->value.data = data;
1002 }
1003 break;
1004 default: /* kill the warning */
1005 break;
1006 }
1007 return 0;
1008}
1009#endif /* HAVE_SKIN_VARIABLES */
919#ifdef HAVE_TOUCHSCREEN 1010#ifdef HAVE_TOUCHSCREEN
920static int parse_lasttouch(struct skin_element *element, 1011static int parse_lasttouch(struct skin_element *element,
921 struct wps_token *token, 1012 struct wps_token *token,
@@ -934,7 +1025,7 @@ static int parse_lasttouch(struct skin_element *element,
934 { 1025 {
935 if (element->params[i].type == STRING) 1026 if (element->params[i].type == STRING)
936 data->region = skin_find_item(element->params[i].data.text, 1027 data->region = skin_find_item(element->params[i].data.text,
937 SKIN_FIND_TOUCHREGION, wps_data); 1028 SKIN_FIND_TOUCHREGION, wps_data);
938 else if (element->params[i].type == INTEGER) 1029 else if (element->params[i].type == INTEGER)
939 data->timeout = element->params[i].data.number; 1030 data->timeout = element->params[i].data.number;
940 } 1031 }
@@ -1217,6 +1308,9 @@ static void skin_data_reset(struct wps_data *wps_data)
1217#ifdef HAVE_TOUCHSCREEN 1308#ifdef HAVE_TOUCHSCREEN
1218 wps_data->touchregions = NULL; 1309 wps_data->touchregions = NULL;
1219#endif 1310#endif
1311#ifdef HAVE_SKIN_VARIABLES
1312 wps_data->skinvars = NULL;
1313#endif
1220#ifdef HAVE_ALBUMART 1314#ifdef HAVE_ALBUMART
1221 wps_data->albumart = NULL; 1315 wps_data->albumart = NULL;
1222 if (wps_data->playback_aa_slot >= 0) 1316 if (wps_data->playback_aa_slot >= 0)
@@ -1632,6 +1726,13 @@ static int skin_element_callback(struct skin_element* element, void* data)
1632 function = parse_albumart_load; 1726 function = parse_albumart_load;
1633 break; 1727 break;
1634#endif 1728#endif
1729#ifdef HAVE_SKIN_VARIABLES
1730 case SKIN_TOKEN_VAR_SET:
1731 case SKIN_TOKEN_VAR_GETVAL:
1732 case SKIN_TOKEN_VAR_TIMEOUT:
1733 function = parse_skinvar;
1734 break;
1735#endif
1635 default: 1736 default:
1636 break; 1737 break;
1637 } 1738 }