# Теми для вітального вікна &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>

Кожному елементу (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` вказує на файл з зображенням. Відносні назви файлів визначаються відносно каталогу теми.

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

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

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

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

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

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

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

Можна визначити майже всі віджети, які є у документації на сайті 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.

Приклад:

    <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
_Language
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>