Перевод статьи о создании тем для kdm

Изображение пользователя _KoT_.

Имеется Chapter 6. Creating themes for the kdm greeter в документации по KDE. Переводил для себя. Пусть здесь лежит, может кому пригодится.

6. Создание тем для kdm
Предпросмотр тем
Детальное описание формата XML файла темы
Узел верхнего уровня
Узлы-элементы
Узлы-компоновщики
Позиции узлов
Отображение узлов
Нормальные/Активные/Подсвеченные узлы
Узлы стиля виджетов
Узлы цвета Face Browser
Узлы-текст
Узлы Stock
Дружественные(Buddy) узлы

Глава 6. Создание тем для kdm

Этот раздел описывает создание тем для темизованого приветствия. Примеры со снимками экрана смотрите в стандартных темах и в темах с сайта оформления

Предпросмотр темы

Kdm темы могут быть созданы с помощью XML файла следующего спецификации из $KDEDIR/share/apps/doc/kdm/greeter.dtd. Файлы темы хранятся в каталоге $KDEDIR/share/apps/kdm/themes/имя_темы. Каталог темы должен содержать файл названный KdmGreeterTheme.desktop, который имеет схожий с другими *.desktop файлами формат и выглядит подобно:
[KdmGreeterTheme]
Greeter=circles.xml
Name=Circles
Description=Theme with blue circles
Author=Bond, James Bond
Copyright=(c) 2002 Bond, James Bond
Screenshot=screenshot.png

Поля Name, Description, Author and Copyright могут быть переведены, также как и в других файлах *.desktop. Все упомянутые файлы должны находится в каталоге темы. Поле Screenshot указывает на файл в котором располагается картинка 200x150 изображающая тему в действии (ни чего страшного, если она отсутствует, но её существование удобно для пользователя). Поле Greeter указывает на XML файл содержащий тему.
Как только тема была полностью протестирована, сделайте архив с каталогом, который будет установлен в $KDEDIR/share/apps/kdm/themes. Это стандартный формат.

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

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

Kdm тема это XML файл с тегом в своём корне. Корневой узел — это узел элемента типа прямоугольник, с неявно фиксированным размещением.
<?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
Надпись. Должен содержать либо текстовый узел, либо узел stock чтобы задать текст.
list
A face browser widget.
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, а элемент, соответствующий фону перехода, должен иметь свойства 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, ot [пиииии!] или all(основной, другие или все), то есть экран приветствия на всех экранах или не на всех.
Каждому элементу может быть дано имя с помощью атрибута id. Некоторые идентификаторы зарезервированы kdm, чтобы назначить элементам специальные функции:
элементы-кнопки и элементы с атрибутом button="true"
Кнопки обычно вызывают определенные действия. Kdm будет скрывать кнопки, действия которых не доступны по некоторым причинам.
Id Действие
chooser_button Вызвать выбор XDMCP.
disconnect_button Отключиться от удалённой сессии.
session_button Открыть меню выбора типа сессии.
system_button Открыть общее меню с различными опциями и действия, в зависимости от конфигурации.
элементы-надписи
Kdm будет показывать/скрывать эти надписи и устанавливать их текст в зависимости от состояния диалога-входа.
Id Функция
pam-error Отображает сообщение о неверной авторизации.
элементы-встраиваемые виджеты
Kdm будет встраивать особы виджеты Qt на место этих элементов.
Id Функция
user-entry Поле ввода для имени пользователя.
pw-entry Поле ввода для пароля.
domain-entry Некоторые диалоговые плагины используют это поле для запроса доменного имени. Если это поле присутствует, то содержащий его элемент должен содержать узлы типа plugin-domain-entry.
talker Тип этого элемента должен быть rect. Он представляет собой "горячую" область приветствия: он содержит надписи и элементы ввода, которые связаны с процессом авторизации. Если данный диалоговый плагин не соответствует существующим элементам, он попытается встроить комплексный виджет с собственным макетом в этот элемент, таким образом полностью заменив "talker" темы. Строго говоря, ntvt 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. Тогда она будет масштабирована в соответствии с масштабом другого измерения сохранив пропорции идеального размера. Используйте эту опцию для сохранения пропорции автоматически масштабируемого изображения.
Если ширина или высота — простое число, то отрицательное значение представляется как смещение относительно размера родительского элемента. Обратите внимание, что можно указать положительное смещение, написав два минуса.
В любом случае можно ограничить окончательный размер атрибутами min-width, min-height, max-width and max-height, которые могут быть указаны в тем же способом, как ширина и высота.
Если x или 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 разрешены перезагрузка и выключение системы.
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.
Шрифт (font) задаётся в формате: "имена_шрифтов параметры_стиля размер". Каждая часть необязательна.
имена_шрифтов — перечисленные через запятую имена шрифтов наподобие: “helvetica”, “monospace” и т.д.
параметры_стиля — разделённые пробелом зарезервированные слова из категорий стиль, толщина или разрежение; из каждой категории можно указать только одно слово. Стиль: normal (нормальный), italic (курсив) или oblique (наклонный). Толщина: ultra-light (сверхтонкая), light (тонкая), medium (средняя), semi-bold (полужирная), bold (жирная), ultra-bold (сверхжирная) или heavy (увесистая :) ). Разрежение: comprise (свёрнутый), ultra-condensed (сверхсжатый), extra-condensed (экстрасжатый), condensed (сжатый), semi-condensed (полусжатый), normal (нормальный), semi-expanded (полурасширенный), expanded (расширенный), extra-expanded (экстрарасширенный) и ultra-expanded (сверхрасширенный).
размер — число с плавающей точкой представляющее размер шрифта в точках (1/72 дюйма(прим переводчика: 0,0352777777778 см)) или целое число представляющее размер в пикселях. Размер в точках предпочтительней, т.к. он не зависит от разрешения экрана.
Если каждый атрибут опущен, то используются значения из узла-стиля. Если не задан цвет текста, используется белый. Значение шрифта по умолчанию настраивается в 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 and button-text. Суффиксы могут быть color или alpha с соответствующими значениями как в нормальных/активных/подсвеченных узлах.
Альтернативой задания палитры в одной строке является атрибут colorscheme, используемый для загрузки схемы цветов KDE. Значением по умолчанию берётся ColorScheme из kdmrc. Индивидуальный цвет можно переопределить цветами схемы (атрибуты color).
К примеру:
<style edit-font="Comic 16" text-color="#dddddd" frame="true"/>

Узлы цвета Face Browser

Тег 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 Имя хоста.
%m Имя машины (machine part of uname output)
%n Имя узла (nodename part of uname output)
%o Имя домена (getdomainname output)
%r Имя выпуска(release part of uname output)
%s Имя системы (sysname part of uname output)
%t Оставшееся число секунд пока можно авторизоваться, плюс подходящая множественная форма переведённого слова “second”. По истечению этого срока авторизуется пользователь, выбранный в настройках системы для автовхода.
%u Имя пользователя, который авторизуется автоматически.
_ Causes the following character to be an accelerator

%t и %u обновляются каждую секунду.

Узлы Stock

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

Комментарии (13)

0
_KoT_ - 26 Декабрь, 2010 - 19:22
Изображение пользователя _KoT_.

Может кто поможет перевести: If the item contains a box, width and height can be specified to be box to mean that they are supposed to be the width and height of the box, that is the items in the box plus the padding.

+1
Lexxa - 26 Декабрь, 2010 - 19:54

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

box переводится как бокс? Точно? Мне тяжело вникать, ибо исходный текст непонятен.

0
_KoT_ - 27 Декабрь, 2010 - 04:46
Изображение пользователя _KoT_.

Спасибо.)
Я box перевёл как бокс. Там есть box nodes — один из типов узлов-компоновщиков, располагает дочерние элементы в строку или в столбец. Может придумаю, как лучше перевести.

0
Lang - 27 Декабрь, 2010 - 01:19
Изображение пользователя Lang.

Самое верное,это не переводить в точь в точь с английского,а попробывать самому создать одну из тем, а затем описать своими словами, как и что

0
_KoT_ - 27 Декабрь, 2010 - 04:47
Изображение пользователя _KoT_.

Это да. Алгоритм такой: перевести начерно, чтоб самому разобраться; поиграться с темой; поправить перевод.

0
_KoT_ - 30 Декабрь, 2010 - 12:07
Изображение пользователя _KoT_.

Начерно перевёл. Может кто вычитает на предмет явных ошибок.

+2
Lang - 31 Декабрь, 2010 - 00:03
Изображение пользователя Lang.

Я буду тогда вашим спеллчекером, раз вы его не используете =):

0
_KoT_ - 31 Декабрь, 2010 - 14:48
Изображение пользователя _KoT_.

Спасибо)
Я использую автопроверку, но она всякие "type=" красным подчёркивает, и за ним пропускаю ошибки.)

0
madman - 29 Декабрь, 2014 - 21:05

А что-то можете сказать по поводу http://kubuntu.ru/node/12884 ?

0
_KoT_ - 30 Декабрь, 2014 - 18:03
Изображение пользователя _KoT_.

Хм. Не задавался целью поставить курсор поцентру.
Поробуй использовать свойства Qt-ешных виджетов. http://doc.qt.io/qt-5/qlineedit.html#alignment-prop
<item type="entry" id="user-entry" alignment="AlignHCenter">
  [...]
</item>

Это на правах идеи-пробы.

0
Гость - 30 Декабрь, 2014 - 18:56

не работает.

0
Гость - 30 Декабрь, 2014 - 22:12

а есть еще какие идеи?

0
Lang - 19 Январь, 2015 - 00:27
Изображение пользователя Lang.

Не знаю, помогу ли Вам сказав, что про KDM забыли и по умолчанию используется lightdm, в пятом перейдут на sddm, хз зачем.

Отправить комментарий

CAPTCHA на основе изображений
Введите цифры