# Теми для вітального вікна &kdm;

У цьому розділі описано створення тем для вікна входу до системи. Приклади зі знімками екрана ви можете знайти у встановлених стандартних темах і темах з вебсайта тем.

## Огляд теми

Створити тему для &kdm; означає створитися XML-файл відповідно до специфікацій, визначених у файлі `$`KDEDIR`/share/apps/doc/kdm/greeter.dtd`. Файли тем зберігаються у каталозі `$`KDEDIR`/share/apps/kdm/themes/`назва_теми``. У каталозі теми має міститися файл з назвою `KdmGreeterTheme.desktop`, формат якого подібний до інших файлів `.desktop` і виглядає приблизно так:

    [KdmGreeterTheme]
    Greeter=circles.xml
    Name=Circles
    Name[uk]=Кола
    Description=Theme with blue circles
    Author=Bond, James Bond
    Copyright=(c) 2002 Bond, James Bond
    Screenshot=screenshot.png

Поля `Name`, `Description`, `Author` і `Copyright` можна перекладати у спосіб, подібних на той, що використовується у інших файлах `.desktop`. Всі згадані у цьому файлі файли повинні знаходитися у одній теці. Поле `Screenshot` має вказувати на файл знімка екрана теми у дії, розміром 200x150 пікселів (нічого, якщо такого файла не буде, але, з точки зору користувача, було б краще, якби ви все ж його зробили). Запис `Greeter` вказує на XML-файл, у якому міститься опис теми.

Після того, як ви проведете повне випробування теми, запакуйте у архів (.tar.bz2) каталог з темою, щоб згодом його можна було встановити до каталогу `$`KDEDIR`/share/apps/kdm/themes`. Цей архів і є стандартним форматом для поширення тем &kdm;.

## Докладний опис XML-формату теми

### Вузол найвищого рівня

Теми &kdm; — це XML-файли з кореневим тегом <greeter>. Вузлом найвищого рівня є вузол item типу `rect` з неявним фіксованим компонуванням.

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE greeter SYSTEM "greeter.dtd">
    <greeter>
    [...]
    </greeter>

У наступних розділах цього документа описано вузли, що можуть міститися між тегами greeter. Деякі з цих вузлів є контейнерами (вузли layout і item), всередині яких містяться інші вузли.

### Вузли Item

Тема &kdm; створюється побудовою ієрархії вузлів item і layout. Вузли item можуть мати такі значення атрибута `type`:

button

- Поле кнопки. Це поле використовує кнопку Qt.

  Також можна зробити поведінку будь-якого іншого елемента подібною на поведінку кнопки, якщо встановити його атрибут `button` у значення `true`. Але краще все ж використовувати у &kdm; Qt-кнопки, оскільки до таких кнопок легше отримати доступ користувачам з обмеженими можливостями.

entry

- Віджет для введення інформації на зразок поля редагування або спадного списку. Зауважте, що це лише заповнювач для віджетів Qt.

label

- Текстова мітка. У ній має міститися або вузол `text`, або вузол `stock`, який визначатиме текст мітки.

list

- Віджет для перегляду зображень користувачів.

pixmap

- Растрове зображення у форматі, який підтримує Qt, наприклад PNG, JPEG, Tiff тощо.

rect

- Простий прямокутний.

svg

- Векторне зображення у форматі SVG.

Приклад:

    <item type="label">

Елемент, що працюватиме як кнопка:

    <item type="rect" id="disconnect_button" button="true">.

Типовою є поведінка, коли екран входу до системи &kdm; зникає після розпізнавання. Це може спричинити блимання між екраном входу і сеансом. Атрибут `background` надає користувачам можливість вказати, які саме елементи теми є зображеннями тла. Якщо використовувати цей атрибут, &kdm; після розпізнавання вилучить всі елементи, що не стосуються тла і показуватиме лише елементи з атрибутом `background` основного вікна. Таким чином перехід від вікна входу до сеансу буде плавним:

    <item type="rect" background="true">
      <normal file="background.svg"/>
      <pos x="0" y="0" width="100%" height="-75"/>
    </item>

Щоб мати можливість використовувати тло для переходу до сеансу, відмінне від того, яке було використано під час розпізнавання, у темі слід визначити два вузли елементів (item), у яких мають міститися, наприклад, відомості про растрові або svg-зображення. Вузол item, який відповідатиме тлу вітального вікна (greeter) не повинен мати властивості `background`, тоді як вузол, що відповідатиме перехідному тлу повинен мати таку властивість. Приклад:

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE greeter SYSTEM "greeter.dtd">
    <greeter>
      <item type="rect" background="true">
        <normal file="background_for_login.svg" element="background"/>
        <pos x="0" y="0" width="100%" height="100%"/>
      </item>
      <item type="rect">
        <normal file="background_for_greeter.svg"/>
        <pos x="0" y="0" width="100%" height="100%"/>
      </item>
      [...]
    </greeter>

У конфігураціях з декількома екранами за допомогою тем можна визначати вигляд екранів, відмінних від того, на якому з’являється вікно входу до системи, — але у такому випадку на них з’являтимуться лише елементи тла. Щоб визначити, на яких екранах має з’явитися елемент, можна скористатися атрибутом `screen`, який може приймати одне зі значень: `greeter`, `other` або `all`. Ці значення позначають екран, на якому відкрито вікно входу до системи, всі екрани, на яких цього вікна немає, та всі екрани, відповідно.

Кожному елементу (item) може бути надано назву за допомогою атрибута `id`. &kdm; розрізняє декілька id, які мають певне функціональне навантаження:

елементи `button` і елементи з атрибутом `button="true"`.

- Кнопки, зазвичай, використовуються для виконання певних дій. Крім того, &kdm; сховає кнопки, якщо пов’язані з ними дії недоступні з якоїсь причини.

  Id Дія
  - chooser_button Запускає засіб вибору XDMCP.
  - disconnect_button Від’єднатися від віддаленого сеансу.
  - session_button Відкриває меню вибору типу сеансу.
  - system_button Відкриває загальне меню з різноманітними параметрами і діями, список яких залежить від конфігурації системи.

Елементи `label`

- &kdm; може показувати або ховати ці елементи і змінювати їх текст залежно від стану діалогового вікна входу до системи.

  Id Функція
  - pam-error Показує повідомлення Спроба входу зазнала невдачі..

Елементи для вбудовування віджетів

- У ці елементи &kdm; може вбудовувати окремі віджети Qt.

  Id Функція
  - user-entry Поле для введення імені користувача.
  - pw-entry Поле для введення пароля.
  - domain-entry Деякі з додатків обміну інформацією використовують це поле для запиту щодо назви домену. Якщо у темі є це поле, відповідні внутрішні елементи повинні мати вузли show з типом `plugin-domain-entry`.
  - talker Цей елемент має належати до типу `rect`. Йому відповідає робоча частина вітального вікна: у ньому містяться елементи `label` і `entry`, які стосуються процесу розпізнавання. Якщо вказаний додаток обміну інформацією не може знайти потрібні елементи, він намагається вбудувати віджет з власним компонування у цей елемент, і таким чином, повністю заміщує talker з теми. Строго кажучи, темам &kdm; взагалі не потрібні елементи talker, оскільки всі додатки розпізнавання у &kdm; мають вбудовані елементи `talker`.
  - userlist Цей елемент має належати до типу `list`. Якщо увімкнено можливість вибору користувача зі списку, &kdm; вбудує сюди віджет списку користувачів. У іншому випадку цей елемент буде приховано.
  - xconsole Цей елемент має належати до типу `rect`. Якщо &kdm; зібрано з вбудованою можливістю `xconsole` і цю можливість увімкнено, &kdm; вбудує віджет журналу консолі у вказаному місці. У іншому випадку елемент буде приховано.

Інші елементи

- &kdm; буде показувати або приховувати ці елементи залежно від налаштувань і поточного стану вітального вікна. &kdm; не накладає на них вимог належності до певного типу, але, зазвичай, вони самі належать до певного типу.

  Id Показувати, лише якщо...
  - timed-label ... відбувається вхід за таймером.
  - caps-lock-warning ... задіяно Caps Lock.
  - xauth-warning ... серверові X для з’єднання потрібне розпізнавання без X.
  - userlist-rect ... увімкнено можливість вибору користувача зі списку. Якщо розмістити елемент `userlist` всередині цього елемента, можна створити щось на зразок рамки навколо списку, яку буде показано, лише якщо показано сам список користувачів.
  - xconsole-rect ... увімкнено вбудовану `xconsole`. Подібний до `userlist-rect`.

### Вузли контейнерів компонування

Вузли компонування знаходяться всередині вузлів елементів (item) і самі містять вузли елементів. Тип вузла компонування визначає розташування його дочірніх вузлів. Вузол елемента може містити лише по одному вузлу компонування кожного типу.

#### Вузли-блоки

Вузли-блоки автоматично розташовують свої дочірні вузли у рядок. Ці вузли визначаються наступним чином:

    <box orientation="alignment" min-width="num" min-height="num"
        xpadding="num" ypadding="num" spacing="num"
        homogeneous="bool">

Де `num` відповідає кількості пікселів, а `bool` приймає значення `true` або `false`. Значенням параметра `alignment` може бути `horizontal` або `vertical`. Типовими значеннями атрибутів, які встановлюватимуться, якщо ви не вкажете значення, будуть нуль для числових атрибутів, `false` для булівських і `vertical` для орієнтації.

Параметр spacing визначає відстань між двома сусідніми дочірніми елементами. Параметр padding — зовнішнє поле блоку. Якщо блок складається з однакових елементів, кожному дочірньому елементу буде виділено однаковий простір.

#### Фіксовані вузли

Фіксованим називається контейнер, у якому дочірні елементи розташовано у точно визначених позиціях. Розмірами такого контейнера є сторони найменшого прямокутника, що містить всі його дочірні елементи. У фіксованого вузла немає атрибутів, отже, його можна записувати так:

    <fixed>

Після цього запису ви можете вказати інші елементи, що містять відповідні вузли розташування.

### Вузли розташування

Розташування і розмір кожного елемента можна вказати за допомогою вузла `pos`. Приклад:

    <pos x="0" y="4" width="100%" height="100%"/>

Якщо розмір не було вказано, ним буде природній розмір елемента, який також називають рекомендованим розміром. Зауважте, що не всі елементи мають належний рекомендований розмір.

Обидва значення, розташування і розмір, можна вказувати у відсотках, які буде обчислено відносно розмірів зовнішнього контейнера елементів. Для елементі найвищого рівня ці відсотки обчислюватимуться від розмірів екрана. Додаванням кришечки (`^`) до вказаного розміру можна визначити, що цей розмір у відсотках слід обчислювати не відносно зовнішнього контейнера, а відносно контейнера, що містить зовнішній контейнер.

Якщо у елементі міститься блок, величинам `width` і `height` можна надати значення `box`, це означатиме, що ці величини рівні ширині і висоті блоку, які обчислюються на основі розмірів елементів блоку і розмірів його полів.

Одна з величин `width` або `height` може приймати значення `scale`, що означає, що значення цієї величини слід обчислити на основі іншого розміру елемента і співвідношення рекомендованих розмірів елемента. Використовуйте подібний запис, щоб зберігати співвідношення сторін зображень у автоматичному режимі.

Якщо визначено атрибут `expand` і він має значення `true`, відповідний елемент буде максимально розтягнуто в рамках обмежувального блоку (тобто цьому елементу буде надано більше місця, якщо це можливо).

Якщо `width` або `height` є від’ємними числами, це означає, що відповідний розмір слід обчислити додавши це від’ємне значення до розмірів зовнішнього контейнера. Зауважте, що можна перевищувати розміри зовнішнього контейнера, якщо записати значення з двома знаками «мінус».

У всіх випадках остаточні розміри можна обмежити за допомогою атрибутів `min-width`, `min-height`, `max-width` і `max-height`, які можна визначити у той же спосіб, що і `width` з `height`.

Якщо `x` або `y` є від’ємними значеннями, це означає, що відраховувати ці координати слід від правого і нижнього країв, а не від лівого і верхнього, як було б для додатних значень.

Також можна визначити, до якої точки елемента слід прив’язати вказані координати розташування. Цей атрибут називається anchor і може приймати значення `c` (центр), `n`, `ne`, `e`, `se`, `s`, `sw`, `w` і `nw`, які відповідають румбам на топографічній карті. Типовим значенням є `nw`, це відповідає верхньому лівому куту. Приклад:

    <pos x="10%" y="50%" anchor="w" width="80%" height="95"/>

### Вузли показу

Ви можете вказати атрибут `type` (тип), щоб певні елементи було показано, лише якщо встановлено цей тип. Якщо розташувати перед типом знак оклику (`!`) умова перетвориться на протилежну. Можливі значення такі:

Тип Показувати якщо...
- `chooser` дозволено перемикання на віддалений вхід до системи.
- `halt` і `reboot` дозволено завершувати роботу системи.
- `system` без умови (завжди встановлено у &kdm;).
- `plugin-``назва-запису` додаток обміну інформацією має відповідне поле для вводу інформації.

Приклад:

    <show type="chooser"/>

Крім того, ви можете вказати значення `min-screen-width` або `min-screen-height`, щоб певні елементи було показано, лише якщо роздільна здатність екрана не менша за вказані значення. Приклад:

    <show min-screen-height="768"/>

### Вузли Normal/Active/Prelight

Вигляд більшості типів елементів можна параметризувати за такими тегами:

`normal`

- Звичайний стан

`prelight`

- Стан, коли вказівник миші знаходиться над елементом.

`active`

- Стан, коли ви натиснули на елемент за допомогою миші.

Повний список атрибутів залежить від типу елемента:

`rect`

-     <normal color="#000000" alpha="0.0"/>

  Кожен з атрибутів може бути пропущено, у цьому випадку буде використано типове значення (у прикладі показано типові значення). `alpha` — це дійсне число з плаваючою крапкою, яке належить проміжку між нулем (прозорий елемент) і одиницею (повністю непрозорий елемент). `color` — має значення у вигляді значка решітки з наступним шістнадцятковим числом з шести цифр; його формат — `#``rrggbb`. Крім того, `color` можна визначити і у вигляді шістнадцяткового числа з восьми цифр, у цьому випадку перші дві цифри визначають значення прозорості (alpha).

`label`

-     <normal color="#ffffff" alpha="1.0" font="Sans 14"/>

  `alpha` і `color` визначаються так само, як і у елементах rect.

  `font` має формат `список сімей` `параметри_гарнітури` `розмір`. Всі ці частини не є обов’язковими.

  `список сімей` — це розділений комами список сімей шрифтів, на зразок helvetica, monospace тощо.

  `параметри_стилю` — це список розділений пробілами ключових слів з категорій гарнітури, ваги і розтягнутості; кожна категорія використовується не більше одного разу. Гарнітурою може бути `normal`, `italic` або `oblique`. Вага може бути `ultra-light`, `light`, `medium`, `semi-bold`, `bold`, `ultra-bold` або `heavy`. Можливі значення розтягування це `ultra-condensed`, `extra-condensed`, `condensed`, `semi-condensed`, `normal`, `semi-expanded`, `expanded`, `extra-expanded` і `ultra-expanded`.

  `розмір` є дійсним числом з плаваючою крапкою, що відповідає розміру шрифту у точках (1/72 дюйма) або цілим числом, за яким іде запис `px`, що відповідає розміру шрифту у пікселях. Слід віддавати перевагу розмірам у точках, оскільки вони не залежать від роздільної здатності екрана.

  Якщо пропущено один з атрибутів, його значення буде встановлено за допомогою вузла style. Якщо цей вузол не містить визначень для кольорів вікна і тексту, буде використано білий. Типовим шрифтом буде налаштований у &kdmrc;.

`pixmap`

`svg`

-     <normal file="picture.png" tint="#dddddd" alpha="1.0"/>

  `file` вказує на файл з зображенням. Відносні назви файлів визначаються відносно каталогу теми.

  `wallpaper` можна скористатися замість `file`, щоб наказати &kdm; шукати зображення у звичайним місцях для зберігання зображень тла (шпалер) &kde;. Передбачено підтримку пакунків шпалер Плазми.

  `element` вказує на ідентифікатор елемента файла SVG. Якщо має порожнє значення, буде показано ціле зображення SVG.

  Ви можете визначати для вузлів `pixmap` декілька зображень так, щоб програма вибрала зображення з найбільшою можливою роздільною здатністю, файли відповідних роздільних здатностей матимуть назви у форматі `базова_назва``-``ширина` `x` `висота``.``суфікс`. Якщо буде виявлено файл без позначки розміру, який не належить до пакунка шпалер Плазми, &kdm; використає лише зображення з точною відповідністю вказаними розмірам і повернеться до використання початкового файла, якщо відповідності не буде. Якщо ж файл належить до пакунку Плазми, програма спробує знайти зображення з розмірами, які є найближчими до потрібних, якщо не буде встановлено точної відповідності розмірів.

  `scalemode` визначає спосіб зміни розмірів зображення, розміри якого не збігаються з розмірами відповідного елемента. Спосіб `free` (типовий) передбачає просте масштабування зображення до належних розмірів, можливо, зі зміною співвідношення сторін. За використання інших двох способів співвідношення сторін зображення зберігається: спосіб `fit` означає збільшення зображення до максимального розміру, який вкладається у геометричні параметри елемента. Зображення, змінене у такий спосіб, буде розташовано по центру. Решту площі елемента намальовано не буде: елемент буде просто розташовано на тлі суцільного кольору елемента `rect`. Спосіб `crop` означає зміну масштабу зображення до мінімального розміру, за якого воно повністю вкриватиме елемент. Зайву площу зображення буде просто симетрично обрізано.

  `tint` і `alpha` визначають колір подібно до того, як це робиться для елементів `rect`. Колір кожного пікселя зображення буде помножено на цей колі покомпонентно.

### Вузли стилю віджетів (style)

Цей тег надає можливість змінювати вигляд міток і віджетів Qt, які вбудовано у тему, наприклад полів редагування, кнопок або списку користувачів. Параметри стилю успадковуються дочірніми елементами, але можуть бути перевизначені у кожному окремому вузлі. Типові значення буде взято з &kdmrc;.

Атрибут `font` визначає шрифт для всіх віджетів. У віджетах для введення інформації його можна перевизначити за допомогою атрибута `edit-font`. Шрифти визначаються так само, як для вузлів normal/active/prelight.

Зазвичай, рушій для роботи з темами намагається вилучити всі рамки віджетів Qt так, щоб вони органічно влилися у тему. У випадку, коли така поведінка є небажаною, ви можете встановити значення атрибута `frame` рівним `true`.

Атрибутом `guistyle` можна скористатися для перевизначення стилю графічного інтерфейсу Qt для вбудованих віджетів. Типовий стиль визначається параметром `GUIStyle` у &kdmrc;

Можна визначити майже всі віджети, які є у документації на сайті Trolltech. Назви атрибутів залежать від контексту, ролі кольору і суфікса. Можливими контекстами є, за порядком збільшення пріоритету: `all-` для всіх груп кольорів, без контексту для активний або неактивних груп кольорів, `active-`, `inactive-` і `disabled-` для відповідної групи кольорів. До ролей кольорів, що підтримуються, належать: `window`, `window-text`, `base`, `alternate-base`, `text`, `bright-text`, `highlight`, `highlighted-text`, `button` ф `button-text`. Суфіксом може бути одне з значень: `-color` or `-alpha`, їх значення вже було пояснено у описі вузлів normal/active/prelight.

Альтернативою до вбудованого визначення палітри є атрибут `colorscheme`, яким можна скористатися для завантаження повної схеми кольорів &kde;. Типове значення схеми визначається параметром `ColorScheme` у &kdmrc;. Окремі визначення `color` змінять відповідні кольори з типової схеми.

Приклад:

    <style edit-font="Comic 16" text-color="#dddddd" frame="true"/>

### Вузли кольорів переглядача зображень користувачів

Вузли кольорів перевизначають колір тла елементів переглядача зображень користувачів. `labelcolor` і `altlabelcolor` по суті відповідають `all-base-color` та. `all-alternate-base-color` для вузлів стилю. Якщо вказано лише `labelcolor`, зміну тла елементів буде вимкнено.

    <color labelcolor="#80ffffff" altlabelcolor="#80f0f0f0"/>

### Текстові вузли

Текстові теги використовують для міток. Їх також можна використовувати для відображення локалізованого тексту ось так (якщо пропущено атрибут `xml:lang`, буде використано значення локалі POSIX locale):

    <text xml:lang="uk">Параметр</текст>

Текстові вузли можуть містити такі особливі послідовності символів з відповідним значенням:

Послідовність Значення
- %% Позначення для символу %
- %c Час і дата системного годинника
- %d Назва дисплея (значення змінної середовища `DISPLAY`)
- %h Назва вузла (вивід команди `gethostname`)
- %m Назва комп’ютера (частина machine виводу команди `uname`)
- %n Назва вузла (частина nodename виводу команди `uname`)
- %o Назва домену (вивід команди `getdomainname`)
- %r Назва випуску системи (частина release виводу команди `uname`)
- %s Назва системи (частина sysname виводу команди `uname`)
- %t Час у секундах, що залишився до входу за таймером плюс відповідна форма множини i18n слова секунда
- %u Ім’я користувача для входу за таймером
- _ Робить клавішу для наступного символу клавіатурним скороченням

`%t` і `%u` призначено лише для внутрішнього використання, щоб показати повідомлення `timed-label`, яке автоматично оновлюється щосекунди.

### Вузли-пакети

Деякі звичайні мітки для перекладу можна визначити за допомогою пакетних тегів (stock). Тег `text` буде проігноровано, якщо використано тег `stock`. Використанню пакетних тегів слід надавати перевагу перед простим додаванням перекладів прямо у тіло теми. Пакетні теги пришвидшують завантаження і можуть бути краще перекладені. Можна використовувати такі значення:

Тип Значення
- caps-lock-warning Caps Lock is enabled
- chooser XDMCP Choose_r
- quit _Quit
- disconnect Disconn_ect
- halt Power o_ff
- language Lan_guage
- login _Login
- session Session _Type
- reboot Re_boot
- system _Menu
- timed-label User %u will login in %t
- domain-label _Domain:
- username-label _Username:
- password-label _Password:
- welcome-label Welcome to %h

Приклад:

    <stock type="welcome-label"/>

### Вузли-приятелі (buddy)

Елементи, які не беруть участі у діях напряму, можна назвати приятелями (buddy). Приятель отримує фокус введення інформації, якщо задіяно початковий елемент (його натиснуто або введено клавіатурне скорочення, визначене `label`).

Посилання на приятеля виконується за ідентифікатором, який визначається атрибутом `idref`. Очевидно, йому слід передати значення ідентифікатора (id). Приклад:

    <item type="label">
      <stock type="username-label"/>
      <buddy idref="user-entry"/>
      [...]
    </item>
    [...]
    <item type="entry" id="user-entry">
      [...]
    </item>