summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--apps/gui/skin_engine/skin_backdrops.c75
-rw-r--r--apps/gui/skin_engine/skin_engine.h6
2 files changed, 65 insertions, 16 deletions
diff --git a/apps/gui/skin_engine/skin_backdrops.c b/apps/gui/skin_engine/skin_backdrops.c
index 12950a666c..303a35333e 100644
--- a/apps/gui/skin_engine/skin_backdrops.c
+++ b/apps/gui/skin_engine/skin_backdrops.c
@@ -22,11 +22,11 @@
22#include "config.h" 22#include "config.h"
23#include <stdio.h> 23#include <stdio.h>
24#include <stdlib.h> 24#include <stdlib.h>
25#include "core_alloc.h"
25#include "string-extra.h" 26#include "string-extra.h"
26#include "settings.h" 27#include "settings.h"
27#include "wps_internals.h" 28#include "wps_internals.h"
28#include "skin_engine.h" 29#include "skin_engine.h"
29#include "skin_buffer.h"
30 30
31#if (LCD_DEPTH > 1) || (defined(HAVE_REMOTE_LCD) && (LCD_REMOTE_DEPTH > 1)) 31#if (LCD_DEPTH > 1) || (defined(HAVE_REMOTE_LCD) && (LCD_REMOTE_DEPTH > 1))
32 32
@@ -36,19 +36,51 @@ static struct skin_backdrop {
36 char *buffer; 36 char *buffer;
37 enum screen_type screen; 37 enum screen_type screen;
38 bool loaded; 38 bool loaded;
39 int buflib_handle;
39} backdrops[NB_BDROPS]; 40} backdrops[NB_BDROPS];
40 41
41#define NB_BDROPS SKINNABLE_SCREENS_COUNT*NB_SCREENS 42#define NB_BDROPS SKINNABLE_SCREENS_COUNT*NB_SCREENS
43int handle_being_loaded;
44int current_lcd_backdrop[NB_SCREENS];
42 45
46int buflib_move_callback(int handle, void* current, void* new)
47{
48 int i;
49 if (handle == handle_being_loaded)
50 return BUFLIB_CB_CANNOT_MOVE;
51 for (i=0; i<NB_BDROPS; i++)
52 {
53 if (backdrops[i].buffer == current)
54 {
55 backdrops[i].buffer = new;
56 break;
57 }
58 }
59 FOR_NB_SCREENS(i)
60 skin_backdrop_show(current_lcd_backdrop[i]);
61 return BUFLIB_CB_OK;
62}
63static struct buflib_callbacks buflib_ops = {buflib_move_callback, NULL};
64static bool first_go = true;
43void skin_backdrop_init(void) 65void skin_backdrop_init(void)
44{ 66{
45 int i; 67 int i;
68
46 for (i=0; i<NB_BDROPS; i++) 69 for (i=0; i<NB_BDROPS; i++)
47 { 70 {
71 if (first_go)
72 backdrops[i].buflib_handle = -1;
73 else
74 skin_backdrop_unload(i);
48 backdrops[i].name[0] = '\0'; 75 backdrops[i].name[0] = '\0';
49 backdrops[i].buffer = NULL; 76 backdrops[i].buffer = NULL;
50 backdrops[i].loaded = false; 77 backdrops[i].loaded = false;
78
51 } 79 }
80 first_go = false;
81 FOR_NB_SCREENS(i)
82 current_lcd_backdrop[i] = -1;
83 handle_being_loaded = -1;
52} 84}
53 85
54int skin_backdrop_assign(char* backdrop, char *bmpdir, 86int skin_backdrop_assign(char* backdrop, char *bmpdir,
@@ -117,10 +149,18 @@ bool skin_backdrops_preload(void)
117 } 149 }
118 if (*filename && *filename != '-') 150 if (*filename && *filename != '-')
119 { 151 {
120 backdrops[i].buffer = (char*)skin_buffer_alloc(buf_size); 152 backdrops[i].buflib_handle = core_alloc_ex(filename, buf_size, &buflib_ops);
121 backdrops[i].loaded = backdrops[i].buffer && 153 if (backdrops[i].buflib_handle > 0)
122 screens[screen].backdrop_load(filename, backdrops[i].buffer); 154 {
123 if (!backdrops[i].loaded) 155 backdrops[i].buffer = core_get_data(backdrops[i].buflib_handle);
156 handle_being_loaded = backdrops[i].buflib_handle;
157 backdrops[i].loaded =
158 screens[screen].backdrop_load(filename, backdrops[i].buffer);
159 handle_being_loaded = -1;
160 if (!backdrops[i].loaded)
161 retval = false;
162 }
163 else
124 retval = false; 164 retval = false;
125 } 165 }
126 if (backdrops[i].name[0] == '-' && backdrops[i].loaded) 166 if (backdrops[i].name[0] == '-' && backdrops[i].loaded)
@@ -147,7 +187,10 @@ void skin_backdrop_show(int backdrop_id)
147 187
148void skin_backdrop_unload(int backdrop_id) 188void skin_backdrop_unload(int backdrop_id)
149{ 189{
190 if (backdrops[backdrop_id].buflib_handle > 0)
191 core_free(backdrops[backdrop_id].buflib_handle);
150 backdrops[backdrop_id].buffer = NULL; 192 backdrops[backdrop_id].buffer = NULL;
193 backdrops[backdrop_id].buflib_handle = -1;
151} 194}
152 195
153void skin_backdrop_load_setting(void) 196void skin_backdrop_load_setting(void)
@@ -161,13 +204,21 @@ void skin_backdrop_load_setting(void)
161 global_settings.backdrop_file[0] != '-') 204 global_settings.backdrop_file[0] != '-')
162 { 205 {
163 if (!backdrops[i].buffer) 206 if (!backdrops[i].buffer)
164 backdrops[i].buffer = (char*)skin_buffer_alloc(LCD_BACKDROP_BYTES); 207 {
165 208 bool loaded;
166 bool loaded = backdrops[i].buffer && 209 backdrops[i].buflib_handle =
167 screens[SCREEN_MAIN].backdrop_load( 210 core_alloc_ex(global_settings.backdrop_file,
168 global_settings.backdrop_file, 211 LCD_BACKDROP_BYTES, &buflib_ops);
169 backdrops[i].buffer); 212 if (backdrops[i].buflib_handle < 0)
170 backdrops[i].name[2] = loaded ? '.' : '\0'; 213 return;
214 backdrops[i].buffer = core_get_data(backdrops[i].buflib_handle);
215 handle_being_loaded = backdrops[i].buflib_handle;
216 loaded = screens[SCREEN_MAIN].backdrop_load(
217 global_settings.backdrop_file,
218 backdrops[i].buffer);
219 handle_being_loaded = -1;
220 backdrops[i].name[2] = loaded ? '.' : '\0';
221 }
171 return; 222 return;
172 } 223 }
173 else 224 else
diff --git a/apps/gui/skin_engine/skin_engine.h b/apps/gui/skin_engine/skin_engine.h
index ef4297d0ce..52ec19d5f9 100644
--- a/apps/gui/skin_engine/skin_engine.h
+++ b/apps/gui/skin_engine/skin_engine.h
@@ -43,12 +43,10 @@ enum skinnable_screens {
43 43
44 44
45#ifdef HAVE_LCD_BITMAP 45#ifdef HAVE_LCD_BITMAP
46#define MAIN_BUFFER ((2*LCD_HEIGHT*LCD_WIDTH*LCD_DEPTH/8) \ 46#define MAIN_BUFFER (2*LCD_HEIGHT*LCD_WIDTH*LCD_DEPTH/8)
47 + (SKINNABLE_SCREENS_COUNT * LCD_BACKDROP_BYTES))
48 47
49#if (NB_SCREENS > 1) 48#if (NB_SCREENS > 1)
50#define REMOTE_BUFFER (2*(LCD_REMOTE_HEIGHT*LCD_REMOTE_WIDTH*LCD_REMOTE_DEPTH/8) \ 49#define REMOTE_BUFFER (2*(LCD_REMOTE_HEIGHT*LCD_REMOTE_WIDTH*LCD_REMOTE_DEPTH/8))
51 + (SKINNABLE_SCREENS_COUNT * REMOTE_LCD_BACKDROP_BYTES))
52#else 50#else
53#define REMOTE_BUFFER 0 51#define REMOTE_BUFFER 0
54#endif 52#endif