From 0ca4b38b1b04e6b7d6f5ad1f3654f8f361d8933f Mon Sep 17 00:00:00 2001 From: Jonathan Gordon Date: Mon, 21 Nov 2011 10:02:23 +0000 Subject: skinengine: Rework skin loading so skins can be un/loaded individually. This also means that loading a .cfg which doesnt change themes shouldnt have them reloaded git-svn-id: svn://svn.rockbox.org/rockbox/trunk@31037 a1c6a512-1295-4272-9138-f99709370657 --- apps/gui/skin_engine/skin_backdrops.c | 56 +++++++++++++++++++++-------------- 1 file changed, 34 insertions(+), 22 deletions(-) (limited to 'apps/gui/skin_engine/skin_backdrops.c') diff --git a/apps/gui/skin_engine/skin_backdrops.c b/apps/gui/skin_engine/skin_backdrops.c index 0b67125bbf..0433d0258d 100644 --- a/apps/gui/skin_engine/skin_backdrops.c +++ b/apps/gui/skin_engine/skin_backdrops.c @@ -37,6 +37,7 @@ static struct skin_backdrop { enum screen_type screen; bool loaded; int buflib_handle; + int ref_count; } backdrops[NB_BDROPS]; #define NB_BDROPS SKINNABLE_SCREENS_COUNT*NB_SCREENS @@ -63,21 +64,21 @@ static struct buflib_callbacks buflib_ops = {buflib_move_callback, NULL}; static bool first_go = true; void skin_backdrop_init(void) { - for (int i=0; i= 0) + if (free >= 0) { - strlcpy(backdrops[free].name, filename, - sizeof (backdrops[free].name)); + strlcpy(backdrops[free].name, filename, MAX_PATH); backdrops[free].buffer = NULL; backdrops[free].screen = screen; + backdrops[free].ref_count = 1; return free; } + else if (i < NB_BDROPS) + return i; return -1; } @@ -188,10 +193,17 @@ void skin_backdrop_show(int backdrop_id) void skin_backdrop_unload(int backdrop_id) { - if (backdrops[backdrop_id].buflib_handle > 0) - core_free(backdrops[backdrop_id].buflib_handle); - backdrops[backdrop_id].buffer = NULL; - backdrops[backdrop_id].buflib_handle = -1; + backdrops[backdrop_id].ref_count--; + if (backdrops[backdrop_id].ref_count <= 0) + { + if (backdrops[backdrop_id].buflib_handle > 0) + core_free(backdrops[backdrop_id].buflib_handle); + backdrops[backdrop_id].buffer = NULL; + backdrops[backdrop_id].buflib_handle = -1; + backdrops[backdrop_id].loaded = false; + backdrops[backdrop_id].name[0] = '\0'; + backdrops[backdrop_id].ref_count = 0; + } } void skin_backdrop_load_setting(void) -- cgit v1.2.3