Mercurial > mplayer.hg
annotate gui/skin/skin.c @ 32933:258baf2bfeca
Move fntFreeFont() into appFreeStruct().
Part of the skin items which are freed in appFreeStruct() are the fonts,
so the best place to free the fonts is together with the rest of the skin
items.
author | ib |
---|---|
date | Thu, 03 Mar 2011 15:00:05 +0000 |
parents | e95ec1b2feea |
children | 3c57056637cc |
rev | line source |
---|---|
26458 | 1 /* |
2 * This file is part of MPlayer. | |
3 * | |
4 * MPlayer is free software; you can redistribute it and/or modify | |
5 * it under the terms of the GNU General Public License as published by | |
6 * the Free Software Foundation; either version 2 of the License, or | |
7 * (at your option) any later version. | |
8 * | |
9 * MPlayer is distributed in the hope that it will be useful, | |
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
12 * GNU General Public License for more details. | |
13 * | |
14 * You should have received a copy of the GNU General Public License along | |
15 * with MPlayer; if not, write to the Free Software Foundation, Inc., | |
16 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. | |
17 */ | |
23077 | 18 |
19 #include <stdio.h> | |
20 #include <string.h> | |
21 | |
32873 | 22 #include "skin.h" |
23077 | 23 #include "cut.h" |
24 #include "font.h" | |
32893 | 25 #include "gui/app.h" |
32873 | 26 #include "gui/mplayer/widgets.h" |
23077 | 27 |
26382
b2f4abcf20ed
Make include paths consistent; do not use ../ in them.
diego
parents:
26365
diff
changeset
|
28 #include "config.h" |
b2f4abcf20ed
Make include paths consistent; do not use ../ in them.
diego
parents:
26365
diff
changeset
|
29 #include "help_mp.h" |
23703
9fb716ab06a3
Avoid code duplication and ugly config.h hack by using av_strlcat/av_strlcpy
reimar
parents:
23077
diff
changeset
|
30 #include "libavutil/avstring.h" |
32873 | 31 #include "mp_msg.h" |
23077 | 32 |
32873 | 33 typedef struct { |
34 const char *name; | |
35 int (*func)(char *in); | |
36 } _item; | |
23077 | 37 |
32875 | 38 static listItems *defList; |
23077 | 39 |
32873 | 40 static int linenumber; |
41 static unsigned char path[512]; | |
32875 | 42 static unsigned char window_name[32]; |
23077 | 43 |
32875 | 44 static wItem *currSection; |
45 static int *currSubItem; | |
46 static wItem *currSubItems; | |
23077 | 47 |
32873 | 48 static void ERRORMESSAGE(const char *format, ...) |
23077 | 49 { |
32873 | 50 char p[512]; |
51 char tmp[512]; | |
52 va_list ap; | |
53 | |
54 va_start(ap, format); | |
55 vsnprintf(p, sizeof(p), format, ap); | |
56 va_end(ap); | |
57 | |
32877 | 58 mp_msg(MSGT_GPLAYER, MSGL_ERR, MSGTR_SKIN_ERRORMESSAGE, linenumber, p); |
32879
9ee46c5e8667
Comply with the requested verbosity on GUI message boxes.
ib
parents:
32878
diff
changeset
|
59 |
9ee46c5e8667
Comply with the requested verbosity on GUI message boxes.
ib
parents:
32878
diff
changeset
|
60 if (mp_msg_test(MSGT_GPLAYER, MSGL_ERR)) { |
32880 | 61 snprintf(tmp, sizeof(tmp), MSGTR_SKIN_ERRORMESSAGE, linenumber, p); |
62 gtkMessageBox(GTK_MB_FATAL, tmp); | |
32879
9ee46c5e8667
Comply with the requested verbosity on GUI message boxes.
ib
parents:
32878
diff
changeset
|
63 } |
23077 | 64 } |
65 | |
32873 | 66 #define CHECKDEFLIST(str) \ |
67 { \ | |
68 if (defList == NULL) \ | |
69 { \ | |
32877 | 70 ERRORMESSAGE(MSGTR_SKIN_ERROR_SECTION, str); \ |
32873 | 71 return 1; \ |
72 } \ | |
73 } | |
74 | |
75 #define CHECKWINLIST(str) \ | |
76 { \ | |
77 if (!window_name[0]) \ | |
78 { \ | |
32877 | 79 ERRORMESSAGE(MSGTR_SKIN_ERROR_WINDOW, str); \ |
32873 | 80 return 1; \ |
81 } \ | |
82 } | |
23077 | 83 |
32873 | 84 #define CHECK(name) \ |
85 { \ | |
86 if (!strcmp(window_name, name)) \ | |
87 { \ | |
32877 | 88 ERRORMESSAGE(MSGTR_SKIN_ERROR_IN_WINDOW, name); \ |
32873 | 89 return 1; \ |
90 } \ | |
91 } | |
92 | |
93 static char *strlower(char *in) | |
94 { | |
95 char *p = in; | |
96 | |
97 while (*p) { | |
98 if (*p >= 'A' && *p <= 'Z') | |
32874 | 99 *p += 'a' - 'A'; |
32873 | 100 |
101 p++; | |
102 } | |
103 | |
104 return in; | |
23077 | 105 } |
106 | |
32873 | 107 int skinBPRead(char *fname, txSample *bf) |
108 { | |
109 int i = bpRead(fname, bf); | |
110 | |
111 switch (i) { | |
112 case -1: | |
113 ERRORMESSAGE(MSGTR_SKIN_BITMAP_16bit, fname); | |
114 break; | |
115 | |
116 case -2: | |
117 ERRORMESSAGE(MSGTR_SKIN_BITMAP_FileNotFound, fname); | |
118 break; | |
119 | |
120 case -3: | |
121 ERRORMESSAGE(MSGTR_SKIN_BITMAP_BMPReadError, fname); | |
122 break; | |
23077 | 123 |
32873 | 124 case -4: |
125 ERRORMESSAGE(MSGTR_SKIN_BITMAP_TGAReadError, fname); | |
126 break; | |
127 | |
128 case -5: | |
129 ERRORMESSAGE(MSGTR_SKIN_BITMAP_PNGReadError, fname); | |
130 break; | |
131 | |
132 case -6: | |
133 ERRORMESSAGE(MSGTR_SKIN_BITMAP_RLENotSupported, fname); | |
134 break; | |
135 | |
136 case -7: | |
137 ERRORMESSAGE(MSGTR_SKIN_BITMAP_UnknownFileType, fname); | |
138 break; | |
139 | |
140 case -8: | |
141 ERRORMESSAGE(MSGTR_SKIN_BITMAP_ConversionError, fname); | |
142 break; | |
143 } | |
144 | |
145 return i; | |
23077 | 146 } |
147 | |
32873 | 148 // section=movieplayer |
149 static int cmd_section(char *in) | |
23077 | 150 { |
32873 | 151 strlower(in); |
152 defList = NULL; | |
153 | |
154 if (!strcmp(in, "movieplayer")) | |
32893 | 155 defList = &appMPlayer; |
32873 | 156 |
157 mp_dbg(MSGT_GPLAYER, MSGL_DBG2, "\n[skin] sectionname: %s\n", in); | |
158 | |
159 return 0; | |
23077 | 160 } |
161 | |
32873 | 162 // end |
163 static int cmd_end(char *in) | |
23077 | 164 { |
32873 | 165 (void)in; |
166 | |
167 if (strlen(window_name)) { | |
168 window_name[0] = 0; | |
169 currSection = NULL; | |
170 currSubItem = NULL; | |
171 currSubItems = NULL; | |
172 } else | |
173 defList = NULL; | |
174 | |
175 mp_dbg(MSGT_GPLAYER, MSGL_DBG2, "\n[skin] end section\n"); | |
176 | |
177 return 0; | |
23077 | 178 } |
179 | |
32873 | 180 // window=main|sub|playbar|menu |
181 static int cmd_window(char *in) | |
23077 | 182 { |
32873 | 183 CHECKDEFLIST("window"); |
184 | |
185 av_strlcpy(window_name, strlower(in), sizeof(window_name)); | |
23077 | 186 |
32873 | 187 if (!strncmp(in, "main", 4)) { |
32893 | 188 currSection = &appMPlayer.main; |
32931
03b1051bed5c
Rename the 'NumberOf' members of the listItems structure.
ib
parents:
32926
diff
changeset
|
189 currSubItem = &appMPlayer.IndexOfMainItems; |
32912 | 190 currSubItems = appMPlayer.mainItems; |
32873 | 191 } else if (!strncmp(in, "sub", 3)) |
32893 | 192 currSection = &appMPlayer.sub; |
32873 | 193 else if (!strncmp(in, "playbar", 7)) { |
32893 | 194 currSection = &appMPlayer.bar; |
32931
03b1051bed5c
Rename the 'NumberOf' members of the listItems structure.
ib
parents:
32926
diff
changeset
|
195 currSubItem = &appMPlayer.IndexOfBarItems; |
32893 | 196 currSubItems = appMPlayer.barItems; |
32873 | 197 } else if (!strncmp(in, "menu", 4)) { |
32893 | 198 currSection = &appMPlayer.menuBase; |
32931
03b1051bed5c
Rename the 'NumberOf' members of the listItems structure.
ib
parents:
32926
diff
changeset
|
199 currSubItem = &appMPlayer.IndexOfMenuItems; |
32912 | 200 currSubItems = appMPlayer.menuItems; |
32873 | 201 } else |
202 ERRORMESSAGE(MSGTR_UNKNOWNWINDOWTYPE); | |
203 | |
204 mp_dbg(MSGT_GPLAYER, MSGL_DBG2, "\n[skin] window: %s\n", window_name); | |
205 | |
206 return 0; | |
23077 | 207 } |
208 | |
32873 | 209 // base=image,x,y[,width,height] |
210 static int cmd_base(char *in) | |
23077 | 211 { |
32873 | 212 unsigned char fname[512]; |
213 unsigned char tmp[512]; | |
214 int x, y; | |
215 int sx = 0, sy = 0; | |
216 | |
217 CHECKDEFLIST("base"); | |
218 CHECKWINLIST("base"); | |
23077 | 219 |
32873 | 220 cutItem(in, fname, ',', 0); |
221 x = cutItemToInt(in, ',', 1); | |
222 y = cutItemToInt(in, ',', 2); | |
223 sx = cutItemToInt(in, ',', 3); | |
224 sy = cutItemToInt(in, ',', 4); | |
225 | |
226 mp_dbg(MSGT_GPLAYER, MSGL_DBG2, "\n[skin] base: %s x: %d y: %d ( %dx%d )\n", fname, x, y, sx, sy); | |
23077 | 227 |
32873 | 228 if (!strcmp(window_name, "main")) { |
229 defList->main.x = x; | |
230 defList->main.y = y; | |
231 defList->main.type = itBase; | |
232 | |
233 av_strlcpy(tmp, path, sizeof(tmp)); | |
234 av_strlcat(tmp, fname, sizeof(tmp)); | |
235 | |
236 if (skinBPRead(tmp, &defList->main.Bitmap) != 0) | |
237 return 1; | |
238 | |
239 defList->main.width = defList->main.Bitmap.Width; | |
240 defList->main.height = defList->main.Bitmap.Height; | |
241 | |
27377
d58d06eafe83
Change a bunch of X11-specific preprocessor directives.
diego
parents:
26458
diff
changeset
|
242 #ifdef CONFIG_XSHAPE |
32873 | 243 Convert32to1(&defList->main.Bitmap, &defList->main.Mask, 0x00ff00ff); |
32876 | 244 mp_dbg(MSGT_GPLAYER, MSGL_DBG2, "[skin] mask: %lux%lu\n", defList->main.Mask.Width, defList->main.Mask.Height); |
23077 | 245 #else |
32873 | 246 defList->main.Mask.Image = NULL; |
23077 | 247 #endif |
32873 | 248 |
249 mp_dbg(MSGT_GPLAYER, MSGL_DBG2, "[skin] width: %d height: %d\n", defList->main.width, defList->main.height); | |
23077 | 250 } |
32873 | 251 |
252 if (!strcmp(window_name, "sub")) { | |
253 defList->sub.type = itBase; | |
254 | |
255 av_strlcpy(tmp, path, sizeof(tmp)); | |
256 av_strlcat(tmp, fname, sizeof(tmp)); | |
257 | |
258 if (skinBPRead(tmp, &defList->sub.Bitmap) != 0) | |
259 return 1; | |
260 | |
261 defList->sub.x = x; | |
262 defList->sub.y = y; | |
263 defList->sub.width = defList->sub.Bitmap.Width; | |
264 defList->sub.height = defList->sub.Bitmap.Height; | |
265 | |
266 if (sx && sy) { | |
267 defList->sub.width = sx; | |
268 defList->sub.height = sy; | |
269 } | |
270 | |
271 mp_dbg(MSGT_GPLAYER, MSGL_DBG2, "[skin] %d,%d %dx%d\n", defList->sub.x, defList->sub.y, defList->sub.width, defList->sub.height); | |
272 } | |
273 | |
274 if (!strcmp(window_name, "menu")) { | |
275 defList->menuIsPresent = 1; | |
276 defList->menuBase.type = itBase; | |
277 | |
278 av_strlcpy(tmp, path, sizeof(tmp)); | |
279 av_strlcat(tmp, fname, sizeof(tmp)); | |
280 | |
281 if (skinBPRead(tmp, &defList->menuBase.Bitmap) != 0) | |
282 return 1; | |
283 | |
284 defList->menuBase.width = defList->menuBase.Bitmap.Width; | |
285 defList->menuBase.height = defList->menuBase.Bitmap.Height; | |
286 | |
27377
d58d06eafe83
Change a bunch of X11-specific preprocessor directives.
diego
parents:
26458
diff
changeset
|
287 #ifdef CONFIG_XSHAPE |
32873 | 288 Convert32to1(&defList->menuBase.Bitmap, &defList->menuBase.Mask, 0x00ff00ff); |
32876 | 289 mp_dbg(MSGT_GPLAYER, MSGL_DBG2, "[skin] mask: %lux%lu\n", defList->menuBase.Mask.Width, defList->menuBase.Mask.Height); |
23077 | 290 #else |
32873 | 291 defList->menuBase.Mask.Image = NULL; |
23077 | 292 #endif |
32873 | 293 |
294 mp_dbg(MSGT_GPLAYER, MSGL_DBG2, "[skin] width: %d height: %d\n", defList->menuBase.width, defList->menuBase.height); | |
295 } | |
296 | |
297 if (!strcmp(window_name, "playbar")) { | |
298 defList->barIsPresent = 1; | |
299 defList->bar.x = x; | |
300 defList->bar.y = y; | |
301 defList->bar.type = itBase; | |
302 | |
303 av_strlcpy(tmp, path, sizeof(tmp)); | |
304 av_strlcat(tmp, fname, sizeof(tmp)); | |
305 | |
306 if (skinBPRead(tmp, &defList->bar.Bitmap) != 0) | |
307 return 1; | |
308 | |
309 defList->bar.width = defList->bar.Bitmap.Width; | |
310 defList->bar.height = defList->bar.Bitmap.Height; | |
311 | |
27377
d58d06eafe83
Change a bunch of X11-specific preprocessor directives.
diego
parents:
26458
diff
changeset
|
312 #ifdef CONFIG_XSHAPE |
32873 | 313 Convert32to1(&defList->bar.Bitmap, &defList->bar.Mask, 0x00ff00ff); |
32876 | 314 mp_dbg(MSGT_GPLAYER, MSGL_DBG2, "[skin] mask: %lux%lu\n", defList->bar.Mask.Width, defList->bar.Mask.Height); |
23077 | 315 #else |
32873 | 316 defList->bar.Mask.Image = NULL; |
23077 | 317 #endif |
318 | |
32873 | 319 mp_dbg(MSGT_GPLAYER, MSGL_DBG2, "[skin] width: %d height: %d\n", defList->bar.width, defList->bar.height); |
320 } | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27377
diff
changeset
|
321 |
32873 | 322 return 0; |
23077 | 323 } |
324 | |
32873 | 325 // background=R,G,B |
326 static int cmd_background(char *in) | |
23077 | 327 { |
32873 | 328 CHECKDEFLIST("background"); |
329 CHECKWINLIST("background"); | |
23077 | 330 |
32873 | 331 CHECK("menu"); |
332 CHECK("main"); | |
23077 | 333 |
32873 | 334 currSection->R = cutItemToInt(in, ',', 0); |
335 currSection->G = cutItemToInt(in, ',', 1); | |
336 currSection->B = cutItemToInt(in, ',', 2); | |
23077 | 337 |
32873 | 338 mp_dbg(MSGT_GPLAYER, MSGL_DBG2, "\n[skin] background color is #%x%x%x.\n", currSection->R, currSection->G, currSection->B); |
23077 | 339 |
32873 | 340 return 0; |
23077 | 341 } |
342 | |
32873 | 343 // button=image,x,y,width,height,message |
344 static int cmd_button(char *in) | |
23077 | 345 { |
32873 | 346 unsigned char fname[512]; |
347 unsigned char tmp[512]; | |
348 int x, y, sx, sy; | |
349 char msg[32]; | |
350 | |
351 CHECKDEFLIST("button"); | |
352 CHECKWINLIST("button"); | |
353 | |
354 CHECK("sub"); | |
355 CHECK("menu"); | |
23077 | 356 |
32873 | 357 cutItem(in, fname, ',', 0); |
358 x = cutItemToInt(in, ',', 1); | |
359 y = cutItemToInt(in, ',', 2); | |
360 sx = cutItemToInt(in, ',', 3); | |
361 sy = cutItemToInt(in, ',', 4); | |
362 cutItem(in, msg, ',', 5); | |
363 | |
364 (*currSubItem)++; | |
365 currSubItems[*currSubItem].type = itButton; | |
366 currSubItems[*currSubItem].x = x; | |
367 currSubItems[*currSubItem].y = y; | |
368 currSubItems[*currSubItem].width = sx; | |
369 currSubItems[*currSubItem].height = sy; | |
23077 | 370 |
32873 | 371 mp_dbg(MSGT_GPLAYER, MSGL_DBG2, "\n[skin] button: fname: %s\n", fname); |
372 mp_dbg(MSGT_GPLAYER, MSGL_DBG2, "[skin] x: %d y: %d sx: %d sy: %d\n", x, y, sx, sy); | |
373 | |
32911 | 374 if ((currSubItems[*currSubItem].message = appFindMessage(msg)) == -1) { |
32873 | 375 ERRORMESSAGE(MSGTR_SKIN_BITMAP_UnknownMessage, msg); |
376 return 0; | |
377 } | |
378 | |
379 currSubItems[*currSubItem].pressed = btnReleased; | |
380 | |
32911 | 381 if (currSubItems[*currSubItem].message == evPauseSwitchToPlay) |
32873 | 382 currSubItems[*currSubItem].pressed = btnDisabled; |
23077 | 383 |
32873 | 384 currSubItems[*currSubItem].tmp = 1; |
385 | |
32911 | 386 mp_dbg(MSGT_GPLAYER, MSGL_DBG2, "[skin] message: %d\n", currSubItems[*currSubItem].message); |
32873 | 387 |
388 currSubItems[*currSubItem].Bitmap.Image = NULL; | |
389 | |
390 if (strcmp(fname, "NULL") != 0) { | |
391 av_strlcpy(tmp, path, sizeof(tmp)); | |
392 av_strlcat(tmp, fname, sizeof(tmp)); | |
393 | |
394 if (skinBPRead(tmp, &currSubItems[*currSubItem].Bitmap) != 0) | |
395 return 1; | |
396 } | |
397 | |
398 return 0; | |
23077 | 399 } |
400 | |
32873 | 401 // selected=image |
402 static int cmd_selected(char *in) | |
403 { | |
404 unsigned char fname[512]; | |
405 unsigned char tmp[512]; | |
406 | |
407 CHECKDEFLIST("selected"); | |
408 CHECKWINLIST("selected"); | |
409 | |
410 CHECK("main"); | |
411 CHECK("sub"); | |
412 CHECK("playbar"); | |
413 | |
414 cutItem(in, fname, ',', 0); | |
23077 | 415 |
32873 | 416 defList->menuSelected.type = itBase; |
417 | |
418 av_strlcpy(tmp, path, sizeof(tmp)); | |
419 av_strlcat(tmp, fname, sizeof(tmp)); | |
420 | |
421 mp_dbg(MSGT_GPLAYER, MSGL_DBG2, "\n[skin] selected: %s\n", fname); | |
23077 | 422 |
32873 | 423 if (skinBPRead(tmp, &defList->menuSelected.Bitmap) != 0) |
424 return 1; | |
425 | |
426 defList->menuSelected.width = defList->menuSelected.Bitmap.Width; | |
427 defList->menuSelected.height = defList->menuSelected.Bitmap.Height; | |
428 | |
429 mp_dbg(MSGT_GPLAYER, MSGL_DBG2, "[skin] width: %d height: %d\n", defList->menuSelected.width, defList->menuSelected.height); | |
430 | |
431 return 0; | |
432 } | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27377
diff
changeset
|
433 |
32873 | 434 // menu=x,y,width,height,message |
435 static int cmd_menu(char *in) | |
436 { | |
32911 | 437 int x, y, sx, sy, message; |
32873 | 438 unsigned char tmp[64]; |
439 | |
440 CHECKDEFLIST("menu"); | |
441 CHECKWINLIST("menu"); | |
442 | |
443 CHECK("main"); | |
444 CHECK("sub"); | |
445 CHECK("playbar"); | |
446 | |
447 x = cutItemToInt(in, ',', 0); | |
448 y = cutItemToInt(in, ',', 1); | |
449 sx = cutItemToInt(in, ',', 2); | |
450 sy = cutItemToInt(in, ',', 3); | |
451 cutItem(in, tmp, ',', 4); | |
23077 | 452 |
32911 | 453 message = appFindMessage(tmp); |
32873 | 454 |
32931
03b1051bed5c
Rename the 'NumberOf' members of the listItems structure.
ib
parents:
32926
diff
changeset
|
455 defList->IndexOfMenuItems++; |
03b1051bed5c
Rename the 'NumberOf' members of the listItems structure.
ib
parents:
32926
diff
changeset
|
456 defList->menuItems[defList->IndexOfMenuItems].x = x; |
03b1051bed5c
Rename the 'NumberOf' members of the listItems structure.
ib
parents:
32926
diff
changeset
|
457 defList->menuItems[defList->IndexOfMenuItems].y = y; |
03b1051bed5c
Rename the 'NumberOf' members of the listItems structure.
ib
parents:
32926
diff
changeset
|
458 defList->menuItems[defList->IndexOfMenuItems].width = sx; |
03b1051bed5c
Rename the 'NumberOf' members of the listItems structure.
ib
parents:
32926
diff
changeset
|
459 defList->menuItems[defList->IndexOfMenuItems].height = sy; |
23077 | 460 |
32931
03b1051bed5c
Rename the 'NumberOf' members of the listItems structure.
ib
parents:
32926
diff
changeset
|
461 mp_dbg(MSGT_GPLAYER, MSGL_DBG2, "\n[skin] menuitem: %d\n", defList->IndexOfMenuItems); |
32873 | 462 mp_dbg(MSGT_GPLAYER, MSGL_DBG2, "[skin] x: %d y: %d sx: %d sy: %d\n", x, y, sx, sy); |
23077 | 463 |
32931
03b1051bed5c
Rename the 'NumberOf' members of the listItems structure.
ib
parents:
32926
diff
changeset
|
464 if ((defList->menuItems[defList->IndexOfMenuItems].message = message) == -1) |
32873 | 465 ERRORMESSAGE(MSGTR_SKIN_BITMAP_UnknownMessage, tmp); |
23077 | 466 |
32931
03b1051bed5c
Rename the 'NumberOf' members of the listItems structure.
ib
parents:
32926
diff
changeset
|
467 mp_dbg(MSGT_GPLAYER, MSGL_DBG2, "[skin] message: %d\n", defList->mainItems[defList->IndexOfMainItems].message); |
23077 | 468 |
32931
03b1051bed5c
Rename the 'NumberOf' members of the listItems structure.
ib
parents:
32926
diff
changeset
|
469 defList->menuItems[defList->IndexOfMenuItems].Bitmap.Image = NULL; |
32873 | 470 return 0; |
23077 | 471 } |
472 | |
32873 | 473 // hpotmeter=button,bwidth,bheight,phases,numphases,default,x,y,width,height,message |
474 static int cmd_hpotmeter(char *in) | |
475 { | |
32911 | 476 int x, y, pwidth, pheight, ph, sx, sy, message, d; |
32873 | 477 unsigned char tmp[512]; |
478 unsigned char pfname[512]; | |
479 unsigned char phfname[512]; | |
480 wItem *item; | |
23077 | 481 |
32873 | 482 CHECKDEFLIST("hpotmeter"); |
483 CHECKWINLIST("hpotmeter"); | |
23077 | 484 |
32873 | 485 CHECK("sub"); |
486 CHECK("menu"); | |
23077 | 487 |
32873 | 488 cutItem(in, pfname, ',', 0); |
32911 | 489 pwidth = cutItemToInt(in, ',', 1); |
490 pheight = cutItemToInt(in, ',', 2); | |
32873 | 491 cutItem(in, phfname, ',', 3); |
492 ph = cutItemToInt(in, ',', 4); | |
493 d = cutItemToInt(in, ',', 5); | |
494 x = cutItemToInt(in, ',', 6); | |
495 y = cutItemToInt(in, ',', 7); | |
496 sx = cutItemToInt(in, ',', 8); | |
497 sy = cutItemToInt(in, ',', 9); | |
498 cutItem(in, tmp, ',', 10); | |
499 | |
32911 | 500 message = appFindMessage(tmp); |
23077 | 501 |
32873 | 502 mp_dbg(MSGT_GPLAYER, MSGL_DBG2, "\n[skin] h/v potmeter: pointer filename: '%s'\n", pfname); |
32911 | 503 mp_dbg(MSGT_GPLAYER, MSGL_DBG2, "[skin] pointer size is %dx%d\n", pwidth, pheight); |
32873 | 504 mp_dbg(MSGT_GPLAYER, MSGL_DBG2, "[skin] phasebitmaps filename: '%s'\n", phfname); |
505 mp_dbg(MSGT_GPLAYER, MSGL_DBG2, "[skin] position: %d,%d %dx%d\n", x, y, sx, sy); | |
506 mp_dbg(MSGT_GPLAYER, MSGL_DBG2, "[skin] default value: %d\n", d); | |
32911 | 507 mp_dbg(MSGT_GPLAYER, MSGL_DBG2, "[skin] message: %d\n", message); |
23077 | 508 |
32873 | 509 (*currSubItem)++; |
510 item = &currSubItems[*currSubItem]; | |
511 item->type = itHPotmeter; | |
512 item->x = x; | |
513 item->y = y; | |
514 item->width = sx; | |
515 item->height = sy; | |
32911 | 516 item->numphases = ph; |
517 item->pwidth = pwidth; | |
518 item->pheight = pheight; | |
519 item->message = message; | |
32873 | 520 item->value = (float)d; |
521 item->pressed = btnReleased; | |
522 item->Bitmap.Image = NULL; | |
23077 | 523 |
32873 | 524 if (strcmp(phfname, "NULL") != 0) { |
525 av_strlcpy(tmp, path, sizeof(tmp)); | |
526 av_strlcat(tmp, phfname, sizeof(tmp)); | |
527 | |
528 if (skinBPRead(tmp, &item->Bitmap) != 0) | |
529 return 1; | |
530 } | |
531 | |
532 item->Mask.Image = NULL; | |
23077 | 533 |
32873 | 534 if (strcmp(pfname, "NULL") != 0) { |
535 av_strlcpy(tmp, path, sizeof(tmp)); | |
536 av_strlcat(tmp, pfname, sizeof(tmp)); | |
537 | |
538 if (skinBPRead(tmp, &item->Mask) != 0) | |
539 return 1; | |
540 } | |
541 | |
542 return 0; | |
23077 | 543 } |
544 | |
32873 | 545 // vpotmeter=button,bwidth,bheight,phases,numphases,default,x,y,width,height,message |
546 static int cmd_vpotmeter(char *in) | |
23077 | 547 { |
32873 | 548 int r = cmd_hpotmeter(in); |
549 wItem *item; | |
23077 | 550 |
32873 | 551 item = &currSubItems[*currSubItem]; |
552 item->type = itVPotmeter; | |
553 return r; | |
23077 | 554 } |
555 | |
32873 | 556 // potmeter=phases,numphases,default,x,y,width,height,message |
557 static int cmd_potmeter(char *in) | |
558 { | |
32911 | 559 int x, y, ph, sx, sy, message, d; |
32873 | 560 unsigned char tmp[512]; |
561 unsigned char phfname[512]; | |
562 wItem *item; | |
23077 | 563 |
32873 | 564 CHECKDEFLIST("potmeter"); |
565 CHECKWINLIST("potmeter"); | |
23077 | 566 |
32873 | 567 CHECK("sub"); |
568 CHECK("menu"); | |
23077 | 569 |
32873 | 570 cutItem(in, phfname, ',', 0); |
571 ph = cutItemToInt(in, ',', 1); | |
572 d = cutItemToInt(in, ',', 2); | |
573 x = cutItemToInt(in, ',', 3); | |
574 y = cutItemToInt(in, ',', 4); | |
575 sx = cutItemToInt(in, ',', 5); | |
576 sy = cutItemToInt(in, ',', 6); | |
577 cutItem(in, tmp, ',', 7); | |
578 | |
32911 | 579 message = appFindMessage(tmp); |
23077 | 580 |
32873 | 581 mp_dbg(MSGT_GPLAYER, MSGL_DBG2, "\n[skin] potmeter: phases filename: '%s'\n", phfname); |
582 mp_dbg(MSGT_GPLAYER, MSGL_DBG2, "[skin] position: %d,%d %dx%d\n", x, y, sx, sy); | |
32911 | 583 mp_dbg(MSGT_GPLAYER, MSGL_DBG2, "[skin] numphases: %d\n", ph); |
32873 | 584 mp_dbg(MSGT_GPLAYER, MSGL_DBG2, "[skin] default value: %d\n", d); |
32911 | 585 mp_dbg(MSGT_GPLAYER, MSGL_DBG2, "[skin] message: %d\n", message); |
23077 | 586 |
32873 | 587 (*currSubItem)++; |
588 item = &currSubItems[*currSubItem]; | |
589 item->type = itPotmeter; | |
590 item->x = x; | |
591 item->y = y; | |
592 item->width = sx; | |
593 item->height = sy; | |
32911 | 594 item->numphases = ph; |
595 item->message = message; | |
32873 | 596 item->value = (float)d; |
597 item->Bitmap.Image = NULL; | |
23077 | 598 |
32873 | 599 if (strcmp(phfname, "NULL") != 0) { |
600 av_strlcpy(tmp, path, sizeof(tmp)); | |
601 av_strlcat(tmp, phfname, sizeof(tmp)); | |
602 | |
603 if (skinBPRead(tmp, &item->Bitmap) != 0) | |
604 return 1; | |
605 } | |
606 | |
607 return 0; | |
23077 | 608 } |
609 | |
32873 | 610 // font=fontfile |
611 static int cmd_font(char *in) | |
612 { | |
613 char name[512]; | |
614 wItem *item; | |
23077 | 615 |
32873 | 616 CHECKDEFLIST("font"); |
617 CHECKWINLIST("font"); | |
23077 | 618 |
32873 | 619 CHECK("sub"); |
620 CHECK("menu"); | |
23077 | 621 |
32873 | 622 cutItem(in, name, ',', 0); |
623 | |
624 mp_dbg(MSGT_GPLAYER, MSGL_DBG2, "\n[skin] font\n"); | |
625 mp_dbg(MSGT_GPLAYER, MSGL_DBG2, "[skin] name: %s\n", name); | |
23077 | 626 |
32873 | 627 (*currSubItem)++; |
628 item = &currSubItems[*currSubItem]; | |
629 item->type = itFont; | |
630 item->fontid = fntRead(path, name); | |
23077 | 631 |
32873 | 632 switch (item->fontid) { |
633 case -1: | |
634 ERRORMESSAGE(MSGTR_SKIN_FONT_NotEnoughtMemory); | |
635 return 1; | |
23077 | 636 |
32873 | 637 case -2: |
638 ERRORMESSAGE(MSGTR_SKIN_FONT_TooManyFontsDeclared); | |
639 return 1; | |
640 | |
641 case -3: | |
642 ERRORMESSAGE(MSGTR_SKIN_FONT_FontFileNotFound); | |
643 return 1; | |
644 | |
645 case -4: | |
646 ERRORMESSAGE(MSGTR_SKIN_FONT_FontImageNotFound); | |
647 return 1; | |
648 } | |
649 | |
650 return 0; | |
23077 | 651 } |
652 | |
32873 | 653 // slabel=x,y,fontfile,"text" |
654 static int cmd_slabel(char *in) | |
23077 | 655 { |
32873 | 656 char tmp[512]; |
657 char sid[64]; | |
658 int x, y, id; | |
659 wItem *item; | |
660 | |
661 CHECKDEFLIST("slabel"); | |
662 CHECKWINLIST("slabel"); | |
23077 | 663 |
32873 | 664 CHECK("sub"); |
665 CHECK("menu"); | |
666 | |
667 mp_dbg(MSGT_GPLAYER, MSGL_DBG2, "\n[skin] slabel\n"); | |
23077 | 668 |
32873 | 669 x = cutItemToInt(in, ',', 0); |
670 y = cutItemToInt(in, ',', 1); | |
671 cutItem(in, sid, ',', 2); | |
23077 | 672 |
32873 | 673 id = fntFindID(sid); |
23077 | 674 |
32873 | 675 if (id < 0) { |
676 ERRORMESSAGE(MSGTR_SKIN_FONT_NonExistentFontID, sid); | |
677 return 1; | |
678 } | |
23077 | 679 |
32873 | 680 cutItem(in, tmp, ',', 3); |
681 cutItem(tmp, tmp, '"', 1); | |
682 | |
683 mp_dbg(MSGT_GPLAYER, MSGL_DBG2, "[skin] pos: %d,%d\n", x, y); | |
684 mp_dbg(MSGT_GPLAYER, MSGL_DBG2, "[skin] id: %s ( %d )\n", sid, id); | |
685 mp_dbg(MSGT_GPLAYER, MSGL_DBG2, "[skin] str: '%s'\n", tmp); | |
23077 | 686 |
32873 | 687 (*currSubItem)++; |
688 item = &currSubItems[*currSubItem]; | |
689 item->type = itSLabel; | |
690 item->fontid = id; | |
691 item->x = x; | |
692 item->y = y; | |
693 item->width = -1; | |
694 item->height = -1; | |
23077 | 695 |
32873 | 696 if ((item->label = malloc(strlen(tmp) + 1)) == NULL) { |
697 ERRORMESSAGE(MSGTR_SKIN_FONT_NotEnoughtMemory); | |
698 return 1; | |
699 } | |
23077 | 700 |
32873 | 701 strcpy(item->label, tmp); |
702 | |
703 return 0; | |
23077 | 704 } |
705 | |
32910 | 706 // dlabel=x,y,width,align,fontfile,"text" |
32873 | 707 static int cmd_dlabel(char *in) |
708 { | |
709 char tmp[512]; | |
710 char sid[64]; | |
711 int x, y, sx, id, a; | |
712 wItem *item; | |
23077 | 713 |
32873 | 714 CHECKDEFLIST("dlabel"); |
715 CHECKWINLIST("dlabel"); | |
23077 | 716 |
32873 | 717 CHECK("sub"); |
718 CHECK("menu"); | |
719 | |
720 mp_dbg(MSGT_GPLAYER, MSGL_DBG2, "\n[skin] dlabel\n"); | |
23077 | 721 |
32873 | 722 x = cutItemToInt(in, ',', 0); |
723 y = cutItemToInt(in, ',', 1); | |
724 sx = cutItemToInt(in, ',', 2); | |
725 a = cutItemToInt(in, ',', 3); | |
726 cutItem(in, sid, ',', 4); | |
23077 | 727 |
32873 | 728 id = fntFindID(sid); |
23077 | 729 |
32873 | 730 if (id < 0) { |
731 ERRORMESSAGE(MSGTR_SKIN_FONT_NonExistentFontID, sid); | |
732 return 1; | |
733 } | |
23077 | 734 |
32873 | 735 cutItem(in, tmp, ',', 5); |
736 cutItem(tmp, tmp, '"', 1); | |
23077 | 737 |
32873 | 738 mp_dbg(MSGT_GPLAYER, MSGL_DBG2, "[skin] pos: %d,%d width: %d align: %d\n", x, y, sx, a); |
739 mp_dbg(MSGT_GPLAYER, MSGL_DBG2, "[skin] id: %s ( %d )\n", sid, id); | |
740 mp_dbg(MSGT_GPLAYER, MSGL_DBG2, "[skin] str: '%s'\n", tmp); | |
23077 | 741 |
32873 | 742 (*currSubItem)++; |
743 item = &currSubItems[*currSubItem]; | |
744 item->type = itDLabel; | |
745 item->fontid = id; | |
746 item->align = a; | |
747 item->x = x; | |
748 item->y = y; | |
749 item->width = sx; | |
750 item->height = -1; | |
23077 | 751 |
32873 | 752 if ((item->label = malloc(strlen(tmp) + 1)) == NULL) { |
753 ERRORMESSAGE(MSGTR_SKIN_FONT_NotEnoughtMemory); | |
754 return 1; | |
755 } | |
23077 | 756 |
32873 | 757 strcpy(item->label, tmp); |
758 | |
759 return 0; | |
23077 | 760 } |
761 | |
32873 | 762 // decoration=enable|disable |
763 static int cmd_decoration(char *in) | |
23077 | 764 { |
32873 | 765 char tmp[512]; |
766 | |
767 CHECKDEFLIST("decoration"); | |
768 CHECKWINLIST("decoration"); | |
769 | |
770 CHECK("sub"); | |
771 CHECK("menu"); | |
772 CHECK("playbar"); | |
773 | |
774 mp_dbg(MSGT_GPLAYER, MSGL_DBG2, "\n[skin] window decoration is %s\n", in); | |
23077 | 775 |
32873 | 776 strlower(in); |
777 cutItem(in, tmp, ',', 0); | |
778 | |
779 if (strcmp(tmp, "enable") != 0 && strcmp(tmp, "disable") != 0) { | |
780 ERRORMESSAGE(MSGTR_SKIN_UnknownParameter, tmp); | |
781 return 1; | |
782 } | |
23077 | 783 |
32873 | 784 if (strcmp(tmp, "enable") != 0) |
785 defList->mainDecoration = 0; | |
786 else | |
787 defList->mainDecoration = 1; | |
23077 | 788 |
32873 | 789 mp_dbg(MSGT_GPLAYER, MSGL_DBG2, "\n[skin] window decoration is %s\n", (defList->mainDecoration ? "enabled" : "disabled")); |
790 | |
791 return 0; | |
23077 | 792 } |
793 | |
32878 | 794 static _item skinItem[] = { |
32873 | 795 { "section", cmd_section }, |
796 { "end", cmd_end }, | |
797 { "window", cmd_window }, | |
798 { "base", cmd_base }, | |
799 { "button", cmd_button }, | |
800 { "selected", cmd_selected }, | |
801 { "background", cmd_background }, | |
802 { "vpotmeter", cmd_vpotmeter }, | |
803 { "hpotmeter", cmd_hpotmeter }, | |
804 { "potmeter", cmd_potmeter }, | |
805 { "font", cmd_font }, | |
806 { "slabel", cmd_slabel }, | |
807 { "dlabel", cmd_dlabel }, | |
808 { "decoration", cmd_decoration }, | |
809 { "menu", cmd_menu } | |
810 }; | |
811 | |
32924 | 812 static const int ITEMS = sizeof(skinItem) / sizeof(_item); |
32873 | 813 |
814 char *strswap(char *in, char what, char whereof) | |
23077 | 815 { |
32873 | 816 int i; |
817 | |
818 if (strlen(in) == 0) | |
819 return NULL; | |
820 | |
821 for (i = 0; i < (int)strlen(in); i++) | |
822 if (in[i] == what) | |
823 in[i] = whereof; | |
824 | |
825 return in; | |
23077 | 826 } |
827 | |
32873 | 828 char *trim(char *in) |
23077 | 829 { |
32873 | 830 int c = 0, id = 0, i; |
831 | |
832 if (strlen(in) == 0) | |
833 return NULL; | |
834 | |
835 while (c != (int)strlen(in)) { | |
836 if (in[c] == '"') | |
837 id = !id; | |
838 | |
839 if ((in[c] == ' ') && (!id)) { | |
840 for (i = 0; i < (int)strlen(in) - c; i++) | |
841 in[c + i] = in[c + i + 1]; | |
842 continue; | |
843 } | |
32850
48583fc18d1a
Make setname() directly return the string created instead of writing it
ib
parents:
32849
diff
changeset
|
844 |
32873 | 845 c++; |
846 } | |
847 | |
848 return in; | |
849 } | |
32850
48583fc18d1a
Make setname() directly return the string created instead of writing it
ib
parents:
32849
diff
changeset
|
850 |
32873 | 851 static char *setname(char *item1, char *item2) |
852 { | |
853 static char fn[512]; | |
854 | |
855 av_strlcpy(fn, item1, sizeof(fn)); | |
856 av_strlcat(fn, "/", sizeof(fn)); | |
857 av_strlcat(fn, item2, sizeof(fn)); | |
858 av_strlcpy(path, fn, sizeof(path)); | |
859 av_strlcat(path, "/", sizeof(path)); | |
860 av_strlcat(fn, "/skin", sizeof(fn)); | |
861 | |
862 return fn; | |
23077 | 863 } |
864 | |
32873 | 865 int skinRead(char *dname) |
23077 | 866 { |
32873 | 867 char *fn; |
868 FILE *skinFile; | |
869 unsigned char tmp[256]; | |
870 unsigned char *ptmp; | |
871 unsigned char command[32]; | |
872 unsigned char param[256]; | |
873 int i; | |
874 | |
875 fn = setname(skinDirInHome, dname); | |
23077 | 876 |
32873 | 877 if ((skinFile = fopen(fn, "rt")) == NULL) { |
878 fn = setname(skinMPlayerDir, dname); | |
879 | |
880 if ((skinFile = fopen(fn, "rt")) == NULL) { | |
32877 | 881 mp_msg(MSGT_GPLAYER, MSGL_ERR, MSGTR_SKIN_SkinFileNotFound, fn); |
32873 | 882 return -1; |
883 } | |
23077 | 884 } |
32873 | 885 |
886 mp_dbg(MSGT_GPLAYER, MSGL_DBG2, "[skin] file: %s\n", fn); | |
23077 | 887 |
32932 | 888 appFreeStruct(); |
23077 | 889 |
32873 | 890 linenumber = 0; |
23077 | 891 |
32873 | 892 while (fgets(tmp, sizeof(tmp), skinFile)) { |
893 linenumber++; | |
894 | |
895 tmp[strcspn(tmp, "\n\r")] = 0; // remove any kind of newline, if any | |
896 strswap(tmp, '\t', ' '); | |
897 trim(tmp); | |
898 ptmp = strchr(tmp, ';'); | |
899 | |
900 if (ptmp) | |
901 *ptmp = 0; | |
902 | |
903 if (!*tmp) | |
904 continue; | |
23077 | 905 |
32873 | 906 cutItem(tmp, command, '=', 0); |
907 cutItem(tmp, param, '=', 1); | |
908 strlower(command); | |
909 | |
910 for (i = 0; i < ITEMS; i++) | |
911 if (!strcmp(command, skinItem[i].name)) | |
912 if (skinItem[i].func(param) != 0) | |
913 return -2; | |
914 } | |
915 | |
916 if (linenumber == 0) { | |
32877 | 917 mp_msg(MSGT_GPLAYER, MSGL_ERR, MSGTR_SKIN_SkinFileNotReadable, fn); |
32873 | 918 return -1; |
919 } | |
920 | |
921 return 0; | |
23077 | 922 } |