diff --git a/apps/gui/skin_engine/skin_backdrops.c b/apps/gui/skin_engine/skin_backdrops.c
index 12950a6..5002d8a 100644
--- a/apps/gui/skin_engine/skin_backdrops.c
+++ b/apps/gui/skin_engine/skin_backdrops.c
@@ -22,6 +22,7 @@
#include "config.h"
#include <stdio.h>
#include <stdlib.h>
+#include "core_alloc.h"
#include "string-extra.h"
#include "settings.h"
#include "wps_internals.h"
@@ -36,9 +37,31 @@ static struct skin_backdrop {
char *buffer;
enum screen_type screen;
bool loaded;
+ int buflib_handle;
} backdrops[NB_BDROPS];
#define NB_BDROPS SKINNABLE_SCREENS_COUNT*NB_SCREENS
+int handle_being_loaded;
+int current_lcd_backdrop[NB_SCREENS];
+
+int buflib_move_callback(int handle, void* current, void* new)
+{
+ int i;
+ if (handle == handle_being_loaded)
+ return BUFLIB_CB_CANNOT_MOVE;
+ for (i=0; i<NB_BDROPS; i++)
+ {
+ if (backdrops[i].buffer == current)
+ {
+ backdrops[i].buffer = new;
+ break;
+ }
+ }
+ FOR_NB_SCREENS(i)
+ skin_backdrop_show(current_lcd_backdrop[i]);
+ return BUFLIB_CB_OK;
+}
+static struct buflib_callbacks buflib_ops = {buflib_move_callback, NULL};
void skin_backdrop_init(void)
{
@@ -49,6 +72,9 @@ void skin_backdrop_init(void)
backdrops[i].buffer = NULL;
backdrops[i].loaded = false;
}
+ FOR_NB_SCREENS(i)
+ current_lcd_backdrop[i] = -1;
+ handle_being_loaded = -1;
}
int skin_backdrop_assign(char* backdrop, char *bmpdir,
@@ -117,10 +143,18 @@ bool skin_backdrops_preload(void)
}
if (*filename && *filename != '-')
{
- backdrops[i].buffer = (char*)skin_buffer_alloc(buf_size);
- backdrops[i].loaded = backdrops[i].buffer &&
- screens[screen].backdrop_load(filename, backdrops[i].buffer);
- if (!backdrops[i].loaded)
+ backdrops[i].buflib_handle = core_alloc_ex(filename, buf_size, &buflib_ops);
+ if (backdrops[i].buflib_handle > 0)
+ {
+ backdrops[i].buffer = core_get_data(backdrops[i].buflib_handle);
+ handle_being_loaded = backdrops[i].buflib_handle;
+ backdrops[i].loaded =
+ screens[screen].backdrop_load(filename, backdrops[i].buffer);
+ handle_being_loaded = -1;
+ if (!backdrops[i].loaded)
+ retval = false;
+ }
+ else
retval = false;
}
if (backdrops[i].name[0] == '-' && backdrops[i].loaded)
@@ -147,6 +181,7 @@ void skin_backdrop_show(int backdrop_id)
void skin_backdrop_unload(int backdrop_id)
{
+ core_free(backdrops[backdrop_id].buflib_handle);
backdrops[backdrop_id].buffer = NULL;
}