
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
— число точек (пикселей), а
bool
— true
или 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"/>
Тег 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. Тег 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). Дружественные узлы задают фокус ввода, когда элемент выбирается (клик мышью или ввод подчеркнутого на надписи (label
) символа).
buddy ссылается на id с помощью атрибута idref
. Очевидно, что это должен быть существующий id. К примеру:
<item type="label"> <stock type="username-label"/> <buddy idref="user-entry"/> [...] </item> [...] <item type="entry" id="user-entry"> [...] </item>