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.c264
1 files changed, 121 insertions, 143 deletions
diff --git a/apps/gui/skin_engine/skin_parser.c b/apps/gui/skin_engine/skin_parser.c
index a2a360de0e..d2ded0c33a 100644
--- a/apps/gui/skin_engine/skin_parser.c
+++ b/apps/gui/skin_engine/skin_parser.c
@@ -191,7 +191,7 @@ void *skin_find_item(const char *label, enum skin_find_what what,
191 break; 191 break;
192#endif 192#endif
193 } 193 }
194 194
195 while (list.linkedlist) 195 while (list.linkedlist)
196 { 196 {
197 bool skip = false; 197 bool skip = false;
@@ -209,7 +209,7 @@ void *skin_find_item(const char *label, enum skin_find_what what,
209 itemlabel = VP_DEFAULT_LABEL_STRING; 209 itemlabel = VP_DEFAULT_LABEL_STRING;
210 else 210 else
211 itemlabel = SKINOFFSETTOPTR(skin_buffer, ((struct skin_viewport *)ret)->label); 211 itemlabel = SKINOFFSETTOPTR(skin_buffer, ((struct skin_viewport *)ret)->label);
212 skip = !(((struct skin_viewport *)ret)->is_infovp == 212 skip = !(((struct skin_viewport *)ret)->is_infovp ==
213 (what==SKIN_FIND_UIVP)); 213 (what==SKIN_FIND_UIVP));
214 break; 214 break;
215#ifdef HAVE_LCD_BITMAP 215#ifdef HAVE_LCD_BITMAP
@@ -230,7 +230,7 @@ void *skin_find_item(const char *label, enum skin_find_what what,
230 itemlabel = SKINOFFSETTOPTR(skin_buffer, ((struct skin_var *)ret)->label); 230 itemlabel = SKINOFFSETTOPTR(skin_buffer, ((struct skin_var *)ret)->label);
231 break; 231 break;
232#endif 232#endif
233 233
234 } 234 }
235 if (!skip && itemlabel && !strcmp(itemlabel, label)) 235 if (!skip && itemlabel && !strcmp(itemlabel, label))
236 { 236 {
@@ -238,7 +238,7 @@ void *skin_find_item(const char *label, enum skin_find_what what,
238 skin_buffer = old_skin_buffer; 238 skin_buffer = old_skin_buffer;
239 return ret; 239 return ret;
240 } 240 }
241 241
242 if (isvplist) 242 if (isvplist)
243 list.vplist = SKINOFFSETTOPTR(skin_buffer, list.vplist->next); 243 list.vplist = SKINOFFSETTOPTR(skin_buffer, list.vplist->next);
244 else 244 else
@@ -259,10 +259,9 @@ void *skin_find_item(const char *label, enum skin_find_what what,
259static struct skin_token_list *new_skin_token_list_item(struct wps_token *token, 259static struct skin_token_list *new_skin_token_list_item(struct wps_token *token,
260 void* token_data) 260 void* token_data)
261{ 261{
262 struct skin_token_list *llitem = 262 struct skin_token_list *llitem = skin_buffer_alloc(sizeof(*llitem));
263 (struct skin_token_list *)skin_buffer_alloc(sizeof(struct skin_token_list));
264 if (!token) 263 if (!token)
265 token = (struct wps_token*)skin_buffer_alloc(sizeof(struct wps_token)); 264 token = skin_buffer_alloc(sizeof(*token));
266 if (!llitem || !token) 265 if (!llitem || !token)
267 return NULL; 266 return NULL;
268 llitem->next = PTRTOSKINOFFSET(skin_buffer, NULL); 267 llitem->next = PTRTOSKINOFFSET(skin_buffer, NULL);
@@ -308,7 +307,7 @@ static int parse_statusbar_tags(struct skin_element* element,
308 } 307 }
309 return 0; 308 return 0;
310} 309}
311 310
312static int get_image_id(int c) 311static int get_image_id(int c)
313{ 312{
314 if(c >= 'a' && c <= 'z') 313 if(c >= 'a' && c <= 'z')
@@ -323,7 +322,7 @@ char *get_image_filename(const char *start, const char* bmpdir,
323 char *buf, int buf_size) 322 char *buf, int buf_size)
324{ 323{
325 snprintf(buf, buf_size, "%s/%s", bmpdir, start); 324 snprintf(buf, buf_size, "%s/%s", bmpdir, start);
326 325
327 return buf; 326 return buf;
328} 327}
329 328
@@ -335,7 +334,7 @@ static int parse_image_display(struct skin_element *element,
335 char sublabel = '\0'; 334 char sublabel = '\0';
336 int subimage; 335 int subimage;
337 struct gui_img *img; 336 struct gui_img *img;
338 struct image_display *id = skin_buffer_alloc(sizeof(struct image_display)); 337 struct image_display *id = skin_buffer_alloc(sizeof(*id));
339 338
340 if (element->params_count == 1 && strlen(label) <= 2) 339 if (element->params_count == 1 && strlen(label) <= 2)
341 { 340 {
@@ -356,7 +355,7 @@ static int parse_image_display(struct skin_element *element,
356 { 355 {
357 token->type = SKIN_TOKEN_IMAGE_DISPLAY_LISTICON; 356 token->type = SKIN_TOKEN_IMAGE_DISPLAY_LISTICON;
358 } 357 }
359 358
360 if (element->params_count > 1) 359 if (element->params_count > 1)
361 { 360 {
362 if (get_param(element, 1)->type == CODE) 361 if (get_param(element, 1)->type == CODE)
@@ -418,7 +417,7 @@ static int parse_image_load(struct skin_element *element,
418 /* Invalid image ID */ 417 /* Invalid image ID */
419 return WPS_ERROR_INVALID_PARAM; 418 return WPS_ERROR_INVALID_PARAM;
420 } 419 }
421 img = (struct gui_img*)skin_buffer_alloc(sizeof(struct gui_img)); 420 img = skin_buffer_alloc(sizeof(*img));
422 if (!img) 421 if (!img)
423 return WPS_ERROR_INVALID_PARAM; 422 return WPS_ERROR_INVALID_PARAM;
424 /* save a pointer to the filename */ 423 /* save a pointer to the filename */
@@ -442,9 +441,8 @@ static int parse_image_load(struct skin_element *element,
442 img->num_subimages = Icon_Last_Themeable; 441 img->num_subimages = Icon_Last_Themeable;
443 img->using_preloaded_icons = true; 442 img->using_preloaded_icons = true;
444 } 443 }
445 444
446 struct skin_token_list *item = 445 struct skin_token_list *item = new_skin_token_list_item(NULL, img);
447 (struct skin_token_list *)new_skin_token_list_item(NULL, img);
448 if (!item) 446 if (!item)
449 return WPS_ERROR_INVALID_PARAM; 447 return WPS_ERROR_INVALID_PARAM;
450 add_to_ll_chain(&wps_data->images, item); 448 add_to_ll_chain(&wps_data->images, item);
@@ -466,14 +464,14 @@ static int parse_font_load(struct skin_element *element,
466 char *filename = get_param_text(element, 1); 464 char *filename = get_param_text(element, 1);
467 int glyphs; 465 int glyphs;
468 char *ptr; 466 char *ptr;
469 467
470 if(element->params_count > 2) 468 if(element->params_count > 2)
471 glyphs = get_param(element, 2)->data.number; 469 glyphs = get_param(element, 2)->data.number;
472 else 470 else
473 glyphs = global_settings.glyphs_to_cache; 471 glyphs = global_settings.glyphs_to_cache;
474 if (id < 2) 472 if (id < 2)
475 { 473 {
476 DEBUGF("font id must be >= 2\n"); 474 DEBUGF("font id must be >= 2 (%d)\n", id);
477 return 1; 475 return 1;
478 } 476 }
479#if defined(DEBUG) || defined(SIMULATOR) 477#if defined(DEBUG) || defined(SIMULATOR)
@@ -482,7 +480,7 @@ static int parse_font_load(struct skin_element *element,
482 DEBUGF("font id %d already being used\n", id); 480 DEBUGF("font id %d already being used\n", id);
483 } 481 }
484#endif 482#endif
485 /* make sure the filename contains .fnt, 483 /* make sure the filename contains .fnt,
486 * we dont actually use it, but require it anyway */ 484 * we dont actually use it, but require it anyway */
487 ptr = strchr(filename, '.'); 485 ptr = strchr(filename, '.');
488 if (!ptr || strncmp(ptr, ".fnt", 4)) 486 if (!ptr || strncmp(ptr, ".fnt", 4))
@@ -502,17 +500,16 @@ static int parse_playlistview(struct skin_element *element,
502 struct wps_data *wps_data) 500 struct wps_data *wps_data)
503{ 501{
504 (void)wps_data; 502 (void)wps_data;
505 struct playlistviewer *viewer = 503 struct playlistviewer *viewer = skin_buffer_alloc(sizeof(*viewer));
506 (struct playlistviewer *)skin_buffer_alloc(sizeof(struct playlistviewer));
507 if (!viewer) 504 if (!viewer)
508 return WPS_ERROR_INVALID_PARAM; 505 return WPS_ERROR_INVALID_PARAM;
509 viewer->vp = PTRTOSKINOFFSET(skin_buffer, &curr_vp->vp); 506 viewer->vp = PTRTOSKINOFFSET(skin_buffer, &curr_vp->vp);
510 viewer->show_icons = true; 507 viewer->show_icons = true;
511 viewer->start_offset = get_param(element, 0)->data.number; 508 viewer->start_offset = get_param(element, 0)->data.number;
512 viewer->line = PTRTOSKINOFFSET(skin_buffer, get_param_code(element, 1)); 509 viewer->line = PTRTOSKINOFFSET(skin_buffer, get_param_code(element, 1));
513 510
514 token->value.data = PTRTOSKINOFFSET(skin_buffer, (void*)viewer); 511 token->value.data = PTRTOSKINOFFSET(skin_buffer, (void*)viewer);
515 512
516 return 0; 513 return 0;
517} 514}
518#endif 515#endif
@@ -525,7 +522,7 @@ static int parse_viewport_gradient_setup(struct skin_element *element,
525 struct gradient_config *cfg; 522 struct gradient_config *cfg;
526 if (element->params_count < 2) /* only start and end are required */ 523 if (element->params_count < 2) /* only start and end are required */
527 return 1; 524 return 1;
528 cfg = (struct gradient_config *)skin_buffer_alloc(sizeof(struct gradient_config)); 525 cfg = skin_buffer_alloc(sizeof(*cfg));
529 if (!cfg) 526 if (!cfg)
530 return 1; 527 return 1;
531 if (!parse_color(curr_screen, get_param_text(element, 0), &cfg->start) || 528 if (!parse_color(curr_screen, get_param_text(element, 0), &cfg->start) ||
@@ -542,7 +539,7 @@ static int parse_viewport_gradient_setup(struct skin_element *element,
542 } 539 }
543 540
544 token->value.data = PTRTOSKINOFFSET(skin_buffer, cfg); 541 token->value.data = PTRTOSKINOFFSET(skin_buffer, cfg);
545 return 0; 542 return 0;
546} 543}
547#endif 544#endif
548 545
@@ -551,7 +548,7 @@ static int parse_listitem(struct skin_element *element,
551 struct wps_data *wps_data) 548 struct wps_data *wps_data)
552{ 549{
553 (void)wps_data; 550 (void)wps_data;
554 struct listitem *li = (struct listitem *)skin_buffer_alloc(sizeof(struct listitem)); 551 struct listitem *li = skin_buffer_alloc(sizeof(*li));
555 if (!li) 552 if (!li)
556 return 1; 553 return 1;
557 token->value.data = PTRTOSKINOFFSET(skin_buffer, li); 554 token->value.data = PTRTOSKINOFFSET(skin_buffer, li);
@@ -573,9 +570,7 @@ static int parse_listitemviewport(struct skin_element *element,
573 struct wps_data *wps_data) 570 struct wps_data *wps_data)
574{ 571{
575#ifndef __PCTOOL__ 572#ifndef __PCTOOL__
576 struct listitem_viewport_cfg *cfg = 573 struct listitem_viewport_cfg *cfg = skin_buffer_alloc(sizeof(*cfg));
577 (struct listitem_viewport_cfg *)skin_buffer_alloc(
578 sizeof(struct listitem_viewport_cfg));
579 if (!cfg) 574 if (!cfg)
580 return -1; 575 return -1;
581 cfg->data = wps_data; 576 cfg->data = wps_data;
@@ -604,7 +599,7 @@ static int parse_viewporttextstyle(struct skin_element *element,
604 int style; 599 int style;
605 char *mode = get_param_text(element, 0); 600 char *mode = get_param_text(element, 0);
606 unsigned colour; 601 unsigned colour;
607 602
608 if (!strcmp(mode, "invert")) 603 if (!strcmp(mode, "invert"))
609 { 604 {
610 style = STYLE_INVERT; 605 style = STYLE_INVERT;
@@ -614,7 +609,7 @@ static int parse_viewporttextstyle(struct skin_element *element,
614 if (element->params_count < 2 || 609 if (element->params_count < 2 ||
615 !parse_color(curr_screen, get_param_text(element, 1), &colour)) 610 !parse_color(curr_screen, get_param_text(element, 1), &colour))
616 return 1; 611 return 1;
617 style = STYLE_COLORED|(STYLE_COLOR_MASK&colour); 612 style = STYLE_COLORED|(STYLE_COLOR_MASK&colour);
618 } 613 }
619#ifdef HAVE_LCD_COLOR 614#ifdef HAVE_LCD_COLOR
620 else if (!strcmp(mode, "gradient")) 615 else if (!strcmp(mode, "gradient"))
@@ -644,8 +639,7 @@ static int parse_drawrectangle( struct skin_element *element,
644 struct wps_data *wps_data) 639 struct wps_data *wps_data)
645{ 640{
646 (void)wps_data; 641 (void)wps_data;
647 struct draw_rectangle *rect = 642 struct draw_rectangle *rect = skin_buffer_alloc(sizeof(*rect));
648 (struct draw_rectangle *)skin_buffer_alloc(sizeof(struct draw_rectangle));
649 643
650 if (!rect) 644 if (!rect)
651 return -1; 645 return -1;
@@ -657,7 +651,7 @@ static int parse_drawrectangle( struct skin_element *element,
657 rect->width = curr_vp->vp.width - rect->x; 651 rect->width = curr_vp->vp.width - rect->x;
658 else 652 else
659 rect->width = get_param(element, 2)->data.number; 653 rect->width = get_param(element, 2)->data.number;
660 654
661 if (isdefault(get_param(element, 3))) 655 if (isdefault(get_param(element, 3)))
662 rect->height = curr_vp->vp.height - rect->y; 656 rect->height = curr_vp->vp.height - rect->y;
663 else 657 else
@@ -683,15 +677,14 @@ static int parse_drawrectangle( struct skin_element *element,
683 677
684 return 0; 678 return 0;
685} 679}
686 680
687static int parse_viewportcolour(struct skin_element *element, 681static int parse_viewportcolour(struct skin_element *element,
688 struct wps_token *token, 682 struct wps_token *token,
689 struct wps_data *wps_data) 683 struct wps_data *wps_data)
690{ 684{
691 (void)wps_data; 685 (void)wps_data;
692 struct skin_tag_parameter *param = get_param(element, 0); 686 struct skin_tag_parameter *param = get_param(element, 0);
693 struct viewport_colour *colour = 687 struct viewport_colour *colour = skin_buffer_alloc(sizeof(*colour));
694 (struct viewport_colour *)skin_buffer_alloc(sizeof(struct viewport_colour));
695 if (!colour) 688 if (!colour)
696 return -1; 689 return -1;
697 if (isdefault(param)) 690 if (isdefault(param))
@@ -761,13 +754,13 @@ static int parse_setting_and_lang(struct skin_element *element,
761{ 754{
762 /* NOTE: both the string validations that happen in here will 755 /* NOTE: both the string validations that happen in here will
763 * automatically PASS on checkwps because its too hard to get 756 * automatically PASS on checkwps because its too hard to get
764 * settings_list.c and english.lang built for it. 757 * settings_list.c and english.lang built for it.
765 * If that ever changes remove the #ifndef __PCTOOL__'s here 758 * If that ever changes remove the #ifndef __PCTOOL__'s here
766 */ 759 */
767 (void)wps_data; 760 (void)wps_data;
768 char *temp = get_param_text(element, 0); 761 char *temp = get_param_text(element, 0);
769 int i; 762 int i;
770 763
771 if (token->type == SKIN_TOKEN_TRANSLATEDSTRING) 764 if (token->type == SKIN_TOKEN_TRANSLATEDSTRING)
772 { 765 {
773#ifndef __PCTOOL__ 766#ifndef __PCTOOL__
@@ -803,12 +796,12 @@ static int parse_logical_if(struct skin_element *element,
803{ 796{
804 (void)wps_data; 797 (void)wps_data;
805 char *op = get_param_text(element, 1); 798 char *op = get_param_text(element, 1);
806 struct logical_if *lif = skin_buffer_alloc(sizeof(struct logical_if)); 799 struct logical_if *lif = skin_buffer_alloc(sizeof(*lif));
807 if (!lif) 800 if (!lif)
808 return -1; 801 return -1;
809 token->value.data = PTRTOSKINOFFSET(skin_buffer, lif); 802 token->value.data = PTRTOSKINOFFSET(skin_buffer, lif);
810 lif->token = get_param_code(element, 0)->data; 803 lif->token = get_param_code(element, 0)->data;
811 804
812 if (!strncmp(op, "=", 1)) 805 if (!strncmp(op, "=", 1))
813 lif->op = IF_EQUALS; 806 lif->op = IF_EQUALS;
814 else if (!strncmp(op, "!=", 2)) 807 else if (!strncmp(op, "!=", 2))
@@ -821,14 +814,14 @@ static int parse_logical_if(struct skin_element *element,
821 lif->op = IF_GREATERTHAN; 814 lif->op = IF_GREATERTHAN;
822 else if (!strncmp(op, "<", 1)) 815 else if (!strncmp(op, "<", 1))
823 lif->op = IF_LESSTHAN; 816 lif->op = IF_LESSTHAN;
824 817
825 memcpy(&lif->operand, get_param(element, 2), sizeof(lif->operand)); 818 memcpy(&lif->operand, get_param(element, 2), sizeof(lif->operand));
826 if (element->params_count > 3) 819 if (element->params_count > 3)
827 lif->num_options = get_param(element, 3)->data.number; 820 lif->num_options = get_param(element, 3)->data.number;
828 else 821 else
829 lif->num_options = TOKEN_VALUE_ONLY; 822 lif->num_options = TOKEN_VALUE_ONLY;
830 return 0; 823 return 0;
831 824
832} 825}
833 826
834static int parse_timeout_tag(struct skin_element *element, 827static int parse_timeout_tag(struct skin_element *element,
@@ -863,7 +856,7 @@ static int parse_substring_tag(struct skin_element* element,
863 struct wps_data *wps_data) 856 struct wps_data *wps_data)
864{ 857{
865 (void)wps_data; 858 (void)wps_data;
866 struct substring *ss = (struct substring*)skin_buffer_alloc(sizeof(struct substring)); 859 struct substring *ss = skin_buffer_alloc(sizeof(*ss));
867 if (!ss) 860 if (!ss)
868 return 1; 861 return 1;
869 ss->start = get_param(element, 0)->data.number; 862 ss->start = get_param(element, 0)->data.number;
@@ -890,14 +883,14 @@ static int parse_progressbar_tag(struct skin_element* element,
890 struct skin_tag_parameter *param = get_param(element, 0); 883 struct skin_tag_parameter *param = get_param(element, 0);
891 int curr_param = 0; 884 int curr_param = 0;
892 char *image_filename = NULL; 885 char *image_filename = NULL;
893 886
894 if (element->params_count == 0 && 887 if (element->params_count == 0 &&
895 element->tag->type != SKIN_TOKEN_PROGRESSBAR) 888 element->tag->type != SKIN_TOKEN_PROGRESSBAR)
896 return 0; /* nothing to do */ 889 return 0; /* nothing to do */
897 pb = (struct progressbar*)skin_buffer_alloc(sizeof(struct progressbar)); 890 pb = skin_buffer_alloc(sizeof(*pb));
898 891
899 token->value.data = PTRTOSKINOFFSET(skin_buffer, pb); 892 token->value.data = PTRTOSKINOFFSET(skin_buffer, pb);
900 893
901 if (!pb) 894 if (!pb)
902 return WPS_ERROR_INVALID_PARAM; 895 return WPS_ERROR_INVALID_PARAM;
903 pb->vp = PTRTOSKINOFFSET(skin_buffer, vp); 896 pb->vp = PTRTOSKINOFFSET(skin_buffer, vp);
@@ -909,7 +902,7 @@ static int parse_progressbar_tag(struct skin_element* element,
909 pb->backdrop = PTRTOSKINOFFSET(skin_buffer, NULL); 902 pb->backdrop = PTRTOSKINOFFSET(skin_buffer, NULL);
910 pb->invert_fill_direction = false; 903 pb->invert_fill_direction = false;
911 pb->horizontal = true; 904 pb->horizontal = true;
912 905
913 if (element->params_count == 0) 906 if (element->params_count == 0)
914 { 907 {
915 pb->x = 0; 908 pb->x = 0;
@@ -919,26 +912,26 @@ static int parse_progressbar_tag(struct skin_element* element,
919 pb->type = element->tag->type; 912 pb->type = element->tag->type;
920 return 0; 913 return 0;
921 } 914 }
922 915
923 /* (x, y, width, height, ...) */ 916 /* (x, y, width, height, ...) */
924 if (!isdefault(param)) 917 if (!isdefault(param))
925 pb->x = param->data.number; 918 pb->x = param->data.number;
926 else 919 else
927 pb->x = 0; 920 pb->x = 0;
928 param++; 921 param++;
929 922
930 if (!isdefault(param)) 923 if (!isdefault(param))
931 pb->y = param->data.number; 924 pb->y = param->data.number;
932 else 925 else
933 pb->y = -1; /* computed at rendering */ 926 pb->y = -1; /* computed at rendering */
934 param++; 927 param++;
935 928
936 if (!isdefault(param)) 929 if (!isdefault(param))
937 pb->width = param->data.number; 930 pb->width = param->data.number;
938 else 931 else
939 pb->width = vp->width - pb->x; 932 pb->width = vp->width - pb->x;
940 param++; 933 param++;
941 934
942 if (!isdefault(param)) 935 if (!isdefault(param))
943 { 936 {
944 /* A zero height makes no sense - reject it */ 937 /* A zero height makes no sense - reject it */
@@ -961,7 +954,7 @@ static int parse_progressbar_tag(struct skin_element* element,
961 } 954 }
962 } 955 }
963 /* optional params, first is the image filename if it isnt recognised as a keyword */ 956 /* optional params, first is the image filename if it isnt recognised as a keyword */
964 957
965 curr_param = 4; 958 curr_param = 4;
966 if (isdefault(get_param(element, curr_param))) 959 if (isdefault(get_param(element, curr_param)))
967 { 960 {
@@ -1012,9 +1005,9 @@ static int parse_progressbar_tag(struct skin_element* element,
1012 curr_param++; 1005 curr_param++;
1013 param++; 1006 param++;
1014 text = SKINOFFSETTOPTR(skin_buffer, param->data.text); 1007 text = SKINOFFSETTOPTR(skin_buffer, param->data.text);
1015 pb->backdrop = PTRTOSKINOFFSET(skin_buffer, 1008 pb->backdrop = PTRTOSKINOFFSET(skin_buffer,
1016 skin_find_item(text, SKIN_FIND_IMAGE, wps_data)); 1009 skin_find_item(text, SKIN_FIND_IMAGE, wps_data));
1017 1010
1018 } 1011 }
1019 else /* option needs the next param */ 1012 else /* option needs the next param */
1020 return -1; 1013 return -1;
@@ -1029,17 +1022,17 @@ static int parse_progressbar_tag(struct skin_element* element,
1029 pb->horizontal = true; 1022 pb->horizontal = true;
1030 else if (curr_param == 4) 1023 else if (curr_param == 4)
1031 image_filename = text; 1024 image_filename = text;
1032 1025
1033 curr_param++; 1026 curr_param++;
1034 } 1027 }
1035 1028
1036 if (image_filename) 1029 if (image_filename)
1037 { 1030 {
1038 pb->image = PTRTOSKINOFFSET(skin_buffer, 1031 pb->image = PTRTOSKINOFFSET(skin_buffer,
1039 skin_find_item(image_filename, SKIN_FIND_IMAGE, wps_data)); 1032 skin_find_item(image_filename, SKIN_FIND_IMAGE, wps_data));
1040 if (!SKINOFFSETTOPTR(skin_buffer, pb->image)) /* load later */ 1033 if (!SKINOFFSETTOPTR(skin_buffer, pb->image)) /* load later */
1041 { 1034 {
1042 struct gui_img* img = (struct gui_img*)skin_buffer_alloc(sizeof(struct gui_img)); 1035 struct gui_img *img = skin_buffer_alloc(sizeof(*img));
1043 if (!img) 1036 if (!img)
1044 return WPS_ERROR_INVALID_PARAM; 1037 return WPS_ERROR_INVALID_PARAM;
1045 /* save a pointer to the filename */ 1038 /* save a pointer to the filename */
@@ -1052,15 +1045,14 @@ static int parse_progressbar_tag(struct skin_element* element,
1052 img->using_preloaded_icons = false; 1045 img->using_preloaded_icons = false;
1053 img->buflib_handle = -1; 1046 img->buflib_handle = -1;
1054 img->vp = PTRTOSKINOFFSET(skin_buffer, &curr_vp->vp); 1047 img->vp = PTRTOSKINOFFSET(skin_buffer, &curr_vp->vp);
1055 struct skin_token_list *item = 1048 struct skin_token_list *item = new_skin_token_list_item(NULL, img);
1056 (struct skin_token_list *)new_skin_token_list_item(NULL, img);
1057 if (!item) 1049 if (!item)
1058 return WPS_ERROR_INVALID_PARAM; 1050 return WPS_ERROR_INVALID_PARAM;
1059 add_to_ll_chain(&wps_data->images, item); 1051 add_to_ll_chain(&wps_data->images, item);
1060 pb->image = PTRTOSKINOFFSET(skin_buffer, img); 1052 pb->image = PTRTOSKINOFFSET(skin_buffer, img);
1061 } 1053 }
1062 } 1054 }
1063 1055
1064 if (token->type == SKIN_TOKEN_VOLUME) 1056 if (token->type == SKIN_TOKEN_VOLUME)
1065 token->type = SKIN_TOKEN_VOLUMEBAR; 1057 token->type = SKIN_TOKEN_VOLUMEBAR;
1066 else if (token->type == SKIN_TOKEN_BATTERY_PERCENT) 1058 else if (token->type == SKIN_TOKEN_BATTERY_PERCENT)
@@ -1074,15 +1066,15 @@ static int parse_progressbar_tag(struct skin_element* element,
1074 else if (token->type == SKIN_TOKEN_LIST_NEEDS_SCROLLBAR) 1066 else if (token->type == SKIN_TOKEN_LIST_NEEDS_SCROLLBAR)
1075 token->type = SKIN_TOKEN_LIST_SCROLLBAR; 1067 token->type = SKIN_TOKEN_LIST_SCROLLBAR;
1076 pb->type = token->type; 1068 pb->type = token->type;
1077 1069
1078 return 0; 1070 return 0;
1079 1071
1080#else 1072#else
1081 (void)element; 1073 (void)element;
1082 if (token->type == SKIN_TOKEN_PROGRESSBAR || 1074 if (token->type == SKIN_TOKEN_PROGRESSBAR ||
1083 token->type == SKIN_TOKEN_PLAYER_PROGRESSBAR) 1075 token->type == SKIN_TOKEN_PLAYER_PROGRESSBAR)
1084 { 1076 {
1085 wps_data->full_line_progressbar = 1077 wps_data->full_line_progressbar =
1086 token->type == SKIN_TOKEN_PLAYER_PROGRESSBAR; 1078 token->type == SKIN_TOKEN_PLAYER_PROGRESSBAR;
1087 } 1079 }
1088 return 0; 1080 return 0;
@@ -1098,8 +1090,7 @@ static int parse_albumart_load(struct skin_element* element,
1098 struct dim dimensions; 1090 struct dim dimensions;
1099 int albumart_slot; 1091 int albumart_slot;
1100 bool swap_for_rtl = lang_is_rtl() && follow_lang_direction; 1092 bool swap_for_rtl = lang_is_rtl() && follow_lang_direction;
1101 struct skin_albumart *aa = 1093 struct skin_albumart *aa = skin_buffer_alloc(sizeof(*aa));
1102 (struct skin_albumart *)skin_buffer_alloc(sizeof(struct skin_albumart));
1103 (void)token; /* silence warning */ 1094 (void)token; /* silence warning */
1104 if (!aa) 1095 if (!aa)
1105 return -1; 1096 return -1;
@@ -1114,7 +1105,7 @@ static int parse_albumart_load(struct skin_element* element,
1114 aa->y = get_param(element, 1)->data.number; 1105 aa->y = get_param(element, 1)->data.number;
1115 aa->width = get_param(element, 2)->data.number; 1106 aa->width = get_param(element, 2)->data.number;
1116 aa->height = get_param(element, 3)->data.number; 1107 aa->height = get_param(element, 3)->data.number;
1117 1108
1118 aa->vp = PTRTOSKINOFFSET(skin_buffer, &curr_vp->vp); 1109 aa->vp = PTRTOSKINOFFSET(skin_buffer, &curr_vp->vp);
1119 aa->draw_handle = -1; 1110 aa->draw_handle = -1;
1120 1111
@@ -1142,7 +1133,7 @@ static int parse_albumart_load(struct skin_element* element,
1142 1133
1143 if (0 <= albumart_slot) 1134 if (0 <= albumart_slot)
1144 wps_data->playback_aa_slot = albumart_slot; 1135 wps_data->playback_aa_slot = albumart_slot;
1145 1136
1146 if (element->params_count > 4 && !isdefault(get_param(element, 4))) 1137 if (element->params_count > 4 && !isdefault(get_param(element, 4)))
1147 { 1138 {
1148 switch (*get_param_text(element, 4)) 1139 switch (*get_param_text(element, 4))
@@ -1194,19 +1185,19 @@ static struct skin_var* find_or_add_var(const char* label,
1194 struct wps_data *data) 1185 struct wps_data *data)
1195{ 1186{
1196 struct skin_var* ret = skin_find_item(label, SKIN_VARIABLE, data); 1187 struct skin_var* ret = skin_find_item(label, SKIN_VARIABLE, data);
1188 if (ret)
1189 return ret;
1190
1191 ret = skin_buffer_alloc(sizeof(*ret));
1197 if (!ret) 1192 if (!ret)
1198 { 1193 return ret;
1199 ret = (struct skin_var*)skin_buffer_alloc(sizeof(struct skin_var)); 1194 ret->label = PTRTOSKINOFFSET(skin_buffer, label);
1200 if (!ret) 1195 ret->value = 1;
1201 return NULL; 1196 ret->last_changed = 0xffff;
1202 ret->label = PTRTOSKINOFFSET(skin_buffer, label); 1197 struct skin_token_list *item = new_skin_token_list_item(NULL, ret);
1203 ret->value = 1; 1198 if (!item)
1204 ret->last_changed = 0xffff; 1199 return NULL;
1205 struct skin_token_list *item = new_skin_token_list_item(NULL, ret); 1200 add_to_ll_chain(&data->skinvars, item);
1206 if (!item)
1207 return NULL;
1208 add_to_ll_chain(&data->skinvars, item);
1209 }
1210 return ret; 1201 return ret;
1211} 1202}
1212static int parse_skinvar( struct skin_element *element, 1203static int parse_skinvar( struct skin_element *element,
@@ -1221,12 +1212,10 @@ static int parse_skinvar( struct skin_element *element,
1221 { 1212 {
1222 case SKIN_TOKEN_VAR_GETVAL: 1213 case SKIN_TOKEN_VAR_GETVAL:
1223 token->value.data = PTRTOSKINOFFSET(skin_buffer, var); 1214 token->value.data = PTRTOSKINOFFSET(skin_buffer, var);
1224 break; 1215 return 0;
1225 case SKIN_TOKEN_VAR_SET: 1216 case SKIN_TOKEN_VAR_SET:
1226 { 1217 {
1227 struct skin_var_changer *data = 1218 struct skin_var_changer *data = skin_buffer_alloc(sizeof(*data));
1228 (struct skin_var_changer*)skin_buffer_alloc(
1229 sizeof(struct skin_var_changer));
1230 if (!data) 1219 if (!data)
1231 return WPS_ERROR_INVALID_PARAM; 1220 return WPS_ERROR_INVALID_PARAM;
1232 data->var = PTRTOSKINOFFSET(skin_buffer, var); 1221 data->var = PTRTOSKINOFFSET(skin_buffer, var);
@@ -1255,12 +1244,10 @@ static int parse_skinvar( struct skin_element *element,
1255 data->max = get_param(element, 3)->data.number; 1244 data->max = get_param(element, 3)->data.number;
1256 token->value.data = PTRTOSKINOFFSET(skin_buffer, data); 1245 token->value.data = PTRTOSKINOFFSET(skin_buffer, data);
1257 } 1246 }
1258 break; 1247 return 0;
1259 case SKIN_TOKEN_VAR_TIMEOUT: 1248 case SKIN_TOKEN_VAR_TIMEOUT:
1260 { 1249 {
1261 struct skin_var_lastchange *data = 1250 struct skin_var_lastchange *data = skin_buffer_alloc(sizeof(*data));
1262 (struct skin_var_lastchange*)skin_buffer_alloc(
1263 sizeof(struct skin_var_lastchange));
1264 if (!data) 1251 if (!data)
1265 return WPS_ERROR_INVALID_PARAM; 1252 return WPS_ERROR_INVALID_PARAM;
1266 data->var = PTRTOSKINOFFSET(skin_buffer, var); 1253 data->var = PTRTOSKINOFFSET(skin_buffer, var);
@@ -1270,11 +1257,9 @@ static int parse_skinvar( struct skin_element *element,
1270 data->timeout *= TIMEOUT_UNIT; 1257 data->timeout *= TIMEOUT_UNIT;
1271 token->value.data = PTRTOSKINOFFSET(skin_buffer, data); 1258 token->value.data = PTRTOSKINOFFSET(skin_buffer, data);
1272 } 1259 }
1273 break; 1260 default:
1274 default: /* kill the warning */ 1261 return 0;
1275 break;
1276 } 1262 }
1277 return 0;
1278} 1263}
1279#endif /* HAVE_SKIN_VARIABLES */ 1264#endif /* HAVE_SKIN_VARIABLES */
1280#ifdef HAVE_TOUCHSCREEN 1265#ifdef HAVE_TOUCHSCREEN
@@ -1282,16 +1267,14 @@ static int parse_lasttouch(struct skin_element *element,
1282 struct wps_token *token, 1267 struct wps_token *token,
1283 struct wps_data *wps_data) 1268 struct wps_data *wps_data)
1284{ 1269{
1285 struct touchregion_lastpress *data = 1270 struct touchregion_lastpress *data = skin_buffer_alloc(sizeof(*data));
1286 (struct touchregion_lastpress*)skin_buffer_alloc(
1287 sizeof(struct touchregion_lastpress));
1288 int i; 1271 int i;
1289 struct touchregion *region = NULL; 1272 struct touchregion *region = NULL;
1290 if (!data) 1273 if (!data)
1291 return WPS_ERROR_INVALID_PARAM; 1274 return WPS_ERROR_INVALID_PARAM;
1292 1275
1293 data->timeout = 10; 1276 data->timeout = 10;
1294 1277
1295 for (i=0; i<element->params_count; i++) 1278 for (i=0; i<element->params_count; i++)
1296 { 1279 {
1297 if (get_param(element, i)->type == STRING) 1280 if (get_param(element, i)->type == STRING)
@@ -1316,16 +1299,16 @@ static const struct touchaction touchactions[] = {
1316 {"hotkey", ACTION_STD_HOTKEY}, {"select", ACTION_STD_OK }, 1299 {"hotkey", ACTION_STD_HOTKEY}, {"select", ACTION_STD_OK },
1317 {"menu", ACTION_STD_MENU }, {"cancel", ACTION_STD_CANCEL }, 1300 {"menu", ACTION_STD_MENU }, {"cancel", ACTION_STD_CANCEL },
1318 {"contextmenu", ACTION_STD_CONTEXT},{"quickscreen", ACTION_STD_QUICKSCREEN }, 1301 {"contextmenu", ACTION_STD_CONTEXT},{"quickscreen", ACTION_STD_QUICKSCREEN },
1319 1302
1320 /* list/tree actions */ 1303 /* list/tree actions */
1321 { "resumeplayback", ACTION_TREE_WPS}, /* returns to previous music, WPS/FM */ 1304 { "resumeplayback", ACTION_TREE_WPS}, /* returns to previous music, WPS/FM */
1322 /* not really WPS specific, but no equivilant ACTION_STD_* */ 1305 /* not really WPS specific, but no equivilant ACTION_STD_* */
1323 {"voldown", ACTION_WPS_VOLDOWN}, {"volup", ACTION_WPS_VOLUP}, 1306 {"voldown", ACTION_WPS_VOLDOWN}, {"volup", ACTION_WPS_VOLUP},
1324 {"mute", ACTION_TOUCH_MUTE }, 1307 {"mute", ACTION_TOUCH_MUTE },
1325 1308
1326 /* generic settings changers */ 1309 /* generic settings changers */
1327 {"setting_inc", ACTION_SETTINGS_INC}, {"setting_dec", ACTION_SETTINGS_DEC}, 1310 {"setting_inc", ACTION_SETTINGS_INC}, {"setting_dec", ACTION_SETTINGS_DEC},
1328 {"setting_set", ACTION_SETTINGS_SET}, 1311 {"setting_set", ACTION_SETTINGS_SET},
1329 1312
1330 /* WPS specific actions */ 1313 /* WPS specific actions */
1331 {"rwd", ACTION_WPS_SEEKBACK }, {"ffwd", ACTION_WPS_SEEKFWD }, 1314 {"rwd", ACTION_WPS_SEEKBACK }, {"ffwd", ACTION_WPS_SEEKFWD },
@@ -1338,11 +1321,11 @@ static const struct touchaction touchactions[] = {
1338 {"listbookmarks", ACTION_WPS_LIST_BOOKMARKS }, 1321 {"listbookmarks", ACTION_WPS_LIST_BOOKMARKS },
1339 {"createbookmark", ACTION_WPS_CREATE_BOOKMARK }, 1322 {"createbookmark", ACTION_WPS_CREATE_BOOKMARK },
1340 1323
1341#if CONFIG_TUNER 1324#if CONFIG_TUNER
1342 /* FM screen actions */ 1325 /* FM screen actions */
1343 /* Also allow browse, play, stop from WPS codes */ 1326 /* Also allow browse, play, stop from WPS codes */
1344 {"mode", ACTION_FM_MODE }, {"record", ACTION_FM_RECORD }, 1327 {"mode", ACTION_FM_MODE }, {"record", ACTION_FM_RECORD },
1345 {"presets", ACTION_FM_PRESET}, 1328 {"presets", ACTION_FM_PRESET},
1346#endif 1329#endif
1347}; 1330};
1348 1331
@@ -1362,7 +1345,7 @@ static int touchregion_setup_setting(struct skin_element *element, int param_no,
1362 { 1345 {
1363 char* text; 1346 char* text;
1364 int temp; 1347 int temp;
1365 struct touchsetting *setting = 1348 struct touchsetting *setting =
1366 &region->setting_data; 1349 &region->setting_data;
1367 if (element->params_count < p+1) 1350 if (element->params_count < p+1)
1368 return -1; 1351 return -1;
@@ -1372,7 +1355,7 @@ static int touchregion_setup_setting(struct skin_element *element, int param_no,
1372 { 1355 {
1373 case F_T_CUSTOM: 1356 case F_T_CUSTOM:
1374 setting->value.text = PTRTOSKINOFFSET(skin_buffer, text); 1357 setting->value.text = PTRTOSKINOFFSET(skin_buffer, text);
1375 break; 1358 break;
1376 case F_T_INT: 1359 case F_T_INT:
1377 case F_T_UINT: 1360 case F_T_UINT:
1378 if (settings[j].cfg_vals == NULL) 1361 if (settings[j].cfg_vals == NULL)
@@ -1382,7 +1365,7 @@ static int touchregion_setup_setting(struct skin_element *element, int param_no,
1382 else if (cfg_string_to_int(j, &temp, text)) 1365 else if (cfg_string_to_int(j, &temp, text))
1383 { 1366 {
1384 if (settings[j].flags&F_TABLE_SETTING) 1367 if (settings[j].flags&F_TABLE_SETTING)
1385 setting->value.number = 1368 setting->value.number =
1386 settings[j].table_setting->values[temp]; 1369 settings[j].table_setting->values[temp];
1387 else 1370 else
1388 setting->value.number = temp; 1371 setting->value.number = temp;
@@ -1423,14 +1406,14 @@ static int parse_touchregion(struct skin_element *element,
1423 * if action starts with & the area must be held to happen 1406 * if action starts with & the area must be held to happen
1424 */ 1407 */
1425 1408
1426 1409
1427 region = (struct touchregion*)skin_buffer_alloc(sizeof(struct touchregion)); 1410 region = skin_buffer_alloc(sizeof(*region));
1428 if (!region) 1411 if (!region)
1429 return WPS_ERROR_INVALID_PARAM; 1412 return WPS_ERROR_INVALID_PARAM;
1430 1413
1431 /* should probably do some bounds checking here with the viewport... but later */ 1414 /* should probably do some bounds checking here with the viewport... but later */
1432 region->action = ACTION_NONE; 1415 region->action = ACTION_NONE;
1433 1416
1434 if (get_param(element, 0)->type == STRING) 1417 if (get_param(element, 0)->type == STRING)
1435 { 1418 {
1436 region->label = PTRTOSKINOFFSET(skin_buffer, get_param_text(element, 0)); 1419 region->label = PTRTOSKINOFFSET(skin_buffer, get_param_text(element, 0));
@@ -1446,7 +1429,7 @@ static int parse_touchregion(struct skin_element *element,
1446 region->label = PTRTOSKINOFFSET(skin_buffer, NULL); 1429 region->label = PTRTOSKINOFFSET(skin_buffer, NULL);
1447 p = 0; 1430 p = 0;
1448 } 1431 }
1449 1432
1450 region->x = get_param(element, p++)->data.number; 1433 region->x = get_param(element, p++)->data.number;
1451 region->y = get_param(element, p++)->data.number; 1434 region->y = get_param(element, p++)->data.number;
1452 region->width = get_param(element, p++)->data.number; 1435 region->width = get_param(element, p++)->data.number;
@@ -1508,13 +1491,13 @@ static int parse_touchregion(struct skin_element *element,
1508 if (!item) 1491 if (!item)
1509 return WPS_ERROR_INVALID_PARAM; 1492 return WPS_ERROR_INVALID_PARAM;
1510 add_to_ll_chain(&wps_data->touchregions, item); 1493 add_to_ll_chain(&wps_data->touchregions, item);
1511 1494
1512 if (region->action == ACTION_TOUCH_MUTE) 1495 if (region->action == ACTION_TOUCH_MUTE)
1513 { 1496 {
1514 region->value = global_settings.volume; 1497 region->value = global_settings.volume;
1515 } 1498 }
1516 1499
1517 1500
1518 return 0; 1501 return 0;
1519} 1502}
1520#endif 1503#endif
@@ -1691,12 +1674,12 @@ static int load_skin_bmp(struct wps_data *wps_data, struct bitmap *bitmap, char*
1691 return fd; 1674 return fd;
1692 } 1675 }
1693#ifndef __PCTOOL__ 1676#ifndef __PCTOOL__
1694 size_t buf_size = read_bmp_fd(fd, bitmap, 0, 1677 size_t buf_size = read_bmp_fd(fd, bitmap, 0,
1695 format|FORMAT_RETURN_SIZE, NULL); 1678 format|FORMAT_RETURN_SIZE, NULL);
1696 handle = core_alloc_ex(bitmap->data, buf_size, &buflib_ops); 1679 handle = core_alloc_ex(bitmap->data, buf_size, &buflib_ops);
1697 if (handle < 0) 1680 if (handle < 0)
1698 { 1681 {
1699 DEBUGF("Not enough skin buffer: need %zd more.\n", 1682 DEBUGF("Not enough skin buffer: need %zd more.\n",
1700 buf_size - skin_buffer_freespace()); 1683 buf_size - skin_buffer_freespace());
1701 close(fd); 1684 close(fd);
1702 return handle; 1685 return handle;
@@ -1705,7 +1688,7 @@ static int load_skin_bmp(struct wps_data *wps_data, struct bitmap *bitmap, char*
1705 lock_handle(handle); 1688 lock_handle(handle);
1706 bitmap->data = core_get_data(handle); 1689 bitmap->data = core_get_data(handle);
1707 int ret = read_bmp_fd(fd, bitmap, buf_size, format, NULL); 1690 int ret = read_bmp_fd(fd, bitmap, buf_size, format, NULL);
1708 bitmap->data = NULL; /* do this to force a crash later if the 1691 bitmap->data = NULL; /* do this to force a crash later if the
1709 caller doesnt call core_get_data() */ 1692 caller doesnt call core_get_data() */
1710 unlock_handle(); 1693 unlock_handle();
1711 close(fd); 1694 close(fd);
@@ -1732,7 +1715,7 @@ static bool load_skin_bitmaps(struct wps_data *wps_data, char *bmpdir)
1732{ 1715{
1733 struct skin_token_list *list; 1716 struct skin_token_list *list;
1734 bool retval = true; /* return false if a single image failed to load */ 1717 bool retval = true; /* return false if a single image failed to load */
1735 1718
1736 /* regular images */ 1719 /* regular images */
1737 list = SKINOFFSETTOPTR(skin_buffer, wps_data->images); 1720 list = SKINOFFSETTOPTR(skin_buffer, wps_data->images);
1738 while (list) 1721 while (list)
@@ -1814,7 +1797,7 @@ static bool skin_load_fonts(struct wps_data *data)
1814 snprintf(path, sizeof path, FONT_DIR "/%s", font->name); 1797 snprintf(path, sizeof path, FONT_DIR "/%s", font->name);
1815#ifndef __PCTOOL__ 1798#ifndef __PCTOOL__
1816 font->id = font_load_ex(path, 0, skinfonts[font_id-2].glyphs); 1799 font->id = font_load_ex(path, 0, skinfonts[font_id-2].glyphs);
1817 1800
1818#else 1801#else
1819 font->id = font_load(path); 1802 font->id = font_load(path);
1820#endif 1803#endif
@@ -1862,13 +1845,12 @@ static bool skin_load_fonts(struct wps_data *data)
1862#endif /* HAVE_LCD_BITMAP */ 1845#endif /* HAVE_LCD_BITMAP */
1863static int convert_viewport(struct wps_data *data, struct skin_element* element) 1846static int convert_viewport(struct wps_data *data, struct skin_element* element)
1864{ 1847{
1865 struct skin_viewport *skin_vp = 1848 struct skin_viewport *skin_vp = skin_buffer_alloc(sizeof(*skin_vp));
1866 (struct skin_viewport *)skin_buffer_alloc(sizeof(struct skin_viewport));
1867 struct screen *display = &screens[curr_screen]; 1849 struct screen *display = &screens[curr_screen];
1868 1850
1869 if (!skin_vp) 1851 if (!skin_vp)
1870 return CALLBACK_ERROR; 1852 return CALLBACK_ERROR;
1871 1853
1872 skin_vp->hidden_flags = 0; 1854 skin_vp->hidden_flags = 0;
1873 skin_vp->label = PTRTOSKINOFFSET(skin_buffer, NULL); 1855 skin_vp->label = PTRTOSKINOFFSET(skin_buffer, NULL);
1874 skin_vp->is_infovp = false; 1856 skin_vp->is_infovp = false;
@@ -1880,7 +1862,7 @@ static int convert_viewport(struct wps_data *data, struct skin_element* element)
1880 first_viewport = element; 1862 first_viewport = element;
1881 1863
1882 viewport_set_defaults(&skin_vp->vp, curr_screen); 1864 viewport_set_defaults(&skin_vp->vp, curr_screen);
1883 1865
1884#if (LCD_DEPTH > 1) || (defined(HAVE_REMOTE_LCD) && (LCD_REMOTE_DEPTH > 1)) 1866#if (LCD_DEPTH > 1) || (defined(HAVE_REMOTE_LCD) && (LCD_REMOTE_DEPTH > 1))
1885 skin_vp->output_to_backdrop_buffer = false; 1867 skin_vp->output_to_backdrop_buffer = false;
1886 skin_vp->start_fgcolour = skin_vp->vp.fg_pattern; 1868 skin_vp->start_fgcolour = skin_vp->vp.fg_pattern;
@@ -1891,7 +1873,7 @@ static int convert_viewport(struct wps_data *data, struct skin_element* element)
1891 skin_vp->start_gradient.end = skin_vp->vp.lse_pattern; 1873 skin_vp->start_gradient.end = skin_vp->vp.lse_pattern;
1892 skin_vp->start_gradient.text = skin_vp->vp.lst_pattern; 1874 skin_vp->start_gradient.text = skin_vp->vp.lst_pattern;
1893#endif 1875#endif
1894 1876
1895 1877
1896 struct skin_tag_parameter *param = get_param(element, 0); 1878 struct skin_tag_parameter *param = get_param(element, 0);
1897 if (element->params_count == 0) /* default viewport */ 1879 if (element->params_count == 0) /* default viewport */
@@ -1901,7 +1883,7 @@ static int convert_viewport(struct wps_data *data, struct skin_element* element)
1901 skin_vp->label = VP_DEFAULT_LABEL; 1883 skin_vp->label = VP_DEFAULT_LABEL;
1902 return CALLBACK_OK; 1884 return CALLBACK_OK;
1903 } 1885 }
1904 1886
1905 if (element->params_count == 6) 1887 if (element->params_count == 6)
1906 { 1888 {
1907 if (element->tag->type == SKIN_TOKEN_UIVIEWPORT_LOAD) 1889 if (element->tag->type == SKIN_TOKEN_UIVIEWPORT_LOAD)
@@ -1984,7 +1966,7 @@ static int skin_element_callback(struct skin_element* element, void* data)
1984 struct wps_data *wps_data = (struct wps_data *)data; 1966 struct wps_data *wps_data = (struct wps_data *)data;
1985 struct wps_token *token; 1967 struct wps_token *token;
1986 parse_function function = NULL; 1968 parse_function function = NULL;
1987 1969
1988 switch (element->type) 1970 switch (element->type)
1989 { 1971 {
1990 /* IMPORTANT: element params are shared, so copy them if needed 1972 /* IMPORTANT: element params are shared, so copy them if needed
@@ -1992,11 +1974,11 @@ static int skin_element_callback(struct skin_element* element, void* data)
1992 */ 1974 */
1993 case TAG: 1975 case TAG:
1994 { 1976 {
1995 token = (struct wps_token*)skin_buffer_alloc(sizeof(struct wps_token)); 1977 token = skin_buffer_alloc(sizeof(*token));
1996 memset(token, 0, sizeof(*token)); 1978 memset(token, 0, sizeof(*token));
1997 token->type = element->tag->type; 1979 token->type = element->tag->type;
1998 token->value.data = INVALID_OFFSET; 1980 token->value.data = INVALID_OFFSET;
1999 1981
2000 if (element->tag->flags&SKIN_RTC_REFRESH) 1982 if (element->tag->flags&SKIN_RTC_REFRESH)
2001 { 1983 {
2002#if CONFIG_RTC 1984#if CONFIG_RTC
@@ -2007,9 +1989,9 @@ static int skin_element_callback(struct skin_element* element, void* data)
2007 } 1989 }
2008 else 1990 else
2009 curr_line->update_mode |= element->tag->flags&SKIN_REFRESH_ALL; 1991 curr_line->update_mode |= element->tag->flags&SKIN_REFRESH_ALL;
2010 1992
2011 element->data = PTRTOSKINOFFSET(skin_buffer, token); 1993 element->data = PTRTOSKINOFFSET(skin_buffer, token);
2012 1994
2013 /* Some tags need special handling for the tag, so add them here */ 1995 /* Some tags need special handling for the tag, so add them here */
2014 switch (token->type) 1996 switch (token->type)
2015 { 1997 {
@@ -2163,17 +2145,14 @@ static int skin_element_callback(struct skin_element* element, void* data)
2163 return convert_viewport(wps_data, element); 2145 return convert_viewport(wps_data, element);
2164 case LINE: 2146 case LINE:
2165 { 2147 {
2166 struct line *line = 2148 curr_line = skin_buffer_alloc(sizeof(*curr_line));
2167 (struct line *)skin_buffer_alloc(sizeof(struct line)); 2149 curr_line->update_mode = SKIN_REFRESH_STATIC;
2168 line->update_mode = SKIN_REFRESH_STATIC; 2150 element->data = PTRTOSKINOFFSET(skin_buffer, curr_line);
2169 curr_line = line;
2170 element->data = PTRTOSKINOFFSET(skin_buffer, line);
2171 } 2151 }
2172 break; 2152 break;
2173 case LINE_ALTERNATOR: 2153 case LINE_ALTERNATOR:
2174 { 2154 {
2175 struct line_alternator *alternator = 2155 struct line_alternator *alternator = skin_buffer_alloc(sizeof(*alternator));
2176 (struct line_alternator *)skin_buffer_alloc(sizeof(struct line_alternator));
2177 alternator->current_line = 0; 2156 alternator->current_line = 0;
2178#ifndef __PCTOOL__ 2157#ifndef __PCTOOL__
2179 alternator->next_change_tick = current_tick; 2158 alternator->next_change_tick = current_tick;
@@ -2183,8 +2162,7 @@ static int skin_element_callback(struct skin_element* element, void* data)
2183 break; 2162 break;
2184 case CONDITIONAL: 2163 case CONDITIONAL:
2185 { 2164 {
2186 struct conditional *conditional = 2165 struct conditional *conditional = skin_buffer_alloc(sizeof(*conditional));
2187 (struct conditional *)skin_buffer_alloc(sizeof(struct conditional));
2188 conditional->last_value = -1; 2166 conditional->last_value = -1;
2189 conditional->token = element->data; 2167 conditional->token = element->data;
2190 element->data = PTRTOSKINOFFSET(skin_buffer, conditional); 2168 element->data = PTRTOSKINOFFSET(skin_buffer, conditional);
@@ -2318,7 +2296,7 @@ bool skin_data_load(enum screen_type screen, struct wps_data *wps_data,
2318 } 2296 }
2319 /* load the bitmaps that were found by the parsing */ 2297 /* load the bitmaps that were found by the parsing */
2320 if (!load_skin_bitmaps(wps_data, bmpdir) || 2298 if (!load_skin_bitmaps(wps_data, bmpdir) ||
2321 !skin_load_fonts(wps_data)) 2299 !skin_load_fonts(wps_data))
2322 { 2300 {
2323 skin_data_reset(wps_data); 2301 skin_data_reset(wps_data);
2324 return false; 2302 return false;