summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJonathan Gordon <rockbox@jdgordon.info>2009-08-18 05:30:59 +0000
committerJonathan Gordon <rockbox@jdgordon.info>2009-08-18 05:30:59 +0000
commit36ca4967e0ced08ab8d262ba046189e6dfbe71da (patch)
tree4b441f67ac8f99af82f208a930de7f797d4bf712
parentfed07312edff7c69f03946bf90f57f7b57f9be39 (diff)
downloadrockbox-36ca4967e0ced08ab8d262ba046189e6dfbe71da.tar.gz
rockbox-36ca4967e0ced08ab8d262ba046189e6dfbe71da.zip
move viewports into the skin buffer, no more viewport limit on the skin
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@22403 a1c6a512-1295-4272-9138-f99709370657
-rw-r--r--apps/gui/skin_engine/skin_display.c95
-rw-r--r--apps/gui/skin_engine/skin_parser.c96
-rw-r--r--apps/gui/skin_engine/wps_debug.c9
-rw-r--r--apps/gui/skin_engine/wps_internals.h10
-rw-r--r--apps/gui/wps.c2
5 files changed, 123 insertions, 89 deletions
diff --git a/apps/gui/skin_engine/skin_display.c b/apps/gui/skin_engine/skin_display.c
index 9f310073cb..1e88863307 100644
--- a/apps/gui/skin_engine/skin_display.c
+++ b/apps/gui/skin_engine/skin_display.c
@@ -100,8 +100,9 @@ bool gui_wps_display(struct gui_wps *gwps)
100#if LCD_DEPTH > 1 100#if LCD_DEPTH > 1
101 if (display->depth > 1) 101 if (display->depth > 1)
102 { 102 {
103 gwps->data->viewports[0].vp.fg_pattern = display->get_foreground(); 103 struct viewport *vp = &find_viewport(VP_DEFAULT_LABEL, gwps->data)->vp;
104 gwps->data->viewports[0].vp.bg_pattern = display->get_background(); 104 vp->fg_pattern = display->get_foreground();
105 vp->bg_pattern = display->get_background();
105 } 106 }
106#endif 107#endif
107 display->clear_display(); 108 display->clear_display();
@@ -132,7 +133,7 @@ bool skin_update(struct gui_wps *gwps, unsigned int update_type)
132#ifdef HAVE_LCD_BITMAP 133#ifdef HAVE_LCD_BITMAP
133 134
134static void draw_progressbar(struct gui_wps *gwps, 135static void draw_progressbar(struct gui_wps *gwps,
135 struct wps_viewport *wps_vp) 136 struct skin_viewport *wps_vp)
136 { 137 {
137 struct screen *display = gwps->display; 138 struct screen *display = gwps->display;
138 struct wps_state *state = gwps->state; 139 struct wps_state *state = gwps->state;
@@ -490,6 +491,19 @@ struct gui_img* find_image(int n, struct wps_data *data)
490 return NULL; 491 return NULL;
491} 492}
492#endif 493#endif
494
495struct skin_viewport* find_viewport(char label, struct wps_data *data)
496{
497 struct skin_token_list *list = data->viewports;
498 while (list)
499 {
500 struct skin_viewport *vp = (struct skin_viewport *)list->token->value.data;
501 if (vp->label == label)
502 return vp;
503 list = list->next;
504 }
505 return NULL;
506}
493 507
494 508
495/* Read a (sub)line to the given alignment format buffer. 509/* Read a (sub)line to the given alignment format buffer.
@@ -590,18 +604,13 @@ static bool get_line(struct gui_wps *gwps,
590 case WPS_VIEWPORT_ENABLE: 604 case WPS_VIEWPORT_ENABLE:
591 { 605 {
592 char label = data->tokens[i].value.i; 606 char label = data->tokens[i].value.i;
593 int j;
594 char temp = VP_DRAW_HIDEABLE; 607 char temp = VP_DRAW_HIDEABLE;
595 for(j=0;j<data->num_viewports;j++) 608 struct skin_viewport *vp = find_viewport(label, data);
609 if (vp)
596 { 610 {
597 temp = VP_DRAW_HIDEABLE; 611 if (vp->hidden_flags&VP_DRAW_WASHIDDEN)
598 if ((data->viewports[j].hidden_flags&VP_DRAW_HIDEABLE) && 612 temp |= VP_DRAW_WASHIDDEN;
599 (data->viewports[j].label == label)) 613 vp->hidden_flags = temp;
600 {
601 if (data->viewports[j].hidden_flags&VP_DRAW_WASHIDDEN)
602 temp |= VP_DRAW_WASHIDDEN;
603 data->viewports[j].hidden_flags = temp;
604 }
605 } 614 }
606 } 615 }
607 break; 616 break;
@@ -926,7 +935,7 @@ static bool skin_redraw(struct gui_wps *gwps, unsigned refresh_mode)
926 if (!id3) 935 if (!id3)
927 return false; 936 return false;
928 937
929 int v, line, i, subline_idx; 938 int line, i, subline_idx;
930 unsigned flags; 939 unsigned flags;
931 char linebuf[MAX_PATH]; 940 char linebuf[MAX_PATH];
932 941
@@ -953,7 +962,7 @@ static bool skin_redraw(struct gui_wps *gwps, unsigned refresh_mode)
953 /* reset to first subline if refresh all flag is set */ 962 /* reset to first subline if refresh all flag is set */
954 if (refresh_mode == WPS_REFRESH_ALL) 963 if (refresh_mode == WPS_REFRESH_ALL)
955 { 964 {
956 display->set_viewport(&data->viewports[0].vp); 965 display->set_viewport(&find_viewport(VP_DEFAULT_LABEL, data)->vp);
957 display->clear_viewport(); 966 display->clear_viewport();
958 967
959 for (i = 0; i <= data->num_lines; i++) 968 for (i = 0; i <= data->num_lines; i++)
@@ -971,21 +980,28 @@ static bool skin_redraw(struct gui_wps *gwps, unsigned refresh_mode)
971#endif 980#endif
972 981
973 /* disable any viewports which are conditionally displayed */ 982 /* disable any viewports which are conditionally displayed */
974 for (v = 0; v < data->num_viewports; v++) 983 struct skin_token_list *viewport_list;
984 for (viewport_list = data->viewports;
985 viewport_list; viewport_list = viewport_list->next)
975 { 986 {
976 if (data->viewports[v].hidden_flags&VP_DRAW_HIDEABLE) 987 struct skin_viewport *skin_viewport =
988 (struct skin_viewport *)viewport_list->token->value.data;
989 if (skin_viewport->hidden_flags&VP_DRAW_HIDEABLE)
977 { 990 {
978 if (data->viewports[v].hidden_flags&VP_DRAW_HIDDEN) 991 if (skin_viewport->hidden_flags&VP_DRAW_HIDDEN)
979 data->viewports[v].hidden_flags |= VP_DRAW_WASHIDDEN; 992 skin_viewport->hidden_flags |= VP_DRAW_WASHIDDEN;
980 else 993 else
981 data->viewports[v].hidden_flags |= VP_DRAW_HIDDEN; 994 skin_viewport->hidden_flags |= VP_DRAW_HIDDEN;
982 } 995 }
983 } 996 }
984 for (v = 0; v < data->num_viewports; v++) 997
998 for (viewport_list = data->viewports;
999 viewport_list; viewport_list = viewport_list->next)
985 { 1000 {
986 struct wps_viewport *wps_vp = &(data->viewports[v]); 1001 struct skin_viewport *skin_viewport =
1002 (struct skin_viewport *)viewport_list->token->value.data;
987 unsigned vp_refresh_mode = refresh_mode; 1003 unsigned vp_refresh_mode = refresh_mode;
988 display->set_viewport(&wps_vp->vp); 1004 display->set_viewport(&skin_viewport->vp);
989 1005
990#ifdef HAVE_LCD_BITMAP 1006#ifdef HAVE_LCD_BITMAP
991 /* Set images to not to be displayed */ 1007 /* Set images to not to be displayed */
@@ -998,27 +1014,27 @@ static bool skin_redraw(struct gui_wps *gwps, unsigned refresh_mode)
998 } 1014 }
999#endif 1015#endif
1000 /* dont redraw the viewport if its disabled */ 1016 /* dont redraw the viewport if its disabled */
1001 if ((wps_vp->hidden_flags&VP_DRAW_HIDDEN)) 1017 if ((skin_viewport->hidden_flags&VP_DRAW_HIDDEN))
1002 { 1018 {
1003 if (!(wps_vp->hidden_flags&VP_DRAW_WASHIDDEN)) 1019 if (!(skin_viewport->hidden_flags&VP_DRAW_WASHIDDEN))
1004 display->scroll_stop(&wps_vp->vp); 1020 display->scroll_stop(&skin_viewport->vp);
1005 wps_vp->hidden_flags |= VP_DRAW_WASHIDDEN; 1021 skin_viewport->hidden_flags |= VP_DRAW_WASHIDDEN;
1006 continue; 1022 continue;
1007 } 1023 }
1008 else if (((wps_vp->hidden_flags& 1024 else if (((skin_viewport->hidden_flags&
1009 (VP_DRAW_WASHIDDEN|VP_DRAW_HIDEABLE)) 1025 (VP_DRAW_WASHIDDEN|VP_DRAW_HIDEABLE))
1010 == (VP_DRAW_WASHIDDEN|VP_DRAW_HIDEABLE))) 1026 == (VP_DRAW_WASHIDDEN|VP_DRAW_HIDEABLE)))
1011 { 1027 {
1012 vp_refresh_mode = WPS_REFRESH_ALL; 1028 vp_refresh_mode = WPS_REFRESH_ALL;
1013 wps_vp->hidden_flags = VP_DRAW_HIDEABLE; 1029 skin_viewport->hidden_flags = VP_DRAW_HIDEABLE;
1014 } 1030 }
1015 if (vp_refresh_mode == WPS_REFRESH_ALL) 1031 if (vp_refresh_mode == WPS_REFRESH_ALL)
1016 { 1032 {
1017 display->clear_viewport(); 1033 display->clear_viewport();
1018 } 1034 }
1019 1035
1020 for (line = wps_vp->first_line; 1036 for (line = skin_viewport->first_line;
1021 line <= wps_vp->last_line; line++) 1037 line <= skin_viewport->last_line; line++)
1022 { 1038 {
1023 memset(linebuf, 0, sizeof(linebuf)); 1039 memset(linebuf, 0, sizeof(linebuf));
1024 update_line = false; 1040 update_line = false;
@@ -1044,8 +1060,8 @@ static bool skin_redraw(struct gui_wps *gwps, unsigned refresh_mode)
1044 /* the peakmeter should be alone on its line */ 1060 /* the peakmeter should be alone on its line */
1045 update_line = false; 1061 update_line = false;
1046 1062
1047 int h = font_get(wps_vp->vp.font)->height; 1063 int h = font_get(skin_viewport->vp.font)->height;
1048 int peak_meter_y = (line - wps_vp->first_line)* h; 1064 int peak_meter_y = (line - skin_viewport->first_line)* h;
1049 1065
1050 /* The user might decide to have the peak meter in the last 1066 /* The user might decide to have the peak meter in the last
1051 line so that it is only displayed if no status bar is 1067 line so that it is only displayed if no status bar is
@@ -1082,17 +1098,18 @@ static bool skin_redraw(struct gui_wps *gwps, unsigned refresh_mode)
1082 viewport there will be a blank line. 1098 viewport there will be a blank line.
1083 To get around this we dont allow any actual drawing to happen in the 1099 To get around this we dont allow any actual drawing to happen in the
1084 deault vp if other vp's are defined */ 1100 deault vp if other vp's are defined */
1085 ((data->num_viewports>1 && v!=0) || data->num_viewports == 1)) 1101 ((skin_viewport->label != VP_DEFAULT_LABEL && viewport_list->next) ||
1102 !viewport_list->next))
1086 { 1103 {
1087 if (flags & WPS_REFRESH_SCROLL) 1104 if (flags & WPS_REFRESH_SCROLL)
1088 { 1105 {
1089 /* if the line is a scrolling one we don't want to update 1106 /* if the line is a scrolling one we don't want to update
1090 too often, so that it has the time to scroll */ 1107 too often, so that it has the time to scroll */
1091 if ((vp_refresh_mode & WPS_REFRESH_SCROLL) || new_subline_refresh) 1108 if ((vp_refresh_mode & WPS_REFRESH_SCROLL) || new_subline_refresh)
1092 write_line(display, &align, line - wps_vp->first_line, true); 1109 write_line(display, &align, line - skin_viewport->first_line, true);
1093 } 1110 }
1094 else 1111 else
1095 write_line(display, &align, line - wps_vp->first_line, false); 1112 write_line(display, &align, line - skin_viewport->first_line, false);
1096 } 1113 }
1097 } 1114 }
1098 1115
@@ -1100,13 +1117,13 @@ static bool skin_redraw(struct gui_wps *gwps, unsigned refresh_mode)
1100 /* progressbar */ 1117 /* progressbar */
1101 if (vp_refresh_mode & WPS_REFRESH_PLAYER_PROGRESS) 1118 if (vp_refresh_mode & WPS_REFRESH_PLAYER_PROGRESS)
1102 { 1119 {
1103 if (wps_vp->pb) 1120 if (skin_viewport->pb)
1104 { 1121 {
1105 draw_progressbar(gwps, wps_vp); 1122 draw_progressbar(gwps, skin_viewport);
1106 } 1123 }
1107 } 1124 }
1108 /* Now display any images in this viewport */ 1125 /* Now display any images in this viewport */
1109 wps_display_images(gwps, &wps_vp->vp); 1126 wps_display_images(gwps, &skin_viewport->vp);
1110#endif 1127#endif
1111 } 1128 }
1112 1129
diff --git a/apps/gui/skin_engine/skin_parser.c b/apps/gui/skin_engine/skin_parser.c
index d2b8fdc259..82083e8922 100644
--- a/apps/gui/skin_engine/skin_parser.c
+++ b/apps/gui/skin_engine/skin_parser.c
@@ -77,6 +77,9 @@ static int numoptions[WPS_MAX_COND_LEVEL];
77/* the current line in the file */ 77/* the current line in the file */
78static int line; 78static int line;
79 79
80/* the current viewport */
81static struct skin_viewport *curr_vp;
82
80#ifdef HAVE_LCD_BITMAP 83#ifdef HAVE_LCD_BITMAP
81 84
82#if LCD_DEPTH > 1 85#if LCD_DEPTH > 1
@@ -419,10 +422,11 @@ static int parse_statusbar_enable(const char *wps_bufptr,
419 (void)token; /* Kill warnings */ 422 (void)token; /* Kill warnings */
420 wps_data->wps_sb_tag = true; 423 wps_data->wps_sb_tag = true;
421 wps_data->show_sb_on_wps = true; 424 wps_data->show_sb_on_wps = true;
422 if (wps_data->viewports[0].vp.y == 0) 425 struct skin_viewport *default_vp = find_viewport(VP_DEFAULT_LABEL, wps_data);
426 if (default_vp->vp.y == 0)
423 { 427 {
424 wps_data->viewports[0].vp.y = STATUSBAR_HEIGHT; 428 default_vp->vp.y = STATUSBAR_HEIGHT;
425 wps_data->viewports[0].vp.height -= STATUSBAR_HEIGHT; 429 default_vp->vp.height -= STATUSBAR_HEIGHT;
426 } 430 }
427 return skip_end_of_line(wps_bufptr); 431 return skip_end_of_line(wps_bufptr);
428} 432}
@@ -434,10 +438,11 @@ static int parse_statusbar_disable(const char *wps_bufptr,
434 (void)token; /* Kill warnings */ 438 (void)token; /* Kill warnings */
435 wps_data->wps_sb_tag = true; 439 wps_data->wps_sb_tag = true;
436 wps_data->show_sb_on_wps = false; 440 wps_data->show_sb_on_wps = false;
437 if (wps_data->viewports[0].vp.y == STATUSBAR_HEIGHT) 441 struct skin_viewport *default_vp = find_viewport(VP_DEFAULT_LABEL, wps_data);
442 if (default_vp->vp.y == STATUSBAR_HEIGHT)
438 { 443 {
439 wps_data->viewports[0].vp.y = 0; 444 default_vp->vp.y = 0;
440 wps_data->viewports[0].vp.height += STATUSBAR_HEIGHT; 445 default_vp->vp.height += STATUSBAR_HEIGHT;
441 } 446 }
442 return skip_end_of_line(wps_bufptr); 447 return skip_end_of_line(wps_bufptr);
443} 448}
@@ -556,7 +561,7 @@ static int parse_image_load(const char *wps_bufptr,
556 img->always_display = false; 561 img->always_display = false;
557 562
558 /* save current viewport */ 563 /* save current viewport */
559 img->vp = &wps_data->viewports[wps_data->num_viewports].vp; 564 img->vp = &curr_vp->vp;
560 565
561 if (token->type == WPS_TOKEN_IMAGE_DISPLAY) 566 if (token->type == WPS_TOKEN_IMAGE_DISPLAY)
562 { 567 {
@@ -612,13 +617,13 @@ static int parse_viewport(const char *wps_bufptr,
612#endif 617#endif
613 SCREEN_MAIN; 618 SCREEN_MAIN;
614 619
615 if (wps_data->num_viewports >= WPS_MAX_VIEWPORTS) 620 struct skin_viewport *skin_vp = skin_buffer_alloc(sizeof(struct skin_viewport));
616 return WPS_ERROR_INVALID_PARAM;
617 621
618 wps_data->num_viewports++;
619 /* check for the optional letter to signify its a hideable viewport */ 622 /* check for the optional letter to signify its a hideable viewport */
620 /* %Vl|<label>|<rest of tags>| */ 623 /* %Vl|<label>|<rest of tags>| */
621 wps_data->viewports[wps_data->num_viewports].hidden_flags = 0; 624 skin_vp->hidden_flags = 0;
625 skin_vp->label = VP_NO_LABEL;
626 skin_vp->pb = NULL;
622 627
623 if (*ptr == 'l') 628 if (*ptr == 'l')
624 { 629 {
@@ -627,8 +632,8 @@ static int parse_viewport(const char *wps_bufptr,
627 char label = *(ptr+2); 632 char label = *(ptr+2);
628 if (label >= 'a' && label <= 'z') 633 if (label >= 'a' && label <= 'z')
629 { 634 {
630 wps_data->viewports[wps_data->num_viewports].hidden_flags = VP_DRAW_HIDEABLE; 635 skin_vp->hidden_flags = VP_DRAW_HIDEABLE;
631 wps_data->viewports[wps_data->num_viewports].label = label; 636 skin_vp->label = label;
632 } 637 }
633 else 638 else
634 return WPS_ERROR_INVALID_PARAM; /* malformed token: e.g. %Cl7 */ 639 return WPS_ERROR_INVALID_PARAM; /* malformed token: e.g. %Cl7 */
@@ -639,7 +644,7 @@ static int parse_viewport(const char *wps_bufptr,
639 return WPS_ERROR_INVALID_PARAM; 644 return WPS_ERROR_INVALID_PARAM;
640 645
641 ptr++; 646 ptr++;
642 struct viewport *vp = &wps_data->viewports[wps_data->num_viewports].vp; 647 struct viewport *vp = &skin_vp->vp;
643 /* format: %V|x|y|width|height|font|fg_pattern|bg_pattern| */ 648 /* format: %V|x|y|width|height|font|fg_pattern|bg_pattern| */
644 649
645 if (!(ptr = viewport_parse_viewport(vp, screen, ptr, '|'))) 650 if (!(ptr = viewport_parse_viewport(vp, screen, ptr, '|')))
@@ -649,10 +654,9 @@ static int parse_viewport(const char *wps_bufptr,
649 if (*ptr != '|') 654 if (*ptr != '|')
650 return WPS_ERROR_INVALID_PARAM; 655 return WPS_ERROR_INVALID_PARAM;
651 656
657 curr_vp->last_line = wps_data->num_lines - 1;
652 658
653 wps_data->viewports[wps_data->num_viewports-1].last_line = wps_data->num_lines - 1; 659 skin_vp->first_line = wps_data->num_lines;
654
655 wps_data->viewports[wps_data->num_viewports].first_line = wps_data->num_lines;
656 660
657 if (wps_data->num_sublines < WPS_MAX_SUBLINES) 661 if (wps_data->num_sublines < WPS_MAX_SUBLINES)
658 { 662 {
@@ -663,6 +667,11 @@ static int parse_viewport(const char *wps_bufptr,
663 wps_data->num_tokens; 667 wps_data->num_tokens;
664 } 668 }
665 669
670 struct skin_token_list *list = new_skin_token_list_item(NULL, skin_vp);
671 if (!list)
672 return WPS_ERROR_INVALID_PARAM;
673 add_to_ll_chain(&wps_data->viewports, list);
674 curr_vp = skin_vp;
666 /* Skip the rest of the line */ 675 /* Skip the rest of the line */
667 return skip_end_of_line(wps_bufptr); 676 return skip_end_of_line(wps_bufptr);
668} 677}
@@ -818,14 +827,13 @@ static int parse_progressbar(const char *wps_bufptr,
818 if (!pb || !item) 827 if (!pb || !item)
819 return WPS_ERROR_INVALID_PARAM; 828 return WPS_ERROR_INVALID_PARAM;
820 829
821 struct viewport *vp = &wps_data->viewports[wps_data->num_viewports].vp; 830 struct viewport *vp = &curr_vp->vp;
822#ifndef __PCTOOL__ 831#ifndef __PCTOOL__
823 int font_height = font_get(vp->font)->height; 832 int font_height = font_get(vp->font)->height;
824#else 833#else
825 int font_height = 8; 834 int font_height = 8;
826#endif 835#endif
827 int line_num = wps_data->num_lines - 836 int line_num = wps_data->num_lines - curr_vp->first_line;
828 wps_data->viewports[wps_data->num_viewports].first_line;
829 837
830 pb->have_bitmap_pb = false; 838 pb->have_bitmap_pb = false;
831 pb->bm.data = NULL; /* no bitmap specified */ 839 pb->bm.data = NULL; /* no bitmap specified */
@@ -837,7 +845,7 @@ static int parse_progressbar(const char *wps_bufptr,
837 pb->height = SYSFONT_HEIGHT-2; 845 pb->height = SYSFONT_HEIGHT-2;
838 pb->y = -line_num - 1; /* Will be computed during the rendering */ 846 pb->y = -line_num - 1; /* Will be computed during the rendering */
839 847
840 wps_data->viewports[wps_data->num_viewports].pb = pb; 848 curr_vp->pb = pb;
841 add_to_ll_chain(&wps_data->progressbars, item); 849 add_to_ll_chain(&wps_data->progressbars, item);
842 return 0; 850 return 0;
843 } 851 }
@@ -882,7 +890,7 @@ static int parse_progressbar(const char *wps_bufptr,
882 else 890 else
883 pb->y = -line_num - 1; /* Will be computed during the rendering */ 891 pb->y = -line_num - 1; /* Will be computed during the rendering */
884 892
885 wps_data->viewports[wps_data->num_viewports].pb = pb; 893 curr_vp->pb = pb;
886 add_to_ll_chain(&wps_data->progressbars, item); 894 add_to_ll_chain(&wps_data->progressbars, item);
887 895
888 /* Skip the rest of the line */ 896 /* Skip the rest of the line */
@@ -1154,7 +1162,7 @@ static int parse_touchregion(const char *wps_bufptr,
1154 region->y = y; 1162 region->y = y;
1155 region->width = w; 1163 region->width = w;
1156 region->height = h; 1164 region->height = h;
1157 region->wvp = &wps_data->viewports[wps_data->num_viewports]; 1165 region->wvp = curr_vp;
1158 1166
1159 if(!strncmp(pb_string, action, sizeof(pb_string)-1) 1167 if(!strncmp(pb_string, action, sizeof(pb_string)-1)
1160 && *(action + sizeof(pb_string)-1) == '|') 1168 && *(action + sizeof(pb_string)-1) == '|')
@@ -1282,7 +1290,6 @@ static bool wps_parse(struct wps_data *data, const char *wps_bufptr)
1282 level = -1; 1290 level = -1;
1283 1291
1284 while(*wps_bufptr && !fail && data->num_tokens < WPS_MAX_TOKENS - 1 1292 while(*wps_bufptr && !fail && data->num_tokens < WPS_MAX_TOKENS - 1
1285 && data->num_viewports < WPS_MAX_VIEWPORTS
1286 && data->num_lines < WPS_MAX_LINES) 1293 && data->num_lines < WPS_MAX_LINES)
1287 { 1294 {
1288 switch(*wps_bufptr++) 1295 switch(*wps_bufptr++)
@@ -1481,10 +1488,7 @@ static bool wps_parse(struct wps_data *data, const char *wps_bufptr)
1481 /* one of the limits of the while loop was exceeded */ 1488 /* one of the limits of the while loop was exceeded */
1482 fail = PARSE_FAIL_LIMITS_EXCEEDED; 1489 fail = PARSE_FAIL_LIMITS_EXCEEDED;
1483 1490
1484 data->viewports[data->num_viewports].last_line = data->num_lines - 1; 1491 curr_vp->last_line = data->num_lines - 1;
1485
1486 /* We have finished with the last viewport, so increment count */
1487 data->num_viewports++;
1488 1492
1489#if defined(DEBUG) || defined(SIMULATOR) 1493#if defined(DEBUG) || defined(SIMULATOR)
1490 print_debug_info(data, fail, line); 1494 print_debug_info(data, fail, line);
@@ -1611,34 +1615,46 @@ bool skin_data_load(struct wps_data *wps_data,
1611 return false; 1615 return false;
1612 1616
1613 wps_reset(wps_data); 1617 wps_reset(wps_data);
1618
1619 curr_vp = skin_buffer_alloc(sizeof(struct skin_viewport));
1620 if (!curr_vp)
1621 return false;
1622 struct skin_token_list *list = new_skin_token_list_item(NULL, curr_vp);
1623 if (!list)
1624 return false;
1625 add_to_ll_chain(&wps_data->viewports, list);
1626
1614 1627
1615 /* Initialise the first (default) viewport */ 1628 /* Initialise the first (default) viewport */
1616 wps_data->viewports[0].vp.x = 0; 1629 curr_vp->label = VP_DEFAULT_LABEL;
1617 wps_data->viewports[0].vp.width = display->getwidth(); 1630 curr_vp->vp.x = 0;
1618 wps_data->viewports[0].vp.height = display->getheight(); 1631 curr_vp->vp.width = display->getwidth();
1632 curr_vp->vp.height = display->getheight();
1633 curr_vp->pb = NULL;
1634 curr_vp->hidden_flags = 0;
1619 switch (statusbar_position(display->screen_type)) 1635 switch (statusbar_position(display->screen_type))
1620 { 1636 {
1621 case STATUSBAR_OFF: 1637 case STATUSBAR_OFF:
1622 wps_data->viewports[0].vp.y = 0; 1638 curr_vp->vp.y = 0;
1623 break; 1639 break;
1624 case STATUSBAR_TOP: 1640 case STATUSBAR_TOP:
1625 wps_data->viewports[0].vp.y = STATUSBAR_HEIGHT; 1641 curr_vp->vp.y = STATUSBAR_HEIGHT;
1626 wps_data->viewports[0].vp.height -= STATUSBAR_HEIGHT; 1642 curr_vp->vp.height -= STATUSBAR_HEIGHT;
1627 break; 1643 break;
1628 case STATUSBAR_BOTTOM: 1644 case STATUSBAR_BOTTOM:
1629 wps_data->viewports[0].vp.y = 0; 1645 curr_vp->vp.y = 0;
1630 wps_data->viewports[0].vp.height -= STATUSBAR_HEIGHT; 1646 curr_vp->vp.height -= STATUSBAR_HEIGHT;
1631 break; 1647 break;
1632 } 1648 }
1633#ifdef HAVE_LCD_BITMAP 1649#ifdef HAVE_LCD_BITMAP
1634 wps_data->viewports[0].vp.font = FONT_UI; 1650 curr_vp->vp.font = FONT_UI;
1635 wps_data->viewports[0].vp.drawmode = DRMODE_SOLID; 1651 curr_vp->vp.drawmode = DRMODE_SOLID;
1636#endif 1652#endif
1637#if LCD_DEPTH > 1 1653#if LCD_DEPTH > 1
1638 if (display->depth > 1) 1654 if (display->depth > 1)
1639 { 1655 {
1640 wps_data->viewports[0].vp.fg_pattern = display->get_foreground(); 1656 curr_vp->vp.fg_pattern = display->get_foreground();
1641 wps_data->viewports[0].vp.bg_pattern = display->get_background(); 1657 curr_vp->vp.bg_pattern = display->get_background();
1642 } 1658 }
1643#endif 1659#endif
1644 if (!isfile) 1660 if (!isfile)
diff --git a/apps/gui/skin_engine/wps_debug.c b/apps/gui/skin_engine/wps_debug.c
index c4a73a7cfb..e3e6e960e6 100644
--- a/apps/gui/skin_engine/wps_debug.c
+++ b/apps/gui/skin_engine/wps_debug.c
@@ -495,12 +495,13 @@ static void dump_wps_tokens(struct wps_data *data)
495 } 495 }
496} 496}
497 497
498#if 0
499/* NOTE: this is probaly not even needed anymore */
498static void print_line_info(struct wps_data *data) 500static void print_line_info(struct wps_data *data)
499{ 501{
500 int i, j, v; 502 int i, j, v;
501 struct wps_line *line; 503 struct wps_line *line;
502 struct wps_subline *subline; 504 struct wps_subline *subline;
503
504 if (wps_verbose_level > 0) 505 if (wps_verbose_level > 0)
505 { 506 {
506 DEBUGF("Number of viewports : %d\n", data->num_viewports); 507 DEBUGF("Number of viewports : %d\n", data->num_viewports);
@@ -513,7 +514,7 @@ static void print_line_info(struct wps_data *data)
513 DEBUGF("Number of tokens : %d\n", data->num_tokens); 514 DEBUGF("Number of tokens : %d\n", data->num_tokens);
514 DEBUGF("\n"); 515 DEBUGF("\n");
515 } 516 }
516 517
517 if (wps_verbose_level > 1) 518 if (wps_verbose_level > 1)
518 { 519 {
519 for (v = 0; v < data->num_viewports; v++) 520 for (v = 0; v < data->num_viewports; v++)
@@ -549,8 +550,6 @@ static void print_line_info(struct wps_data *data)
549 DEBUGF("\n"); 550 DEBUGF("\n");
550 } 551 }
551} 552}
552#if 0
553/* NOTE: this is probaly not even needed anymore */
554static void print_wps_strings(struct wps_data *data) 553static void print_wps_strings(struct wps_data *data)
555{ 554{
556 int i, len, total_len = 0, buf_used = 0; 555 int i, len, total_len = 0, buf_used = 0;
@@ -588,7 +587,7 @@ void print_debug_info(struct wps_data *data, enum wps_parse_error fail, int line
588 { 587 {
589 dump_wps_tokens(data); 588 dump_wps_tokens(data);
590 /* print_wps_strings(data); */ 589 /* print_wps_strings(data); */
591 print_line_info(data); 590 /* print_line_info(data); */
592 } 591 }
593#endif /* SIMULATOR */ 592#endif /* SIMULATOR */
594 593
diff --git a/apps/gui/skin_engine/wps_internals.h b/apps/gui/skin_engine/wps_internals.h
index 99b6e8ad9b..4136347a7b 100644
--- a/apps/gui/skin_engine/wps_internals.h
+++ b/apps/gui/skin_engine/wps_internals.h
@@ -191,7 +191,9 @@ struct wps_line {
191#define VP_DRAW_HIDEABLE 0x1 191#define VP_DRAW_HIDEABLE 0x1
192#define VP_DRAW_HIDDEN 0x2 192#define VP_DRAW_HIDDEN 0x2
193#define VP_DRAW_WASHIDDEN 0x4 193#define VP_DRAW_WASHIDDEN 0x4
194struct wps_viewport { 194#define VP_DEFAULT_LABEL '|'
195#define VP_NO_LABEL '-'
196struct skin_viewport {
195 struct viewport vp; /* The LCD viewport struct */ 197 struct viewport vp; /* The LCD viewport struct */
196 struct progressbar *pb; 198 struct progressbar *pb;
197 /* Indexes of the first and last lines belonging to this viewport in the 199 /* Indexes of the first and last lines belonging to this viewport in the
@@ -203,7 +205,7 @@ struct wps_viewport {
203 205
204#ifdef HAVE_TOUCHSCREEN 206#ifdef HAVE_TOUCHSCREEN
205struct touchregion { 207struct touchregion {
206 struct wps_viewport* wvp;/* The viewport this region is in */ 208 struct skin_viewport* wvp;/* The viewport this region is in */
207 short int x; /* x-pos */ 209 short int x; /* x-pos */
208 short int y; /* y-pos */ 210 short int y; /* y-pos */
209 short int width; /* width */ 211 short int width; /* width */
@@ -262,8 +264,7 @@ struct wps_data
262 int num_lines; 264 int num_lines;
263 265
264 /* Number of viewports in the WPS */ 266 /* Number of viewports in the WPS */
265 int num_viewports; 267 struct skin_token_list *viewports;
266 struct wps_viewport viewports[WPS_MAX_VIEWPORTS];
267 268
268 struct wps_line lines[WPS_MAX_LINES]; 269 struct wps_line lines[WPS_MAX_LINES];
269 270
@@ -346,5 +347,6 @@ const char *get_token_value(struct gui_wps *gwps,
346 347
347 348
348struct gui_img* find_image(int n, struct wps_data *data); 349struct gui_img* find_image(int n, struct wps_data *data);
350struct skin_viewport* find_viewport(char label, struct wps_data *data);
349 351
350#endif 352#endif
diff --git a/apps/gui/wps.c b/apps/gui/wps.c
index 055f8d01e6..4553970422 100644
--- a/apps/gui/wps.c
+++ b/apps/gui/wps.c
@@ -1239,7 +1239,7 @@ static void statusbar_toggle_handler(void *data)
1239 1239
1240 FOR_NB_SCREENS(i) 1240 FOR_NB_SCREENS(i)
1241 { 1241 {
1242 struct viewport *vp = &gui_wps[i].data->viewports[0].vp; 1242 struct viewport *vp = &find_viewport(VP_DEFAULT_LABEL, &wps_datas[i])->vp;
1243 bool draw = wpsbars & (VP_SB_ONSCREEN(i) | VP_SB_IGNORE_SETTING(i)); 1243 bool draw = wpsbars & (VP_SB_ONSCREEN(i) | VP_SB_IGNORE_SETTING(i));
1244 if (!draw) 1244 if (!draw)
1245 { 1245 {