From 81343bae5d377f9ebb7fbc15d87f7f7d782179e8 Mon Sep 17 00:00:00 2001 From: Jonathan Gordon Date: Thu, 15 Sep 2011 13:48:17 +0000 Subject: skin_engine: make sure to free all buflib allocations so we dont leak handles/memory git-svn-id: svn://svn.rockbox.org/rockbox/trunk@30554 a1c6a512-1295-4272-9138-f99709370657 --- apps/gui/skin_engine/skin_engine.c | 63 +++++++++++++++++++++----------------- apps/gui/skin_engine/skin_parser.c | 24 +++++++++++---- 2 files changed, 53 insertions(+), 34 deletions(-) diff --git a/apps/gui/skin_engine/skin_engine.c b/apps/gui/skin_engine/skin_engine.c index 8e85cb891f..7a9a10ec57 100644 --- a/apps/gui/skin_engine/skin_engine.c +++ b/apps/gui/skin_engine/skin_engine.c @@ -55,34 +55,7 @@ void theme_init_buffer(void) } #endif -void settings_apply_skins(void) -{ - int i, j; - skin_buffer_init(skin_buffer, SKIN_BUFFER_SIZE); - -#ifdef HAVE_LCD_BITMAP - skin_backdrop_init(); - skin_font_init(); -#endif - gui_sync_skin_init(); - - /* Make sure each skin is loaded */ - for (i=0; i 1 || defined(HAVE_REMOTE_LCD) && LCD_REMOTE_DEPTH > 1 - skin_backdrops_preload(); /* should maybe check the retval here... */ -#endif - viewportmanager_theme_changed(THEME_STATUSBAR); -#if LCD_DEPTH > 1 || defined(HAVE_REMOTE_LCD) && LCD_REMOTE_DEPTH > 1 - FOR_NB_SCREENS(i) - skin_backdrop_show(sb_get_backdrop(i)); -#endif -} - - +void skin_data_free_buflib_allocs(struct wps_data *wps_data); char* wps_default_skin(enum screen_type screen); char* default_radio_skin(enum screen_type screen); @@ -130,6 +103,40 @@ void gui_sync_skin_init(void) } } +void settings_apply_skins(void) +{ + int i, j; + + for (i=0; i 1 || defined(HAVE_REMOTE_LCD) && LCD_REMOTE_DEPTH > 1 + skin_backdrops_preload(); /* should maybe check the retval here... */ +#endif + viewportmanager_theme_changed(THEME_STATUSBAR); +#if LCD_DEPTH > 1 || defined(HAVE_REMOTE_LCD) && LCD_REMOTE_DEPTH > 1 + FOR_NB_SCREENS(i) + skin_backdrop_show(sb_get_backdrop(i)); +#endif +} + void skin_load(enum skinnable_screens skin, enum screen_type screen, const char *buf, bool isfile) { diff --git a/apps/gui/skin_engine/skin_parser.c b/apps/gui/skin_engine/skin_parser.c index d6091f9441..97f2d9a5f7 100644 --- a/apps/gui/skin_engine/skin_parser.c +++ b/apps/gui/skin_engine/skin_parser.c @@ -1424,12 +1424,12 @@ static bool check_feature_tag(const int type) } } -/* - * initial setup of wps_data; does reset everything - * except fields which need to survive, i.e. - * - **/ -static void skin_data_reset(struct wps_data *wps_data) +/* This is used to free any buflib allocations before the rest of + * wps_data is reset. + * The call to this in settings_apply_skins() is the last chance to do + * any core_free()'s before wps_data is trashed and those handles lost + */ +void skin_data_free_buflib_allocs(struct wps_data *wps_data) { #ifdef HAVE_LCD_BITMAP #ifndef __PCTOOL__ @@ -1442,6 +1442,18 @@ static void skin_data_reset(struct wps_data *wps_data) list = list->next; } #endif +#endif +} + +/* + * initial setup of wps_data; does reset everything + * except fields which need to survive, i.e. + * Also called if the load fails + **/ +static void skin_data_reset(struct wps_data *wps_data) +{ + skin_data_free_buflib_allocs(wps_data); +#ifdef HAVE_LCD_BITMAP wps_data->images = NULL; #endif wps_data->tree = NULL; -- cgit v1.2.3