Mercurial > mplayer.hg
annotate gui/skin/skin.c @ 32879:9ee46c5e8667
Comply with the requested verbosity on GUI message boxes.
author | ib |
---|---|
date | Thu, 24 Feb 2011 23:49:33 +0000 |
parents | afa6f80b0867 |
children | 96cbdbf90c42 |
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 | |
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)) { |
32873 | 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")) | |
155 defList = skinAppMPlayer; | |
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)) { |
188 currSection = &skinAppMPlayer->main; | |
189 currSubItem = &skinAppMPlayer->NumberOfItems; | |
190 currSubItems = skinAppMPlayer->Items; | |
191 } else if (!strncmp(in, "sub", 3)) | |
192 currSection = &skinAppMPlayer->sub; | |
193 else if (!strncmp(in, "playbar", 7)) { | |
194 currSection = &skinAppMPlayer->bar; | |
195 currSubItem = &skinAppMPlayer->NumberOfBarItems; | |
196 currSubItems = skinAppMPlayer->barItems; | |
197 } else if (!strncmp(in, "menu", 4)) { | |
198 currSection = &skinAppMPlayer->menuBase; | |
199 currSubItem = &skinAppMPlayer->NumberOfMenuItems; | |
200 currSubItems = skinAppMPlayer->MenuItems; | |
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 | |
374 if ((currSubItems[*currSubItem].msg = appFindMessage(msg)) == -1) { | |
375 ERRORMESSAGE(MSGTR_SKIN_BITMAP_UnknownMessage, msg); | |
376 return 0; | |
377 } | |
378 | |
379 currSubItems[*currSubItem].pressed = btnReleased; | |
380 | |
381 if (currSubItems[*currSubItem].msg == evPauseSwitchToPlay) | |
382 currSubItems[*currSubItem].pressed = btnDisabled; | |
23077 | 383 |
32873 | 384 currSubItems[*currSubItem].tmp = 1; |
385 | |
386 mp_dbg(MSGT_GPLAYER, MSGL_DBG2, "[skin] message: %d\n", currSubItems[*currSubItem].msg); | |
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 { | |
437 int x, y, sx, sy, msg; | |
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 |
32873 | 453 msg = appFindMessage(tmp); |
454 | |
455 defList->NumberOfMenuItems++; | |
456 defList->MenuItems[defList->NumberOfMenuItems].x = x; | |
457 defList->MenuItems[defList->NumberOfMenuItems].y = y; | |
458 defList->MenuItems[defList->NumberOfMenuItems].width = sx; | |
459 defList->MenuItems[defList->NumberOfMenuItems].height = sy; | |
23077 | 460 |
32873 | 461 mp_dbg(MSGT_GPLAYER, MSGL_DBG2, "\n[skin] menuitem: %d\n", defList->NumberOfMenuItems); |
462 mp_dbg(MSGT_GPLAYER, MSGL_DBG2, "[skin] x: %d y: %d sx: %d sy: %d\n", x, y, sx, sy); | |
23077 | 463 |
32873 | 464 if ((defList->MenuItems[defList->NumberOfMenuItems].msg = msg) == -1) |
465 ERRORMESSAGE(MSGTR_SKIN_BITMAP_UnknownMessage, tmp); | |
23077 | 466 |
32873 | 467 mp_dbg(MSGT_GPLAYER, MSGL_DBG2, "[skin] message: %d\n", defList->Items[defList->NumberOfItems].msg); |
23077 | 468 |
32873 | 469 defList->MenuItems[defList->NumberOfMenuItems].Bitmap.Image = NULL; |
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 { | |
476 int x, y, psx, psy, ph, sx, sy, msg, d; | |
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); |
489 psx = cutItemToInt(in, ',', 1); | |
490 psy = cutItemToInt(in, ',', 2); | |
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 | |
500 msg = appFindMessage(tmp); | |
23077 | 501 |
32873 | 502 mp_dbg(MSGT_GPLAYER, MSGL_DBG2, "\n[skin] h/v potmeter: pointer filename: '%s'\n", pfname); |
503 mp_dbg(MSGT_GPLAYER, MSGL_DBG2, "[skin] pointer size is %dx%d\n", psx, psy); | |
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); | |
507 mp_dbg(MSGT_GPLAYER, MSGL_DBG2, "[skin] message: %d\n", msg); | |
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; | |
516 item->phases = ph; | |
517 item->psx = psx; | |
518 item->psy = psy; | |
519 item->msg = msg; | |
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 { | |
559 int x, y, ph, sx, sy, msg, d; | |
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 | |
579 msg = 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); | |
583 mp_dbg(MSGT_GPLAYER, MSGL_DBG2, "[skin] phases: %d\n", ph); | |
584 mp_dbg(MSGT_GPLAYER, MSGL_DBG2, "[skin] default value: %d\n", d); | |
585 mp_dbg(MSGT_GPLAYER, MSGL_DBG2, "[skin] message: %d\n", msg); | |
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; | |
594 item->phases = ph; | |
595 item->msg = msg; | |
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 | |
32873 | 706 // dlabel=x,y,length,align,fontfile,"text" |
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 | |
812 #define ITEMS (int)(sizeof(skinItem) / sizeof(_item)) | |
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 |
32873 | 888 appInitStruct(skinAppMPlayer); |
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 } |