<?xml version="1.0" encoding="utf-8"?>
<!-- synced with r21612 -->
<appendix id="skin">
<title>Формат скинов <application>MPlayer</application></title>

<sect1 id="skin-overview">
<title>Обзор</title>

<para>
На самом деле с форматом скинов уже нет необходимости что-либо делать, но вам
следует знать, что <application>MPlayer</application>
<emphasis role="bold">не имеет</emphasis> встроенного скина, так что
<emphasis role="bold">как минимум один скин должен быть установлен, для
возможности использовать GUI.</emphasis>
</para>

<!-- ********** -->

<sect2 id="skin-overview-directories">
<title>Каталоги</title>
<para>
Скины ищутся в следующих каталогах (по порядку):
<orderedlist>
<listitem><para>
  <filename class="directory">$(DATADIR)/skins/</filename>
</para></listitem>
<listitem><para>
  <filename class="directory">$(PREFIX)/share/mplayer/skins/</filename>
</para></listitem>
<listitem><para>
  <filename class="directory">~/.mplayer/skins/</filename>
</para></listitem>
</orderedlist>
</para>

<para>
Имейте в виду, что первый путь может меняться в соответствии с конфигурацией
<application>MPlayer</application> (смотрите аргументы скрипта
<command>configure</command> <option>--prefix</option> и <option>--datadir</option>).
</para>

<para>
Каждый скин устанавливается в его собственный подкаталог, в одном из указанных выше
каталогов, например:
<screen>$(PREFIX)/share/mplayer/skins/default/</screen>
</para>
</sect2>

<!-- ********** -->

<sect2 id="skin-overview-formats">
<title>Форматы изображений</title>
<para>Изображениями должны быть truecolor (24 или 32 бит/пиксел) PNG.</para>
<para>
В главном окне и полосе воспроизведения (смотрите ниже) можно использовать
изображения с 'прозрачностью': Области, заполненные цветом #FF00FF (magenta) полностью
прозрачны при просмотре программой <application>MPlayer</application>. Это значит, что
если ваш X сервер поддерживает расширение XShape, вы сможете получить даже
окна произвольной формы.
</para>
</sect2>

<sect2 id="skin-overview-components">
<title>Компоненты скина</title>
<para>
Скины имеют достаточно свободный формат (в отличие,например, от скинов
<application>Winamp</application>/<application>XMMS</application>,
имеющих формат фиксированный), так что зависит исключительно от вас, выйдет ли
у вас что-то грандиозное.
</para>

<para>
В данный момент могут быть оформлены четыре окна:
<link linkend="skin-file-main">главное окно</link>,
<link linkend="skin-file-subwindow">вспомогательное окно</link>,
<link linkend="skin-file-main">полоса воспроизведения</link>, and the
<link linkend="skin-file-menu">меню со скинами</link> (активирующееся правым щелчком
мыши).

<itemizedlist>
<listitem>
  <para>
  <emphasis role="bold">Главное окно</emphasis> и/или
  <emphasis role="bold">полоса воспроизведения</emphasis> - те, через которые вы
  управляете <application>MPlayer</application>. Фон окна - это изображение.
  Различные элементы могут (и должны) размещаться в окне:
  <emphasis>кнопки</emphasis>,   <emphasis>ползунки</emphasis> и
  <emphasis>надписи</emphasis>.
  Для каждого элемента должен быть задан размер и положение.
  </para>

  <para>
  <emphasis role="bold">Кнопка</emphasis> имеет три состояния (нажата, отпущена,
  отключена), таким образом, ее изображение должно быть разделено вертикально на три части.
  Смотрите элемент <link linkend="skin-button">кнопка</link> для подробностей.
  </para>

  <para>
  <emphasis role="bold">Ползунок</emphasis> (в основном используется для полосы перемещения
  и управления громкостью/балансом) может иметь любое количество положений, задаваемых делением
  его изображения на различные части одна под другой. Смотрите
  <link linkend="skin-hpotmeter">hpotmeter</link> и
  <link linkend="skin-potmeter">potmeter</link> для подробностей.
  </para>

  <para>
  <emphasis role="bold">Надписи</emphasis> чуть особеннее: Символы, необходимые для их
  отрисовки, берутся из графического файла, и задаются
  <link linkend="skin-fonts">файлом описания шрифта</link>.
  Последний - это текстовый файл, указывающий x,y положения и размер каждого символа
  в файле с изображением (файл изображения и файл описания шрифта
  <emphasis>вместе</emphasis> формируют шрифт). Смотрите
  <link linkend="skin-dlabel">dlabel</link>
  и <link linkend="skin-slabel">slabel</link> для подробностей.
  </para>

  <note><para>Все изображения могут быть полностью прозрачными, как описано в разделе,
  посвященном <link linkend="skin-overview-formats">форматам изображений</link>. Если X
  сервер не поддерживает расширение XShape, части, помеченные как прозрачные, будут черными.
  Если вам нравится использовать эту возможность, ширина фона главного окна должна
  делиться на 8.
  </para></note>
</listitem>

<listitem><para>
  <emphasis role="bold">Вспомогательное окно</emphasis>  - это то, где появляется фильм.
  Оно может отображать указанную картинку, если  никакого фильма не загружено (пустое окно
  немного надоедает :-)) <emphasis role="bold">Замечание:</emphasis> прозрачность здесь
  <emphasis role="bold">не допускается</emphasis>.
</para></listitem>

<listitem>
  <para>
  <emphasis role="bold">Меню со скинами</emphasis> - всего лишь способ управлять
  <application>MPlayer</application> в понятиях элементов меню. Для меню требуются
  два изображения: одно из них - основное, показывает меню в обычном режиме,
  другое используется для отображения выбранных элементов. Когда появляется меню,
  отображается первое. Если вы перемещаете мышь над элементами меню,
  выбранный элемент копируется из второго изображения поверх элемента меню под указателем мыши
  (второе изображение никогда не отображается целиком).
  </para>
  <para>
  Элемент меню определяется его позицией и размером изображения (смотрите раздел,
  посвященный <link linkend="skin-file-menu">меню со скинами</link> для подробностей).
  </para>
</listitem>
</itemizedlist>
</para>

<para>
Важная вещь, не упомянутая выше: Чтобы работали кнопки, ползунки и элементы меню,
<application>MPlayer</application> должен знать, что делать, если на них
щелкнули мышью. Это делается при помощи <link linkend="skin-gui">сообщений</link>
(событий). Для этих элементов вы должны определить сообщения, генерируемые, когда
на них щелкают мышью.
</para>
</sect2>

<!-- ********** -->

<sect2 id="skin-files">
<title>Файлы</title>
<para>
Вам нужны следующие файлы для создания скина:
<itemizedlist>
<listitem><para>
  Файл конфигурации, называющийся <link linkend="skin-file">skin</link> говорит
  <application>MPlayer</application> как совместить разные части скина воедино,
  и что делать, если производится щелчок где-нибудь в окне.
</para></listitem>
<listitem><para>
  Фоновое изображение главного окна.
</para></listitem>
<listitem><para>
  Изображения элементов главного окна (включая один или более файлов описания шрифтов,
  необходимых для отрисовки надписей.
</para></listitem>
<listitem><para>
  Изображение, показываемое во вспомогательном окне (необязательно).
</para></listitem>
<listitem><para>
  Два изображения для меню со скинами (нужны, только если вы хотите создавать меню).
</para></listitem>
</itemizedlist>
  Все файлы, за исключением skin, могут быть названы так, как вам захочется
  (но заметьте, что файлы описания шрифтов должны иметь расширение
  a <filename>.fnt</filename>).
</para>
</sect2>
</sect1>


<!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -->


<sect1 id="skin-file">
<title>Файл skin</title>
<para>
Как описано выше, это файл конфигурации скина. он строчно-орентирован:
строки комментариев начинаются с символа '<literal>;</literal>' в начале
строки (только пробелы и табуляция допускается перед символом '<literal>;</literal>').
</para>

<para>
Файл создается из разделов. Каждый описывает скин для приложения и
имеет следующую форму:
<programlisting>
section = <replaceable>название раздела</replaceable>
.
.
.
end
</programlisting>
</para>

<para>
В данный момент приложение одно, так что вам потребуется только один раздел: его название
<emphasis role="bold">movieplayer</emphasis>.
</para>

<para>
В пределах раздела каждое окно описывается блоком следующей структуры:
<programlisting>
window = <replaceable>название окна</replaceable>
.
.
.
end
</programlisting>
</para>

<para>
где  <replaceable>название окна</replaceable> может быть одной из этих строк:
<itemizedlist>
<listitem><para>
  <emphasis role="bold">main</emphasis> - главное окно
</para></listitem>
<listitem><para>
  <emphasis role="bold">sub</emphasis> - вспомогательное окно
</para></listitem>
<listitem><para>
  <emphasis role="bold">menu</emphasis> - меню со скинами
</para></listitem>
<listitem><para>
  <emphasis role="bold">playbar</emphasis> - полоса воспроизведения
</para></listitem>
</itemizedlist>
</para>

<para>
(Блоки sub и menu опциональные - необязательно создавать меню или оформлять вспомогательное
окно.)
</para>

<para>
В пределах блока window вы можете описать каждый элемент окна строкой в следующем формате:
<programlisting>item = parameter</programlisting>
Где <literal>item</literal> - это строка, определяющая тип элемента GUI,
<literal>parameter</literal> - числовое или текстовое значение (или список значений, разделенных
запятой).
</para>

<para>
Если собрать все вместе, файл целиком будет выглядеть примерно так:
<programlisting>
section = movieplayer
  window = main
  ; ... items for main window ...
  end

  window = sub
  ; ... items for subwindow ...
  end

  window = menu
  ; ... items for menu ...
  end

  window = playbar
  ; ... items for playbar ...
  end
end
</programlisting>
</para>

<para>
Название файла с изображением  должно указываться без лидирующих каталогов -
изображения ищутся в каталоге <filename class="directory">skins</filename>.
Вы можете (но не обязаны) указать расширение файла. Если файл не существует,
<application>MPlayer</application> пытается загрузить файл
<filename>&lt;filename&gt;.&lt;ext&gt;</filename>, где <literal>png</literal>
и <literal>PNG</literal> пробуются вместо <filename>&lt;ext&gt;</filename>
(в этом порядке). Будет использоваться первый найденный файл.
</para>

<para>
Вот пример, чтобы было понятнее. Предположим вы имеете изображение, называющееся
<filename>main.png</filename>, которое используете для главного окна:
<programlisting>base = main, -1, -1</programlisting>
<application>MPlayer</application> пытается загрузить файлы <filename>main</filename>,
<filename>main.png</filename>, <filename>main.PNG</filename>.
</para>

<para>
И наконец несколько слов о позиционировании. Главное и вспомогательное окна могут
быть размещены в разных углах экрана указанием <literal>X</literal> и
<literal>Y</literal> координат. <literal>0</literal> -  это верхний и левый край,
<literal>-1</literal> - центр и <literal>-2</literal> - правый или нижний, как
указано на иллюстрации:
<informalfigure>
<screen>
(0, 0)----(-1, 0)----(-2, 0)
  |          |          |
  |          |          |
(0,-1)----(-1,-1)----(-2,-1)
  |          |          |
  |          |          |
(0,-2)----(-1,-2)----(-2,-2)
</screen>
</informalfigure>
</para>

<!-- ********** -->

<sect2 id="skin-file-main">
<title>Главное окно и полоса воспроизведения</title>
<para>
Ниже  - список элементов, которые можно указывать в
'<literal>window = main</literal>' ... '<literal>end</literal>',
и '<literal>window = playbar</literal>' ... '<literal>end</literal>'
блоках.
</para>

<variablelist>
<varlistentry>
  <term><literal>
  <anchor id="skin-main-base"/>base = image, X, Y
  </literal></term>
  <listitem>
  <para>
  Позволяет вам указать фоновое изображение, используемое в главном окне.
  Окно будет появляться в указанной <literal>X,Y</literal> позиции на экране и
  иметь размер изображения.
  </para>
  <note><para>
  Эти координаты пока не работают для окна отображения.
  </para></note>
  <warning><para>Прозрачные регионы в изображении (цвет #FF00FF) станут черными
  на X сервере без расширения XShape. Ширина картинки должна делиться
  на 8.</para></warning>
  </listitem>
</varlistentry>

<varlistentry>
  <term><literal>
  <anchor id="skin-button"/>button = image, X, Y, width, height, message
  </literal></term>
  <listitem>
  <para>
  Размещает кнопку размера <literal>width</literal> * <literal>height</literal> на
  позиции <literal>X,Y</literal>. Указанное сообщение <literal>message</literal>
  генерируется при щелчке на кнопку. Изображение <literal>image</literal>,
  должно иметь три части одна ниже другой (в соответствии с возможными состояниями
  кнопки), как здесь:
  </para>
  <informalfigure>
  <screen>
+------------+
|  нажата    |
+------------+
|  отпущена  |
+------------+
|  отключена |
+------------+<!--
  --></screen>
  </informalfigure>
  </listitem>
</varlistentry>

<varlistentry>
  <term><literal>
  <anchor id="skin-decoration"/>decoration = enable|disable
  </literal></term>
  <listitem>
  <para>
  Включает или выключает декорации главного окна, осуществляемые window manager . По-умолчанию
  <emphasis role="bold">disable</emphasis>.
  </para>
  <note><para>
  Это не работает для окна отображения, в этом нет надобности.
  </para></note>
  </listitem>
</varlistentry>

<varlistentry>
  <term><literal>
  <anchor id="skin-hpotmeter"/>hpotmeter = button, bwidth, bheight, phases, numphases, default, X, Y, width, height, message
  </literal></term>
  <listitem><para>
  </para></listitem>
</varlistentry>

<varlistentry>
  <term><literal>
  <anchor id="skin-vpotmeter"/>vpotmeter = button, bwidth, bheight, phases, numphases, default, X, Y, width, height, message
  </literal></term>
  <listitem><para>
  Размещает горизонтальный (hpotmeter) или вертикальный (vpotmeter) ползунок размера
  <literal>width</literal> * <literal>height</literal> на позиции
  <literal>X,Y</literal>. Изображение может быть разделено на разные части для
  указания различных положений ползунка (например, вы можете иметь регулятор для
  управления громкостью звука, изменяющийся с красного на зеленый при изменении его
  уровня с минимального на максимальный.). <literal>hpotmeter</literal> может иметь
  кнопку, которую можно таскать горизонтально. Параметры:
  <itemizedlist>
  <listitem><para>
    <literal>button</literal> - изображение, используемое для
    кнопки (должно иметь три части одна под другой, как в случае
    <link linkend="skin-button">кнопки</link>)
  </para></listitem>
  <listitem><para>
    <literal>bwidth</literal>, <literal>bheight</literal> - размер кнопки
  </para></listitem>
  <listitem><para>
    <literal>phases</literal> - изображение, используемое для
    различных положений hpotmeter. Специальное значение <literal>NULL</literal>
    может использоваться, если подобное изображение вам не нужно. Изображение
    должно быть разделено вертикально на
    <literal>numphases</literal> частей, как указано ниже:
    <informalfigure><screen>
+--------------+
| положение #1 |
+--------------+
| положение #2 |
+--------------+
     ...
+--------------+
| положение #n |
+--------------+<!--
    --></screen></informalfigure>
  </para></listitem>
  <listitem><para>
    <literal>numphases</literal> - количество положений в изображении
    <literal>phases</literal>
  </para></listitem>
  <listitem><para>
    <literal>default</literal> - положение hpotmeter по-умолчанию
    (в диапазоне от <literal>0</literal> до <literal>100</literal>)
  </para></listitem>
  <listitem><para>
    <literal>X</literal>, <literal>Y</literal> - позиция hpotmeter
    </para></listitem>
  <listitem><para>
    <literal>width</literal>, <literal>height</literal> - ширина и высота
    <literal>hpotmeter</literal>
  </para></listitem>
  <listitem><para>
    <literal>message</literal> - сообщение, генерируемое  при изменении значения
    <literal>hpotmeter</literal>
  </para></listitem>
  </itemizedlist>
  </para></listitem>
</varlistentry>

<varlistentry>
  <term><literal>
  <anchor id="skin-potmeter"/>potmeter = phases, numphases, default, X, Y, width, height, message
  </literal></term>
  <listitem><para>
  <literal>hpotmeter</literal> без кнопки.
  (Я предполагаю, что это означает повернутый вокруг,
  но он реагирует только на перетаскивание по горизонтали.) Для описания параметров смотрите
  <link linkend="skin-hpotmeter">hpotmeter</link>.
  <literal>phases</literal> может быть равен <literal>NULL</literal>, но это совершенно
  бесполезно, поскольку вы не сможете определить в каком положении
  находится <literal>potmeter</literal>.
  </para></listitem>
</varlistentry>

<varlistentry>
  <term><literal>
  <anchor id="skin-font"/>font = fontfile, fontid
  </literal></term>
  <listitem><para>
  Определяет шрифт. <literal>fontfile</literal> - это название файла описания шрифта
  с расширением <filename>.fnt</filename> (не указывайте расширение здесь).
  <literal>fontid</literal> используется для ссылки на шрифт
  (смотрите <link linkend="skin-dlabel">dlabel</link> и
  <link linkend="skin-slabel">slabel</link>). Может быть определено до 25 шрифтов.
  </para></listitem>
</varlistentry>

<varlistentry>
  <term><literal>
  <anchor id="skin-slabel"/>slabel = X, Y, fontid, "text"
  </literal></term>
  <listitem><para>
  Размещает  статическую метку на позиции <literal>X,Y</literal>. <literal>text</literal>
  отображается, используя шрифт, определенный по <literal>fontid</literal>.
  Текст - просто обычная строка (<literal>$x</literal> переменные не работают), которая должна
  быть заключена в двойные кавычки (но символ " не может быть частью текста).
  Метка отображается, используя шрифт определенный по <literal>fontid</literal>.
  </para></listitem>
</varlistentry>

<varlistentry>
  <term><literal>
  <anchor id="skin-dlabel"/>dlabel = X, Y, length, align, fontid, "text"
  </literal></term>
  <listitem>
  <para>
  Размещает динамическую метку на позиции <literal>X,Y</literal>. Метка зовется
  динамической, потому что ее текст периодически обновляется. Максимальная длина
  метки задается параметром <literal>length</literal> (ее высота равна высоте символа).
  Если отображаемый текст шире этого значения, он будет скроллироваться,
  иначе он выравнивается в пределах указанного пространства в соответствии со
  значением параметра
  <literal>align</literal>: <literal>0</literal> - вправо,
  <literal>1</literal> - по центру, <literal>2</literal> - влево.
  </para>
  <para>
  Отображаемый текст задается параметром <literal>text</literal>: Он должен быть
  заключен в двойные кавычки (но символ " не может быть частью текста).
  Метка отображается, используя шрифт, определяемый по <literal>fontid</literal>.
  Вы можете использовать следующие переменные в тексте:
  </para>

  <informaltable>
  <tgroup cols="2">
  <thead>
    <row><entry>Переменная</entry><entry>Значение</entry></row>
  </thead>
  <tbody>
  <row>
    <entry>$1</entry>
    <entry>время воспроизведения в формате <emphasis>чч:мм:сс</emphasis></entry>
  </row>
  <row>
    <entry>$2</entry>
    <entry>время воспроизведения в формате <emphasis>мммм:сс</emphasis></entry>
  </row>
  <row>
    <entry>$3</entry>
    <entry>время воспроизведения формате <emphasis>чч</emphasis>(часы)</entry>
  </row>
  <row>
    <entry>$4</entry>
    <entry>время воспроизведения в формате <emphasis>мм</emphasis>(минуты)</entry>
  </row>
  <row>
    <entry>$5</entry>
    <entry>время воспроизведения в формате <emphasis>сс</emphasis>(секунды)</entry>
  </row>
  <row>
    <entry>$6</entry>
    <entry>длительность фильма в формате <emphasis>чч:мм:сс</emphasis></entry>
  </row>
  <row>
    <entry>$7</entry>
    <entry>длительность фильма в формате <emphasis>мммм:сс</emphasis></entry>
  </row>
  <row>
    <entry>$8</entry>
    <entry>время воспроизведения формате <emphasis>ч:мм:сс</emphasis></entry>
  </row>
  <row>
    <entry>$v</entry>
    <entry>кромкость в формате <emphasis>xxx.xx</emphasis>%</entry>
  </row>
  <row>
    <entry>$V</entry>
    <entry>кромкость в формате <emphasis>xxx.xx</emphasis></entry>
  </row>
  <row>
    <entry>$b</entry>
    <entry>баланс в формате <emphasis>xxx.xx</emphasis>%</entry>
  </row>
  <row>
    <entry>$B</entry>
    <entry>баланс в формате <emphasis>xxx.xx</emphasis></entry>
  </row>
  <row>
    <entry>$$</entry>
    <entry>символ $</entry>
  </row>
  <row>
    <entry>$a</entry>
    <entry>символ ,соответствующий типу звука (нет: <literal>n</literal>,
    моно: <literal>m</literal>, стерео: <literal>t</literal>)</entry>
  </row>
  <row>
    <entry>$t</entry>
    <entry>номер дорожки (в плейлисте)</entry>
  </row>
  <row>
    <entry>$o</entry>
    <entry>имя файла</entry>
  </row>
  <row>
    <entry>$f</entry>
    <entry>имя файла в нижнем регистре</entry>
  </row>
  <row>
    <entry>$F</entry>
    <entry>имя файла в верхнем регистре</entry>
  </row>
  <row>
    <entry>$T</entry>
    <entry>
    символ, соответствующий типу потока (файл: <literal>f</literal>,
    Video CD: <literal>v</literal>, DVD: <literal>d</literal>,
    URL: <literal>u</literal>)
    </entry>
  </row>
  <row>
    <entry>$p</entry>
    <entry>
    символ <keycap>p</keycap> (если фильм воспроизводится и шрифт имеет
    символ <keycap>p</keycap>)
    </entry>
  </row>
  <row>
    <entry>$s</entry>
    <entry>
    символ <keycap>s</keycap> (если фильм остановлен и шрифт имеет
    символ <keycap>s</keycap>)
    </entry>
  </row>
  <row>
    <entry>$e</entry>
    <entry>
    символ <keycap>e</keycap> (если фильм на паузе и шрифт имеет
    символ <keycap>e</keycap>)
    </entry>
  </row>
  <row>
    <entry>$x</entry>
    <entry>ширина фильма</entry>
  </row>
  <row>
    <entry>$y</entry>
    <entry>высота фильма</entry>
  </row>
  <row>
    <entry>$C</entry>
    <entry>название используемого кодека</entry>
  </row>
  </tbody>
  </tgroup>
  </informaltable>

  <note><para>
  Переменные <literal>$a, $T, $p, $s</literal> и <literal>$e</literal> все
  возвращают символы, которые должны быть отображены в качестве специальных значков
  (например, <keycap>e</keycap> - для значка паузы, который обычно выглядит как ||).
  Вы должны иметь шрифт для обычных символов и отличающийся шрифт для значков.
  Смотрите раздел о <link linkend="skin-fonts-symbols">значках</link>
  для дополнительной информации.
  </para></note>
  </listitem>
</varlistentry>
</variablelist>
</sect2>

<!-- ********** -->

<sect2 id="skin-file-subwindow">
<title>Вспомогательное окно</title>
<para>
Следующие элементы могут быть использованы в блоке
'<literal>window = sub</literal>' . . . '<literal>end</literal>' .
</para>

<variablelist>
<varlistentry>
  <term><literal>
  <anchor id="skin-sub-base"/>base = image, X, Y, width, height
  </literal></term>
  <listitem><para>
  Изображение, отображаемое в окне. Окно будет появляться в указанной позиции
  <literal>X,Y</literal> экрана (<literal>0,0</literal> - верхний левый угол).
  Вы можете указать <literal>-1</literal> для центра и <literal>-2</literal>
  для правого (<literal>X</literal>) и нижнего (<literal>Y</literal>) края.
  Окно будет того же размера, что и изображение. <literal>width</literal> и
  <literal>height</literal> означают размер окна; они необязательны
  (если отсутствуют, окно будет иметь те же размеры, что и изображение).
  </para></listitem>
</varlistentry>

<varlistentry>
  <term><literal>
  <anchor id="skin-background"/>background = R, G, B
  </literal></term>
  <listitem><para>
  Позволяет указать цвет фона. Это полезно, если изображение меньше окна.
  <literal>R</literal>, <literal>G</literal> и <literal>B</literal>
  указывают красную, зеленую и синюю составляющие цвета (каждое из них -
  десятичное число от 0 до 255).
  </para></listitem>
</varlistentry>
</variablelist>
</sect2>

<!-- ********** -->

<sect2 id="skin-file-menu">
<title>Меню со скинами</title>
<para>
Как было описано выше, меню отображается при помощи двух картинок. Нормальные
элементы меню берутся из изображения, указанного элементом <literal>base</literal>,
в то время как выделенный в данный момент элемент берется  из изображения,
указанного элементом <literal>selected</literal>. Вы должны определить позицию и
размер каждого элемента меню.
</para>

<para>
Следующие элементы можно использовать в блоке
'<literal>window = menu</literal>'. . .'<literal>end</literal>'.
</para>

<variablelist>
<varlistentry>
  <term><literal>
  <anchor id="skin-menu-base"/>base = image
  </literal></term>
  <listitem><para>
  Изображение для нормальных элементов меню.
  </para></listitem>
</varlistentry>

<varlistentry>
  <term><literal>
  <anchor id="skin-selected"/>selected = image
  </literal></term>
  <listitem><para>
  Изображение, показывающее меню со всеми выделенными элементами.
  </para></listitem>
</varlistentry>

<varlistentry>
  <term><literal>
  <anchor id="skin-menu"/>menu = X, Y, width, height, message
  </literal></term>
  <listitem><para>
  Определяет позицию <literal>X,Y</literal> и размер элемента меню в изображении.
  <literal>message</literal> - это сообщение, генерируемое, когда кнопка мыши будет отпущена
  над элементом меню.
  </para></listitem>
</varlistentry>
</variablelist>
</sect2>
</sect1>


<!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -->


<sect1 id="skin-fonts">
<title>Шрифты</title>
<para>
Как описано в разделе, посвященному частям скина, шрифт определяется
изображением и файлом описания. Вы можете поместить символы в любое место изображения,
но будьте уверены, что их позиция и размер точно указаны в файле описания.
</para>

<para>
Файл описания шрифта (с расширением <filename>.fnt</filename>) может иметь комментарии,
начинающиеся с '<literal>;</literal>'. Файл должен иметь строку вида
<anchor id="skin-font-image"/>
<programlisting>image = <replaceable>image</replaceable></programlisting>,
где <literal><replaceable>image</replaceable></literal> - это название
файла с изображением, используемым для шрифта (расширение указывать необязательно).
<anchor id="skin-font-char"/>
<programlisting>"char" = X, Y, width, height</programlisting>
Здесь <literal>X</literal> и <literal>Y</literal> указывают позицию символа
<literal>char</literal> в изображении (<literal>0,0</literal> - верхний левый угол),
<literal>width</literal> и <literal>height</literal> - размеры символа в пикселах.
</para>

<para>
Этот пример определяет символы  A, B, C, используя <filename>font.png</filename>.
<programlisting>
; Can be "font" instead of "font.png".
image = font.png

; Three characters are enough for demonstration purposes :-)
"A" =  0,0, 7,13
"B" =  7,0, 7,13
"C" = 14,0, 7,13
</programlisting>
</para>

<!-- ********** -->

<sect2 id="skin-fonts-symbols">
<title>Значки</title>

<para>
Некоторые символы имеют специальное значение, когда возвращаются некоторыми переменными,
используемыми в <link linkend="skin-dlabel">dlabel</link>. Подразумевается, что эти символы
должны отображаться в виде значков, так для DVD потока можно отображать значок
красивого логотипа DVD вместо символа '<literal>d</literal>'.
</para>
<para>
Следующая таблица содержит список всех символов, которые могут использоваться для
отображения значков (и поэтому требуют другой шрифт).
</para>

<informaltable>
<tgroup cols="2">
<thead>
  <row><entry>Символ</entry><entry>Значок</entry></row>
</thead>
<tbody>
  <row><entry><keycap>p</keycap></entry><entry>воспроизведение</entry></row>
  <row><entry><keycap>s</keycap></entry><entry>стоп</entry></row>
  <row><entry><keycap>e</keycap></entry><entry>пауза</entry></row>
  <row><entry><keycap>n</keycap></entry><entry>без звука</entry></row>
  <row><entry><keycap>m</keycap></entry><entry>звук моно</entry></row>
  <row><entry><keycap>t</keycap></entry><entry>звук стерео</entry></row>
  <row><entry><keycap>f</keycap></entry><entry>файл</entry></row>
  <row><entry><keycap>v</keycap></entry><entry>Video CD</entry></row>
  <row><entry><keycap>d</keycap></entry><entry>DVD</entry></row>
  <row><entry><keycap>u</keycap></entry><entry>URL</entry></row>
</tbody>
</tgroup>
</informaltable>
</sect2>
</sect1>


<!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -->


<sect1 id="skin-gui">
<title>GUI сообщения</title>
<para>
Это сообщения, которые могут генерироваться кнопками, ползунками и элементами меню.
</para>

<variablelist>
<title>Управление воспроизведением:</title>
<varlistentry>
  <term><emphasis role="bold">evNext</emphasis></term>
  <listitem><para>
  Переход к следующему элементу списка воспроизведения.
  </para></listitem>
</varlistentry>

<varlistentry>
  <term><emphasis role="bold">evPause</emphasis></term>
  <listitem><para>
  Вместе с <literal>evPlaySwitchToPause</literal> формирует переключатель паузы.
  Может быть использовано для общей кнопки воспроизведение/пауза. Оба сообщения
  должны быть назначены кнопкам, находящимся практически в одной точке окна.
  Это сообщение ставит воспроизведение на паузу и показывает изображение кнопки с
  назначенным сообщением <literal>evPlaySwitchToPause</literal>
  (чтобы показать, что кнопка может быть нажата для продолжения воспроизведения).
  </para></listitem>
</varlistentry>

<varlistentry>
  <term><emphasis role="bold">evPlay</emphasis></term>
  <listitem><para>
  Старт воспроизведения.
  </para></listitem>
</varlistentry>

<varlistentry>
  <term><emphasis role="bold">evPlaySwitchToPause</emphasis></term>
  <listitem><para>
  Противоположность <literal>evPauseSwitchToPlay</literal>. Это сообщение
  запускает воспроизведение и показывает изображение кнопки с
  назначенным сообщением <literal>evPauseSwitchToPlay</literal>
  (чтобы показать, что кнопка может быть нажата для включения паузы).
  </para></listitem>
</varlistentry>

<varlistentry>
  <term><emphasis role="bold">evPrev</emphasis></term>
  <listitem><para>
  Переход к предыдущему элементу списка воспроизведения.
  </para></listitem>
</varlistentry>

<varlistentry>
  <term><emphasis role="bold">evStop</emphasis></term>
  <listitem><para>
  Останавливает воспроизведение.
  </para></listitem>
</varlistentry>
</variablelist>

<variablelist>
<title>Перемещение:</title>
<varlistentry>
  <term><emphasis role="bold">evBackward10sec</emphasis></term>
  <listitem><para>
  Перемещение назад на 10 секунд.
  </para></listitem>
</varlistentry>

<varlistentry>
  <term><emphasis role="bold">evBackward1min</emphasis></term>
  <listitem><para>
  Перемещение назад на 1 минуту.
  </para></listitem>
</varlistentry>

<varlistentry>
  <term><emphasis role="bold">evBackward10min</emphasis></term>
  <listitem><para>
  Перемещение назад на 10 минут.
  </para></listitem>
</varlistentry>

<varlistentry>
  <term><emphasis role="bold">evForward10sec</emphasis></term>
  <listitem><para>
  Перемещение вперед на 10 секунд.
  </para></listitem>
</varlistentry>

<varlistentry>
  <term><emphasis role="bold">evForward1min</emphasis></term>
  <listitem><para>
  Перемещение вперед на 1 минуту.
  </para></listitem>
</varlistentry>

<varlistentry>
  <term><emphasis role="bold">evForward10min</emphasis></term>
  <listitem><para>
  Перемещение вперед на 10 минут.
  </para></listitem>
</varlistentry>

<varlistentry>
  <term><emphasis role="bold">evSetMoviePosition</emphasis></term>
  <listitem><para>
  Перемещается к позиции (может использоваться ползунком;
  используется относительное (0-100%) положение ползунка).
  </para></listitem>
</varlistentry>
</variablelist>

<variablelist>
<title>Управление видео:</title>
<varlistentry>
  <term><emphasis role="bold">evHalfSize</emphasis></term>
  <listitem><para>
  Установить половинный размер окна.
  </para></listitem>
</varlistentry>
<varlistentry>
  <term><emphasis role="bold">evDoubleSize</emphasis></term>
  <listitem><para>
  Установить двойной размер окна.
  </para></listitem>
</varlistentry>
<varlistentry>
  <term><emphasis role="bold">evFullScreen</emphasis></term>
  <listitem><para>
  Включить/выключить полноэкранный режим.
  </para></listitem>
</varlistentry>
<varlistentry>
  <term><emphasis role="bold">evNormalSize</emphasis></term>
  <listitem><para>
  Установить нормальный размер окна.
  </para></listitem>
</varlistentry>
</variablelist>

<variablelist>
<title>Управление звуком:</title>
<varlistentry>
  <term><emphasis role="bold">evDecAudioBufDelay</emphasis></term>
  <listitem><para>
  Уменьшить задержку буфера звука.
  </para></listitem>
</varlistentry>

<varlistentry>
  <term><emphasis role="bold">evDecBalance</emphasis></term>
  <listitem><para>
  Уменьшить баланс.
  </para></listitem>
</varlistentry>

<varlistentry>
  <term><emphasis role="bold">evDecVolume</emphasis></term>
  <listitem><para>
  Уменьшить громкость.
  </para></listitem>
</varlistentry>

<varlistentry>
  <term><emphasis role="bold">evIncAudioBufDelay</emphasis></term>
  <listitem><para>
  Увеличить задержку буфера звука.
  </para></listitem>
</varlistentry>

<varlistentry>
  <term><emphasis role="bold">evIncBalance</emphasis></term>
  <listitem><para>
  Увеличить баланс.
  </para></listitem>
</varlistentry>

<varlistentry>
  <term><emphasis role="bold">evIncVolume</emphasis></term>
  <listitem><para>
  Увеличить громкость.
  </para></listitem>
</varlistentry>

<varlistentry>
  <term><emphasis role="bold">evMute</emphasis></term>
  <listitem><para>
  Выключить/включить звук.
  </para></listitem>
</varlistentry>

<varlistentry>
  <term><emphasis role="bold">evSetBalance</emphasis></term>
  <listitem><para>
  Установить баланс (может использоваться ползунком;
  используется относительное (0-100%) значение ползунка),
  </para></listitem>
</varlistentry>

<varlistentry>
  <term><emphasis role="bold">evSetVolume</emphasis></term>
  <listitem><para>
  Установить громкость (может использоваться ползунком;
  используется относительное (0-100%) значение ползунка),
  </para></listitem>
</varlistentry>
</variablelist>

<variablelist>
<title>Разное:</title>
<varlistentry>
  <term><emphasis role="bold">evAbout</emphasis></term>
  <listitem><para>
  Открыть окно 'О программе'.
  </para></listitem>
</varlistentry>

<varlistentry>
  <term><emphasis role="bold">evDropSubtitle</emphasis></term>
  <listitem><para>
  Отключает субтитры, использующиеся в данный момент.
  </para></listitem>
</varlistentry>

<varlistentry>
  <term><emphasis role="bold">evEqualizer</emphasis></term>
  <listitem><para>
  Включает/выключает эквалайзер.
  </para></listitem>
</varlistentry>

<varlistentry>
  <term><emphasis role="bold">evExit</emphasis></term>
  <listitem><para>
  Выход из программы.
  </para></listitem>
</varlistentry>

<varlistentry>
  <term><emphasis role="bold">evIconify</emphasis></term>
  <listitem><para>
  Сворачивает окно в иконку.
  </para></listitem>
</varlistentry>

<varlistentry>
  <term><emphasis role="bold">evLoad</emphasis></term>
  <listitem><para>
  Открывает файл (открывая окно навигации, в котором вы можете выбрать файл).
  </para></listitem>
</varlistentry>

<varlistentry>
  <term><emphasis role="bold">evLoadPlay</emphasis></term>
  <listitem><para>
  Делает то же, что и <literal>evLoad</literal>, но запускает вопроизведение файла
  автоматически после его загрузки.
  </para></listitem>
</varlistentry>

<varlistentry>
  <term><emphasis role="bold">evLoadSubtitle</emphasis></term>
  <listitem><para>
  Загружает файл с субтитрами (с диалогом выбора файла).
  </para></listitem>
</varlistentry>

<varlistentry>
  <term><emphasis role="bold">evLoadAudioFile</emphasis></term>
  <listitem><para>
  Загружает звуковой файл (с диалогом выбора файла).
  </para></listitem>
</varlistentry>

<varlistentry>
  <term><emphasis role="bold">evNone</emphasis></term>
  <listitem><para>
  Пустое сообщение, не имеет действий (за исключением, возможно, Subversion версий :-)).
  </para></listitem>
</varlistentry>

<varlistentry>
  <term><emphasis role="bold">evPlaylist</emphasis></term>
  <listitem><para>
  Открывае/закрывает окно со списком воспроизведения.
  </para></listitem>
</varlistentry>

<varlistentry>
  <term><emphasis role="bold">evPlayDVD</emphasis></term>
  <listitem><para>
  Пытается открыть диск в указанном устройстве DVD-ROM.
  </para></listitem>
</varlistentry>

<varlistentry>
  <term><emphasis role="bold">evPlayVCD</emphasis></term>
  <listitem><para>
  Пытается открыть диск в указанном устройстве CD-ROM.
  </para></listitem>
</varlistentry>

<varlistentry>
  <term><emphasis role="bold">evPreferences</emphasis></term>
  <listitem><para>
  Открывает окно с настройками.
  </para></listitem>
</varlistentry>

<varlistentry>
  <term><emphasis role="bold">evSetAspect</emphasis></term>
  <listitem><para>
  Включает показ пропорций изображения.
  </para></listitem>
</varlistentry>

<varlistentry>
  <term><emphasis role="bold">evSetURL</emphasis></term>
  <listitem><para>
  Отображает диалог ввода URL.
  </para></listitem>
</varlistentry>

<varlistentry>
  <term><emphasis role="bold">evSkinBrowser</emphasis></term>
  <listitem><para>
  Открывает окно навигации по скинам.
  </para></listitem>
</varlistentry>
</variablelist>
</sect1>


<!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -->


<sect1 id="skin-quality">
<title>Создание качественного скина</title>

<para>
Итак, вы прочитали о создании скина для
<application>MPlayer</application> GUI, прекрасно нарисовали все в
<application>Gimp</application> и желаете отправить скин нам?
Прочтите некоторые руководства для избежания основных ошибок и
создания высококачественного скина.
</para>

<para>
Мы хотим, чтобы скины, добавляемые нами в репозиторий, удовлетворяли
некоторым стандартам качества. Есть также несколько вещей,
сделающих вашу жизнь проще.
</para>

<para>
В качестве примера можете посмотреть на скин <systemitem>Blue</systemitem>,
начиная с версии 1.5, он удовлетворяет всем критериям, указанным ниже.
</para>

<itemizedlist>
  <listitem><para>
  Каждый скин должна идти с файлом
  <filename>README</filename>, содержащим информацию о вас, авторе,
  правах на копирование, лицензионным уведомлением и всем другим,
  что вам захочется добавить. Если хотите иметь историю изменений, то
  этот файл - хорошее место для нее.
  </para></listitem>

  <listitem><para>
  Должен быть файл <filename>VERSION</filename>,
  содержащий только номер версии скина в одной строке
  (например 1.0).
  </para></listitem>

  <listitem><para>
  Горизонтальные и вертикальные элементы управления
  (такие как ползунки громкости или положения) должны иметь
  кнопку-ползунок точно отцентрированную по центру самого ползунка.
  Должно быть возможно двигать кнопку к обоим концам ползунка,
  но не выходить за них.
  </para></listitem>

  <listitem><para>
  Элементы скина должны иметь правильные размеры,
  указанные в файле skin. Если это не так, вы сможете щелкнуть, например,
  мимо кнопки и все равно она сработает, или наоборот кликнуть на нее,
  не вызвав никакого действия.
  </para></listitem>

  <listitem><para>
  Файл <filename>skin</filename> должен быть набран аккуратно
  и не должен содержать символов табуляции. Аккуратно набран означает,
  что числа должны выравниваться стройно в столбцы.
  </para></listitem>
</itemizedlist>

</sect1>
</appendix>
