diff options
author | Jonathan Gordon <rockbox@jdgordon.info> | 2011-09-15 13:48:17 +0000 |
---|---|---|
committer | Jonathan Gordon <rockbox@jdgordon.info> | 2011-09-15 13:48:17 +0000 |
commit | 81343bae5d377f9ebb7fbc15d87f7f7d782179e8 (patch) | |
tree | b0e698ead50b63a0b6625d377abad6cd9d0c0b90 | |
parent | 0cfd7a388874f3a95662bcd349bd371d497e59f3 (diff) | |
download | rockbox-81343bae5d377f9ebb7fbc15d87f7f7d782179e8.tar.gz rockbox-81343bae5d377f9ebb7fbc15d87f7f7d782179e8.zip |
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
-rw-r--r-- | apps/gui/skin_engine/skin_engine.c | 63 | ||||
-rw-r--r-- | 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) | |||
55 | } | 55 | } |
56 | #endif | 56 | #endif |
57 | 57 | ||
58 | void settings_apply_skins(void) | 58 | void skin_data_free_buflib_allocs(struct wps_data *wps_data); |
59 | { | ||
60 | int i, j; | ||
61 | skin_buffer_init(skin_buffer, SKIN_BUFFER_SIZE); | ||
62 | |||
63 | #ifdef HAVE_LCD_BITMAP | ||
64 | skin_backdrop_init(); | ||
65 | skin_font_init(); | ||
66 | #endif | ||
67 | gui_sync_skin_init(); | ||
68 | |||
69 | /* Make sure each skin is loaded */ | ||
70 | for (i=0; i<SKINNABLE_SCREENS_COUNT; i++) | ||
71 | { | ||
72 | FOR_NB_SCREENS(j) | ||
73 | skin_get_gwps(i, j); | ||
74 | } | ||
75 | #if LCD_DEPTH > 1 || defined(HAVE_REMOTE_LCD) && LCD_REMOTE_DEPTH > 1 | ||
76 | skin_backdrops_preload(); /* should maybe check the retval here... */ | ||
77 | #endif | ||
78 | viewportmanager_theme_changed(THEME_STATUSBAR); | ||
79 | #if LCD_DEPTH > 1 || defined(HAVE_REMOTE_LCD) && LCD_REMOTE_DEPTH > 1 | ||
80 | FOR_NB_SCREENS(i) | ||
81 | skin_backdrop_show(sb_get_backdrop(i)); | ||
82 | #endif | ||
83 | } | ||
84 | |||
85 | |||
86 | char* wps_default_skin(enum screen_type screen); | 59 | char* wps_default_skin(enum screen_type screen); |
87 | char* default_radio_skin(enum screen_type screen); | 60 | char* default_radio_skin(enum screen_type screen); |
88 | 61 | ||
@@ -130,6 +103,40 @@ void gui_sync_skin_init(void) | |||
130 | } | 103 | } |
131 | } | 104 | } |
132 | 105 | ||
106 | void settings_apply_skins(void) | ||
107 | { | ||
108 | int i, j; | ||
109 | |||
110 | for (i=0; i<SKINNABLE_SCREENS_COUNT; i++) | ||
111 | { | ||
112 | FOR_NB_SCREENS(j) | ||
113 | skin_data_free_buflib_allocs(&skins[j][i].data); | ||
114 | } | ||
115 | |||
116 | skin_buffer_init(skin_buffer, SKIN_BUFFER_SIZE); | ||
117 | |||
118 | #ifdef HAVE_LCD_BITMAP | ||
119 | skin_backdrop_init(); | ||
120 | skin_font_init(); | ||
121 | #endif | ||
122 | gui_sync_skin_init(); | ||
123 | |||
124 | /* Make sure each skin is loaded */ | ||
125 | for (i=0; i<SKINNABLE_SCREENS_COUNT; i++) | ||
126 | { | ||
127 | FOR_NB_SCREENS(j) | ||
128 | skin_get_gwps(i, j); | ||
129 | } | ||
130 | #if LCD_DEPTH > 1 || defined(HAVE_REMOTE_LCD) && LCD_REMOTE_DEPTH > 1 | ||
131 | skin_backdrops_preload(); /* should maybe check the retval here... */ | ||
132 | #endif | ||
133 | viewportmanager_theme_changed(THEME_STATUSBAR); | ||
134 | #if LCD_DEPTH > 1 || defined(HAVE_REMOTE_LCD) && LCD_REMOTE_DEPTH > 1 | ||
135 | FOR_NB_SCREENS(i) | ||
136 | skin_backdrop_show(sb_get_backdrop(i)); | ||
137 | #endif | ||
138 | } | ||
139 | |||
133 | void skin_load(enum skinnable_screens skin, enum screen_type screen, | 140 | void skin_load(enum skinnable_screens skin, enum screen_type screen, |
134 | const char *buf, bool isfile) | 141 | const char *buf, bool isfile) |
135 | { | 142 | { |
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) | |||
1424 | } | 1424 | } |
1425 | } | 1425 | } |
1426 | 1426 | ||
1427 | /* | 1427 | /* This is used to free any buflib allocations before the rest of |
1428 | * initial setup of wps_data; does reset everything | 1428 | * wps_data is reset. |
1429 | * except fields which need to survive, i.e. | 1429 | * The call to this in settings_apply_skins() is the last chance to do |
1430 | * | 1430 | * any core_free()'s before wps_data is trashed and those handles lost |
1431 | **/ | 1431 | */ |
1432 | static void skin_data_reset(struct wps_data *wps_data) | 1432 | void skin_data_free_buflib_allocs(struct wps_data *wps_data) |
1433 | { | 1433 | { |
1434 | #ifdef HAVE_LCD_BITMAP | 1434 | #ifdef HAVE_LCD_BITMAP |
1435 | #ifndef __PCTOOL__ | 1435 | #ifndef __PCTOOL__ |
@@ -1442,6 +1442,18 @@ static void skin_data_reset(struct wps_data *wps_data) | |||
1442 | list = list->next; | 1442 | list = list->next; |
1443 | } | 1443 | } |
1444 | #endif | 1444 | #endif |
1445 | #endif | ||
1446 | } | ||
1447 | |||
1448 | /* | ||
1449 | * initial setup of wps_data; does reset everything | ||
1450 | * except fields which need to survive, i.e. | ||
1451 | * Also called if the load fails | ||
1452 | **/ | ||
1453 | static void skin_data_reset(struct wps_data *wps_data) | ||
1454 | { | ||
1455 | skin_data_free_buflib_allocs(wps_data); | ||
1456 | #ifdef HAVE_LCD_BITMAP | ||
1445 | wps_data->images = NULL; | 1457 | wps_data->images = NULL; |
1446 | #endif | 1458 | #endif |
1447 | wps_data->tree = NULL; | 1459 | wps_data->tree = NULL; |