diff options
Diffstat (limited to 'apps/gui/skin_engine/skin_tokens.c')
-rw-r--r-- | apps/gui/skin_engine/skin_tokens.c | 52 |
1 files changed, 32 insertions, 20 deletions
diff --git a/apps/gui/skin_engine/skin_tokens.c b/apps/gui/skin_engine/skin_tokens.c index 6f154a4d53..bb9466c134 100644 --- a/apps/gui/skin_engine/skin_tokens.c +++ b/apps/gui/skin_engine/skin_tokens.c | |||
@@ -36,6 +36,7 @@ | |||
36 | #include "debug.h" | 36 | #include "debug.h" |
37 | #include "cuesheet.h" | 37 | #include "cuesheet.h" |
38 | #include "replaygain.h" | 38 | #include "replaygain.h" |
39 | #include "core_alloc.h" | ||
39 | #ifdef HAVE_LCD_CHARCELLS | 40 | #ifdef HAVE_LCD_CHARCELLS |
40 | #include "hwcompat.h" | 41 | #include "hwcompat.h" |
41 | #endif | 42 | #endif |
@@ -732,18 +733,21 @@ static const char* NOINLINE get_lif_token_value(struct gui_wps *gwps, | |||
732 | { | 733 | { |
733 | int a = lif->num_options; | 734 | int a = lif->num_options; |
734 | int b; | 735 | int b; |
735 | const char* out_text = get_token_value(gwps, lif->token, offset, | 736 | struct wps_token *liftoken = SKINOFFSETTOPTR(get_skin_buffer(gwps->data), lif->token); |
736 | buf, buf_size, &a); | 737 | const char* out_text = get_token_value(gwps, liftoken, offset, buf, buf_size, &a); |
737 | if (a == -1 && lif->token->type != SKIN_TOKEN_VOLUME) | 738 | if (a == -1 && liftoken->type != SKIN_TOKEN_VOLUME) |
738 | a = (out_text && *out_text) ? 1 : 0; | 739 | a = (out_text && *out_text) ? 1 : 0; |
739 | switch (lif->operand.type) | 740 | switch (lif->operand.type) |
740 | { | 741 | { |
741 | case STRING: | 742 | case STRING: |
743 | { | ||
744 | char *cmp = SKINOFFSETTOPTR(get_skin_buffer(gwps->data), lif->operand.data.text); | ||
742 | if (out_text == NULL) | 745 | if (out_text == NULL) |
743 | return NULL; | 746 | return NULL; |
744 | a = strcmp(out_text, lif->operand.data.text); | 747 | a = strcmp(out_text, cmp); |
745 | b = 0; | 748 | b = 0; |
746 | break; | 749 | break; |
750 | } | ||
747 | case INTEGER: | 751 | case INTEGER: |
748 | case DECIMAL: | 752 | case DECIMAL: |
749 | b = lif->operand.data.number; | 753 | b = lif->operand.data.number; |
@@ -752,11 +756,12 @@ static const char* NOINLINE get_lif_token_value(struct gui_wps *gwps, | |||
752 | { | 756 | { |
753 | char temp_buf[MAX_PATH]; | 757 | char temp_buf[MAX_PATH]; |
754 | const char *outb; | 758 | const char *outb; |
755 | struct wps_token *token = lif->operand.data.code->data; | 759 | struct skin_element *element = SKINOFFSETTOPTR(get_skin_buffer(gwps->data), lif->operand.data.code); |
760 | struct wps_token *token = SKINOFFSETTOPTR(get_skin_buffer(gwps->data), element->data); | ||
756 | b = lif->num_options; | 761 | b = lif->num_options; |
757 | outb = get_token_value(gwps, token, offset, temp_buf, | 762 | outb = get_token_value(gwps, token, offset, temp_buf, |
758 | sizeof(temp_buf), &b); | 763 | sizeof(temp_buf), &b); |
759 | if (b == -1 && lif->token->type != SKIN_TOKEN_VOLUME) | 764 | if (b == -1 && liftoken->type != SKIN_TOKEN_VOLUME) |
760 | { | 765 | { |
761 | if (!out_text || !outb) | 766 | if (!out_text || !outb) |
762 | return (lif->op == IF_EQUALS) ? NULL : "neq"; | 767 | return (lif->op == IF_EQUALS) ? NULL : "neq"; |
@@ -865,14 +870,15 @@ const char *get_token_value(struct gui_wps *gwps, | |||
865 | { | 870 | { |
866 | case SKIN_TOKEN_LOGICAL_IF: | 871 | case SKIN_TOKEN_LOGICAL_IF: |
867 | { | 872 | { |
868 | struct logical_if *lif = token->value.data; | 873 | struct logical_if *lif = SKINOFFSETTOPTR(get_skin_buffer(data), token->value.data); |
869 | return get_lif_token_value(gwps, lif, offset, buf, buf_size); | 874 | return get_lif_token_value(gwps, lif, offset, buf, buf_size); |
870 | } | 875 | } |
871 | break; | 876 | break; |
872 | case SKIN_TOKEN_SUBSTRING: | 877 | case SKIN_TOKEN_SUBSTRING: |
873 | { | 878 | { |
874 | struct substring *ss = token->value.data; | 879 | struct substring *ss = SKINOFFSETTOPTR(get_skin_buffer(data), token->value.data); |
875 | const char *token_val = get_token_value(gwps, ss->token, offset, | 880 | const char *token_val = get_token_value(gwps, |
881 | SKINOFFSETTOPTR(get_skin_buffer(data), ss->token), offset, | ||
876 | buf, buf_size, intval); | 882 | buf, buf_size, intval); |
877 | if (token_val) | 883 | if (token_val) |
878 | { | 884 | { |
@@ -909,7 +915,7 @@ const char *get_token_value(struct gui_wps *gwps, | |||
909 | return &(token->value.c); | 915 | return &(token->value.c); |
910 | 916 | ||
911 | case SKIN_TOKEN_STRING: | 917 | case SKIN_TOKEN_STRING: |
912 | return (char*)token->value.data; | 918 | return (char*)SKINOFFSETTOPTR(get_skin_buffer(data), token->value.data); |
913 | 919 | ||
914 | case SKIN_TOKEN_TRANSLATEDSTRING: | 920 | case SKIN_TOKEN_TRANSLATEDSTRING: |
915 | return (char*)P2STR(ID2P(token->value.i)); | 921 | return (char*)P2STR(ID2P(token->value.i)); |
@@ -929,7 +935,7 @@ const char *get_token_value(struct gui_wps *gwps, | |||
929 | return buf; | 935 | return buf; |
930 | case SKIN_TOKEN_LIST_ITEM_TEXT: | 936 | case SKIN_TOKEN_LIST_ITEM_TEXT: |
931 | { | 937 | { |
932 | struct listitem *li = (struct listitem *)token->value.data; | 938 | struct listitem *li = (struct listitem *)SKINOFFSETTOPTR(get_skin_buffer(data), token->value.data); |
933 | return skinlist_get_item_text(li->offset, li->wrap, buf, buf_size); | 939 | return skinlist_get_item_text(li->offset, li->wrap, buf, buf_size); |
934 | } | 940 | } |
935 | case SKIN_TOKEN_LIST_ITEM_NUMBER: | 941 | case SKIN_TOKEN_LIST_ITEM_NUMBER: |
@@ -941,7 +947,7 @@ const char *get_token_value(struct gui_wps *gwps, | |||
941 | return skinlist_is_selected_item()?"s":""; | 947 | return skinlist_is_selected_item()?"s":""; |
942 | case SKIN_TOKEN_LIST_ITEM_ICON: | 948 | case SKIN_TOKEN_LIST_ITEM_ICON: |
943 | { | 949 | { |
944 | struct listitem *li = (struct listitem *)token->value.data; | 950 | struct listitem *li = (struct listitem *)SKINOFFSETTOPTR(get_skin_buffer(data), token->value.data); |
945 | int icon = skinlist_get_item_icon(li->offset, li->wrap); | 951 | int icon = skinlist_get_item_icon(li->offset, li->wrap); |
946 | if (intval) | 952 | if (intval) |
947 | *intval = icon; | 953 | *intval = icon; |
@@ -997,14 +1003,15 @@ const char *get_token_value(struct gui_wps *gwps, | |||
997 | return buf; | 1003 | return buf; |
998 | #ifdef HAVE_ALBUMART | 1004 | #ifdef HAVE_ALBUMART |
999 | case SKIN_TOKEN_ALBUMART_FOUND: | 1005 | case SKIN_TOKEN_ALBUMART_FOUND: |
1000 | if (data->albumart) | 1006 | if (SKINOFFSETTOPTR(get_skin_buffer(data), data->albumart)) |
1001 | { | 1007 | { |
1002 | int handle = -1; | 1008 | int handle = -1; |
1003 | handle = playback_current_aa_hid(data->playback_aa_slot); | 1009 | handle = playback_current_aa_hid(data->playback_aa_slot); |
1004 | #if CONFIG_TUNER | 1010 | #if CONFIG_TUNER |
1005 | if (in_radio_screen() || (get_radio_status() != FMRADIO_OFF)) | 1011 | if (in_radio_screen() || (get_radio_status() != FMRADIO_OFF)) |
1006 | { | 1012 | { |
1007 | struct dim dim = {data->albumart->width, data->albumart->height}; | 1013 | struct skin_albumart *aa = SKINOFFSETTOPTR(get_skin_buffer(data), data->albumart); |
1014 | struct dim dim = {aa->width, aa->height}; | ||
1008 | handle = radio_get_art_hid(&dim); | 1015 | handle = radio_get_art_hid(&dim); |
1009 | } | 1016 | } |
1010 | #endif | 1017 | #endif |
@@ -1473,9 +1480,11 @@ const char *get_token_value(struct gui_wps *gwps, | |||
1473 | { | 1480 | { |
1474 | #ifdef HAVE_TOUCHSCREEN | 1481 | #ifdef HAVE_TOUCHSCREEN |
1475 | unsigned int last_touch = touchscreen_last_touch(); | 1482 | unsigned int last_touch = touchscreen_last_touch(); |
1476 | struct touchregion_lastpress *data = token->value.data; | 1483 | char *skin_base = get_skin_buffer(data); |
1477 | if (data->region) | 1484 | struct touchregion_lastpress *data = SKINOFFSETTOPTR(skin_base, token->value.data); |
1478 | last_touch = data->region->last_press; | 1485 | struct touchregion *region = SKINOFFSETTOPTR(skin_base, data->region); |
1486 | if (region) | ||
1487 | last_touch = region->last_press; | ||
1479 | 1488 | ||
1480 | if (last_touch != 0xffff && | 1489 | if (last_touch != 0xffff && |
1481 | TIME_BEFORE(current_tick, data->timeout + last_touch)) | 1490 | TIME_BEFORE(current_tick, data->timeout + last_touch)) |
@@ -1805,7 +1814,8 @@ const char *get_token_value(struct gui_wps *gwps, | |||
1805 | #ifdef HAVE_SKIN_VARIABLES | 1814 | #ifdef HAVE_SKIN_VARIABLES |
1806 | case SKIN_TOKEN_VAR_GETVAL: | 1815 | case SKIN_TOKEN_VAR_GETVAL: |
1807 | { | 1816 | { |
1808 | struct skin_var* var = token->value.data; | 1817 | char *skin_base = get_skin_buffer(data); |
1818 | struct skin_var* var = SKINOFFSETTOPTR(skin_base, token->value.data); | ||
1809 | if (intval) | 1819 | if (intval) |
1810 | *intval = var->value; | 1820 | *intval = var->value; |
1811 | snprintf(buf, buf_size, "%d", var->value); | 1821 | snprintf(buf, buf_size, "%d", var->value); |
@@ -1814,8 +1824,10 @@ const char *get_token_value(struct gui_wps *gwps, | |||
1814 | break; | 1824 | break; |
1815 | case SKIN_TOKEN_VAR_TIMEOUT: | 1825 | case SKIN_TOKEN_VAR_TIMEOUT: |
1816 | { | 1826 | { |
1817 | struct skin_var_lastchange *data = token->value.data; | 1827 | char *skin_base = get_skin_buffer(data); |
1818 | unsigned int last_change = data->var->last_changed; | 1828 | struct skin_var_lastchange *data = SKINOFFSETTOPTR(skin_base, token->value.data); |
1829 | struct skin_var* var = SKINOFFSETTOPTR(skin_base, data->var); | ||
1830 | unsigned int last_change = var->last_changed; | ||
1819 | 1831 | ||
1820 | if (last_change != 0xffff && | 1832 | if (last_change != 0xffff && |
1821 | TIME_BEFORE(current_tick, data->timeout + last_change)) | 1833 | TIME_BEFORE(current_tick, data->timeout + last_change)) |