summaryrefslogtreecommitdiff
path: root/apps/gui/skin_engine/skin_tokens.c
diff options
context:
space:
mode:
Diffstat (limited to 'apps/gui/skin_engine/skin_tokens.c')
-rw-r--r--apps/gui/skin_engine/skin_tokens.c52
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))