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