# Formát skinů MPlayeru

## Přehled

Nemá to sice nic společného s formátem skinu, ale měli byste vědět, že MPlayer nemá vestavěný skin, takže si musíte alespoň jeden skin nainstalovat, chcete-li používat GUI.

### Adresáře

Adresáře prohledávané na skiny jsou (v tomto pořadí):

1. `$(DATADIR)/skins/`

2. `$(PREFIX)/share/mplayer/skins/`

3. `~/.mplayer/skins/`

Poznamenejme, že první z cest se může lišit podle toho, jak je MPlayer zkonfigurován (viz volby configure skriptu `--prefix` a `--datadir`).

Každý skin je instalován do vlastního adresáře v některém z výše uvedených. Například:

    $(PREFIX)/share/mplayer/skins/default/

### Formáty obrázků

Obrázky musí být truecolor (24 nebo 32 bpp) PNG.

V hlavním okně a v přehrávači (viz níž) můžete použít obrázky s 'průhledností': Oblasti vyplněné barvou #FF00FF (magenta) jsou plně průhledné, pokud jsou zobrazovány MPlayerem. To znamená, že můžete mít tvarovaná okna, pokud má váš X server XShape rozšíření.

### Součásti skinu

Skiny mají poměrně volný formát (narozdíl například od pevného formátu skinů Winampu/XMMS), takže je jen na vás, zda vytvoříte něco skvělého.

V současnosti jsou zde čtyři okna, která můžete dekorovat: hlavní okno, podokno, ovládací panel a nabidka (tu lze aktivovat pravým myšítkem).

- MPlayer je ovládán v hlavním okně a/nebo v ovládacím panelu. Pozadím okna je obrázek. Následující součásti mohou (a musí) být umístěny v okně: tlačítka, potenciometry (šoupátka) a popisky. Každé součásti musíte nastavit pozici a velikost.

  A tlačítko má tři stavy (stisknuto, puštěno a zakázáno), proto musí být jeho obraz svisle rozdělen do tří částí. Detaily viz součást tlačítko.

  A potenciometr (hlavně používaný pro lištu převíjení a ovládání hlasitosti/stereováhy) může mít libovolný počet fází dělících jeho obraz na jednotlivé části pod sebou. Detaily viz hpotenciometr a potenciometr.

  Popisky jsou poněkud zvláštní: Znaky potřebné pro jejich vykreslení jsou brány z obrazového souboru a znaky v obrázku jsou popsány souborem popisu fontu. Tento (druhý) soubor je prostý textový soubor, který popisuje pozici x,y a velikost každého znaku v obrázku (obrázkový soubor a soubor popisu fontu spolu tvoří font). Detaily viz dlabel.

  Všechny obrázky mohou mít plnou průhlednost, jak je popsána v sekci o formátech obrázků. Pokud X server nepodporuje rozšíření XShape, budou průhledné části černé. Pokud byste chtěli využít tuto vlastnost, musí být šířka pozadí hlavního okna celočíselně dělitelná 8.

- Podokno je to okno, kde se zobrazuje film. Může v něm být zobrazen určený obrázek, pokud není načten žádný film (je docela únavné, pokud zde není nic :-)). Poznámka: průhlednost zde není povolena.

- Nabídka je jen způsob, jak ovládat MPlayer položkami menu. Vyžadovány jsou dva obrázky: jeden z nich jako menu v normálním stavu a druhý se zvýrazněnými položkami. Když pak vyvoláte menu, je zobrazen první obrázek. Při pohybu myší přes položky, je zkopírována aktuálně vybraná položka z druhého obrázku přes ten první pod kursorem (druhý obrázek není nikdy zobrazen celý).

  Položka menu je definována svou pozicí a velikostí v obrázku (detaily viz sekce nabídka).

Jednu důležitou věc jsme ještě nezmínili: Mají-li tlačítka, potenciometry a položky menu pracovat, musí MPlayer vědět, co má udělat, pokud je na ně kliknuto. To je zajištěno pomocí zpráv (událostí). Pro tyto členy tedy musíte definovat zprávy, které budou při kliku generovány.

### Soubory

Pro výrobu skinu budete potřebovat následující:

- Konfigurační soubor jménem skin řekne MPlayeru, jak má dát jednotlivé části skinu dohromady a co udělat, kliknete-li někde v okně.

- Obrázek pozadí hlavního okna.

- Obrázky položek hlavního okna (včetně jednoho nebo více souborů s popisem fontu pro vykreslování popisek).

- Obrázek pro zobrazení v podokně (volitelný).

- Dva obrázky pro nabídku (ty jsou potřeba pouze pokud chcete vytvořit menu).

S výjimkou konfiguračního souboru skinu si můžete pojmenovat ostatní soubory jak chcete (s tím, že vaše soubory s popisem fontu budou mít příponu `.fnt`).

## Soubor skin

Jak jsme již řekli, je to konfigurační soubor skinu. Soubor je řádkově orientován; řádky s komentářem začínají znakem '`;`' (před ním jsou povoleny jen mezery a tabulátory).

Soubor je složen ze sekcí. Každá sekce popisuje skin pro aplikaci a má následující formu:

    section = název cekce
    .
    .
    .
    end

Zatím máme jen jednu aplikaci, takže potřebujete jen jednu sekci: její název je movieplayer.

Uvnitř sekce je každé okno posáno blokem, který má následující formu:

    window = název okna
    .
    .
    .
    end

kde název okna může být jeden z těchto řetězců:

- main - pro hlavní okno

- sub - pro podokno

- menu - pro nabídku

- playbar - ovládací panel

(Bloky sub a menu jsou volitelné - nemusíte vytvářet nabídku nebo vyzdobit podokno.)

Uvnitř window bloku můžete definovat každou položku okna řádkem v tomto tvaru:

    položka = parametr

Kde `položka` je řetězec označující typ položky GUI a `parametr` je číselná nebo textová hodnota (nebo seznam hodnot oddělených čárkami).

Dáte-li to všechno dohromady, celý soubor vypadá asi takto:

    section = movieplayer
      window = main
      ; ... položky hlavního okna ...
      end

      window = sub
      ; ... položky podokna ...
      end

      window = menu
      ; ... položky menu ...
      end

      window = playbar
      ; ... položky ovládacího panelu ...
      end
    end

Jméno souboru s obrázkem musí být zadáno bez úvodních adresářů - obrázky jsou vyhledávány v adresáři `skins`. Měli byste (ale nemusíte) zadat příponu souboru. Pokud soubor neexistuje, zkouší MPlayer načíst soubor `<jméno>.<příp>`, kdy jsou za `<příp>` zkoušeny přípony `png` a `PNG` (v tomto pořadí). Použitý bude první vyhovující soubor.

Aby bylo vše jasné, uvedeme příklad. Řekněme, že máte obrázek jménem `main.png`, který použijeme pro hlavní okno:

    base = main, -1, -1

MPlayer se pokusí nahrát soubory `main`, `main.png`, `main.PNG`.

Nakonec několik slov o pozicování. Hlavní okno a podokno lze umístit do odlišných rohů obrazovky zadáním souřadnic `X` a `Y`. `0` horní nebo levý, `-1` je střed a `-2` je vpravo nebo dole, jak je vidět na obrázku:

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

### Hlavní okno a ovládací panel

Níže uvádíme seznam položek, které mohou být použity v blocích '`window = main`' ... '`end`', a '`window = playbar`' ... '`end`'.

`base = obrázek, X, Y`

  Umožňuje nastavit obrázek pozadí hlavního okna. Okno bude vykresleno na zadaných souřadnicích `X,Y` na obrazovce a bude mít velikost obrázku.

  Tyto koordináty zatím nefungují pro okno display.

  Průhledné oblasti v obrázku (obarvené #FF00FF) budou černé na X serverech bez XShape rozšíření. Šířka obrázku musí být celočíselně dělitelná 8.

`button = obrázek, X, Y, šířka, výška, zpráva`

  Umístí tlačítko rozměru `šířka` * `výška` na pozici `X,Y`. Zadaná `zpráva` je generována při kliku na tlačítko. Zadaný `obrázek` musí mít tři části pod sebou (odpovídající možným stavům tlačítka) takto:

      +------------+
      | stisknuto  |
      +------------+
      |  uvolněno  |
      +------------+
      |  zakázáno  |
      +------------+

`decoration = enable|disable`

  Zapne (enable) nebo vypne (disable) dekoraci hlavního okna, produkovanou okenním manažerem. Výchozí je disable.

  V okně display to nefunguje, není to potřeba.

`hpotmeter = tlačítko, tšířka, tvýška, fáze, počet_fází, výchozí, X, Y, šířka, výška, zpráva`

`vpotmeter = tlačítko, tšířka, tvýška, fáze, počet_fází, výchozí, X, Y, šířka, výška, zpráva`

  Umístí vodorovný (hpotmeter) nebo svislý (vpotmeter) potenciometr velikosti `šířka` * `výška` na pozici `X,Y`. Obrázek může být rozdělen do různých částí pro různé fáze potenciometru (Například můžete mít potenciometr pro nastavení hlasitosti, jehož dráha se barví ze zelené na červenou, jak se jeho hodnota mění od nejmenší do největší.). `hpotmeter` může mít táhlo, které může být vodorovně taženo. Význam parametrů:

  - `tlačítko` - obrázek, který se použije pro tlačítko (musí mít tři části pod sebou, stejně jako v případě tohoto tlačítka)

  - `tšířka`, `tvýška` - velikost tlačítka

  - `fáze` - obrázek použitý pro různé fáze hpotmetru. Pokud žádný obrázek nechcete, můžete použít speciální hodnotu `NULL`. Obrázek musí být rozdělen svisle na `počet_fází` částí takto:

        +------------+
        |   fáze #1  |
        +------------+
        |   fáze #2  |
        +------------+
             ...
        +------------+
        |   fáze #n  |
        +------------+

  - `numphases` - number of phases stored in the `počet_fází` - počet fází uložených v obrázku `fáze`

  - `výchozí` - výchozí hodnota pro hpotmeter (v rozsahu `0` až `100`)

  - `X`, `Y` - pozice pro hpotmeter

  - `šířka`, `výška` - šířka a výška `hpotmeter`u

  - `zpráva` - zpráva generovaná při změně hodnoty `hpotmeter`u

`potmeter = fáze, počet_fází, výchozí, X, Y, šířka, výška, zpráva`

  `hpotmeter` bez tlačítka. (soudil bych, že byl míněn jako otočný, ale reaguje pouze na horizontální tažení.) Popis parametrů je stejný jako v hpotmeter. `fáze` mohou být `NULL`, ale je to vcelku k ničemu, jelikož nemůžete vidět, jak je nastaven `potmeter`.

`font = soubor_fontu, id_fontu`

  Definuje font. `soubor_fontu` je jméno souboru popisu fontu s příponou `.fnt` (zde příponu nezadávejte). `id_fontu` je použit jako ukazatel na font (viz dlabel a slabel). Definováno může být více než 25 fontů.

`slabel = X, Y, id_fontu, "text";`

  Umístí statický popisek na pozici `X,Y`. `text` je zobrazen fontem identifikovaným pomocí `id_fontu`. Text je surový řetězec (`$x` proměnné nefungují), který musí být uzavřen ve dvojitých uvozovkách (ale znak " nesmí být součástí textu). Popisek je zobrazen fontem identifikovaným pomocí `id_fontu`.

`dlabel = X, Y, délka, zarovnání, id_fontu, "text"`

  Umístí dynamický popisek na pozici `X,Y`. Popisek je dynamický proto, že je jeho text periodicky obnovován. Maximální délka popisku je nastavena na `délka` (jeho výškou je výška znaku). Pokud je zobrazovaný text širší, pak bude rolován, jinak bude zarovnán do určeného prostoru podle hodnoty parametru `zarovnání`: `0` je zarovnání vpravo, `1` na střed, `2` vlevo.

  Text k zobrazení je zadán parametrem `text`: Musí být uzavřen do dvojitých uvozovek (ale znak " nesmí být součástí textu). Popisek je zobrazen fontem identifikovaným pomocí `id_fontu`. V textu můžete použít tyto proměnné:

  Proměnná | Význam
  --- | ---
  $1 | čas přehrávání ve formátu hh:mm:ss
  $2 | čas přehrávání ve formátu mmmm:ss
  $3 | čas přehrávání ve formátu hh (hodiny)
  $4 | čas přehrávání ve formátu mm (minuty)
  $5 | čas přehrávání ve formátu ss (sekundy)
  $6 | délka filmu ve formátu hh:mm:ss
  $7 | délka filmu ve formátu mmmm:ss
  $8 | čas přehrávání ve formátu h:mm:ss
  $v | hlasitost ve formátu xxx.xx%
  $V | hlasitost ve formátu xxx.xx
  $b | stereováha ve formátu xxx.xx%
  $B | stereováha ve formátu xxx.xx
  $$ | znak $
  $a | znak podle typu audia (žádné: `n`, mono: `m`, stereo: `t`)
  $t | číslo stopy (v playlistu)
  $o | název souboru
  $f | název souboru malými písmeny
  $F | název souboru velkými písmeny
  $T | znak podle typu datového proudu (soubor: `f`, Video CD: `v`, DVD: `d`, URL: `u`)
  $p | znak p (pokud přehráváte soubor a font obsahuje znak p)
  $s | znak s character (pokud přehráváte soubor a font obsahuje znak s)
  $e | znak e (pokud je přehrávání pozastaveno a font obsahuje znak e)
  $x | šířka filmu
  $y | výška filmu
  $C | název použitého kodeku

  Proměnné `$a, $T, $p, $s` a `$e` vracejí znaky, které by měly být zobrazovány jako speciální symboly (například, e vrací symbol pauza, který obvykle vypadá jako ||). Měli byste mít font pro normální znaky a jiný font pro symboly. Více informací viz sekce o symbolech.

### Ovládací panel

Následující vstupy mohou být použity v bloku '`window = sub`' . . . '`end`'.

`base = obrázek, X, Y, šířka, výška`

  Obrázek, který bude zobrazen v okně. Okno se zobrazí na pozici zadané souřadnicemi `X,Y` na obrazovce (`0,0` je levý horní roh). Můžete nastavit `-1` pro střed a `-2` pro vpravo (`X`) a dole (`Y`). Okno bude stejně velké jako obrázek. `šířka` a `výška` udávají velikost okna; jsou volitelné (pokud chybí, má okno rozměry shodné s obrázkem).

`background = R, G, B`

  Umožňuje nastavit barvu pozadí. To je užitečné, pokud je obrázek menší než okno. `R`, `G` a `B` označují červenou, zelenou a modrou složku barvy (každá z nich je dekadická hodnota 0 až 255).

### Nabídka

Jak již bylo dříve řečeno, nabídka je zobrazena pomocí dvou obrázků. Normální položky nabídky jsou brány z obrázku určeného položkou `base`, zatímco aktuálně zvolený vstup je brán z obrázku určeného položkou `selected`. Musíte definovat pozici a rozměr každé položky nabídky.

Následující vstupy mohou být použity v bloku '`window = menu`'. . .'`end`'.

`base = obrázek`

  Obrázek normálních položek nabídky.

`selected = obrázek`

  Obrázek nabídky kde jsou všechny položky vybrány.

`menu = X, Y, šířka, výška, zpráva`

  Definuje pozici `X,Y` a rozměr položky nabídky v obrázku. `zpráva` je zpráva, generovaná jakmile je uvolněno tlačítko myši nad položkou.

## Fonty

Jak jsme již zmínili v sekci o částech skinu, font je definován obrázkem a souborem popisu. Můžete rozmístit znaky v obrázku libovolně, ale ujistěte se, že je jejich velikost a pozice je uvedena v souboru popisu přesně.

Soubor popisu fontu (s příponou `.fnt`) může obsahovat řádky s komentářem začínající '`;`'. Soubor musí obsahovat řádek ve formě

    image = obrázek

Kde `obrázek` je název obrázku použitého pro font (nemusíte zadávat příponu).

    "char" = X, Y, šířka, výška

Zde `X` a `Y` udávají pozici `char` znaku v obrázku (`0,0` je levý horní roh). `šířka` a `výška` jsou rozměry znaku v pixelech.

Tento příklad definuje znaky A, B, C s použítím `font.png`.

    ; Zde může být jen "font" místo "font.png".
    image = font.png

    ; Tři znaky pro ilustraci stačí :-)
    "A" =  0,0, 7,13
    "B" =  7,0, 7,13
    "C" = 14,0, 7,13

### Symboly

Některé znaky mají speciální význam, jsou-li vráceny některou z proměnných použitých v dlabel. Tyto znaky mají být zobrazovány jako symboly, takže mohou být zobrazeny věci jako pěkné DVD logo místo znaku '`d`' pro DVD datový proud.

Následující tabulka obsahuje znaky, které mohou být použity k zobrazení symbolů (a tudíž vyžadují odlišný font).

Znak | Symbol
--- | ---
p | play
s | stop
e | pauza
n | bez zvuku
m | mono zvuk
t | stereo zvuk
f | datový proud je soubor
v | datový proud je Video CD
d | datový proud je DVD
u | datový proud je URL

## GUI zprávy

Tyto zprávy mohou být generovány tlačítky, potenciometry a položkami nabídky.

evNone

  Prázdná zpráva, nemá žádný efekt (možná s výjimkou Subversion verzí :-)).

Ovládání přehrávání:

evPlay

  Zahájí přehrávání.

evStop

  Zastaví přehrávání.

evPause

evPrev

  Skočí na předchozí stopu v playlistu.

evNext

  Skočí na následující stopu v playlistu.

evLoad

  Otevře soubor (otevřením okna prohlížeče souborů, kde si soubor vyberete).

evLoadPlay

  Stejné jako `evLoad`, ale navíc se okamžitě spustí přehrávání otevřeného souboru.

evLoadAudioFile

  Otevře soubor se zvukem (pomocí prohlížeče souborů)

evLoadSubtitle

  Otevře soubor s titulky (pomocí prohlížeče souborů)

evDropSubtitle

  Vypne aktuálně použité titulky.

evPlaylist

  Otevře/zavře okno playlistu.

evPlayVCD

  Zkusí otevřít disk v zadané CD-ROM mechanice.

evPlayDVD

  Zkusí otevřít disk v zadané DVD-ROM mechanice.

evLoadURL

  Zobrazí dialogové okno pro volbu URL.

evPlaySwitchToPause

  Protiklad `evPauseSwitchToPlay`. Tato zpráva zahájí přehrávání a zobrazí obrázek pro tlačítko `evPauseSwitchToPlay` (pro indikaci, že tlačítko může být stisknuto pro pozastavení přehrávání).

evPauseSwitchToPlay

  Tvoří přepínač společně s `evPlaySwitchToPause`. Ty mohou být použity k vytvoření tradičního play/pauza tlačítka. Obě zprávy by měly být přiřazeny tlačítkům umístěným na stejné pozici v okně. Tato zpráva pozastaví přehrávání a zobrazen bude obrázek pro `evPlaySwitchToPause` talčítko (pro indikaci, že tlačítko může být stisknuto pro obnovení přehrávání).

Převíjení:

evBackward10sec

  Převine zpět o 10 sekund.

evBackward1min

  Převine zpět o 1 minutu.

evBackward10min

  Převine zpět o 10 minut.

evForward10sec

  Převine vpřed o 10 sekund.

evForward1min

  Převine vpřed o 1 minutu.

evForward10min

  Převine vpřed o 10 minut.

evSetMoviePosition

  Převine na danou pozici (může být přiřazeno potenciometru; použije se relativní hodnota (0-100%) potenciometru).

Ovládání videa:

evHalfSize

  Nastaví velikost okna filmu na poloviční velikost.

evDoubleSize

  Nastaví velikost okna filmu na dvojnásobnou velikost.

evFullScreen

  Přepíná do celoobrazovkového režimu a zpět.

evNormalSize

  Nastaví velikost okna na normální velikost.

evSetAspect

Ovládání zvuku:

evDecVolume

  Sníží hlasitost.

evIncVolume

  Zvýší hlasitost.

evSetVolume

  Nastaví hlasitost (může být sdruženo s potenciometrem; použije se relativní hodnota potenciometru (0-100%)).

evMute

  Vypne/zapne zvuk.

evSetBalance

  Nastaví stereováhu (může být sdruženo s potenciometrem; použije se relativní hodnota potenciometru (0-100%)).

evEqualizer

  Zapne/vypne ekvalizér.

Různé:

evAbout

  Otevře okno o aplikaci.

evPreferences

  Otevře okno předvoleb.

evSkinBrowser

  Otevře okno voliče skinů.

evIconify

  Minimalizuje okno.

evExit

  Ukončí program.

## Tvorba kvalitních skinů

Co když jste si přečetli o skinech pro GUI MPlayeru, odvedli to nejlepší s Gimpem a chcete nám poslat svůj skin? Přečtěte si pár návodů, abyste se vyhnuli běžným omylům a vytvořili vysoce kvalitní skin.

Chceme, aby skiny, které přidáme do našeho repozitáře odpovídaly určitým standardům kvality. Je zde také mnoho věcí, které můžete udělat, abyste nám ulehčili práci.

Za příklad si vemte skin Blue. Ten splňuje všechna kritéria od verze 1.5.

- Ke každému skinu by měl být soubor `README`, obsahující informace o vás jako autorovi, o copyrightu a licenci a vše ostatní, co chcete dodat. Chcete-li mít changelog, tento soubor je dobrým místem.

- Měl by tu být soubor `VERSION` neobsahující nic jiného, než číslo verze na jediném řádku (např. 1.0).

- Horizontální a vertikální ovládání (posuvníky jako hlasitost nebo pozice) by měly mít střed knoflíku správně zarovnán na stred posuvníku. Mělo by být možné posouvat knoflík na oba konce posuvníku, ale ne za ně.

- Jednotlivé součásti skinu by měly mít správné rozměry deklarované v souboru skin. Pokud to tak není, můžete kliknout mimo např. tlačítko a to se stejně stiskne, nebo kliknout na jeho plochu a nestisknout jej.

- Soubor `skin` by měl být srovnán na znaky a neobsahovat tabulátory. Srovnán na znaky znamená, že se čísla budou rovnat do úhledných sloupců.