48
56
static int *currWinItemIdx;
49
57
static wItem *currWinItems;
60
* @brief Display a skin error message.
62
* @param format format string
63
* @param ... arguments
51
65
static void skin_error(const char *format, ...)
60
74
gmp_msg(MSGT_GPLAYER, MSGL_ERR, MSGTR_SKIN_ERRORMESSAGE, linenumber, p);
78
* @brief Check whether a @a section definition has started.
80
* @param item name of the item to be put in a message in case of an error
82
* @return 1 (ok) or 0 (error)
63
84
static int section_item(char *item)
112
* @brief Check whether a specific @a window definition has started.
114
* @param name name of the window to be checked
116
* @return 0 (ok) or 1 (error)
83
118
static int in_window(char *name)
85
120
if (strcmp(currWinName, name) == 0) {
93
int skinBPRead(char *fname, guiImage *bf)
129
* @brief Read a skin @a image file.
131
* @param fname filename (with path)
132
* @param img pointer suitable to store the image data
134
* @return return code of #bpRead()
136
int skinImageRead(char *fname, guiImage *img)
95
int i = bpRead(fname, bf);
138
int i = bpRead(fname, img);
131
// section=movieplayer
180
* @brief Parse a @a section definition.
182
* Syntax: section=movieplayer
184
* @param in definition to be analyzed
186
* @return 0 (ok) or 1 (error)
132
188
static int item_section(char *in)
146
mp_dbg(MSGT_GPLAYER, MSGL_DBG2, "[skin] section: %s\n", in);
202
mp_msg(MSGT_GPLAYER, MSGL_DBG2, "[skin] section: %s\n", in);
208
* @brief Parse an @a end definition.
212
* @param in definition to be analyzed
214
* @return 0 (ok) or 1 (error)
152
216
static int item_end(char *in)
154
218
char *space, *name;
157
222
if (currWinName[0]) {
159
224
name = currWinName;
162
227
name = "section";
168
230
if (!section_item("end"))
171
mp_dbg(MSGT_GPLAYER, MSGL_DBG2, "[skin] %send (%s)\n", space, name);
233
mp_msg(MSGT_GPLAYER, MSGL_DBG2, "[skin] %send (%s)\n", space, name);
173
235
if (currWinName[0]) {
174
236
currWinName[0] = 0;
184
// window=main|sub|playbar|menu
247
* @brief Parse a @a window definition.
249
* Syntax: window=main|sub|playbar|menu
251
* @param in definition to be analyzed
253
* @return 0 (ok) or 1 (error)
185
255
static int item_window(char *in)
187
257
if (!section_item("window"))
218
288
av_strlcpy(currWinName, in, sizeof(currWinName));
220
mp_dbg(MSGT_GPLAYER, MSGL_DBG2, "[skin] window: %s\n", currWinName);
290
mp_msg(MSGT_GPLAYER, MSGL_DBG2, "[skin] window: %s\n", currWinName);
225
// base=image,x,y[,width,height]
296
* @brief Parse a @a base definition.
298
* Syntax: base=image,x,y[,width,height]
300
* @param in definition to be analyzed
302
* @return 0 (ok) or 1 (error)
226
304
static int item_base(char *in)
228
306
unsigned char fname[256];
244
322
w = cutItemToInt(in, ',', 3);
245
323
h = cutItemToInt(in, ',', 4);
247
mp_dbg(MSGT_GPLAYER, MSGL_DBG2, "[skin] image: %s", fname);
325
mp_msg(MSGT_GPLAYER, MSGL_DBG2, "[skin] image: %s", fname);
249
327
currWin->type = itBase;
255
mp_dbg(MSGT_GPLAYER, MSGL_DBG2, " %d,%d", x, y);
333
mp_msg(MSGT_GPLAYER, MSGL_DBG2, " %d,%d", x, y);
258
mp_dbg(MSGT_GPLAYER, MSGL_DBG2, "\n");
336
mp_msg(MSGT_GPLAYER, MSGL_DBG2, "\n");
260
338
av_strlcpy(file, path, sizeof(file));
261
339
av_strlcat(file, fname, sizeof(file));
263
if (skinBPRead(file, &currWin->Bitmap) != 0)
341
if (skinImageRead(file, &currWin->Bitmap) != 0)
266
344
currWin->width = currWin->Bitmap.Width;
276
mp_dbg(MSGT_GPLAYER, MSGL_DBG2, "[skin] bitmap: %dx%d\n", currWin->width, currWin->height);
354
mp_msg(MSGT_GPLAYER, MSGL_DBG2, "[skin] bitmap: %dx%d\n", currWin->width, currWin->height);
279
357
#ifdef CONFIG_XSHAPE
281
359
skin_error(MSGTR_SKIN_NotEnoughMemory);
284
mp_dbg(MSGT_GPLAYER, MSGL_DBG2, "[skin] mask: %lux%lu\n", currWin->Mask.Width, currWin->Mask.Height);
362
mp_msg(MSGT_GPLAYER, MSGL_DBG2, "[skin] mask: %lux%lu\n", currWin->Mask.Width, currWin->Mask.Height);
286
364
currWin->Mask.Image = NULL;
377
* @brief Parse a @a background definition.
379
* Syntax: background=R,G,B
381
* @param in definition to be analyzed
383
* @return 0 (ok) or 1 (error)
299
385
static int item_background(char *in)
301
387
if (!window_item("background"))
312
398
currWin->G = cutItemToInt(in, ',', 1);
313
399
currWin->B = cutItemToInt(in, ',', 2);
315
mp_dbg(MSGT_GPLAYER, MSGL_DBG2, "[skin] background color: #%02x%02x%02x\n", currWin->R, currWin->G, currWin->B);
401
mp_msg(MSGT_GPLAYER, MSGL_DBG2, "[skin] background color: #%02x%02x%02x\n", currWin->R, currWin->G, currWin->B);
320
// button=image,x,y,width,height,message
407
* @brief Parse a @a button definition.
409
* Syntax: button=image,x,y,width,height,message
411
* @param in definition to be analyzed
413
* @return 0 (ok) or 1 (error)
321
415
static int item_button(char *in)
323
417
unsigned char fname[256];
351
mp_dbg(MSGT_GPLAYER, MSGL_DBG2, "[skin] button image: %s %d,%d\n", fname, x, y);
352
mp_dbg(MSGT_GPLAYER, MSGL_DBG2, "[skin] message: %s (#%d)\n", msg, message);
353
mp_dbg(MSGT_GPLAYER, MSGL_DBG2, "[skin] size: %dx%d\n", w, h);
445
mp_msg(MSGT_GPLAYER, MSGL_DBG2, "[skin] button image: %s %d,%d\n", fname, x, y);
446
mp_msg(MSGT_GPLAYER, MSGL_DBG2, "[skin] message: %s (#%d)\n", msg, message);
447
mp_msg(MSGT_GPLAYER, MSGL_DBG2, "[skin] size: %dx%d\n", w, h);
355
449
item = next_item();
374
468
av_strlcpy(file, path, sizeof(file));
375
469
av_strlcat(file, fname, sizeof(file));
377
if (skinBPRead(file, &item->Bitmap) != 0)
471
if (skinImageRead(file, &item->Bitmap) != 0)
380
mp_dbg(MSGT_GPLAYER, MSGL_DBG2, "[skin] (bitmap: %lux%lu)\n", item->Bitmap.Width, item->Bitmap.Height);
474
mp_msg(MSGT_GPLAYER, MSGL_DBG2, "[skin] (bitmap: %lux%lu)\n", item->Bitmap.Width, item->Bitmap.Height);
481
* @brief Parse a @a selected definition.
483
* Syntax: selected=image
485
* @param in definition to be analyzed
487
* @return 0 (ok) or 1 (error)
387
489
static int item_selected(char *in)
389
491
unsigned char file[512];
399
501
if (in_window("playbar"))
402
mp_dbg(MSGT_GPLAYER, MSGL_DBG2, "[skin] image selected: %s\n", in);
504
mp_msg(MSGT_GPLAYER, MSGL_DBG2, "[skin] image selected: %s\n", in);
404
506
currItem = &skin->menuSelected;
405
507
currItem->type = itBase;
407
509
av_strlcpy(file, path, sizeof(file));
408
510
av_strlcat(file, in, sizeof(file));
410
if (skinBPRead(file, &currItem->Bitmap) != 0)
512
if (skinImageRead(file, &currItem->Bitmap) != 0)
413
515
currItem->width = currItem->Bitmap.Width;
414
516
currItem->height = currItem->Bitmap.Height;
416
mp_dbg(MSGT_GPLAYER, MSGL_DBG2, "[skin] bitmap: %dx%d\n", currItem->width, currItem->height);
518
mp_msg(MSGT_GPLAYER, MSGL_DBG2, "[skin] bitmap: %dx%d\n", currItem->width, currItem->height);
421
// menu=x,y,width,height,message
524
* @brief Parse a @a menu definition.
526
* Syntax: menu=x,y,width,height,message
528
* @param in definition to be analyzed
530
* @return 0 (ok) or 1 (error)
422
532
static int item_menu(char *in)
424
534
int x, y, w, h, message;
460
570
item->height = h;
461
571
item->message = message;
463
mp_dbg(MSGT_GPLAYER, MSGL_DBG2, "[skin] item #%d: %d,%d %dx%d\n", *currWinItemIdx, x, y, w, h);
464
mp_dbg(MSGT_GPLAYER, MSGL_DBG2, "[skin] message: %s (#%d)\n", msg, message);
573
mp_msg(MSGT_GPLAYER, MSGL_DBG2, "[skin] item #%d: %d,%d %dx%d\n", *currWinItemIdx, x, y, w, h);
574
mp_msg(MSGT_GPLAYER, MSGL_DBG2, "[skin] message: %s (#%d)\n", msg, message);
466
576
item->Bitmap.Image = NULL;
471
// hpotmeter=button,bwidth,bheight,phases,numphases,default,x,y,width,height,message
582
* @brief Parse a @a hpotmeter definition.
584
* Syntax: hpotmeter=button,bwidth,bheight,phases,numphases,default,x,y,width,height,message
586
* @param in definition to be analyzed
588
* @return 0 (ok) or 1 (error)
472
590
static int item_hpotmeter(char *in)
474
592
unsigned char pfname[256];
507
mp_dbg(MSGT_GPLAYER, MSGL_DBG2, "[skin] h/v potmeter image: %s %d,%d %dx%d\n", phfname, x, y, w, h);
508
mp_dbg(MSGT_GPLAYER, MSGL_DBG2, "[skin] button image: %s %dx%d\n", pfname, pwidth, pheight);
509
mp_dbg(MSGT_GPLAYER, MSGL_DBG2, "[skin] numphases: %d, default: %d%%\n", ph, d);
510
mp_dbg(MSGT_GPLAYER, MSGL_DBG2, "[skin] message: %s (#%d)\n", buf, message);
625
mp_msg(MSGT_GPLAYER, MSGL_DBG2, "[skin] h/v potmeter image: %s %d,%d %dx%d\n", phfname, x, y, w, h);
626
mp_msg(MSGT_GPLAYER, MSGL_DBG2, "[skin] button image: %s %dx%d\n", pfname, pwidth, pheight);
627
mp_msg(MSGT_GPLAYER, MSGL_DBG2, "[skin] numphases: %d, default: %d%%\n", ph, d);
628
mp_msg(MSGT_GPLAYER, MSGL_DBG2, "[skin] message: %s (#%d)\n", buf, message);
512
630
item = next_item();
532
650
av_strlcpy(buf, path, sizeof(buf));
533
651
av_strlcat(buf, phfname, sizeof(buf));
535
if (skinBPRead(buf, &item->Bitmap) != 0)
653
if (skinImageRead(buf, &item->Bitmap) != 0)
538
mp_dbg(MSGT_GPLAYER, MSGL_DBG2, "[skin] (potmeter bitmap: %lux%lu)\n", item->Bitmap.Width, item->Bitmap.Height);
656
mp_msg(MSGT_GPLAYER, MSGL_DBG2, "[skin] (potmeter bitmap: %lux%lu)\n", item->Bitmap.Width, item->Bitmap.Height);
541
659
item->Mask.Image = NULL;
544
662
av_strlcpy(buf, path, sizeof(buf));
545
663
av_strlcat(buf, pfname, sizeof(buf));
547
if (skinBPRead(buf, &item->Mask) != 0)
665
if (skinImageRead(buf, &item->Mask) != 0)
550
mp_dbg(MSGT_GPLAYER, MSGL_DBG2, "[skin] (button bitmap: %lux%lu)\n", item->Mask.Width, item->Mask.Height);
668
mp_msg(MSGT_GPLAYER, MSGL_DBG2, "[skin] (button bitmap: %lux%lu)\n", item->Mask.Width, item->Mask.Height);
556
// vpotmeter=button,bwidth,bheight,phases,numphases,default,x,y,width,height,message
675
* @brief Parse a @a vpotmeter definition.
677
* Syntax: vpotmeter=button,bwidth,bheight,phases,numphases,default,x,y,width,height,message
679
* @param in definition to be analyzed
681
* @return 0 (ok) or 1 (error)
557
683
static int item_vpotmeter(char *in)
572
// potmeter=phases,numphases,default,x,y,width,height,message
699
* @brief Parse a @a potmeter definition.
701
* Syntax: potmeter=phases,numphases,default,x,y,width,height,message
703
* @param in definition to be analyzed
705
* @return 0 (ok) or 1 (error)
573
707
static int item_potmeter(char *in)
575
709
unsigned char phfname[256];
604
mp_dbg(MSGT_GPLAYER, MSGL_DBG2, "[skin] potmeter image: %s %d,%d %dx%d\n", phfname, x, y, w, h);
605
mp_dbg(MSGT_GPLAYER, MSGL_DBG2, "[skin] numphases: %d, default: %d%%\n", ph, d);
606
mp_dbg(MSGT_GPLAYER, MSGL_DBG2, "[skin] message: %s (#%d)\n", buf, message);
738
mp_msg(MSGT_GPLAYER, MSGL_DBG2, "[skin] potmeter image: %s %d,%d %dx%d\n", phfname, x, y, w, h);
739
mp_msg(MSGT_GPLAYER, MSGL_DBG2, "[skin] numphases: %d, default: %d%%\n", ph, d);
740
mp_msg(MSGT_GPLAYER, MSGL_DBG2, "[skin] message: %s (#%d)\n", buf, message);
608
742
item = next_item();
625
759
av_strlcpy(buf, path, sizeof(buf));
626
760
av_strlcat(buf, phfname, sizeof(buf));
628
if (skinBPRead(buf, &item->Bitmap) != 0)
762
if (skinImageRead(buf, &item->Bitmap) != 0)
631
mp_dbg(MSGT_GPLAYER, MSGL_DBG2, "[skin] (bitmap: %lux%lu)\n", item->Bitmap.Width, item->Bitmap.Height);
765
mp_msg(MSGT_GPLAYER, MSGL_DBG2, "[skin] (bitmap: %lux%lu)\n", item->Bitmap.Width, item->Bitmap.Height);
772
* @brief Parse a @a font definition.
774
* Syntax: font=fontfile
776
* @param in definition to be analyzed
778
* @return 0 (ok) or 1 (error)
638
780
static int item_font(char *in)
670
mp_dbg(MSGT_GPLAYER, MSGL_DBG2, "[skin] font: %s (#%d)\n", fnt, fntFindID(fnt));
812
mp_msg(MSGT_GPLAYER, MSGL_DBG2, "[skin] font: %s (#%d)\n", fnt, fntFindID(fnt));
675
// slabel=x,y,fontfile,"text"
818
* @brief Parse a @a slabel definition.
820
* Syntax: slabel=x,y,fontfile,"text"
822
* @param in definition to be analyzed
824
* @return 0 (ok) or 1 (error)
676
826
static int item_slabel(char *in)
694
844
cutItem(in, txt, ',', 3);
695
845
cutItem(txt, txt, '"', 1);
697
mp_dbg(MSGT_GPLAYER, MSGL_DBG2, "[skin] slabel: \"%s\"\n", txt);
698
mp_dbg(MSGT_GPLAYER, MSGL_DBG2, "[skin] pos: %d,%d\n", x, y);
847
mp_msg(MSGT_GPLAYER, MSGL_DBG2, "[skin] slabel: \"%s\"\n", txt);
848
mp_msg(MSGT_GPLAYER, MSGL_DBG2, "[skin] pos: %d,%d\n", x, y);
700
850
id = fntFindID(fnt);
707
mp_dbg(MSGT_GPLAYER, MSGL_DBG2, "[skin] font: %s (#%d)\n", fnt, id);
857
mp_msg(MSGT_GPLAYER, MSGL_DBG2, "[skin] font: %s (#%d)\n", fnt, id);
709
859
item = next_item();
730
// dlabel=x,y,width,align,fontfile,"text"
881
* @brief Parse a @a dlabel definition.
883
* Syntax: dlabel=x,y,width,align,fontfile,"text"
885
* @param in definition to be analyzed
887
* @return 0 (ok) or 1 (error)
731
889
static int item_dlabel(char *in)
733
891
int x, y, w, a, id;
751
909
cutItem(in, txt, ',', 5);
752
910
cutItem(txt, txt, '"', 1);
754
mp_dbg(MSGT_GPLAYER, MSGL_DBG2, "[skin] dlabel: \"%s\"\n", txt);
755
mp_dbg(MSGT_GPLAYER, MSGL_DBG2, "[skin] pos: %d,%d\n", x, y);
756
mp_dbg(MSGT_GPLAYER, MSGL_DBG2, "[skin] width: %d, align: %d\n", w, a);
912
mp_msg(MSGT_GPLAYER, MSGL_DBG2, "[skin] dlabel: \"%s\"\n", txt);
913
mp_msg(MSGT_GPLAYER, MSGL_DBG2, "[skin] pos: %d,%d\n", x, y);
914
mp_msg(MSGT_GPLAYER, MSGL_DBG2, "[skin] width: %d, align: %d\n", w, a);
758
916
id = fntFindID(fnt);
765
mp_dbg(MSGT_GPLAYER, MSGL_DBG2, "[skin] font: %s (#%d)\n", fnt, id);
923
mp_msg(MSGT_GPLAYER, MSGL_DBG2, "[skin] font: %s (#%d)\n", fnt, id);
767
925
item = next_item();
789
// decoration=enable|disable
948
* @brief Parse a @a decoration definition.
950
* Syntax: decoration=enable|disable
952
* @param in definition to be analyzed
954
* @return 0 (ok) or 1 (error)
790
956
static int item_decoration(char *in)
792
958
if (!window_item("decoration"))
809
975
skin->mainDecoration = (strcmp(in, "enable") == 0);
811
mp_dbg(MSGT_GPLAYER, MSGL_DBG2, "[skin] decoration: %s\n", in);
977
mp_msg(MSGT_GPLAYER, MSGL_DBG2, "[skin] decoration: %s\n", in);
983
* @brief Parsing functions responsible for skin item definitions.
816
985
static _item skinItem[] = {
817
986
{ "background", item_background },
818
987
{ "base", item_base },
831
1000
{ "window", item_window }
1004
* @brief Build the skin file path for a skin name.
1006
* @param dir skins directory
1007
* @param sname name of the skin
1009
* @return skin file path
1011
* @note As a side effect, variable #path gets set to the skin path.
834
1013
static char *setname(char *dir, char *sname)
836
1015
static char skinfname[512];
845
1024
return skinfname;
1028
* @brief Read and parse a skin.
1030
* @param sname name of the skin
1032
* @return 0 (ok), -1 (skin file not found or not readable) or -2 (parsing error)
848
1034
int skinRead(char *sname)
850
1036
char *skinfname;
868
mp_dbg(MSGT_GPLAYER, MSGL_DBG2, "[skin] configuration file: %s\n", skinfname);
1054
mp_msg(MSGT_GPLAYER, MSGL_DBG2, "[skin] configuration file: %s\n", skinfname);
870
1056
appFreeStruct();