Mercurial > mplayer.hg
annotate gui/skin/skin.c @ 32877:a095a4ed8ad3
Change message levels to 'error'.
Because all these messages indicate that an error has occurred and
additionally the processing stops, 'error' is the right message level.
The GUI user will now be informed about these errors.
Furthermore, the message names and texts have been revised.
author | ib |
---|---|
date | Thu, 24 Feb 2011 17:47:40 +0000 |
parents | 176bd475b6f3 |
children | afa6f80b0867 |
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); |
32873 | 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 { \ | |
32877 | 67 ERRORMESSAGE(MSGTR_SKIN_ERROR_SECTION, str); \ |
32873 | 68 return 1; \ |
69 } \ | |
70 } | |
71 | |
72 #define CHECKWINLIST(str) \ | |
73 { \ | |
74 if (!window_name[0]) \ | |
75 { \ | |
32877 | 76 ERRORMESSAGE(MSGTR_SKIN_ERROR_WINDOW, str); \ |
32873 | 77 return 1; \ |
78 } \ | |
79 } | |
23077 | 80 |
32873 | 81 #define CHECK(name) \ |
82 { \ | |
83 if (!strcmp(window_name, name)) \ | |
84 { \ | |
32877 | 85 ERRORMESSAGE(MSGTR_SKIN_ERROR_IN_WINDOW, name); \ |
32873 | 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) { | |
32877 | 878 mp_msg(MSGT_GPLAYER, MSGL_ERR, MSGTR_SKIN_SkinFileNotFound, fn); |
32873 | 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) { | |
32877 | 914 mp_msg(MSGT_GPLAYER, MSGL_ERR, MSGTR_SKIN_SkinFileNotReadable, fn); |
32873 | 915 return -1; |
916 } | |
917 | |
918 return 0; | |
23077 | 919 } |