summaryrefslogtreecommitdiff
path: root/apps
diff options
context:
space:
mode:
Diffstat (limited to 'apps')
-rw-r--r--apps/gui/bitmap/list-skinned.c17
-rw-r--r--apps/gui/skin_engine/skin_display.c22
-rw-r--r--apps/gui/skin_engine/skin_parser.c54
-rw-r--r--apps/gui/skin_engine/skin_render.c66
-rw-r--r--apps/gui/skin_engine/skin_tokens.c56
-rw-r--r--apps/gui/statusbar-skinned.c12
-rw-r--r--apps/plugins/chessbox/chessbox_pgn.c14
-rw-r--r--apps/plugins/reversi/reversi-gui.c7
8 files changed, 160 insertions, 88 deletions
diff --git a/apps/gui/bitmap/list-skinned.c b/apps/gui/bitmap/list-skinned.c
index f0396263f3..c5429738ed 100644
--- a/apps/gui/bitmap/list-skinned.c
+++ b/apps/gui/bitmap/list-skinned.c
@@ -219,7 +219,9 @@ bool skinlist_draw(struct screen *display, struct gui_synclist *list)
219 { 219 {
220 int original_x, original_y; 220 int original_x, original_y;
221 skin_viewport = SKINOFFSETTOPTR(get_skin_buffer(wps.data), viewport->data); 221 skin_viewport = SKINOFFSETTOPTR(get_skin_buffer(wps.data), viewport->data);
222 char *viewport_label = SKINOFFSETTOPTR(get_skin_buffer(wps.data), skin_viewport->label); 222 char *viewport_label = NULL;
223 if (skin_viewport)
224 viewport_label = SKINOFFSETTOPTR(get_skin_buffer(wps.data), skin_viewport->label);
223 if (viewport->children == 0 || !viewport_label || 225 if (viewport->children == 0 || !viewport_label ||
224 (skin_viewport->label && strcmp(label, viewport_label)) 226 (skin_viewport->label && strcmp(label, viewport_label))
225 ) 227 )
@@ -254,13 +256,17 @@ bool skinlist_draw(struct screen *display, struct gui_synclist *list)
254 while (imglist) 256 while (imglist)
255 { 257 {
256 struct wps_token *token = SKINOFFSETTOPTR(get_skin_buffer(wps.data), imglist->token); 258 struct wps_token *token = SKINOFFSETTOPTR(get_skin_buffer(wps.data), imglist->token);
257 struct gui_img *img = SKINOFFSETTOPTR(get_skin_buffer(wps.data), token->value.data); 259 struct gui_img *img = NULL;
258 img->display = -1; 260 if (token)
261 img = SKINOFFSETTOPTR(get_skin_buffer(wps.data), token->value.data);
262 if (img)
263 img->display = -1;
259 imglist = SKINOFFSETTOPTR(get_skin_buffer(wps.data), imglist->next); 264 imglist = SKINOFFSETTOPTR(get_skin_buffer(wps.data), imglist->next);
260 } 265 }
261 struct skin_element** children = SKINOFFSETTOPTR(get_skin_buffer(wps.data), viewport->children); 266 struct skin_element** children = SKINOFFSETTOPTR(get_skin_buffer(wps.data), viewport->children);
262 skin_render_viewport(SKINOFFSETTOPTR(get_skin_buffer(wps.data), (intptr_t)children[0]), 267 if (children && *children)
263 &wps, skin_viewport, SKIN_REFRESH_ALL); 268 skin_render_viewport(SKINOFFSETTOPTR(get_skin_buffer(wps.data), (intptr_t)children[0]),
269 &wps, skin_viewport, SKIN_REFRESH_ALL);
264 wps_display_images(&wps, &skin_viewport->vp); 270 wps_display_images(&wps, &skin_viewport->vp);
265 /* force disableing scroll because it breaks later */ 271 /* force disableing scroll because it breaks later */
266 if (!is_selected) 272 if (!is_selected)
@@ -278,4 +284,3 @@ bool skinlist_draw(struct screen *display, struct gui_synclist *list)
278 current_drawing_line = list->selected_item; 284 current_drawing_line = list->selected_item;
279 return true; 285 return true;
280} 286}
281
diff --git a/apps/gui/skin_engine/skin_display.c b/apps/gui/skin_engine/skin_display.c
index c35b09eaac..4a3dcc2177 100644
--- a/apps/gui/skin_engine/skin_display.c
+++ b/apps/gui/skin_engine/skin_display.c
@@ -390,16 +390,20 @@ void wps_display_images(struct gui_wps *gwps, struct viewport* vp)
390 while (list) 390 while (list)
391 { 391 {
392 struct wps_token *token = SKINOFFSETTOPTR(get_skin_buffer(data), list->token); 392 struct wps_token *token = SKINOFFSETTOPTR(get_skin_buffer(data), list->token);
393 struct gui_img *img = (struct gui_img*)SKINOFFSETTOPTR(get_skin_buffer(data), token->value.data); 393 struct gui_img *img = NULL;
394 if (img->using_preloaded_icons && img->display >= 0) 394 if (token)
395 { 395 img = (struct gui_img*)SKINOFFSETTOPTR(get_skin_buffer(data), token->value.data);
396 screen_put_icon(display, img->x, img->y, img->display); 396 if (img) {
397 } 397 if (img->using_preloaded_icons && img->display >= 0)
398 else if (img->loaded)
399 {
400 if (img->display >= 0)
401 { 398 {
402 wps_draw_image(gwps, img, img->display, vp); 399 screen_put_icon(display, img->x, img->y, img->display);
400 }
401 else if (img->loaded)
402 {
403 if (img->display >= 0)
404 {
405 wps_draw_image(gwps, img, img->display, vp);
406 }
403 } 407 }
404 } 408 }
405 list = SKINOFFSETTOPTR(get_skin_buffer(data), list->next); 409 list = SKINOFFSETTOPTR(get_skin_buffer(data), list->next);
diff --git a/apps/gui/skin_engine/skin_parser.c b/apps/gui/skin_engine/skin_parser.c
index e1a8118190..b64bfc143c 100644
--- a/apps/gui/skin_engine/skin_parser.c
+++ b/apps/gui/skin_engine/skin_parser.c
@@ -183,13 +183,16 @@ void *skin_find_item(const char *label, enum skin_find_what what,
183 { 183 {
184 bool skip = false; 184 bool skip = false;
185 struct wps_token *token = NULL; 185 struct wps_token *token = NULL;
186 itemlabel = NULL;
186 if (!isvplist) 187 if (!isvplist)
187 token = SKINOFFSETTOPTR(databuf, list.linkedlist->token); 188 token = SKINOFFSETTOPTR(databuf, list.linkedlist->token);
188 switch (what) 189 if (token)
190 switch (what)
189 { 191 {
190 case SKIN_FIND_UIVP: 192 case SKIN_FIND_UIVP:
191 case SKIN_FIND_VP: 193 case SKIN_FIND_VP:
192 ret = SKINOFFSETTOPTR(databuf, list.vplist->data); 194 ret = SKINOFFSETTOPTR(databuf, list.vplist->data);
195 if (!ret) break;
193 if (((struct skin_viewport *)ret)->label == VP_DEFAULT_LABEL) 196 if (((struct skin_viewport *)ret)->label == VP_DEFAULT_LABEL)
194 itemlabel = VP_DEFAULT_LABEL_STRING; 197 itemlabel = VP_DEFAULT_LABEL_STRING;
195 else 198 else
@@ -199,10 +202,12 @@ void *skin_find_item(const char *label, enum skin_find_what what,
199 break; 202 break;
200 case SKIN_FIND_IMAGE: 203 case SKIN_FIND_IMAGE:
201 ret = SKINOFFSETTOPTR(databuf, token->value.data); 204 ret = SKINOFFSETTOPTR(databuf, token->value.data);
205 if (!ret) break;
202 itemlabel = SKINOFFSETTOPTR(databuf, ((struct gui_img *)ret)->label); 206 itemlabel = SKINOFFSETTOPTR(databuf, ((struct gui_img *)ret)->label);
203 break; 207 break;
204#ifdef HAVE_TOUCHSCREEN 208#ifdef HAVE_TOUCHSCREEN
205 case SKIN_FIND_TOUCHREGION: 209 case SKIN_FIND_TOUCHREGION:
210 if (!ret) break;
206 ret = SKINOFFSETTOPTR(databuf, token->value.data); 211 ret = SKINOFFSETTOPTR(databuf, token->value.data);
207 itemlabel = SKINOFFSETTOPTR(databuf, ((struct touchregion *)ret)->label); 212 itemlabel = SKINOFFSETTOPTR(databuf, ((struct touchregion *)ret)->label);
208 break; 213 break;
@@ -210,6 +215,7 @@ void *skin_find_item(const char *label, enum skin_find_what what,
210#ifdef HAVE_SKIN_VARIABLES 215#ifdef HAVE_SKIN_VARIABLES
211 case SKIN_VARIABLE: 216 case SKIN_VARIABLE:
212 ret = SKINOFFSETTOPTR(databuf, token->value.data); 217 ret = SKINOFFSETTOPTR(databuf, token->value.data);
218 if (!ret) break;
213 itemlabel = SKINOFFSETTOPTR(databuf, ((struct skin_var *)ret)->label); 219 itemlabel = SKINOFFSETTOPTR(databuf, ((struct skin_var *)ret)->label);
214 break; 220 break;
215#endif 221#endif
@@ -1708,23 +1714,30 @@ void skin_data_free_buflib_allocs(struct wps_data *wps_data)
1708{ 1714{
1709 if (wps_data->wps_loaded) 1715 if (wps_data->wps_loaded)
1710 skin_buffer = get_skin_buffer(wps_data); 1716 skin_buffer = get_skin_buffer(wps_data);
1717 if (!skin_buffer)
1718 return;
1719
1711#ifndef __PCTOOL__ 1720#ifndef __PCTOOL__
1712 struct skin_token_list *list = SKINOFFSETTOPTR(skin_buffer, wps_data->images); 1721 struct skin_token_list *list = SKINOFFSETTOPTR(skin_buffer, wps_data->images);
1713 int *font_ids = SKINOFFSETTOPTR(skin_buffer, wps_data->font_ids); 1722 int *font_ids = SKINOFFSETTOPTR(skin_buffer, wps_data->font_ids);
1714 while (list) 1723 while (list)
1715 { 1724 {
1716 struct wps_token *token = SKINOFFSETTOPTR(skin_buffer, list->token); 1725 struct wps_token *token = SKINOFFSETTOPTR(skin_buffer, list->token);
1717 struct gui_img *img = (struct gui_img*)SKINOFFSETTOPTR(skin_buffer, token->value.data); 1726 struct gui_img *img = NULL;
1718 if (img->buflib_handle > 0) 1727 if (token)
1728 img = (struct gui_img*)SKINOFFSETTOPTR(skin_buffer, token->value.data);
1729 if (img && img->buflib_handle > 0)
1719 { 1730 {
1720 struct skin_token_list *imglist = SKINOFFSETTOPTR(skin_buffer, list->next); 1731 struct skin_token_list *imglist = SKINOFFSETTOPTR(skin_buffer, list->next);
1721 core_free(img->buflib_handle);
1722 1732
1733 core_free(img->buflib_handle);
1723 while (imglist) 1734 while (imglist)
1724 { 1735 {
1725 struct wps_token *freetoken = SKINOFFSETTOPTR(skin_buffer, imglist->token); 1736 struct wps_token *freetoken = SKINOFFSETTOPTR(skin_buffer, imglist->token);
1726 struct gui_img *freeimg = (struct gui_img*)SKINOFFSETTOPTR(skin_buffer, freetoken->value.data); 1737 struct gui_img *freeimg = NULL;
1727 if (img->buflib_handle == freeimg->buflib_handle) 1738 if (freetoken)
1739 freeimg = (struct gui_img*)SKINOFFSETTOPTR(skin_buffer, freetoken->value.data);
1740 if (freeimg && img->buflib_handle == freeimg->buflib_handle)
1728 freeimg->buflib_handle = -1; 1741 freeimg->buflib_handle = -1;
1729 imglist = SKINOFFSETTOPTR(skin_buffer, imglist->next); 1742 imglist = SKINOFFSETTOPTR(skin_buffer, imglist->next);
1730 } 1743 }
@@ -1885,8 +1898,10 @@ static bool load_skin_bitmaps(struct wps_data *wps_data, char *bmpdir)
1885 while (list) 1898 while (list)
1886 { 1899 {
1887 struct wps_token *token = SKINOFFSETTOPTR(skin_buffer, list->token); 1900 struct wps_token *token = SKINOFFSETTOPTR(skin_buffer, list->token);
1901 if (!token) goto skip;
1888 struct gui_img *img = (struct gui_img*)SKINOFFSETTOPTR(skin_buffer, token->value.data); 1902 struct gui_img *img = (struct gui_img*)SKINOFFSETTOPTR(skin_buffer, token->value.data);
1889 if (!img->loaded) 1903
1904 if (img && !img->loaded)
1890 { 1905 {
1891 if (img->using_preloaded_icons) 1906 if (img->using_preloaded_icons)
1892 { 1907 {
@@ -1901,20 +1916,22 @@ static bool load_skin_bitmaps(struct wps_data *wps_data, char *bmpdir)
1901 handle = load_skin_bmp(wps_data, &img->bm, bmpdir); 1916 handle = load_skin_bmp(wps_data, &img->bm, bmpdir);
1902 img->buflib_handle = handle; 1917 img->buflib_handle = handle;
1903 img->loaded = img->buflib_handle >= 0; 1918 img->loaded = img->buflib_handle >= 0;
1919
1904 if (img->loaded) 1920 if (img->loaded)
1905 { 1921 {
1906 struct skin_token_list *imglist = SKINOFFSETTOPTR(skin_buffer, list->next); 1922 struct skin_token_list *imglist = SKINOFFSETTOPTR(skin_buffer, list->next);
1907
1908 img->subimage_height = img->bm.height / img->num_subimages; 1923 img->subimage_height = img->bm.height / img->num_subimages;
1909 while (imglist) 1924 while (imglist)
1910 { 1925 {
1911 token = SKINOFFSETTOPTR(skin_buffer, imglist->token); 1926 token = SKINOFFSETTOPTR(skin_buffer, imglist->token);
1912 img = (struct gui_img*)SKINOFFSETTOPTR(skin_buffer, token->value.data); 1927 if (token) {
1913 if (!strcmp(path, img->bm.data)) 1928 img = (struct gui_img*)SKINOFFSETTOPTR(skin_buffer, token->value.data);
1914 { 1929 if (img && !strcmp(path, img->bm.data))
1915 img->loaded = true; 1930 {
1916 img->buflib_handle = handle; 1931 img->loaded = true;
1917 img->subimage_height = img->bm.height / img->num_subimages; 1932 img->buflib_handle = handle;
1933 img->subimage_height = img->bm.height / img->num_subimages;
1934 }
1918 } 1935 }
1919 imglist = SKINOFFSETTOPTR(skin_buffer, imglist->next); 1936 imglist = SKINOFFSETTOPTR(skin_buffer, imglist->next);
1920 } 1937 }
@@ -1923,6 +1940,7 @@ static bool load_skin_bitmaps(struct wps_data *wps_data, char *bmpdir)
1923 retval = false; 1940 retval = false;
1924 } 1941 }
1925 } 1942 }
1943 skip:
1926 list = SKINOFFSETTOPTR(skin_buffer, list->next); 1944 list = SKINOFFSETTOPTR(skin_buffer, list->next);
1927 } 1945 }
1928 1946
@@ -1947,6 +1965,7 @@ static bool skin_load_fonts(struct wps_data *data)
1947 /* first, find the viewports that have a non-sys/ui-font font */ 1965 /* first, find the viewports that have a non-sys/ui-font font */
1948 struct skin_viewport *skin_vp = 1966 struct skin_viewport *skin_vp =
1949 SKINOFFSETTOPTR(skin_buffer, vp_list->data); 1967 SKINOFFSETTOPTR(skin_buffer, vp_list->data);
1968 if (!skin_vp) continue;
1950 struct viewport *vp = &skin_vp->vp; 1969 struct viewport *vp = &skin_vp->vp;
1951 1970
1952 font_id = skin_vp->parsed_fontid; 1971 font_id = skin_vp->parsed_fontid;
@@ -2507,9 +2526,10 @@ bool skin_data_load(enum screen_type screen, struct wps_data *wps_data,
2507 while (regions) 2526 while (regions)
2508 { 2527 {
2509 struct wps_token *token = SKINOFFSETTOPTR(skin_buffer, regions->token); 2528 struct wps_token *token = SKINOFFSETTOPTR(skin_buffer, regions->token);
2510 struct touchregion *r = SKINOFFSETTOPTR(skin_buffer, token->value.data); 2529 struct touchregion *r = NULL;
2511 2530 if (token)
2512 if (r->action != ACTION_TOUCH_SCROLLBAR && 2531 r = SKINOFFSETTOPTR(skin_buffer, token->value.data);
2532 if (r && r->action != ACTION_TOUCH_SCROLLBAR &&
2513 r->action != ACTION_TOUCH_VOLUME) 2533 r->action != ACTION_TOUCH_VOLUME)
2514 { 2534 {
2515 user_touch_region_found = true; 2535 user_touch_region_found = true;
diff --git a/apps/gui/skin_engine/skin_render.c b/apps/gui/skin_engine/skin_render.c
index ed2f783e7a..7f2dcab222 100644
--- a/apps/gui/skin_engine/skin_render.c
+++ b/apps/gui/skin_engine/skin_render.c
@@ -96,7 +96,7 @@ static bool do_non_text_tags(struct gui_wps *gwps, struct skin_draw_info *info,
96 struct skin_element *element, struct skin_viewport* skin_vp) 96 struct skin_element *element, struct skin_viewport* skin_vp)
97{ 97{
98 struct wps_token *token = (struct wps_token *)SKINOFFSETTOPTR(skin_buffer, element->data); 98 struct wps_token *token = (struct wps_token *)SKINOFFSETTOPTR(skin_buffer, element->data);
99 99 if (!token) return false;
100 struct viewport *vp = &skin_vp->vp; 100 struct viewport *vp = &skin_vp->vp;
101 struct wps_data *data = gwps->data; 101 struct wps_data *data = gwps->data;
102 bool do_refresh = (element->tag->flags & info->refresh_type) > 0; 102 bool do_refresh = (element->tag->flags & info->refresh_type) > 0;
@@ -107,7 +107,9 @@ static bool do_non_text_tags(struct gui_wps *gwps, struct skin_draw_info *info,
107 case SKIN_TOKEN_VIEWPORT_FGCOLOUR: 107 case SKIN_TOKEN_VIEWPORT_FGCOLOUR:
108 { 108 {
109 struct viewport_colour *col = SKINOFFSETTOPTR(skin_buffer, token->value.data); 109 struct viewport_colour *col = SKINOFFSETTOPTR(skin_buffer, token->value.data);
110 if (!col) return false;
110 struct viewport *vp = SKINOFFSETTOPTR(skin_buffer, col->vp); 111 struct viewport *vp = SKINOFFSETTOPTR(skin_buffer, col->vp);
112 if (!vp) return false;
111 vp->fg_pattern = col->colour; 113 vp->fg_pattern = col->colour;
112 skin_vp->fgbg_changed = true; 114 skin_vp->fgbg_changed = true;
113 } 115 }
@@ -115,7 +117,9 @@ static bool do_non_text_tags(struct gui_wps *gwps, struct skin_draw_info *info,
115 case SKIN_TOKEN_VIEWPORT_BGCOLOUR: 117 case SKIN_TOKEN_VIEWPORT_BGCOLOUR:
116 { 118 {
117 struct viewport_colour *col = SKINOFFSETTOPTR(skin_buffer, token->value.data); 119 struct viewport_colour *col = SKINOFFSETTOPTR(skin_buffer, token->value.data);
120 if (!col) return false;
118 struct viewport *vp = SKINOFFSETTOPTR(skin_buffer, col->vp); 121 struct viewport *vp = SKINOFFSETTOPTR(skin_buffer, col->vp);
122 if (!vp) return false;
119 vp->bg_pattern = col->colour; 123 vp->bg_pattern = col->colour;
120 skin_vp->fgbg_changed = true; 124 skin_vp->fgbg_changed = true;
121 } 125 }
@@ -124,6 +128,7 @@ static bool do_non_text_tags(struct gui_wps *gwps, struct skin_draw_info *info,
124 { 128 {
125 struct line_desc *data = SKINOFFSETTOPTR(skin_buffer, token->value.data); 129 struct line_desc *data = SKINOFFSETTOPTR(skin_buffer, token->value.data);
126 struct line_desc *linedes = &info->line_desc; 130 struct line_desc *linedes = &info->line_desc;
131 if (!data || !linedes) return false;
127 /* gradient colors are handled with a separate tag 132 /* gradient colors are handled with a separate tag
128 * (SKIN_TOKEN_VIEWPORT_GRADIENT_SETUP, see below). since it may 133 * (SKIN_TOKEN_VIEWPORT_GRADIENT_SETUP, see below). since it may
129 * come before the text style tag color fields need to be preserved */ 134 * come before the text style tag color fields need to be preserved */
@@ -147,6 +152,7 @@ static bool do_non_text_tags(struct gui_wps *gwps, struct skin_draw_info *info,
147 { 152 {
148 struct gradient_config *cfg = SKINOFFSETTOPTR(skin_buffer, token->value.data); 153 struct gradient_config *cfg = SKINOFFSETTOPTR(skin_buffer, token->value.data);
149 struct line_desc *linedes = &info->line_desc; 154 struct line_desc *linedes = &info->line_desc;
155 if (!cfg || !linedes) return false;
150 linedes->text_color = cfg->text; 156 linedes->text_color = cfg->text;
151 linedes->line_color = cfg->start; 157 linedes->line_color = cfg->start;
152 linedes->line_end_color = cfg->end; 158 linedes->line_end_color = cfg->end;
@@ -162,17 +168,19 @@ static bool do_non_text_tags(struct gui_wps *gwps, struct skin_draw_info *info,
162 { 168 {
163 struct skin_viewport *skinvp = SKINOFFSETTOPTR(skin_buffer, viewport->data); 169 struct skin_viewport *skinvp = SKINOFFSETTOPTR(skin_buffer, viewport->data);
164 170
165 char *vplabel = SKINOFFSETTOPTR(skin_buffer, skinvp->label); 171 if (skinvp) {
166 if (skinvp->label == VP_DEFAULT_LABEL) 172 char *vplabel = SKINOFFSETTOPTR(skin_buffer, skinvp->label);
167 vplabel = VP_DEFAULT_LABEL_STRING; 173 if (skinvp->label == VP_DEFAULT_LABEL)
168 if (vplabel && !skinvp->is_infovp && 174 vplabel = VP_DEFAULT_LABEL_STRING;
169 !strcmp(vplabel, label)) 175 if (vplabel && !skinvp->is_infovp &&
170 { 176 !strcmp(vplabel, label))
171 if (skinvp->hidden_flags&VP_DRAW_HIDDEN)
172 { 177 {
173 temp |= VP_DRAW_WASHIDDEN; 178 if (skinvp->hidden_flags&VP_DRAW_HIDDEN)
179 {
180 temp |= VP_DRAW_WASHIDDEN;
181 }
182 skinvp->hidden_flags = temp;
174 } 183 }
175 skinvp->hidden_flags = temp;
176 } 184 }
177 viewport = SKINOFFSETTOPTR(skin_buffer, viewport->next); 185 viewport = SKINOFFSETTOPTR(skin_buffer, viewport->next);
178 } 186 }
@@ -195,12 +203,13 @@ static bool do_non_text_tags(struct gui_wps *gwps, struct skin_draw_info *info,
195 { 203 {
196 struct draw_rectangle *rect = 204 struct draw_rectangle *rect =
197 SKINOFFSETTOPTR(skin_buffer, token->value.data); 205 SKINOFFSETTOPTR(skin_buffer, token->value.data);
206 if (!rect) break;
198#ifdef HAVE_LCD_COLOR 207#ifdef HAVE_LCD_COLOR
199 if (rect->start_colour != rect->end_colour && 208 if (rect->start_colour != rect->end_colour &&
200 gwps->display->screen_type == SCREEN_MAIN) 209 gwps->display->screen_type == SCREEN_MAIN)
201 { 210 {
202 gwps->display->gradient_fillrect(rect->x, rect->y, rect->width, 211 gwps->display->gradient_fillrect(rect->x, rect->y, rect->width,
203 rect->height, rect->start_colour, rect->end_colour); 212 rect->height, rect->start_colour, rect->end_colour);
204 } 213 }
205 else 214 else
206#endif 215#endif
@@ -210,7 +219,7 @@ static bool do_non_text_tags(struct gui_wps *gwps, struct skin_draw_info *info,
210 vp->fg_pattern = rect->start_colour; 219 vp->fg_pattern = rect->start_colour;
211#endif 220#endif
212 gwps->display->fillrect(rect->x, rect->y, rect->width, 221 gwps->display->fillrect(rect->x, rect->y, rect->width,
213 rect->height); 222 rect->height);
214#if LCD_DEPTH > 1 223#if LCD_DEPTH > 1
215 vp->fg_pattern = backup; 224 vp->fg_pattern = backup;
216#endif 225#endif
@@ -245,6 +254,7 @@ static bool do_non_text_tags(struct gui_wps *gwps, struct skin_draw_info *info,
245 case SKIN_TOKEN_IMAGE_DISPLAY_9SEGMENT: 254 case SKIN_TOKEN_IMAGE_DISPLAY_9SEGMENT:
246 { 255 {
247 struct image_display *id = SKINOFFSETTOPTR(skin_buffer, token->value.data); 256 struct image_display *id = SKINOFFSETTOPTR(skin_buffer, token->value.data);
257 if (!id) break;
248 const char* label = SKINOFFSETTOPTR(skin_buffer, id->label); 258 const char* label = SKINOFFSETTOPTR(skin_buffer, id->label);
249 struct gui_img *img = skin_find_item(label,SKIN_FIND_IMAGE, data); 259 struct gui_img *img = skin_find_item(label,SKIN_FIND_IMAGE, data);
250 if (img && img->loaded) 260 if (img && img->loaded)
@@ -313,7 +323,6 @@ static bool do_non_text_tags(struct gui_wps *gwps, struct skin_draw_info *info,
313 skin_render_playlistviewer(SKINOFFSETTOPTR(skin_buffer, token->value.data), gwps, 323 skin_render_playlistviewer(SKINOFFSETTOPTR(skin_buffer, token->value.data), gwps,
314 info->skin_vp, info->refresh_type); 324 info->skin_vp, info->refresh_type);
315 break; 325 break;
316
317#ifdef HAVE_SKIN_VARIABLES 326#ifdef HAVE_SKIN_VARIABLES
318 case SKIN_TOKEN_VAR_SET: 327 case SKIN_TOKEN_VAR_SET:
319 { 328 {
@@ -374,19 +383,21 @@ static void do_tags_in_hidden_conditional(struct skin_element* branch,
374 { 383 {
375 do_tags_in_hidden_conditional(get_child(child->children, i), info); 384 do_tags_in_hidden_conditional(get_child(child->children, i), info);
376 } 385 }
377 child = SKINOFFSETTOPTR(skin_buffer, child->next); 386 goto skip;
378 continue;
379 } 387 }
380 else if (child->type != TAG || !SKINOFFSETTOPTR(skin_buffer, child->data)) 388 else if (child->type != TAG || !SKINOFFSETTOPTR(skin_buffer, child->data))
381 { 389 {
382 child = SKINOFFSETTOPTR(skin_buffer, child->next); 390 goto skip;
383 continue;
384 } 391 }
392
385 token = (struct wps_token *)SKINOFFSETTOPTR(skin_buffer, child->data); 393 token = (struct wps_token *)SKINOFFSETTOPTR(skin_buffer, child->data);
394
386 /* clear all pictures in the conditional and nested ones */ 395 /* clear all pictures in the conditional and nested ones */
387 if (token->type == SKIN_TOKEN_IMAGE_PRELOAD_DISPLAY) 396 if (token->type == SKIN_TOKEN_IMAGE_PRELOAD_DISPLAY)
388 { 397 {
389 struct image_display *id = SKINOFFSETTOPTR(skin_buffer, token->value.data); 398 struct image_display *id = SKINOFFSETTOPTR(skin_buffer, token->value.data);
399 if (!id) goto skip;
400
390 struct gui_img *img = skin_find_item(SKINOFFSETTOPTR(skin_buffer, id->label), 401 struct gui_img *img = skin_find_item(SKINOFFSETTOPTR(skin_buffer, id->label),
391 SKIN_FIND_IMAGE, data); 402 SKIN_FIND_IMAGE, data);
392 clear_image_pos(gwps, img); 403 clear_image_pos(gwps, img);
@@ -404,6 +415,7 @@ static void do_tags_in_hidden_conditional(struct skin_element* branch,
404 viewport = SKINOFFSETTOPTR(skin_buffer, viewport->next)) 415 viewport = SKINOFFSETTOPTR(skin_buffer, viewport->next))
405 { 416 {
406 struct skin_viewport *skin_viewport = SKINOFFSETTOPTR(skin_buffer, viewport->data); 417 struct skin_viewport *skin_viewport = SKINOFFSETTOPTR(skin_buffer, viewport->data);
418 if (!skin_viewport) continue;
407 char *vplabel = SKINOFFSETTOPTR(skin_buffer, skin_viewport->label); 419 char *vplabel = SKINOFFSETTOPTR(skin_buffer, skin_viewport->label);
408 if (skin_viewport->label == VP_DEFAULT_LABEL) 420 if (skin_viewport->label == VP_DEFAULT_LABEL)
409 vplabel = VP_DEFAULT_LABEL_STRING; 421 vplabel = VP_DEFAULT_LABEL_STRING;
@@ -451,6 +463,7 @@ static void do_tags_in_hidden_conditional(struct skin_element* branch,
451 playback_current_aa_hid(data->playback_aa_slot), true); 463 playback_current_aa_hid(data->playback_aa_slot), true);
452 } 464 }
453#endif 465#endif
466 skip:
454 child = SKINOFFSETTOPTR(skin_buffer, child->next); 467 child = SKINOFFSETTOPTR(skin_buffer, child->next);
455 } 468 }
456 } 469 }
@@ -517,6 +530,7 @@ static bool skin_render_line(struct skin_element* line, struct skin_draw_info *i
517 { 530 {
518 case CONDITIONAL: 531 case CONDITIONAL:
519 conditional = SKINOFFSETTOPTR(skin_buffer, child->data); 532 conditional = SKINOFFSETTOPTR(skin_buffer, child->data);
533 if (!conditional) break;
520 last_value = conditional->last_value; 534 last_value = conditional->last_value;
521 value = evaluate_conditional(info->gwps, info->offset, 535 value = evaluate_conditional(info->gwps, info->offset,
522 conditional, child->children_count); 536 conditional, child->children_count);
@@ -623,7 +637,8 @@ static int get_subline_timeout(struct gui_wps *gwps, struct skin_element* line)
623 element->tag->type == SKIN_TOKEN_SUBLINE_TIMEOUT ) 637 element->tag->type == SKIN_TOKEN_SUBLINE_TIMEOUT )
624 { 638 {
625 token = SKINOFFSETTOPTR(skin_buffer, element->data); 639 token = SKINOFFSETTOPTR(skin_buffer, element->data);
626 return token->value.i; 640 if (token)
641 return token->value.i;
627 } 642 }
628 else if (element->type == CONDITIONAL) 643 else if (element->type == CONDITIONAL)
629 { 644 {
@@ -726,8 +741,11 @@ void skin_render_viewport(struct skin_element* viewport, struct gui_wps *gwps,
726 while (imglist) 741 while (imglist)
727 { 742 {
728 struct wps_token *token = SKINOFFSETTOPTR(skin_buffer, imglist->token); 743 struct wps_token *token = SKINOFFSETTOPTR(skin_buffer, imglist->token);
729 struct gui_img *img = (struct gui_img *)SKINOFFSETTOPTR(skin_buffer, token->value.data); 744 if (token) {
730 img->display = -1; 745 struct gui_img *img = (struct gui_img *)SKINOFFSETTOPTR(skin_buffer, token->value.data);
746 if (img)
747 img->display = -1;
748 }
731 imglist = SKINOFFSETTOPTR(skin_buffer, imglist->next); 749 imglist = SKINOFFSETTOPTR(skin_buffer, imglist->next);
732 } 750 }
733 751
@@ -756,7 +774,6 @@ void skin_render_viewport(struct skin_element* viewport, struct gui_wps *gwps,
756 align->center = NULL; 774 align->center = NULL;
757 align->right = NULL; 775 align->right = NULL;
758 776
759
760 if (line->type == LINE_ALTERNATOR) 777 if (line->type == LINE_ALTERNATOR)
761 func = skin_render_alternator; 778 func = skin_render_alternator;
762 else if (line->type == LINE) 779 else if (line->type == LINE)
@@ -819,9 +836,10 @@ void skin_render(struct gui_wps *gwps, unsigned refresh_mode)
819 display->clear_viewport(); 836 display->clear_viewport();
820 } 837 }
821 } 838 }
822
823 viewport = SKINOFFSETTOPTR(skin_buffer, data->tree); 839 viewport = SKINOFFSETTOPTR(skin_buffer, data->tree);
840 if (!viewport) return;
824 skin_viewport = SKINOFFSETTOPTR(skin_buffer, viewport->data); 841 skin_viewport = SKINOFFSETTOPTR(skin_buffer, viewport->data);
842 if (!skin_viewport) return;
825 label = SKINOFFSETTOPTR(skin_buffer, skin_viewport->label); 843 label = SKINOFFSETTOPTR(skin_buffer, skin_viewport->label);
826 if (skin_viewport->label == VP_DEFAULT_LABEL) 844 if (skin_viewport->label == VP_DEFAULT_LABEL)
827 label = VP_DEFAULT_LABEL_STRING; 845 label = VP_DEFAULT_LABEL_STRING;
@@ -833,8 +851,10 @@ void skin_render(struct gui_wps *gwps, unsigned refresh_mode)
833 viewport; 851 viewport;
834 viewport = SKINOFFSETTOPTR(skin_buffer, viewport->next)) 852 viewport = SKINOFFSETTOPTR(skin_buffer, viewport->next))
835 { 853 {
854
836 /* SETUP */ 855 /* SETUP */
837 skin_viewport = SKINOFFSETTOPTR(skin_buffer, viewport->data); 856 skin_viewport = SKINOFFSETTOPTR(skin_buffer, viewport->data);
857 if (!skin_viewport) continue;
838 unsigned vp_refresh_mode = refresh_mode; 858 unsigned vp_refresh_mode = refresh_mode;
839#if (LCD_DEPTH > 1) || (defined(HAVE_REMOTE_LCD) && LCD_REMOTE_DEPTH > 1) 859#if (LCD_DEPTH > 1) || (defined(HAVE_REMOTE_LCD) && LCD_REMOTE_DEPTH > 1)
840 if (skin_viewport->output_to_backdrop_buffer) 860 if (skin_viewport->output_to_backdrop_buffer)
diff --git a/apps/gui/skin_engine/skin_tokens.c b/apps/gui/skin_engine/skin_tokens.c
index db9a9e694b..b86c664d7e 100644
--- a/apps/gui/skin_engine/skin_tokens.c
+++ b/apps/gui/skin_engine/skin_tokens.c
@@ -163,7 +163,7 @@ const char *get_cuesheetid3_token(struct wps_token *token, struct mp3entry *id3,
163 struct cuesheet *cue = id3?id3->cuesheet:NULL; 163 struct cuesheet *cue = id3?id3->cuesheet:NULL;
164 if (!cue || !cue->curr_track) 164 if (!cue || !cue->curr_track)
165 return NULL; 165 return NULL;
166 166
167 struct cue_track_info *track = cue->curr_track; 167 struct cue_track_info *track = cue->curr_track;
168 if (offset_tracks) 168 if (offset_tracks)
169 { 169 {
@@ -185,7 +185,7 @@ const char *get_cuesheetid3_token(struct wps_token *token, struct mp3entry *id3,
185 case SKIN_TOKEN_METADATA_TRACK_TITLE: 185 case SKIN_TOKEN_METADATA_TRACK_TITLE:
186 return *track->title ? track->title : NULL; 186 return *track->title ? track->title : NULL;
187 case SKIN_TOKEN_METADATA_TRACK_NUMBER: 187 case SKIN_TOKEN_METADATA_TRACK_NUMBER:
188 snprintf(buf, buf_size, "%d/%d", 188 snprintf(buf, buf_size, "%d/%d",
189 cue->curr_track_idx+offset_tracks+1, cue->track_count); 189 cue->curr_track_idx+offset_tracks+1, cue->track_count);
190 return buf; 190 return buf;
191 default: 191 default:
@@ -200,7 +200,7 @@ static const char* get_filename_token(struct wps_token *token, char* filename,
200 if (filename) 200 if (filename)
201 { 201 {
202 switch (token->type) 202 switch (token->type)
203 { 203 {
204 case SKIN_TOKEN_FILE_PATH: 204 case SKIN_TOKEN_FILE_PATH:
205 return filename; 205 return filename;
206 case SKIN_TOKEN_FILE_NAME: 206 case SKIN_TOKEN_FILE_NAME:
@@ -478,7 +478,7 @@ const char *get_radio_token(struct wps_token *token, int preset_offset,
478 { 478 {
479 *intval = val; 479 *intval = val;
480 } 480 }
481 else 481 else
482 { 482 {
483 *intval = 1+(limit-1)*(val-min)/(max-1-min); 483 *intval = 1+(limit-1)*(val-min)/(max-1-min);
484 } 484 }
@@ -514,7 +514,7 @@ const char *get_radio_token(struct wps_token *token, int preset_offset,
514 return buf; 514 return buf;
515 } 515 }
516 case SKIN_TOKEN_PRESET_COUNT: 516 case SKIN_TOKEN_PRESET_COUNT:
517 snprintf(buf, buf_size, "%d", radio_preset_count()); 517 snprintf(buf, buf_size, "%d", radio_preset_count());
518 if (intval) 518 if (intval)
519 *intval = radio_preset_count(); 519 *intval = radio_preset_count();
520 return buf; 520 return buf;
@@ -580,7 +580,7 @@ static const char* NOINLINE get_lif_token_value(struct gui_wps *gwps,
580 int b; 580 int b;
581 bool number_set = true; 581 bool number_set = true;
582 struct wps_token *liftoken = SKINOFFSETTOPTR(get_skin_buffer(gwps->data), lif->token); 582 struct wps_token *liftoken = SKINOFFSETTOPTR(get_skin_buffer(gwps->data), lif->token);
583 const char* out_text = get_token_value(gwps, liftoken, offset, buf, buf_size, &a); 583 const char* out_text = get_token_value(gwps, liftoken, offset, buf, buf_size, &a);
584 if (a == -1 && liftoken->type != SKIN_TOKEN_VOLUME) 584 if (a == -1 && liftoken->type != SKIN_TOKEN_VOLUME)
585 { 585 {
586 a = (out_text && *out_text) ? 1 : 0; 586 a = (out_text && *out_text) ? 1 : 0;
@@ -610,10 +610,13 @@ static const char* NOINLINE get_lif_token_value(struct gui_wps *gwps,
610 char temp_buf[MAX_PATH]; 610 char temp_buf[MAX_PATH];
611 const char *outb; 611 const char *outb;
612 struct skin_element *element = SKINOFFSETTOPTR(get_skin_buffer(gwps->data), lif->operand.data.code); 612 struct skin_element *element = SKINOFFSETTOPTR(get_skin_buffer(gwps->data), lif->operand.data.code);
613 if (!element) return NULL;
613 struct wps_token *token = SKINOFFSETTOPTR(get_skin_buffer(gwps->data), element->data); 614 struct wps_token *token = SKINOFFSETTOPTR(get_skin_buffer(gwps->data), element->data);
614 b = lif->num_options; 615 b = lif->num_options;
616
615 outb = get_token_value(gwps, token, offset, temp_buf, 617 outb = get_token_value(gwps, token, offset, temp_buf,
616 sizeof(temp_buf), &b); 618 sizeof(temp_buf), &b);
619
617 if (b == -1 && liftoken->type != SKIN_TOKEN_VOLUME) 620 if (b == -1 && liftoken->type != SKIN_TOKEN_VOLUME)
618 { 621 {
619 if (!out_text || !outb) 622 if (!out_text || !outb)
@@ -631,7 +634,7 @@ static const char* NOINLINE get_lif_token_value(struct gui_wps *gwps,
631 case DEFAULT: 634 case DEFAULT:
632 break; 635 break;
633 } 636 }
634 637
635 switch (lif->op) 638 switch (lif->op)
636 { 639 {
637 case IF_EQUALS: 640 case IF_EQUALS:
@@ -666,10 +669,12 @@ const char *get_token_value(struct gui_wps *gwps,
666{ 669{
667 if (!gwps) 670 if (!gwps)
668 return NULL; 671 return NULL;
672 if (!token)
673 return NULL;
669 674
670 struct wps_data *data = gwps->data; 675 struct wps_data *data = gwps->data;
671 struct wps_state *state = skin_get_global_state(); 676 struct wps_state *state = skin_get_global_state();
672 struct mp3entry *id3; /* Think very carefully about using this. 677 struct mp3entry *id3; /* Think very carefully about using this.
673 maybe get_id3_token() is the better place? */ 678 maybe get_id3_token() is the better place? */
674 const char *out_text = NULL; 679 const char *out_text = NULL;
675 char *filename = NULL; 680 char *filename = NULL;
@@ -680,7 +685,7 @@ const char *get_token_value(struct gui_wps *gwps,
680 id3 = get_mp3entry_from_offset(token->next? 1: offset, &filename); 685 id3 = get_mp3entry_from_offset(token->next? 1: offset, &filename);
681 if (id3) 686 if (id3)
682 filename = id3->path; 687 filename = id3->path;
683 688
684#if CONFIG_RTC 689#if CONFIG_RTC
685 struct tm* tm = NULL; 690 struct tm* tm = NULL;
686 691
@@ -702,10 +707,10 @@ const char *get_token_value(struct gui_wps *gwps,
702 limit = *intval; 707 limit = *intval;
703 *intval = -1; 708 *intval = -1;
704 } 709 }
705 710
706 if (id3 && id3 == state->id3 && id3->cuesheet ) 711 if (id3 && id3 == state->id3 && id3->cuesheet )
707 { 712 {
708 out_text = get_cuesheetid3_token(token, id3, 713 out_text = get_cuesheetid3_token(token, id3,
709 token->next?1:offset, buf, buf_size); 714 token->next?1:offset, buf, buf_size);
710 if (out_text) 715 if (out_text)
711 return out_text; 716 return out_text;
@@ -734,6 +739,7 @@ const char *get_token_value(struct gui_wps *gwps,
734 char *skinbuffer = get_skin_buffer(data); 739 char *skinbuffer = get_skin_buffer(data);
735 struct skin_element *element = 740 struct skin_element *element =
736 SKINOFFSETTOPTR(skinbuffer, token->value.data); 741 SKINOFFSETTOPTR(skinbuffer, token->value.data);
742 if (!element || !element->params) return NULL;
737 struct skin_tag_parameter* params = 743 struct skin_tag_parameter* params =
738 SKINOFFSETTOPTR(skinbuffer, element->params); 744 SKINOFFSETTOPTR(skinbuffer, element->params);
739 struct skin_tag_parameter* thistag; 745 struct skin_tag_parameter* thistag;
@@ -742,6 +748,7 @@ const char *get_token_value(struct gui_wps *gwps,
742 thistag = &params[i]; 748 thistag = &params[i];
743 struct skin_element *tokenelement = 749 struct skin_element *tokenelement =
744 SKINOFFSETTOPTR(skinbuffer, thistag->data.code); 750 SKINOFFSETTOPTR(skinbuffer, thistag->data.code);
751 if (!tokenelement) return NULL;
745 out_text = get_token_value(gwps, 752 out_text = get_token_value(gwps,
746 SKINOFFSETTOPTR(skinbuffer, tokenelement->data), 753 SKINOFFSETTOPTR(skinbuffer, tokenelement->data),
747 offset, buf, buf_size, intval); 754 offset, buf, buf_size, intval);
@@ -753,10 +760,12 @@ const char *get_token_value(struct gui_wps *gwps,
753 return truecount ? "true" : NULL; 760 return truecount ? "true" : NULL;
754 } 761 }
755 break; 762 break;
763
756 case SKIN_TOKEN_SUBSTRING: 764 case SKIN_TOKEN_SUBSTRING:
757 { 765 {
758 struct substring *ss = SKINOFFSETTOPTR(get_skin_buffer(data), token->value.data); 766 struct substring *ss = SKINOFFSETTOPTR(get_skin_buffer(data), token->value.data);
759 const char *token_val = get_token_value(gwps, 767 if (!ss) return NULL;
768 const char *token_val = get_token_value(gwps,
760 SKINOFFSETTOPTR(get_skin_buffer(data), ss->token), offset, 769 SKINOFFSETTOPTR(get_skin_buffer(data), ss->token), offset,
761 buf, buf_size, intval); 770 buf, buf_size, intval);
762 if (token_val) 771 if (token_val)
@@ -788,13 +797,13 @@ const char *get_token_value(struct gui_wps *gwps,
788 if (ss->expect_number && 797 if (ss->expect_number &&
789 intval && (buf[0] >= '0' && buf[0] <= '9')) 798 intval && (buf[0] >= '0' && buf[0] <= '9'))
790 *intval = atoi(buf) + 1; /* so 0 is the first item */ 799 *intval = atoi(buf) + 1; /* so 0 is the first item */
791 800
792 return buf; 801 return buf;
793 } 802 }
794 return NULL; 803 return NULL;
795 } 804 }
796 break; 805 break;
797 806
798 case SKIN_TOKEN_CHARACTER: 807 case SKIN_TOKEN_CHARACTER:
799 if (token->value.c == '\n') 808 if (token->value.c == '\n')
800 return NULL; 809 return NULL;
@@ -802,7 +811,7 @@ const char *get_token_value(struct gui_wps *gwps,
802 811
803 case SKIN_TOKEN_STRING: 812 case SKIN_TOKEN_STRING:
804 return (char*)SKINOFFSETTOPTR(get_skin_buffer(data), token->value.data); 813 return (char*)SKINOFFSETTOPTR(get_skin_buffer(data), token->value.data);
805 814
806 case SKIN_TOKEN_TRANSLATEDSTRING: 815 case SKIN_TOKEN_TRANSLATEDSTRING:
807 return (char*)P2STR(ID2P(token->value.i)); 816 return (char*)P2STR(ID2P(token->value.i));
808 817
@@ -821,6 +830,7 @@ const char *get_token_value(struct gui_wps *gwps,
821 case SKIN_TOKEN_LIST_ITEM_TEXT: 830 case SKIN_TOKEN_LIST_ITEM_TEXT:
822 { 831 {
823 struct listitem *li = (struct listitem *)SKINOFFSETTOPTR(get_skin_buffer(data), token->value.data); 832 struct listitem *li = (struct listitem *)SKINOFFSETTOPTR(get_skin_buffer(data), token->value.data);
833 if (!li) return NULL;
824 return skinlist_get_item_text(li->offset, li->wrap, buf, buf_size); 834 return skinlist_get_item_text(li->offset, li->wrap, buf, buf_size);
825 } 835 }
826 case SKIN_TOKEN_LIST_ITEM_ROW: 836 case SKIN_TOKEN_LIST_ITEM_ROW:
@@ -843,6 +853,7 @@ const char *get_token_value(struct gui_wps *gwps,
843 case SKIN_TOKEN_LIST_ITEM_ICON: 853 case SKIN_TOKEN_LIST_ITEM_ICON:
844 { 854 {
845 struct listitem *li = (struct listitem *)SKINOFFSETTOPTR(get_skin_buffer(data), token->value.data); 855 struct listitem *li = (struct listitem *)SKINOFFSETTOPTR(get_skin_buffer(data), token->value.data);
856 if (!li) return NULL;
846 int icon = skinlist_get_item_icon(li->offset, li->wrap); 857 int icon = skinlist_get_item_icon(li->offset, li->wrap);
847 if (intval) 858 if (intval)
848 *intval = icon; 859 *intval = icon;
@@ -905,11 +916,12 @@ const char *get_token_value(struct gui_wps *gwps,
905 if (in_radio_screen() || (get_radio_status() != FMRADIO_OFF)) 916 if (in_radio_screen() || (get_radio_status() != FMRADIO_OFF))
906 { 917 {
907 struct skin_albumart *aa = SKINOFFSETTOPTR(get_skin_buffer(data), data->albumart); 918 struct skin_albumart *aa = SKINOFFSETTOPTR(get_skin_buffer(data), data->albumart);
919 if (!aa) return NULL;
908 struct dim dim = {aa->width, aa->height}; 920 struct dim dim = {aa->width, aa->height};
909 handle = radio_get_art_hid(&dim); 921 handle = radio_get_art_hid(&dim);
910 } 922 }
911#endif 923#endif
912 if (handle >= 0) 924 if (handle >= 0)
913 return "C"; 925 return "C";
914 } 926 }
915 return NULL; 927 return NULL;
@@ -1009,7 +1021,7 @@ const char *get_token_value(struct gui_wps *gwps,
1009 int mode = 1; /* stop */ 1021 int mode = 1; /* stop */
1010 if (status == STATUS_PLAY) 1022 if (status == STATUS_PLAY)
1011 mode = 2; /* play */ 1023 mode = 2; /* play */
1012 if (state->is_fading || 1024 if (state->is_fading ||
1013 (status == STATUS_PAUSE && !status_get_ffmode())) 1025 (status == STATUS_PAUSE && !status_get_ffmode()))
1014 mode = 3; /* pause */ 1026 mode = 3; /* pause */
1015 else 1027 else
@@ -1336,13 +1348,13 @@ const char *get_token_value(struct gui_wps *gwps,
1336 token->value.i)) 1348 token->value.i))
1337 return "v"; 1349 return "v";
1338 return NULL; 1350 return NULL;
1339
1340 case SKIN_TOKEN_LASTTOUCH: 1351 case SKIN_TOKEN_LASTTOUCH:
1341 { 1352 {
1342#ifdef HAVE_TOUCHSCREEN 1353#ifdef HAVE_TOUCHSCREEN
1343 unsigned int last_touch = touchscreen_last_touch(); 1354 unsigned int last_touch = touchscreen_last_touch();
1344 char *skin_base = get_skin_buffer(data); 1355 char *skin_base = get_skin_buffer(data);
1345 struct touchregion_lastpress *data = SKINOFFSETTOPTR(skin_base, token->value.data); 1356 struct touchregion_lastpress *data = SKINOFFSETTOPTR(skin_base, token->value.data);
1357 if (!data) return NULL;
1346 struct touchregion *region = SKINOFFSETTOPTR(skin_base, data->region); 1358 struct touchregion *region = SKINOFFSETTOPTR(skin_base, data->region);
1347 if (region) 1359 if (region)
1348 last_touch = region->last_press; 1360 last_touch = region->last_press;
@@ -1669,10 +1681,8 @@ const char *get_token_value(struct gui_wps *gwps,
1669 } 1681 }
1670 return NULL; 1682 return NULL;
1671#endif 1683#endif
1672
1673 default: 1684 default:
1674 return NULL; 1685 return NULL;
1675 } 1686 }
1676}
1677
1678 1687
1688}
diff --git a/apps/gui/statusbar-skinned.c b/apps/gui/statusbar-skinned.c
index f8e06c2b5d..9b10ad4dce 100644
--- a/apps/gui/statusbar-skinned.c
+++ b/apps/gui/statusbar-skinned.c
@@ -86,14 +86,15 @@ int sb_preproccess(enum screen_type screen, struct wps_data *data)
86int sb_postproccess(enum screen_type screen, struct wps_data *data) 86int sb_postproccess(enum screen_type screen, struct wps_data *data)
87{ 87{
88 if (data->wps_loaded) 88 if (data->wps_loaded)
89 { 89 {
90 /* hide the sb's default viewport because it has nasty effect with stuff 90 /* hide the sb's default viewport because it has nasty effect with stuff
91 * not part of the statusbar, 91 * not part of the statusbar,
92 * hence .sbs's without any other vps are unsupported*/ 92 * hence .sbs's without any other vps are unsupported*/
93 struct skin_viewport *vp = skin_find_item(VP_DEFAULT_LABEL_STRING, SKIN_FIND_VP, data); 93 struct skin_viewport *vp = skin_find_item(VP_DEFAULT_LABEL_STRING, SKIN_FIND_VP, data);
94 struct skin_element *tree = SKINOFFSETTOPTR(get_skin_buffer(data), data->tree); 94 struct skin_element *tree = SKINOFFSETTOPTR(get_skin_buffer(data), data->tree);
95 struct skin_element *next_vp = SKINOFFSETTOPTR(get_skin_buffer(data), tree->next); 95 struct skin_element *next_vp = NULL;
96 96 if (tree) next_vp = SKINOFFSETTOPTR(get_skin_buffer(data), tree->next);
97
97 if (vp) 98 if (vp)
98 { 99 {
99 if (!next_vp) 100 if (!next_vp)
@@ -132,9 +133,12 @@ struct viewport *sb_skin_get_info_vp(enum screen_type screen)
132 viewportmanager_theme_enable(screen, false, NULL); 133 viewportmanager_theme_enable(screen, false, NULL);
133 viewportmanager_theme_undo(screen, true); 134 viewportmanager_theme_undo(screen, true);
134 } 135 }
135 label = SKINOFFSETTOPTR(get_skin_buffer(data), infovp_label[screen]);
136 if (infovp_label[screen] == VP_DEFAULT_LABEL) 136 if (infovp_label[screen] == VP_DEFAULT_LABEL)
137 label = VP_DEFAULT_LABEL_STRING; 137 label = VP_DEFAULT_LABEL_STRING;
138 else
139 label = SKINOFFSETTOPTR(get_skin_buffer(data), infovp_label[screen]);
140 if (!label)
141 return NULL;
138 vp = skin_find_item(label, SKIN_FIND_UIVP, data); 142 vp = skin_find_item(label, SKIN_FIND_UIVP, data);
139 if (!vp) 143 if (!vp)
140 return NULL; 144 return NULL;
diff --git a/apps/plugins/chessbox/chessbox_pgn.c b/apps/plugins/chessbox/chessbox_pgn.c
index 40e88e500b..0d9da441b1 100644
--- a/apps/plugins/chessbox/chessbox_pgn.c
+++ b/apps/plugins/chessbox/chessbox_pgn.c
@@ -623,6 +623,7 @@ struct pgn_game_node* pgn_list_games(const char* filename){
623 /* a new game header is found */ 623 /* a new game header is found */
624 if (line_buffer[0] == '['){ 624 if (line_buffer[0] == '['){
625 temp_node = (struct pgn_game_node *)pl_malloc(sizeof size_node); 625 temp_node = (struct pgn_game_node *)pl_malloc(sizeof size_node);
626 if (!temp_node) return NULL;
626 temp_node->next_node = NULL; 627 temp_node->next_node = NULL;
627 if (curr_node == NULL) { 628 if (curr_node == NULL) {
628 first_game = curr_node = temp_node; 629 first_game = curr_node = temp_node;
@@ -773,9 +774,11 @@ void pgn_parse_game(const char* filename,
773 */ 774 */
774 if (first_ply != NULL){ 775 if (first_ply != NULL){
775 temp_ply = (struct pgn_ply_node *)pl_malloc(sizeof size_ply); 776 temp_ply = (struct pgn_ply_node *)pl_malloc(sizeof size_ply);
776 temp_ply->player = neutral; 777 if (temp_ply) {
777 temp_ply->prev_node = curr_node; 778 temp_ply->player = neutral;
778 curr_node->next_node = temp_ply; 779 temp_ply->prev_node = curr_node;
780 curr_node->next_node = temp_ply;
781 }
779 } 782 }
780 selected_game->first_ply = first_ply; 783 selected_game->first_ply = first_ply;
781 784
@@ -793,6 +796,7 @@ struct pgn_game_node* pgn_init_game(void){
793 796
794 /* create an "end of game" dummy ply and assign defaults */ 797 /* create an "end of game" dummy ply and assign defaults */
795 ply = (struct pgn_ply_node *)pl_malloc(sizeof ply_size); 798 ply = (struct pgn_ply_node *)pl_malloc(sizeof ply_size);
799 if (!ply) return NULL;
796 ply->player = neutral; 800 ply->player = neutral;
797 ply->pgn_text[0] = '\0'; 801 ply->pgn_text[0] = '\0';
798 ply->prev_node = NULL; 802 ply->prev_node = NULL;
@@ -800,6 +804,8 @@ struct pgn_game_node* pgn_init_game(void){
800 804
801 /* create the game and assign defaults */ 805 /* create the game and assign defaults */
802 game = (struct pgn_game_node *)pl_malloc(sizeof game_size); 806 game = (struct pgn_game_node *)pl_malloc(sizeof game_size);
807 if (!game) return NULL;
808
803 game->game_number = 0; 809 game->game_number = 0;
804 rb->strcpy(game->white_player,"Player"); 810 rb->strcpy(game->white_player,"Player");
805 rb->strcpy(game->black_player,"GnuChess"); 811 rb->strcpy(game->black_player,"GnuChess");
@@ -823,6 +829,7 @@ void pgn_append_ply(struct pgn_game_node* game,
823 struct pgn_ply_node ply_size, *ply, *temp; 829 struct pgn_ply_node ply_size, *ply, *temp;
824 830
825 ply = (struct pgn_ply_node *)pl_malloc(sizeof ply_size); 831 ply = (struct pgn_ply_node *)pl_malloc(sizeof ply_size);
832 if (!ply) return;
826 ply->player = ply_player; 833 ply->player = ply_player;
827 ply->column_from = move_buffer[0] - 'a'; 834 ply->column_from = move_buffer[0] - 'a';
828 ply->row_from = move_buffer[1] - '1'; 835 ply->row_from = move_buffer[1] - '1';
@@ -847,6 +854,7 @@ void pgn_append_ply(struct pgn_game_node* game,
847 } else { 854 } else {
848 temp->prev_node->next_node = ply; 855 temp->prev_node->next_node = ply;
849 } 856 }
857
850 temp->prev_node = ply; 858 temp->prev_node = ply;
851} 859}
852 860
diff --git a/apps/plugins/reversi/reversi-gui.c b/apps/plugins/reversi/reversi-gui.c
index aca54a1ea3..74dd98b676 100644
--- a/apps/plugins/reversi/reversi-gui.c
+++ b/apps/plugins/reversi/reversi-gui.c
@@ -637,12 +637,13 @@ enum plugin_status plugin_start(const void *parameter) {
637 draw_screen = false; 637 draw_screen = false;
638 } 638 }
639 switch(cur_player) { 639 switch(cur_player) {
640 case BLACK:
641 cur_strategy = black_strategy;
642 break;
643 case WHITE: 640 case WHITE:
644 cur_strategy = white_strategy; 641 cur_strategy = white_strategy;
645 break; 642 break;
643 case BLACK:
644 default:
645 cur_strategy = black_strategy;
646 break;
646 } 647 }
647 648
648 if(cur_strategy->is_robot && !game_finished) { 649 if(cur_strategy->is_robot && !game_finished) {