Детальное описание формата XML файла темы

Узел верхнего уровня

kdm тема это XML файл с тегом <greeter> в корне. Корневой узел — это узел элемента типа прямоугольник, с неявно фиксированным размещением.

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

Тег greeter может содержать узлы описанные в следующих разделах документа. Некоторые из этих узлов — контейнеры(узлы компоновщики, узлы элементы), которые могут содержать друге узлы.

Узлы элементы

Тема kdm создаётся специфичной иерархией узлов элементов и узлов компоновщиков. Узлы элементы могут иметь следующие значения атрибута type:

button

Поле кнопка. Это поле использует кнопку Qt.

Можно сделать любой другой элемент действующим как кнопка, присвоив его атрибуту button значение true. Но лучше использовать кнопки Qt, поскольку они являются доступными для пользователей с ограниченными возможностями.

entry

Виджет ввода такой, как однострочное поле вода или выпадающий список. Отметим, что это всего лишь прототип для виджетов Qt.

label

Надпись. Должна содержать либо узел text, либо stock узел stock чтобы задать текст.

list

Виджет отображающий список пользователей.

pixmap

Растровое изображение в формате поддерживаемом Qt, к примеру PNG, JPEG, Tiff и т.д.

rect

Простой прямоугольник.

svg

Векторное изображение в формате svg.

К примеру:

<item type="label">
Элемент действующий как кнопка:
<item type="rect" id="disconnect_button" button="true">.

По умолчанию, окно входа исчезнет после авторизации. Это может привести к мерцанию между окном входа и сессией. Атрибут background позволяет пользователям указать какие элементы темы — фоновое изображение. Это заставит kdm удалить все не фоновые элементы и прорисовать оставшиеся фоновые. Это может быть использовано для создания плавного перехода между окном входа и сессией:

<item type="rect" background="true">
  <normal file="background.svg"/>
  <pos x="0" y="0" width="100%" height="-75"/>
</item>
Чтобы использовать для перехода фон, отличный от фона окна входа, в теме следует задать два узла-элемента(содержащие растровое или svg изображение, к примеру). Элемент, соответствующий фону приветствия, должен не иметь свойство 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, то есть экран приветствия на всех экранах или не на всех.

Каждому элементу может быть дано имя с помощью атрибута id. Некоторые идентификаторы зарезервированы kdm, чтобы назначить элементам специальные функции:

Элементы 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 с type = plugin-domain-entry.
talkerТип этого элемента должен быть rect. Он представляет собой «горячую» область приветствия: он содержит надписи (label) и элементы ввода (entry), которые связаны с процессом авторизации. Если данный «диалоговый» плагин не соответствует существующим элементам, он попытается встроить комплексный виджет с собственным макетом в этот элемент, таким образом полностью заменив «talker»темы. Строго говоря, теме kdm не надо всегда предоставлять свой дизайн «talker»-а так как все kdm плагины авторизации могут использовать элемент talker.
userlistТип этого элемента должен быть list. Если активна возможность отобразить список пользователей, kdm встроит виджет списка пользователей сюда. В противном случае, этот элемент скрыт.
xconsoleТип этого элемента должен быть rect. Если при компиляции свойство xconsole включено, то kdm встроит виджет лога консоли сюда. В противном случае, этот элемент скрыт.
Другие элементы

kdm будет показывать/скрывать эти элементы в зависимости от конфигурации и состояния приветствия. kdm не навязывает им тип (атрибут type), но они обычно имеют тип.

IdОтображать только если ...
timed-label... происходит авторизация.
caps-lock-warning... нажата клавиша Caps Lock.
xauth-warning... X-Server нуждается в не X (не графической) авторизации для соединения.
userlist-rect.. доступен список пользователей. Вложив элемент-список пользователей сюда, можно создать нечто вроде рамки вокруг списка и он будет показываться только тогда, когда показан сам список пользователей.
xconsole-rectсвойство xconsole ключено. Аналогично userlist-rect.

Узлы компоновщики

Узлы компоновщики содержаться в узлах-элементах и, в свою очередь, содержат узлы-элементы. Тип узла компоновщика определяет расположение его дочерних узлов. Узел-элемент может содержать только один узел-компоновщик любого типа.

Узлы-боксы

Узлы-боксы автоматически располагает свои дочерние в строку. Они задаются следующим образом:

<box orientation="alignment" min-width="num" min-height="num"
    xpadding="num" ypadding="num" spacing="num"
    homogeneous="bool">
num — число точек (пикселей), а 
Здесь booltrue или false. Значением alignment может быть horizontal или vertical. Если вы пропустите какой нибудь атрибут, то он будет по умолчанию — 0 для числа, false для bool и vertical для ориентации.

spacing — расстояние между соседними дочерними элементами. padding — наружная граница. Если бокс однородный, то одинаковое пространство будет выделено для каждого дочернего элемента.

Фиксированные узлы

Фиксатор располагает свои дочерние элемент в заданных координатах. Размер этого контейнера это наименьший прямоугольник содержащий все дочерние элементы. Фиксатор не имеет дополнительных атрибутов и вы можете использовать его так:

<fixed>
Расположите другие элементы надлежащим образом внутри него.

Позиции узлов

Для каждого элемента можно определить его позицию и размер с помощью узлаpos. К примеру:

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

(прим. переводчика: width — ширина, height — высота) Если размер не задан, то он становится равным «естественному» размеру элемента, называемому идеальным размером. Заметим, что не все элементы имеют удобный размер.

Обе координаты и размер могут быть заданы в процентах и будут рассчитываться по отношению к размеру внешнего контейнера. Для элементов верхнего уровня это процент от всего экрана. Добавьте знак ^, чтобы размер заданного здесь элемента мог изменятся соответственно размера родительских элементов.

Если элемент содержит бокс, width и height можно задать как box. Таким образом они будут обозначать ширину и высоту бокса, то есть сумму элементов внутри бокса и расстояний между ними.

Или width, или height можно задать как scale. Тогда она будет масштабирована в соответствии с масштабом другого измерения сохранив пропорции идеального размера. Используйте эту опцию для сохранения пропорции автоматически масштабируемого изображения.

Если указан атрибут expand, и он равен true, то этот элемент будет растянут на всё свободное пространство бокса.

Если ширина или высота — простые числа, то отрицательное значение представляется как смещение относительно размера родительского элемента. Обратите внимание, что можно указать положительное смещение, написав два минуса.

В любом случае можно ограничить окончательный размер атрибутами min-width, min-height, max-width и max-height, которые могут быть указаны тем же способом, как ширина и высота.

Если x or y — простые числа, то отрицательные значение представляется как смещение относительно правого нижнего угла, в отличии от стандартного — от левого верхнего.

Кроме того, можно указать, относительно какой точки элемента задаётся позиция. Задайте атрибуту anchor значение: с — относительно центра, n — относительно центра верхней границы (англ. north — север), ne — относительно правого верхнего угла, e — относительно центра правой границы (англ. east — восток), se — относительно правого нижнего угла, s — относительно центра нижней границы (англ. south — юг), sw — относительно левого нижнего угла, w — относительно центра левой границы (англ. west — запад), nw — относительно левого верхнего угла. К примеру:

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

Отображение узлов

Вы можете задать атрибут type так, чтобы элемент отобразился, только если будет установлено определённое состояние системы. Приставка !задаст противоположное значение. Возможны следующие значения:

Тип (Type)Показать, если...
chooserразрешён удалённый вход.
halt и rebootразрешено выключение системы.
systemнет состояния (всегда установлено в kdm ).
plugin-entry-name«диалоговый» плагин предоставляет соответствующее поле ввода.

К примеру:

<show type="chooser"/>

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

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

Нормальные/Активные/Подсвеченные узлы

Вид большинства типов элементов может быть задан с помощью тегов:

normal

Нормальное состояние.

prelight

Когда мышь находится над элементом.

active

Когда клавиша мыши нажата на элементе.

Наборы доступных атрибутов зависят от типа элемента:

rect

<normal color="#000000" alpha="0.0"/>
Любой из атрибутов может быть опущен, в этом случае по используется значение умолчанию (the example represents the defaults). alpha — число с плавающей точкой между 0(прозрачный) и 1(непрозрачный). color — цвет заданный шестнадцатеричным числом, формат: «#rrggbb». Также, цвет может быть задан в формате «#aarrggbb», здесь aa — значение непрозрачности (alpha).

label

<normal color="#ffffff" alpha="1.0" font="Sans 14"/>
alpha и color задаются также как в элементе «rect» items.

Шрифт (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 дюйма(прим переводчика: 0,0352777777778 см)) или целое число px представляющее размер в пикселях. Размер в точках предпочтительней, т.к. он не зависит от разрешения экрана.

Если каждый атрибут опущен, то используются значения из узла-стиля.Если не задан цвет текста, используется белый. Значение шрифта по умолчанию настраивается в kdmrc.

pixmap, svg

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

file задаёт файл содержащий картинку. Путь задаётся относительно каталога темы.

Вместо файлов можно использовать обои, kdm будет искать изображения там, где KDE обычно хранит обои. Поддерживаются пакеты обоев плазмы.

element задаёт id элемента SVG файла. Если пусто, то будет прорисовано всё SVG изображение.

Для узлов-астровых изображений, можно предоставить несколько картинок так, чтобы использовалось изображение в лучшем качестве для данного разрешения. Имена файлов с отметкой размера имеют формат:основноеИмя-ширинаxвысота.расширение Если существует файл без метки размера, и это не пакет обоев плазмы, то kdm примет только идеально подходящие для данного размера файлы и иначе вернётся к исходному файлу. В противном случае он будет пытаться найти изображение, размер которого ближе всего к необходимому, если совершенное соответствие не найдено.

scalemode определяет, как изменить размер изображения, которое не соответствуют размеру элемента. free (по умолчанию) означает просто масштабировать изображение до нужного размера, возможно, исказив его пропорции. Два других метода поддерживают пропорции изображения: fit — увеличить изображение до максимального размера, который вписывается в геометрию элемента. Картинка будет отцентрована. Оставшиеся области не будут заполнены этим элементом, поэтому он будет окрашен сплошной заливкой. crop — увеличить картинку до минимального размера полностью заполняющего элемент. Картинка будет симметрично обрезана.

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

Узлы стиля виджета

Это тег дает возможность менять внешний вид надписей и включённых в тему Qt виджетов, например: однострочные поля ввода, кнопки и список пользователей. Дочерние элементы наследуют параметры настройки стиля, но могут переопределить их. Значения по умолчанию берутся из kdmrc.

Атрибут font устанавливает значения для всех виджетов. Для виджетов ввода это может переопределено атрибутом edit-font. Шрифты задаются также как в нормальных/активных/подсвеченных узлах.

Обычно движок прорисовки темы удаляет все рамки, чтобы Qt виджеты плавно вписывались в тему. В случае, когда это нежелательно, надо присвоить атрибуту frame значение true.

Атрибут guistyleможно использовать для переопределения графического стиля Qt для встроенных виджетов. Значением по умолчанию берётся GUIStyle из kdmrc

озможно задать почти всю палитру для виджетов, как описано на сайте Trolltech. (прим. переводчика: палитра(palette) взята из Qt. Есть не оф. перевод документации, надеюсь когда нибудь доберутся и до этой страницы. Я про палитру читал в книге Макса Шлее "Qt4.5 Профессиональное программирование на C++") Имена атрибутов состоят из сферы применения, цветовой роли и суффикса. Поддерживаемые сферы: all- для всех цветовых групп, без сферы и для активных и для не активных цветовых групп, active- (активно), inactive-(неактивно) и disabled-(выключено) для соответствующий цветовых групп. Поддерживаемые цветовые роли: window, window-text, base, alternate-base, text, bright-text, highlight, highlighted-text, button и button-text. Суффиксы могут быть -color или -alpha с соответствующими значениями как в нормальных/активных/подсвеченных узлах.

Альтернативой задания палитры в одной строке является атрибут colorscheme, используемый для загрузки схемы цветов KDE. Значением по умолчанию берётся ColorScheme из kdmrc. Индивидуальный цвет можно переопределить цветами схемы (атрибуты color).

К примеру:

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

Face Browser Color Nodes

Тег color позволяет переопределить цвет фона элементов в Face Browser. labelcolor и altlabelcolor эквивалентыall-base-color и all-alternate-base-color в узлах стиля. Альтернативный элемент фона отключён только, если задан labelcolor.

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

Текстовые узлы

Тег text используется надписями(label). Он может быть использован для отображения локализованного (переведённого) текста (если атрибут xml:lang опущен, то подразумевается локаль POSIX):

<text xml:lang="fr">Option</text>

Текстовые узлы могут содержать специальные последовательности символов:

ПоследовательностьВставляемые на её место значения.
%%Символ '%'.
%cЧасовой пояс
%dИмя экрана (DISPLAY — переменная окружения)
%hИмя хоста.(вывод функции gethostname)
%mИмя машины (machine — часть вывода функции uname)
%nИмя узла (nodename — часть вывода функции uname)
%oИмя домена (вывод функции getdomainname)
%rИмя выпуска(release — часть вывода функции uname)
%sИмя системы (sysname — часть вывода функции uname)
%tОставшееся число секунд пока можно авторизоваться, плюс подходящая множественная форма переведённого слова «second». По истечению этого срока авторизуется пользователь, выбранный в настройках системы для автовхода.
%uИмя пользователя, который авторизуется автоматически.
_Causes the following character to be an accelerator

%t и %u предполагается использовать только внутриtimed-label, которое обновляется каждую секунду.

Узлы Stock

екоторые общие локализованные надписи могут быть указаны через теги stock. Тег text игнорируется если используется тег stock. На самом деле вам следует использовать stock, а не вкладывать все переводы в тему. Это даст более быструю загрузку и, вероятно, лучшее качество перевода. Возможны следующие значения: (прим. переводчика: перевод может отличатся от моего, но смысл тот же.)

Тип (Type)Вставляемые на её место значения.
caps-lock-warning«Клавиша Caps Lock нажата»
chooser«XDMCP Choose_r»
quit«Выход»
disconnect«Разорвать соединение»
halt«Выключить питание»
language«Язык»
login«Логин»
session«Тип сессии»
reboot«Перезагрузить»
system«Меню»
timed-label«Пользователь %u будет авторизован через %t»
domain-label«Домен»
username-label«Имя пользователя:»
password-label«Пароль:»
welcome-label«Добро пожаловать в %h»

К примеру:

<stock type="welcome-label"/>

Дружественные (Buddy) узлы

Элементы которые не вызывают действие напрямую могут быть указаны как дружественные (buddy). Дружественные узлы задают фокус ввода, когда элемент выбирается (клик мышью или ввод подчеркнутого на надписи (label) символа).

buddy ссылается на id с помощью атрибута idref. Очевидно, что это должен быть существующий id. К примеру:

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