16
16
* along with this program; if not, write to the Free Software
17
17
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
21
23
#include <libxml/tree.h>
22
24
#include <libxml/parser.h>
24
GHashTable* gcompris_skin_fonts = NULL;
25
GHashTable* gcompris_skin_colors = NULL;
27
guint32 gcompris_skin_color_title;
28
guint32 gcompris_skin_color_text_button;
29
guint32 gcompris_skin_color_content;
30
guint32 gcompris_skin_color_subtitle;
32
gchar* gcompris_skin_font_title;
33
gchar* gcompris_skin_font_subtitle;
34
gchar* gcompris_skin_font_content;
36
gchar* gcompris_skin_font_board_tiny;
37
gchar* gcompris_skin_font_board_small;
38
gchar* gcompris_skin_font_board_medium;
39
gchar* gcompris_skin_font_board_big;
40
gchar* gcompris_skin_font_board_big_bold;
41
gchar* gcompris_skin_font_board_fixed;
42
gchar* gcompris_skin_font_board_title;
43
gchar* gcompris_skin_font_board_title_bold;
44
gchar* gcompris_skin_font_board_huge;
45
gchar* gcompris_skin_font_board_huge_bold;
26
GHashTable* gc_skin_fonts = NULL;
27
GHashTable* gc_skin_colors = NULL;
28
GHashTable* gc_skin_numbers = NULL;
30
guint32 gc_skin_color_title;
31
guint32 gc_skin_color_text_button;
32
guint32 gc_skin_color_content;
33
guint32 gc_skin_color_subtitle;
34
guint32 gc_skin_color_shadow;
36
gchar* gc_skin_font_title;
37
gchar* gc_skin_font_subtitle;
38
gchar* gc_skin_font_content;
40
gchar* gc_skin_font_board_tiny;
41
gchar* gc_skin_font_board_small;
42
gchar* gc_skin_font_board_medium;
43
gchar* gc_skin_font_board_big;
44
gchar* gc_skin_font_board_big_bold;
45
gchar* gc_skin_font_board_fixed;
46
gchar* gc_skin_font_board_title;
47
gchar* gc_skin_font_board_title_bold;
48
gchar* gc_skin_font_board_huge;
49
gchar* gc_skin_font_board_huge_bold;
53
57
* The caller must free the returned string
55
gchar *gcompris_image_to_skin(gchar *pixmapfile)
60
gc_skin_image_get(gchar *pixmapfile)
57
GcomprisProperties *properties = gcompris_get_properties();
62
GcomprisProperties *properties = gc_prop_get();
60
65
/* First, test if pixmapfile is in the current skin dir */
61
filename = g_strdup_printf("%s/skins/%s/%s", PACKAGE_DATA_DIR, properties->skin, pixmapfile);
66
filename = g_strdup_printf("%s/skins/%s/%s",
67
properties->package_data_dir,
68
properties->skin, pixmapfile);
63
70
if (g_file_test ((filename), G_FILE_TEST_EXISTS)) {
66
73
filename = g_strdup_printf("skins/%s/%s", properties->skin, pixmapfile);
71
/* Now check if pixmapfile is in the default skin dir */
73
filename = g_strdup_printf("%s/skins/%s/%s", PACKAGE_DATA_DIR, DEFAULT_SKIN, pixmapfile);
75
if (g_file_test ((filename), G_FILE_TEST_EXISTS)) {
78
filename = g_strdup_printf("skins/%s/%s", DEFAULT_SKIN, pixmapfile);
79
/* Check it's on the server */
80
filename = gc_net_get_url_from_file("boards/skins/%s/%s", properties->skin, pixmapfile);
83
g_warning (_("Couldn't find file %s !"), filename);
84
/* Return the default skin dir */
85
filename = g_strdup_printf("skins/%s/%s", DEFAULT_SKIN, pixmapfile);
90
91
* If not found, try in the default skin directory
91
92
* If not found abort gcompris
93
GdkPixbuf *gcompris_load_skin_pixmap(char *pixmapfile)
95
gc_skin_pixmap_load(char *pixmapfile)
96
GcomprisProperties *properties = gcompris_get_properties();
97
98
GdkPixbuf *result_pixbuf;
99
filename = gcompris_image_to_skin(pixmapfile);
101
result_pixbuf = gcompris_load_pixmap (filename);
100
filename = gc_skin_image_get(pixmapfile);
102
result_pixbuf = gc_pixmap_load (filename);
103
104
g_free(filename);
105
106
return (result_pixbuf);
109
* Utility function used when freeing the memory used by
110
* Utility function used when freeing the memory used by
110
111
* a hashtable containing strings.
112
void gcompris_skin_free_string(gpointer data)
114
gc_skin_free_string(gpointer data)
118
* Initialize some common variables
120
* Initialize some common variables
119
121
* (the one that have to be defined in each skin)
121
void gcompris_skin_setup_vars(void)
124
gc_skin_setup_vars(void)
123
gcompris_skin_color_title =
124
gcompris_skin_get_color_default("gcompris/title", COLOR_TITLE);
125
gcompris_skin_color_text_button =
126
gcompris_skin_get_color_default("gcompris/text button", COLOR_TEXT_BUTTON);
127
gcompris_skin_color_content =
128
gcompris_skin_get_color_default("gcompris/content", COLOR_CONTENT);
129
gcompris_skin_color_subtitle =
130
gcompris_skin_get_color_default("gcompris/subtitle", COLOR_SUBTITLE);
132
gcompris_skin_font_title =
133
gcompris_skin_get_font_default("gcompris/title", FONT_TITLE);
134
gcompris_skin_font_subtitle =
135
gcompris_skin_get_font_default("gcompris/subtitle", FONT_SUBTITLE);
136
gcompris_skin_font_content =
137
gcompris_skin_get_font_default("gcompris/content", FONT_CONTENT);
139
gcompris_skin_font_board_tiny =
140
gcompris_skin_get_font_default("gcompris/board/tiny", FONT_BOARD_TINY);
141
gcompris_skin_font_board_small =
142
gcompris_skin_get_font_default("gcompris/board/small", FONT_BOARD_SMALL);
143
gcompris_skin_font_board_medium =
144
gcompris_skin_get_font_default("gcompris/board/medium", FONT_BOARD_MEDIUM);
145
gcompris_skin_font_board_big =
146
gcompris_skin_get_font_default("gcompris/board/big", FONT_BOARD_BIG);
147
gcompris_skin_font_board_big_bold =
148
gcompris_skin_get_font_default("gcompris/board/big bold", FONT_BOARD_BIG_BOLD);
149
gcompris_skin_font_board_fixed =
150
gcompris_skin_get_font_default("gcompris/board/fixed", FONT_BOARD_FIXED);
151
gcompris_skin_font_board_title =
152
gcompris_skin_get_font_default("gcompris/board/title", FONT_BOARD_TITLE);
153
gcompris_skin_font_board_title_bold =
154
gcompris_skin_get_font_default("gcompris/board/title bold", FONT_BOARD_TITLE_BOLD);
155
gcompris_skin_font_board_huge =
156
gcompris_skin_get_font_default("gcompris/board/huge", FONT_BOARD_HUGE);
157
gcompris_skin_font_board_huge_bold =
158
gcompris_skin_get_font_default("gcompris/board/huge bold", FONT_BOARD_HUGE_BOLD);
126
gc_skin_color_title =
127
gc_skin_get_color_default("gcompris/title", COLOR_TITLE);
128
gc_skin_color_text_button =
129
gc_skin_get_color_default("gcompris/text button", COLOR_TEXT_BUTTON);
130
gc_skin_color_content =
131
gc_skin_get_color_default("gcompris/content", COLOR_CONTENT);
132
gc_skin_color_subtitle =
133
gc_skin_get_color_default("gcompris/subtitle", COLOR_SUBTITLE);
134
gc_skin_color_shadow =
135
gc_skin_get_color_default("gcompris/shadow", COLOR_SHADOW);
138
gc_skin_get_font_default("gcompris/title", FONT_TITLE);
139
gc_skin_font_subtitle =
140
gc_skin_get_font_default("gcompris/subtitle", FONT_SUBTITLE);
141
gc_skin_font_content =
142
gc_skin_get_font_default("gcompris/content", FONT_CONTENT);
144
gc_skin_font_board_tiny =
145
gc_skin_get_font_default("gcompris/board/tiny", FONT_BOARD_TINY);
146
gc_skin_font_board_small =
147
gc_skin_get_font_default("gcompris/board/small", FONT_BOARD_SMALL);
148
gc_skin_font_board_medium =
149
gc_skin_get_font_default("gcompris/board/medium", FONT_BOARD_MEDIUM);
150
gc_skin_font_board_big =
151
gc_skin_get_font_default("gcompris/board/big", FONT_BOARD_BIG);
152
gc_skin_font_board_big_bold =
153
gc_skin_get_font_default("gcompris/board/big bold", FONT_BOARD_BIG_BOLD);
154
gc_skin_font_board_fixed =
155
gc_skin_get_font_default("gcompris/board/fixed", FONT_BOARD_FIXED);
156
gc_skin_font_board_title =
157
gc_skin_get_font_default("gcompris/board/title", FONT_BOARD_TITLE);
158
gc_skin_font_board_title_bold =
159
gc_skin_get_font_default("gcompris/board/title bold", FONT_BOARD_TITLE_BOLD);
160
gc_skin_font_board_huge =
161
gc_skin_get_font_default("gcompris/board/huge", FONT_BOARD_HUGE);
162
gc_skin_font_board_huge_bold =
163
gc_skin_get_font_default("gcompris/board/huge bold", FONT_BOARD_HUGE_BOLD);
162
167
* Convert from string a color expressed in the form 0xRRGGBBAA
163
168
* to a unsigned 32 bit integer.
165
gboolean gcompris_skin_str_to_color(gchar* data, guint32* color){
170
gboolean gc_skin_str_to_color(gchar* data, guint32* color){
293
302
node = skinNode->children;
294
303
while(node !=NULL)
296
if(g_strcasecmp(node->name,"color")==0){
297
key = xmlGetProp(node, "id");
298
data = xmlGetProp(node, "rgba");
305
if(g_strcasecmp((gchar *)node->name, "color")==0){
306
key = (gchar *)xmlGetProp(node, BAD_CAST "id");
307
data =(gchar *) xmlGetProp(node, BAD_CAST "rgba");
299
308
if((key!=NULL)&&(data!=NULL)){
300
if(gcompris_skin_str_to_color(data, &color)){
301
g_hash_table_insert(gcompris_skin_colors, key, GUINT_TO_POINTER(color));
309
if(gc_skin_str_to_color(data, &color)){
310
g_hash_table_insert(gc_skin_colors, key, GUINT_TO_POINTER(color));
303
312
if(key!=NULL) g_free(key);
306
315
if(data!=NULL) g_free(data);
308
else if(g_strcasecmp(node->name,"font")==0){
309
key = xmlGetProp(node, "id");
310
data = xmlGetProp(node, "name");
311
if((key!=NULL)&&(data!=NULL)){
312
g_hash_table_insert(gcompris_skin_fonts, key, data);
314
if(key!=NULL) g_free(key);
315
if(data!=NULL) g_free(data);
317
else if(g_strcasecmp((gchar *)node->name, "font")==0){
318
key = (gchar *)xmlGetProp(node, BAD_CAST "id");
319
data = (gchar *)xmlGetProp(node, BAD_CAST "name");
320
if((key!=NULL)&&(data!=NULL)){
321
g_hash_table_insert(gc_skin_fonts, key, data);
323
if(key!=NULL) g_free(key);
324
if(data!=NULL) g_free(data);
327
else if(g_strcasecmp((gchar *)node->name, "number")==0){
328
key = (gchar *)xmlGetProp(node, BAD_CAST "id");
329
data = (gchar *)xmlGetProp(node, BAD_CAST "value");
330
if((key!=NULL)&&(data!=NULL)){
331
int number = atoi(data);
332
g_hash_table_insert(gc_skin_numbers, key, GUINT_TO_POINTER(number));
335
if(key!=NULL) g_free(key);
336
if(data!=NULL) g_free(data);
318
339
node = node->next;
325
* Parse the default skin.xml file and the one located in the skin
346
* Parse the default skin.xml file and the one located in the skin
326
347
* directory then load all skins properties into memory
328
void gcompris_skin_load (gchar* skin)
350
gc_skin_load (gchar* skin)
334
gcompris_skin_free();
336
gcompris_skin_fonts = g_hash_table_new_full(g_str_hash, g_str_equal,
337
gcompris_skin_free_string,
338
gcompris_skin_free_string);
339
gcompris_skin_colors = g_hash_table_new_full(g_str_hash, g_str_equal,
340
gcompris_skin_free_string,
342
gcompris_skin_xml_load("default");
343
if(strcmp(skin,"default")!=0)
344
gcompris_skin_xml_load(skin);
346
gcompris_skin_setup_vars();
358
gc_skin_fonts = g_hash_table_new_full(g_str_hash, g_str_equal,
360
gc_skin_free_string);
361
gc_skin_colors = g_hash_table_new_full(g_str_hash, g_str_equal,
364
gc_skin_numbers = g_hash_table_new_full(g_str_hash, g_str_equal,
367
skin_xml_load(DEFAULT_SKIN);
368
if(strcmp(skin,DEFAULT_SKIN)!=0)
371
gc_skin_setup_vars();
350
375
* Free the memory used to store the skin properties.
352
void gcompris_skin_free (void)
354
if(gcompris_skin_fonts!=NULL)
355
g_hash_table_destroy(gcompris_skin_fonts);
357
if(gcompris_skin_colors!=NULL)
358
g_hash_table_destroy(gcompris_skin_colors);
380
if(gc_skin_fonts!=NULL)
381
g_hash_table_destroy(gc_skin_fonts);
383
if(gc_skin_colors!=NULL)
384
g_hash_table_destroy(gc_skin_colors);
386
if(gc_skin_numbers!= NULL)
387
g_hash_table_destroy(gc_skin_numbers);
362
391
* Get the skin color associated to the id
364
guint32 gcompris_skin_get_color_default(gchar* id, guint32 def)
394
gc_skin_get_color_default(gchar* id, guint32 def)
367
result = g_hash_table_lookup(gcompris_skin_colors, (gpointer)id);
397
result = g_hash_table_lookup(gc_skin_colors, (gpointer)id);
369
399
return GPOINTER_TO_UINT(result);
404
* Get the skin gdkcolor associated to the id
406
* The color is returned in the given gdkcolor
409
gc_skin_get_gdkcolor_default(gchar* id, guint32 def, GdkColor *gdkcolor)
414
color = gc_skin_get_color_default(id, def);
416
tmp = g_strdup_printf("#%06X", gc_skin_get_color(id) >> 8);
417
gdk_color_parse(tmp, gdkcolor);
374
422
* Get the skin font name associated to the id
376
gchar* gcompris_skin_get_font_default(gchar* id, gchar* def)
425
gc_skin_get_font_default(gchar* id, gchar* def)
379
result = g_hash_table_lookup(gcompris_skin_fonts, (gpointer)id);
428
result = g_hash_table_lookup(gc_skin_fonts, (gpointer)id);
381
430
return (gchar*)result;
435
* Get the skin 'number' associated to the id
438
gc_skin_get_number_default(gchar* id, guint32 def)
441
result = g_hash_table_lookup(gc_skin_numbers, (gpointer)id);
443
return GPOINTER_TO_UINT(result);