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