# MPlayer skin formátum

## Áttekintés

### Skin komponensek

A Skin-ek eléggé szabad formátumúak (nem mint például a Winamp/XMMS, fix formátumú skin-jei), tehát csak rajtad múlik, hogy valami igazán nagyot alkoss.

Jelenleg négy ablak van, amit dekorálni kell: a fő ablak, az alablak, a playbar és a skin menü (ami jobb kattintással aktiválható).

- A fő ablak és/vagy a playbar az, ahol vezérelheted az MPlayert. Az ablak háttere egy kép. Ebbe az ablakba különböző elemeket lehet (és kell) tenni: gombok, potméterek (csúszkák) és címkék. Minden egyes elemnek meg kell adnod a pozícióját és a méretét.

  Egy gombnak három állása van (lenyomott, felengedett, letiltott), így a képe függőlegesen három részre van osztva. Lásd a gomb elemet a részletekért.

  Egy potmeternek (főként a kereső sáv és a hangerő/balansz állító) bármennyi fázisa lehet a képének egymás alatti tetszőleges feldarabolásával. Lásd a hpotmetert és potmetert a részletekért.

  A címkék egy kicsit különlegesek: A megrajzolásukhoz szükséges karaktereket egy kép fájlból nyerjük és a képen lévő karaktereket egy betű leíró fájl írja le. Ez utóbbi egy sima szöveges fájl, ami megadja minden egyes betű x, y pozícióját és méretét a képen (a kép fájl és a hozzátartozó betű leíró fájl együtt alkot egy betűtípust). Lásd a dlabelt és az slabelt a részletekért.

  Az összes kép lehet teljes transzparens is, amint az a kép formátumokról szóló részben le van írva. Ha az X szerver nem támogatja az XShape kiterjesztést, a transzparensként megjelölt részek feketék lesznek. Ha használni akarod ezt a tulajdonságot, a fő ablak háttérképének 8-cal oszthatónak kell lennie.

- Az alablak az, ahol a film megjelenik. Egy megadott képet tud megjeleníteni, ha nincs film betöltve (elég unalmas egy üres ablak :-)) Megjegyzés: a transzparens kép nem megengedett itt.

- A skin menü csak az MPlayer vezérlésének egy módja menüpontok segítségével. Két kép kell a menühöz: az egyik a legjobb kép, ami a menüt mutatja normál állapotában, a másik a kiválasztott pont megjelenítésére lesz felhasználva. Ha kinyitod a menüt, az első kép látszódik. Ha az egeret az egyik menüpont fölé viszed, az aktuálisan kiválasztott pont bemásolódik a második képről az egér mutató alatti területre (a második képet soha sem lehet látni egészében).

  Egy menüpontot a képen lévő poziciója és a mérete határoz meg (lásd a skin menü részt).

Van egy fontos dolog, amiről eddig nem beszéltünk: a gombokhoz, potméterekhez és menüpontokhoz tartozóan az MPlayer tudnia kell, hogy mit csináljon, ha rákattintanak. Ez üzenetekkel (eseményekkel) van megvalósítva. Minden elemhez meg kell adnod, hogy milyen üzenetet generál, amikor kattintanak rá.

### Képformátumok

A képeknek truecolor-os (24 vagy 32 bpp) PNG-knek kell lenniük.

A fő ablakban és a playbar-on (lásd lejjebb) használhatsz transzparens képeket: Az #FF00FF (bíborvörös) színnel feltöltött területek teljesen transzparensek lesznek, ha az MPlayer-rel nézed. Ez azt jelenti, hogy formázott ablakjaid is lehetnek, ha az X szerverednek van XShape kiterjesztése.

### Fájlok

A következő fájlokra lesz szükséges, hogy el tudj készíteni egy skin-t:

- A konfigurációs fájl, aminek skin a neve, megmondja az MPlayernek, hogyan rakja össze a skin különböző részeit és hogy mit tegyen ha valahol kattintanak az ablakban.

- A fő ablak háttérképe.

- A fő ablakban lévő elemek képe (beleértve egy vagy több betű leíró fájlt, ami a címkék megrajzolásához kell).

- Az alablakban megjelenítendő kép (opcionális).

- Két kép a skin menünek (csak akkor szükséges, ha menüt akarsz csinálni).

A skin konfigurációs fájl kivételével a többi fájlt úgy nevezed el, ahogy csak akarod (de jegyezd meg, hogy a betű leíró fájlnak `.fnt` kiterjesztéssel kell rendelkeznie).

## A skin fájl

Amint fentebb már említettem, ez a skin konfigurációs fájl. Sor-orientált; a megjegyzést tartalmazó sorok egy '`;`' karakterrel kezdődnek (csak szóközök és tab-ok lehetnek a '`;`' előtt).

A fájl szekciókból áll. Minden szekció a skin egy alkalmazását írja le a következő formában:

    section = szekció neve
    .
    .
    .
    end

Jelenleg csak egy alkalmazás van, vagyis csak egy szekciót kell készítened: a neve movieplayer.

Ebben a szekcióban minden ablakot egy blokk ír le a következő formában:

    window = ablak neve
    .
    .
    .
    end

Ahol az ablak neve ezen karakterláncok valamelyike lehet:

- main - a főablak esetében

- sub - az alablak esetében

- menu - a skin menü esetében

- playbar - a playbar esetében

(Az alablak és menü blokkok opcionálisak - nem kötelező menüt készítened vagy kidekorálni az alablakot.)

Egy ablak blokkon belül az ablak minden elemét definiálhatod, egyet egy sorban, ebbe a formában:

    item = parameter

Ahol az `item` egy karakterlánc, ami azonosítja az adott típusú GUI elemet, a `parameter` pedig egy numerikus vagy szöveges érték (vagy értékek listája vesszővel elválasztva).

A fentieket összerakva a teljes fájl valahogy így néz ki:

    section = movieplayer
      window = main
      ; ... főablak elemei ...
      end

      window = sub
      ; ... alablak elemei ...
      end

      window = menu
      ; ... menü elemei ...
      end

      window = playbar
      ; ... playbar elemei ...
      end
    end

Egy kép fájl nevét a hozzá vezető útvonal nélkül kell megadni - a képeknek a `skins` könyvtárban kell lenniük. A fájl kiterjesztését megadhatod (de nem kötelező). Ha a fájl nem létezik, az MPlayer megpróbálja betölteni a `<filename>.<ext>` fájlt, ahol `png` és `PNG` kerül az `<ext>` helyére (ebben a sorrendben). Az első megtalált fájlt fogja használni.

Egy példa a tisztánlátáshoz. Tegyük fel, hogy van egy `main.png` nevű fájlod, amit a fő ablakhoz használsz:

    base = main, -1, -1

Az MPlayer megpróbálja betölteni a `main`, `main.png`, `main.PNG` fájlokat.

Végül pár szó a pozícionálásról. A fő ablak és az alablak a képernyő különböző sarkaiba helyezhető az `X` és `Y` koordináták megadásával. A `0` fent vagy bal oldalt van, a `-1` középen és a `-2` jobb oldalt vagy lent, ahogy az itt is látható:

    (0, 0)----(-1, 0)----(-2, 0)
      |          |          |
      |          |          |
    (0,-1)----(-1,-1)----(-2,-1)
      |          |          |
      |          |          |
    (0,-2)----(-1,-2)----(-2,-2)

### Fő ablak és a playbar

A következő bejegyzések használhatóak a '`window = main`' ... '`end`', és a '`window = playbar`' ... '`end`' blokkokban.

`base = image, X, Y`

  Megadhatod vele a fő ablakban használt háttérképet. Az ablak a megadott `X, Y` pozícióban fog megjelenni a képernyőn. Az ablak mérete a kép méretével lesz azonos.

  Ezek a koordináták jelenleg nem működnek a megjelenítő ablak esetében.

  A kép transzparens részei (#FF00FF színű) feketeként jelenik meg az XShape kiterjesztés nélküli X szerverek esetében. A kép szélességének 8-cal oszthatónak kell lennie.

`button = image, X, Y, width, height, message`

  Egy `width` * `height` méretű gomb megjelenítése az `X, Y` pozícióban. A megadott `message` üzenet akkor generálódik, amikor a gombot megnyomják. Az `image` által megadott képnek három részt kell tartalmaznia egymás alatt (a gomb állapotainak megfelelően), így:

      +-------------+
      |  benyomott  |
      +-------------+
      | felengedett |
      +-------------+
      |  letiltott  |
      +-------------+

`decoration = enable|disable`

  Engedélyezi vagy letiltja a főablakban az ablakkezelő dekorációját. Alapértelmezetten disable.

  Ez nem működik a megjelenítő ablakban, nincs rá szükség.

`hpotmeter = button, bwidth, bheight, phases, numphases, default, X, Y, width, height, message`

`vpotmeter = button, bwidth, bheight, phases, numphases, default, X, Y, width, height, message`

  Egy vízszintes (hpotmeter) vagy függőleges (vpotmeter) potméter megjelenítése `width` * `height` méretben az `X, Y` pozícióban. A kép több különböző részre osztható a potméter különböző fázisainak megfelelően (például lehet egy pot-od a hangerő szabályozásához, ami zöldből pirosba vált, ahogy az értéke változik a minimumtól a maximumig). A `hpotmeter`-nek lehet egy gombja is, amit vízszintesen lehet húzni. A paraméterek:

  - `button` - a gombként használt kép (három részt kell tartalmaznia egymás alatt, mint a gomb esetében)

  - `bwidth`, `bheight` - a gomb mérete

  - `phases` - a hpotmeter különböző fázisaiban használt kép neve. Speciális értékként a `NULL` is használható, ha nem akarsz ilyen képet. A képet függőlegesen `numphases` részre kell felosztani így:

        +------------+
        |  1. fázis  |
        +------------+
        |  2. fázis  |
        +------------+
             ...
        +------------+
        |  n. fázis  |
        +------------+

  - `numphases` - a `phases` képen lévő fázisok száma

  - `default` - a hpotmeter alapértelmezett értéke (`0` és `100` között)

  - `X`, `Y` - a hpotmeter pozíciója

  - `width`, `height` - a `hpotmeter` szélessége és magassága

  - `message` - az üzenet, ami a `hpotmeter` értékének megváltozásakor generálódik

`potmeter = phases, numphases, default, X, Y, width, height, message`

  Egy `hpotmeter` gomb nélkül. (Gondolom a megfordítása volt az eredeti cél, de csak a vízszintes vonszolásra reagál.) A paraméterek leírását lásd a hpotmeter-nél. A `phases` lehet `NULL`, de ez eléggé haszontalan, mivel akkor nem látod, hogy a `potmeter` hova van állítva.

`font = fontfile, fontid`

  Egy betűt definiál. A `fontfile` a betű leíró fájl neve egy `.fnt` kiterjesztéssel (a kiterjesztést ne add meg itt). A `fontid`-t a betűre történő hivatkozásokhoz lehet használni (lásd dlabel és slabel). 25 betűt lehet definiálni.

`slabel = X, Y, fontid, "text"`

  Egy statikus címkét tesz ki az `X, Y` pozícióba. A `text` szöveget jeleníti meg a `fontid`-vel azonosított betűtípussal. A szöveg egyszerű karakterlánc (az `$x` változók nem működnek) amit dupla idézőjelek közé kell írni (de a " karakter nem lehet a szöveg része). A címke a `fontid`-vel azonosított betűtípussal jelenik meg.

`dlabel = X, Y, width, align, fontid, "text"`

  Egy dinamikus címkét tesz ki az `X, Y` pozícióba. A címke azért dinamikus, mert a szövege periódikusan frissül. A címke maximum hosszát a `width` szabályozza (a magassága egy karakter magasságával egyezik meg). Ha a megjelenítendő szöveg szélesebb ennél, scrollozva lesz, különben az `align` paraméter által megadott módon pozícionálódik: `0` jobbra, `1` középre, `2` balra igazítva.

  A megjelenítendő szöveget a `text` adja meg: dupla idézőjelek közé kell írni (de a " karakter nem lehet része a szövegnek). A címke a `fontid` által meghatározott betűtípussal jelenik meg. A szövegben a következő változókat használhatod:

  Változó | Jelentés
  --- | ---
  $1 | lejátszási idő hh:mm:ss formátumban
  $2 | lejátszási idő mmmm:ss formátumban
  $3 | lejátszási idő hh formátumban (órák)
  $4 | lejátszási idő mm formátumban (percek)
  $5 | lejátszási idő ss formátumban (másodpercek)
  $6 | film hossza hh:mm:ss formátumban
  $7 | film hossza mmmm:ss formátumban
  $8 | film hossza h:mm:ss formátumban
  $v | hangerő xxx.xx% formátumban
  $V | hangerő xxx.xx formátumban
  $b | balansz xxx.xx% formátumban
  $B | balansz xxx.xx formátumban
  $$ | az $ karakter
  $a | egy karakter az audió típusnak megfelelően (nincs: `n`, mono: `m`, sztereo: `t`)
  $t | sáv száma (a lejátszási listában)
  $o | fájlnév
  $f | fájlnév kisbetűsen
  $F | fájlnév nagybetűsen
  $T | egy karakter a folyam típusnak megfelelően (file: `f`, Video CD: `v`, DVD: `d`, URL: `u`)
  $p | a p karakter (ha a film lejátszás alatt van és a betűtípusban van p karakter)
  $s | az s karakter (ha a film meg van állítva movie és a betűtípusban van s karakter)
  $e | az e karakter (ha a lejátszás szünetel és a betűtípusban van e karakter)
  $x | film szélessége
  $y | film magassága
  $C | használt codec neve

  Az `$a, $T, $p, $s` és `$e` változók mind karakterekkel térnek vissza, amiket speciális szimbólumként kell megjeleníteni (például az e a pillanatállj szimbóluma, ami általában valami ilyesmi: ||). Szükséged lesz egy normál karaktereket tartalmazó betűtípusra és egy másikra a szimbólumokhoz. Lásd a szimbólumokról szóló részt a további információkért.

### Alablak

A következő bejegyzések használhatóak a '`window = sub`' . . . '`end`' blokkban.

`base = image, X, Y, width, height`

  Az ablakban megjelenítendő kép. Az ablak a megadott `X, Y` pozícióban jelenik meg a képernyőn (`0,0` a bal felső sarok). A `-1` a középre, a `-2` a jobbra (`X`) és le (`Y`) igazítást jelenti. Az ablak akkora lesz, amekkora a kép. A `width` és a `height` az ablak méretét írják elő, opcionálisak (ha hiányoznak, az ablak ugyan akkora méretű lesz, mint a kép).

`background = R, G, B`

  Beállíthatod vele a háttér színét. Hasznos, ha a kép kisebb, mint az ablak mérete. Az `R`, `G` és `B` a szín vörös, zöld és kék komponensét adja meg (mindegyik decimális szám 0-tól 255-ig).

### Skin menü

Amint korábban már említettem, a menü két kép segítségével kerül megjelenítésre. A normál menü bejegyzések a `base` elemmel megadott képen láthatóak, míg az épp aktuálisan kiválasztott elem megjelenítése a `selected` elemről történik. Meg kell adnod minden egyes menüpont pozícióját és méretét.

A következő bejegyzések használhatóak a '`window = menu`'. . .'`end`' blokkban.

`base = image`

  A normál menüpontokat tartalmazó kép.

`selected = image`

  Az összes menüpontot kiválasztva ábrázoló kép.

`menu = X, Y, width, height, message`

  Megadja egy menüelem `X, Y` pozícióját és a méretét a képen. A `message` egy üzenet, ami az egérgomb menüponton történő felengedésekor generálódik.

## Betűk

Amint azt már a skin elemeiről szóló részben is említettem, egy betűtípust egy kép és egy leíró fájl alkot. A karaktereket bárhová teheted a képen, de győződj meg róla, hogy a pozíciójuk és a méretük pontosan meg van adva a leíró fájlban.

A betű leíró fájl (az `.fnt` kiterjesztéssel) tartalmazhat megjegyzéseket, melyek '`;`'-vel kezdődő sorokban kapnak helyet. A fájlban kell, hogy szerepeljenek az alábbi sorok:

    image = image

Ahol az `image` a betűhöz használt kép fájl neve (nem kell megadnod a kiterjesztést).

    "char" = X, Y, width, height

Itt az `X` és az `Y` a `char` karakter pozícióját adja meg a képen (`0,0` a bal felső sarok). A `width` és a `height` a karakter méretei pixelben.

Ez a példa az A, B, C karaktereket definiálja a `font.png` felhasználásával.

    ; Lehet "font" is a "font.png" helyett.
    image = font.png

    ; Három karakter elég a bemutatáshoz :-)
    "A" =  0,0, 7,13
    "B" =  7,0, 7,13
    "C" = 14,0, 7,13

### Szimbólumok

Néhány karakternek speciális jelentése van, ha dlabel-ben használva valamelyik változó tér vissza vele. Ezeket a karaktereket szimbólumokként kell megjeleníteni, így például egy szép DVD logó jelenhet meg a '`d`' karakter helyett egy DVD folyam esetén.

Az alábbi táblázat a szimbólumként megjeleníthető (és így külön betűtípust igénylő) karaktereket tartalmazza.

Karakter | Szimbólum
--- | ---
p | lejátszás
s | stop
e | pillanatállj
n | nincs hang
m | mono hang
t | sztereó hang
f | a folyam egy fájl
v | a folyam egy Video CD
d | a folyam egy DVD
u | a folyam egy URL

## GUI üzenetek

Az alábbi üzeneteket generálják a gombok, potméterek és menüpontok.

### Lejátszás vezérlése:

evNext

  ugrás a következő sávra a lejátszási listában.

evPause

  Párt alkot az `evPlaySwitchToPause`-val. Egy általános lejátszás/szünet gomb készítéséhez használhatóak fel. Mind a két üzenetet egy olyan gombhoz kell hozzárendelni, ami teljesen ugyan ott jelenik meg az ablakban. Ez az üzenet megállítja a lejátszást és megjelenteti az `evPlaySwitchToPause` gombhoz tartozó képet (jelezve ezzel, hogy a gombot meg lehet nyomni a lejátszás folytatásához).

evPlay

  Lejátszás elindítása.

evPlaySwitchToPause

  Az `evPauseSwitchToPlay` ellentéte. Ez az üzenet elkezdi a lejátszást és megjelenteti az `evPauseSwitchToPlay` gomb képét (jelezve ezzel, hogy a gombot meg lehet nyomni a lejátszás megállításához).

evPrev

  Az előző sávra ugrik a lejátszási listában.

evStop

  Lejátszás megállítása.

### Seeking:

evBackward10sec

  Visszalépés 10 másodperccel.

evBackward1min

  Visszalépés 1 perccel.

evBackward10min

  Visszalépés 10 perccel.

evForward10sec

  Előrelépés 10 másodperccel.

evForward1min

  Előrelépés 1 perccel.

evForward10min

  Előrelépés 10 perccel.

evSetMoviePosition

  Ugrás a pozícióhoz (potméter tudja használni; a potméter relatív értékét (0-100%) használja).

### Videó vezérlés:

evHalfSize

  Film ablak méretének felezése.

evDoubleSize

  Film ablak méretének duplázása.

evFullScreen

  Teljes képernyős mód be-/kikapcsolása.

evNormalSize

  Film ablak normál méretének beállítása.

### Audió vezérlés:

evDecAudioBufDelay

  Audió buffer késleltetésének csökkentése.

evDecBalance

  Balansz csökkentése.

evDecVolume

  Hangerő csökkentése.

evIncAudioBufDelay

  Audió buffer késleltetésének növelése.

evIncBalance

  Balansz növelése.

evIncVolume

  Hangerő növelése.

evMute

  Hang ki-/bekapcsolása.

evSetBalance

  Balansz beállítása (potméter tudja használni; a potméter relatív értékét (0-100%) használja).

evSetVolume

  Hangerő beállítása (potméter tudja használni; a potméter relatív értékét (0-100%) használja).

### Vegyes:

evAbout

  Programinformációs ablak megnyitása.

evDropSubtitle

  Aktuálisan használt felirat letiltása.

evEqualizer

  Equalizer be-/kikapcsolása.

evExit

  Kilépés a programból.

evIconify

  Ablak összecsukása kis méretűvé.

evLoad

  Fájl betöltése (a fájl böngésző ablak megnyitásával, ahol kiválaszthatod a fájlt).

evLoadPlay

  Ugyan azt csinálja, mint az `evLoad`, de automatikusan elkezdi lejátszani a fájlt, miután betöltötte.

evLoadSubtitle

  Felirat fájl betöltése (a fájl választóval)

evLoadAudioFile

  Audió fájl betöltése (a fájl választóval)

evNone

  Üres üzenet, nincs hatása (kivéve talán a Subversion verziót :-)).

evPlaylist

  Lejátszási lista ablak megnyitása/becsukása.

evPlayDVD

  Megpróbálja megnyitni az adott DVD-ROM meghajtóban lévő lemezt.

evPlayVCD

  Megpróbálja megnyitni az adott CD-ROM meghajtóban lévő lemezt.

evPreferences

  Megnyitja a beállítások ablakot.

evSetAspect

  Beállítja a megjelenített kép arányát.

evSetURL

  Megjeleníti az URL dialógus ablakot.

evSkinBrowser

  Megnyitja a skin böngésző ablakot.

## Minőségi skin-ek készítése

Tehát végigolvastad az MPlayer GUI-jához történő skin készítés leírását, megtettél minden tőled telhetőt a Gimppel és el szeretnéd küldeni nekünk a skin-ed? Olvass még egy kicsit tovább, hogy elkerüld a gyakori hibákat és minőségi skin-t tudj készíteni.

Szeretnénk, ha a skin-ek, amit beveszünk a listánkba, megfelelnének bizonyos minőségi elvárásoknak. Ezen kívül van még pár dolog, amivel a mi életünket könnyítheted meg.

Példaként nézd meg a a Blue skin-t, az teljesíti az összes lent felsorolt kritériumot az 1.5-ös verzió óta.

- Minden skin-nek tartalmaznia kell egy `README` fájlt, ami tartalmazza az információkat rólad, a szerzőről, a szerzői jogi és licensz figyelmeztetéseket és bármi mást, amit még bele akarsz írni. Ha szeretnél changelog-ot, ez a fájl jó hely neki.

- Kell lennie egy `VERSION` fájlnak, melyben semmi más nincs, csak a skin verziószáma egyetlen egy sorban (pl. 1.0).

- A vízszintes és függőleges irányítókon (csúszkák a hangerőnek és a pozíciónak) a gombjuk középpontjának pontosan középen kell lennie, a csúszka felénél. A gombot mindkét irányban ki kell tudni húzni a csúszka végéig, de azon túl nem.

- A skin elemeit megfelelő méretűnek kell deklarálni a skin fájlban. Ha nem így van, akkor kattintani tudsz pl. a gombon kívül és mégis megnyomod vagy egy területen belül kattintasz és nem lesz hatása.

- A `skin` fájlnak jól formázottnak kell lennie és nem tartalmazhat tab-okat. A jól formázottság azt jelenti, hogy a számoknak szépen oszlopokban kell lenniük.