Get rid of get_user_file_path and do the path handling in wrappers for open() and...
[maemo-rb.git] / apps / gui / skin_engine / skin_backdrops.c
blob3e04beaae0c117eda31393f2036d11a57800e90c
1 /***************************************************************************
2 * __________ __ ___.
3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___
4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
7 * \/ \/ \/ \/ \/
8 * $Id$
10 * Copyright (C) 2010 Jonathan Gordon
12 * This program is free software; you can redistribute it and/or
13 * modify it under the terms of the GNU General Public License
14 * as published by the Free Software Foundation; either version 2
15 * of the License, or (at your option) any later version.
17 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
18 * KIND, either express or implied.
20 ****************************************************************************/
22 #include "config.h"
23 #include <stdio.h>
24 #include <stdlib.h>
25 #include "string-extra.h"
26 #include "settings.h"
27 #include "wps_internals.h"
28 #include "skin_engine.h"
29 #include "skin_buffer.h"
31 #if (LCD_DEPTH > 1) || (defined(HAVE_REMOTE_LCD) && (LCD_REMOTE_DEPTH > 1))
33 #define NB_BDROPS SKINNABLE_SCREENS_COUNT*NB_SCREENS
34 static struct skin_backdrop {
35 char name[MAX_PATH];
36 char *buffer;
37 enum screen_type screen;
38 bool loaded;
39 } backdrops[NB_BDROPS];
41 #define NB_BDROPS SKINNABLE_SCREENS_COUNT*NB_SCREENS
43 void skin_backdrop_init(void)
45 int i;
46 for (i=0; i<NB_BDROPS; i++)
48 backdrops[i].name[0] = '\0';
49 backdrops[i].buffer = NULL;
50 backdrops[i].loaded = false;
54 int skin_backdrop_assign(char* backdrop, char *bmpdir,
55 enum screen_type screen)
57 char filename[MAX_PATH];
58 int i, free = -1;
59 if (!backdrop)
60 return -1;
61 if (backdrop[0] == '-')
63 filename[0] = '-';
64 filename[1] = '\0';
65 filename[2] = '\0'; /* we check this later to see if we actually have an
66 image to load. != '\0' means display the image */
68 else
70 get_image_filename(backdrop, bmpdir, filename, sizeof(filename));
72 for (i=0; i<NB_BDROPS; i++)
74 if (!backdrops[i].name[0] && free < 0)
75 free = i;
76 if (!strcmp(backdrops[i].name, filename) && backdrops[i].screen == screen)
78 break;
81 if (i < NB_BDROPS)
82 return i;
83 else if (free >= 0)
85 strlcpy(backdrops[free].name, filename,
86 sizeof (backdrops[free].name));
87 backdrops[free].buffer = NULL;
88 backdrops[free].screen = screen;
89 return free;
91 return -1;
94 bool skin_backdrops_preload(void)
96 bool retval = true;
97 int i;
98 char *filename;
99 for (i=0; i<NB_BDROPS; i++)
101 if (backdrops[i].name[0] && !backdrops[i].buffer)
103 size_t buf_size;
104 enum screen_type screen = backdrops[i].screen;
105 #if defined(HAVE_REMOTE_LCD) && (LCD_REMOTE_DEPTH > 1)
106 if (screen == SCREEN_REMOTE)
107 buf_size = REMOTE_LCD_BACKDROP_BYTES;
108 else
109 #endif
110 buf_size = LCD_BACKDROP_BYTES;
112 filename = backdrops[i].name;
113 if (screen == SCREEN_MAIN && global_settings.backdrop_file[0] &&
114 global_settings.backdrop_file[0] != '-' && filename[0] == '-')
116 char* temp = filename+2; /* slightly hacky to get a buffer */
117 size_t size = sizeof(backdrops[i].name) - 2;
118 snprintf(temp, size, BACKDROP_DIR "/%s.bmp", global_settings.backdrop_file);
119 filename = temp;
121 if (*filename && *filename != '-')
123 backdrops[i].buffer = (char*)skin_buffer_alloc(buf_size);
124 backdrops[i].loaded = backdrops[i].buffer &&
125 screens[screen].backdrop_load(filename, backdrops[i].buffer);
126 if (!backdrops[i].loaded)
127 retval = false;
129 if (backdrops[i].name[0] == '-' && backdrops[i].loaded)
130 backdrops[i].name[2] = '.';
133 return retval;
136 void skin_backdrop_show(int backdrop_id)
138 if (backdrop_id < 0)
139 return;
140 enum screen_type screen = backdrops[backdrop_id].screen;
141 if ((backdrops[backdrop_id].loaded == false) ||
142 (backdrops[backdrop_id].name[0] == '-' &&
143 backdrops[backdrop_id].name[2] == '\0'))
145 screens[screen].backdrop_show(NULL);
147 else if (backdrops[backdrop_id].buffer)
148 screens[screen].backdrop_show(backdrops[backdrop_id].buffer);
151 void skin_backdrop_unload(int backdrop_id)
153 backdrops[backdrop_id].buffer = NULL;
156 void skin_backdrop_load_setting(void)
158 int i;
159 char filename[MAX_PATH];
160 for(i=0;i<SKINNABLE_SCREENS_COUNT*NB_SCREENS;i++)
162 if (backdrops[i].name[0] == '-' && backdrops[i].screen == SCREEN_MAIN)
164 if (global_settings.backdrop_file[0] &&
165 global_settings.backdrop_file[0] != '-')
167 if (!backdrops[i].buffer)
168 backdrops[i].buffer = (char*)skin_buffer_alloc(LCD_BACKDROP_BYTES);
169 snprintf(filename, sizeof filename, BACKDROP_DIR "/%s.bmp",
170 global_settings.backdrop_file);
171 bool loaded = backdrops[i].buffer &&
172 screens[SCREEN_MAIN].backdrop_load(filename,
173 backdrops[i].buffer);
174 backdrops[i].name[2] = loaded ? '.' : '\0';
175 return;
177 else
178 backdrops[i].name[2] = '\0';
180 #if NB_SCREENS > 1
181 else if (backdrops[i].name[0] == '-')
183 backdrops[i].name[2] = '\0';
184 return;
186 #endif
190 #else
192 void skin_backdrop_init(void)
195 #endif