summaryrefslogtreecommitdiff
path: root/apps/gui/skin_engine/skin_backdrops.c
diff options
context:
space:
mode:
Diffstat (limited to 'apps/gui/skin_engine/skin_backdrops.c')
-rw-r--r--apps/gui/skin_engine/skin_backdrops.c56
1 files changed, 34 insertions, 22 deletions
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 {
37 enum screen_type screen; 37 enum screen_type screen;
38 bool loaded; 38 bool loaded;
39 int buflib_handle; 39 int buflib_handle;
40 int ref_count;
40} backdrops[NB_BDROPS]; 41} backdrops[NB_BDROPS];
41 42
42#define NB_BDROPS SKINNABLE_SCREENS_COUNT*NB_SCREENS 43#define NB_BDROPS SKINNABLE_SCREENS_COUNT*NB_SCREENS
@@ -63,21 +64,21 @@ static struct buflib_callbacks buflib_ops = {buflib_move_callback, NULL};
63static bool first_go = true; 64static bool first_go = true;
64void skin_backdrop_init(void) 65void skin_backdrop_init(void)
65{ 66{
66 for (int i=0; i<NB_BDROPS; i++) 67 if (first_go)
67 { 68 {
68 if (first_go) 69 for (int i=0; i<NB_BDROPS; i++)
70 {
69 backdrops[i].buflib_handle = -1; 71 backdrops[i].buflib_handle = -1;
70 else 72 backdrops[i].name[0] = '\0';
71 skin_backdrop_unload(i); 73 backdrops[i].buffer = NULL;
72 backdrops[i].name[0] = '\0'; 74 backdrops[i].loaded = false;
73 backdrops[i].buffer = NULL; 75 backdrops[i].ref_count = 0;
74 backdrops[i].loaded = false; 76 }
75 77 FOR_NB_SCREENS(i)
78 current_lcd_backdrop[i] = -1;
79 handle_being_loaded = -1;
80 first_go = false;
76 } 81 }
77 first_go = false;
78 FOR_NB_SCREENS(i)
79 current_lcd_backdrop[i] = -1;
80 handle_being_loaded = -1;
81} 82}
82 83
83int skin_backdrop_assign(char* backdrop, char *bmpdir, 84int skin_backdrop_assign(char* backdrop, char *bmpdir,
@@ -101,22 +102,26 @@ int skin_backdrop_assign(char* backdrop, char *bmpdir,
101 for (i=0; i<NB_BDROPS; i++) 102 for (i=0; i<NB_BDROPS; i++)
102 { 103 {
103 if (!backdrops[i].name[0] && free < 0) 104 if (!backdrops[i].name[0] && free < 0)
105 {
104 free = i; 106 free = i;
105 if (!strcmp(backdrops[i].name, filename) && backdrops[i].screen == screen) 107 break;
108 }
109 else if (!strcmp(backdrops[i].name, filename) && backdrops[i].screen == screen)
106 { 110 {
111 backdrops[i].ref_count++;
107 break; 112 break;
108 } 113 }
109 } 114 }
110 if (i < NB_BDROPS) 115 if (free >= 0)
111 return i;
112 else if (free >= 0)
113 { 116 {
114 strlcpy(backdrops[free].name, filename, 117 strlcpy(backdrops[free].name, filename, MAX_PATH);
115 sizeof (backdrops[free].name));
116 backdrops[free].buffer = NULL; 118 backdrops[free].buffer = NULL;
117 backdrops[free].screen = screen; 119 backdrops[free].screen = screen;
120 backdrops[free].ref_count = 1;
118 return free; 121 return free;
119 } 122 }
123 else if (i < NB_BDROPS)
124 return i;
120 return -1; 125 return -1;
121} 126}
122 127
@@ -188,10 +193,17 @@ void skin_backdrop_show(int backdrop_id)
188 193
189void skin_backdrop_unload(int backdrop_id) 194void skin_backdrop_unload(int backdrop_id)
190{ 195{
191 if (backdrops[backdrop_id].buflib_handle > 0) 196 backdrops[backdrop_id].ref_count--;
192 core_free(backdrops[backdrop_id].buflib_handle); 197 if (backdrops[backdrop_id].ref_count <= 0)
193 backdrops[backdrop_id].buffer = NULL; 198 {
194 backdrops[backdrop_id].buflib_handle = -1; 199 if (backdrops[backdrop_id].buflib_handle > 0)
200 core_free(backdrops[backdrop_id].buflib_handle);
201 backdrops[backdrop_id].buffer = NULL;
202 backdrops[backdrop_id].buflib_handle = -1;
203 backdrops[backdrop_id].loaded = false;
204 backdrops[backdrop_id].name[0] = '\0';
205 backdrops[backdrop_id].ref_count = 0;
206 }
195} 207}
196 208
197void skin_backdrop_load_setting(void) 209void skin_backdrop_load_setting(void)