diff options
-rw-r--r-- | apps/gui/skin_engine/skin_display.c | 95 | ||||
-rw-r--r-- | apps/gui/skin_engine/skin_parser.c | 96 | ||||
-rw-r--r-- | apps/gui/skin_engine/wps_debug.c | 9 | ||||
-rw-r--r-- | apps/gui/skin_engine/wps_internals.h | 10 | ||||
-rw-r--r-- | apps/gui/wps.c | 2 |
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 | ||
134 | static void draw_progressbar(struct gui_wps *gwps, | 135 | static 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 | |||
495 | struct 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 */ |
78 | static int line; | 78 | static int line; |
79 | 79 | ||
80 | /* the current viewport */ | ||
81 | static 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 */ | ||
498 | static void print_line_info(struct wps_data *data) | 500 | static 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 */ | ||
554 | static void print_wps_strings(struct wps_data *data) | 553 | static 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 |
194 | struct wps_viewport { | 194 | #define VP_DEFAULT_LABEL '|' |
195 | #define VP_NO_LABEL '-' | ||
196 | struct 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 |
205 | struct touchregion { | 207 | struct 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 | ||
348 | struct gui_img* find_image(int n, struct wps_data *data); | 349 | struct gui_img* find_image(int n, struct wps_data *data); |
350 | struct 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 | { |