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