You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
tde-i18n/tde-i18n-ru/docs/tdebase/ksplashml/index.docbook

1076 lines
51 KiB

<?xml version="1.0" ?>
<!DOCTYPE book PUBLIC "-//KDE//DTD DocBook XML V4.2-Based Variant V1.1//EN"
"dtd/kdex.dtd" [
<!ENTITY kappname "&ksplash;">
<!ENTITY package "tdebase">
<!ENTITY % addindex "IGNORE">
<!ENTITY % Russian "INCLUDE">
]>
<book lang="&language;">
<bookinfo>
<title>Руководство пользователя &ksplash;</title>
<authorgroup>
<author>&Teemu.Rytilahti; &Teemu.Rytilahti.mail; </author>
<othercredit role="developer">&Brian.C.Ledbetter; &Brian.C.Ledbetter.mail; </othercredit>
<othercredit role="developer">&Ravikiran.Rajagopal; &Ravikiran.Rajagopal.mail; </othercredit>
<othercredit role="translator"><firstname>Иван</firstname><surname>Кашуков</surname><affiliation><address><email>dolphin210@yandex.ru</email></address></affiliation><contrib>Перевод на русский язык</contrib></othercredit><othercredit role="translator"><firstname>Николай</firstname><surname>Шафоростов</surname><affiliation><address><email>shafff@ukr.net</email></address></affiliation><contrib>Обновление перевода</contrib></othercredit> <othercredit role="translator"><firstname>Виктор</firstname><surname>Ерёмин </surname><affiliation><address><email>ErV2005@rambler.ru</email></address></affiliation><contrib>Перевод на русский язык</contrib></othercredit>
</authorgroup>
<copyright>
<year>2003</year>
<holder>Teemu Rytilahti</holder>
</copyright>
<copyright>
<year>2003-04</year>
<holder>Ravikiran Rajagopal</holder>
</copyright>
<legalnotice>&FDLNotice;</legalnotice>
<date>2003-01-10</date>
<releaseinfo>1.01.00</releaseinfo>
<abstract>
<para>&ksplash; &mdash; симпатичный экран, показывающий процесс загрузки среды KDE.</para>
</abstract>
<keywordset>
<keyword>KDE</keyword>
<keyword>tdebase</keyword>
<keyword>ksplash</keyword>
<keyword>ksplashml</keyword>
<keyword>заставка</keyword>
<keyword>украшение</keyword>
</keywordset>
</bookinfo>
<chapter id="introduction">
<title>Введение</title>
<para>&ksplash; &mdash; симпатичный экран, показывающий процесс загрузки KDE. Вопросы и пожелания отправляйте в списки рассылки &kde;. Отличительные особенности &ksplash;: </para>
<simplelist>
<member>Возможность применения тем</member>
<member>Высокая гибкость в настройке обеспечивается использованием подключаемых модулей</member>
<member>Программа может быть использована любым приложением, которое работает с DCOP</member>
</simplelist>
<para>Это руководство объясняет, как создавать темы для использования с уже доступными подключаемыми модулями. Если ни один из доступных модулей не удовлетворяет вашему вкусу, вы можете научиться полностью настраивать внешний вид &ksplash;, создавая подключаемые модули на C++. </para>
</chapter>
<chapter id="using-themes">
<title>Использование тем</title>
<para>Чтобы использовать темы с <ulink url="http://www.kde-look.org">KDE-Look</ulink>, скопируйте их в <filename>~/.trinity/apps/ksplash/Themes/</filename> (для одного пользователя) или в <filename>$<envar>TDEDIR</envar>/share/apps/ksplash/Themes/</filename> (чтобы сделать их доступными для всех пользователей вашей системы).</para>
<para>Чтобы сделать это автоматически, используйте модуль <guilabel>Заставка</guilabel> раздела <guilabel>Внешний вид и темы</guilabel> Центра управления &kde;.</para>
<sect1 id="using-kcontrol-module">
<title>Модуль Центра управления</title>
<para>Этот модуль позволяет устанавливать, проверять и удалять темы &ksplash;.</para>
<para>Внизу расположен список доступных тем &ksplash;. При выборе одной из последних, её предварительный просмотр появится в соответствующей части окна. Чтобы активировать тему, нажмите <guibutton>OK</guibutton> или <guibutton>Применить</guibutton>.</para>
<para>Чтобы установить новые модули, нажмите <guibutton>Добавить...</guibutton>. Не нужно распаковывать файлы тем, они могут обрабатываться и в сжатом виде.</para>
<para>Для просмотра анимации темы, нажмите кнопку<guibutton>Тест</guibutton>.</para>
<para>Чтобы удалить тему, воспользуйтесь кнопкой <guibutton>Удалить</guibutton>. Если тема установлена для всех пользователей, то удалять её нужно с правами администратора. Также, мы не рекомендуем удалять тему «<guilabel>По умолчанию</guilabel>».</para>
</sect1>
</chapter>
<chapter id="themes">
<title>Как создавать темы для &ksplash;</title>
<sect1 id="themes-general">
<title>Основные положения</title>
<para>Создавать свои собственные темы для &ksplash; достаточно легко. Когда вы закончили свою тему, вы можете отправить её на <ulink url="http://www.kde-look.org">KDE-Look</ulink>, чтобы её могли использовать другие.</para>
<sect2 id="theme-syntax">
<title>Определение своей темы</title>
<para>Давайте создадим тему под названием <literal>MyCoolTheme</literal>. Чтобы тема была найдена &ksplash;, следует поместить её в папку <filename class="directory">MyCoolTheme</filename> в папке <filename class="directory">~/.trinity/apps/ksplash/Themes/</filename>. В ней должен содержаться файл <filename>Theme.rc</filename>, содержащий настройки темы. Вы можете установить множество особенностей для темы, изменить движок подключаемых модулей и т. д. Не обязательно использовать все доступные параметры, обычно используются только некоторые. Синтаксис записей файла <filename>Theme.rc</filename>: <literal>[параметр] = [значение]</literal>. Параметры описаны в следующих разделах.</para>
<example>
<title>Простой файл <filename>Theme.rc</filename></title>
<programlisting>[KSplash Theme: MyCoolTheme]
Name = MyCoolTheme
Description = Симпатичная тема, использующая движок XpLike
Version = 1.0
Author = Имя автора &lt;realmail@mail.com&gt;
## Используйте движок XpLike для этой темы.
Engine = XpLike
Show Icon = false
Welcome Text = Загрузка KDE
</programlisting>
</example>
<para>После того как вы задали имя, описание и автора темы, вам следует выбрать движок темы (подключаемый модуль). Затем вы сможете настроить разнообразные характеристики движка темы, устанавливая пары параметр=значение, как в вышеприведённом файле.</para>
<important>
<para>Важно, чтобы имя папки, в которой хранятся файлы темы (<filename class="directory">~/.trinity/apps/ksplash/Themes/MyCoolTheme</filename> в данном примере) и идентификатор (<literal>[KSplash Theme: MyCoolTheme] </literal> в данном примере) в <filename>Theme.rc</filename> совпадали. В противном случае, &ksplash; не распознает тему.</para>
</important>
</sect2>
<sect2 id="theme-files">
<title>Файлы фона</title>
<para>При запуске &ksplash; пытается найти файл фона, соответствующий текущему разрешению экрана (если файл используется движком темы). Формат названия файла фона: <filename>Background-<replaceable>WWWxHHH</replaceable>.png</filename>, где WWW-ширина, а HHH-высота изображения.</para>
<para>Например, вам надо использовать файл <filename>Background-1024x768</filename>. Если файл, соответствующий текущему разрешению экрана, не найден, программа пытается изменить размер файла <filename>Background.png</filename> (или другого, заданного в <filename>Theme.rc</filename>) так, чтобы он соответствовал разрешению. Изменение размера <quote>на лету</quote> занимает некоторое время, так что вам следует создать файлы как минимум для следующих разрешений экрана: 1280x1024, 1024x768 и 800x600.</para>
</sect2>
</sect1>
<sect1 id="theme-engines">
<title>Параметры движков тем</title>
<sect2 id="default-themes">
<title>Тема, используемая по умолчанию</title>
<table>
<title>Настройка темы по умолчанию</title>
<tgroup cols="3">
<tbody>
<row>
<entry>Параметр</entry>
<entry>Значение</entry>
<entry>Описание</entry>
</row>
<!-- Statusbar -->
<row>
<entry>Always Show Progress</entry>
<entry>[true/false]</entry>
<entry>Определяет, будет ли показан прогресс загрузки. Значение по умолчанию &mdash; true.</entry>
</row>
<row>
<entry>Label Foreground</entry>
<entry>[цвет]</entry>
<entry>Цвет текста индикатора состояния. Значение по умолчанию &mdash; white (белый, #FFFFFF).</entry>
</row>
<!-- Misc. things -->
<row>
<entry>Icons Flashing</entry>
<entry>[true/false]</entry>
<entry>Определяет, будут ли мерцать значки. По умолчанию — true (да).</entry>
</row>
</tbody>
</tgroup>
</table>
</sect2>
<sect2 id="standard-themes">
<title>Стандартная тема</title>
<table>
<title>Параметры стандартной темы</title>
<tgroup cols="3">
<tbody>
<row>
<entry>Параметр</entry>
<entry>Значение</entry>
<entry>Описание</entry>
</row>
<!-- Statusbar -->
<row>
<entry>Statusbar Position</entry>
<entry>[top/bottom]</entry>
<entry>Определяет расположение индикатора состояния на экране. Значение по умолчанию &mdash; bottom (внизу).</entry>
</row>
<row>
<entry>Statusbar Visible</entry>
<entry>[true/false]</entry>
<entry>Определяет, будет ли индикатор состояния видимым. Значение по умолчанию &mdash; true (да).</entry>
</row>
<row>
<entry>Progress Visible</entry>
<entry>[true/false]</entry>
<entry>Определяет, будет ли показан прогресс загрузки. Значение по умолчанию &mdash; true.</entry>
</row>
<!-- Fonts -->
<row>
<entry>Statusbar Font</entry>
<entry>[шрифт]</entry>
<entry>Шрифт, используемый в индикаторе состояния. Значение по умолчанию &mdash; Helvetica.</entry>
</row>
<row>
<entry>Statusbar Font Size</entry>
<entry>[размер]</entry>
<entry>Размер шрифта индикатора состояния. Значение по умолчанию &mdash; 16 пт.</entry>
</row>
<row>
<entry>Statusbar Font Bold</entry>
<entry>[true/false]</entry>
<entry>Определяет, будет ли шрифт индикатора состояния полужирным. Значение по умолчанию &mdash; true (да).</entry>
</row>
<row>
<entry>Statusbar Font Italic</entry>
<entry>[true/false]</entry>
<entry>Определяет, будет ли шрифт индикатора состояния курсивным. Значение по умолчанию &mdash; false (нет).</entry>
</row>
<!-- Misc. things -->
<row>
<entry>Statusbar Foreground</entry>
<entry>[цвет]</entry>
<entry>Цвет переднего плана индикатора состояния. Значение по умолчанию &mdash; white (белый).</entry>
</row>
<row>
<entry>Statusbar Background</entry>
<entry>[цвет]</entry>
<entry>Цвет фона индикатора состояния. Значение по умолчанию &mdash; black (чёрный).</entry>
</row>
<row>
<entry>Statusbar Icon</entry>
<entry>[true/false]</entry>
<entry>Определяет, будет ли значок у индикатора состояния.</entry>
</row>
<row>
<entry>Icons Visible</entry>
<entry>[true/false]</entry>
<entry>Определяет, будут ли значки видимыми. Значение по умолчанию &mdash; true (да).</entry>
</row>
<row>
<entry>Icons Jumping</entry>
<entry>[true/false]</entry>
<entry>Определяет, будут ли прыгать значки. Значение по умолчанию &mdash; true (да).</entry>
</row>
<row>
<entry>Icon Position</entry>
<entry>[0-3, 10-13]</entry>
<entry>Расположение значков. Значение по умолчанию &mdash; вверху слева.</entry>
</row>
<row>
<entry>Splash Screen</entry>
<entry>[название]</entry>
<entry>Название заставки.</entry>
</row>
</tbody>
</tgroup>
</table>
</sect2>
<sect2 id="redmond-themes">
<title>Тема Redmond</title>
<table>
<title>Параметры темы Redmond</title>
<tgroup cols="3">
<tbody>
<row>
<entry>Параметр</entry>
<entry>Значение</entry>
<entry>Описание</entry>
</row>
<!-- Main elements -->
<row>
<entry>Background Image</entry>
<entry>[имя_файла]</entry>
<entry>Определяемое пользователем фоновое изображение.</entry>
</row>
<row>
<entry>User Icon</entry>
<entry>[имя_значка]</entry>
<entry>Имя значка пользователя. Значение по умолчанию &mdash; <constant>go</constant>.</entry>
</row>
<row>
<entry>Welcome Text</entry>
<entry>[текст]</entry>
<entry>Текст, показываемый на экране. Значение по умолчанию &mdash; «Добро пожаловать».</entry>
</row>
<row>
<entry>Username Text</entry>
<entry>[текст]</entry>
<entry>Текст, замещающий имя пользователя.</entry>
</row>
<!-- Positioning elements -->
<row>
<entry>Welcome Text Position</entry>
<entry>[x,y]</entry>
<entry>Область экрана, в которой показывается текст приглашения (определяемый параметром «Welcome Text»).</entry>
</row>
<row>
<entry>Username Text Position</entry>
<entry>[x,y]</entry>
<entry>Область экрана, в которой показывается имя пользователя.</entry>
</row>
<row>
<entry>Action Text Position</entry>
<entry>[x,y]</entry>
<entry>Область экрана, в которой показывается текущее действие.</entry>
</row>
<row>
<entry>Icon Position</entry>
<entry>[x,y]</entry>
<entry>Область экрана, в которой показывается значок пользователя.</entry>
</row>
<!-- Show to show.. -->
<row>
<entry>Show Welcome Text</entry>
<entry>[true/false]</entry>
<entry>Определяет, будет ли показываться текст приглашения. Значение по умолчанию &mdash; true (да).</entry>
</row>
<row>
<entry>Show Welcome Shadow</entry>
<entry>[true/false]</entry>
<entry>Определяет, будет ли показываться тень под текстом приглашения. Значение по умолчанию &mdash; true (да).</entry>
</row>
<row>
<entry>Show Username</entry>
<entry>[true/false]</entry>
<entry>Определяет, будет ли показываться имя пользователя. Значение по умолчанию &mdash; true (да).</entry>
</row>
<row>
<entry>Show Action</entry>
<entry>[true/false]</entry>
<entry>Определяет, будет ли показываться действие, выполняемое в данный момент. Значение по умолчанию &mdash; true (да).</entry>
</row>
<row>
<entry>Show Icon</entry>
<entry>[true/false]</entry>
<entry>Определяет, будет ли показываться значок пользователя. Значение по умолчанию &mdash; true (да).</entry>
</row>
<row>
<entry>Use TDM User Icon</entry>
<entry>[true/false]</entry>
<entry>Определяет, будет ли использоваться значок, соответствующий пользователю при входе в систему. Значение по умолчанию &mdash; true (да).</entry>
</row>
</tbody>
</tgroup>
</table>
</sect2>
<sect2 id="macx-themes">
<title>Тема MacX</title>
<table>
<title>Параметры темы MacX</title>
<tgroup cols="3">
<tbody>
<row>
<entry>Параметр</entry>
<entry>Значение</entry>
<entry>Описание</entry>
</row>
<row>
<entry>Icon Size Minimum</entry>
<entry>[размер]</entry>
<entry>Минимальный размер значков. Значение по умолчанию &mdash; 16 пикселей.</entry>
</row>
<row>
<entry>Icon Size Maximum</entry>
<entry>[размер]</entry>
<entry>Максимальный размер значков. Значение по умолчанию &mdash; 64 пикселя.</entry>
</row>
<row>
<entry>Optimized Icon Rendering</entry>
<entry>[true/false]</entry>
<entry>Будет ли оптимизироваться отрисовка значков. Значение по умолчанию &mdash; true (да).</entry>
</row>
<row>
<entry>Progress Bar Visible</entry>
<entry>[true/false]</entry>
<entry>По умолчанию &mdash; true (да).</entry>
</row>
<row>
<entry>Progress Bar Position</entry>
<entry>[top/bottom]</entry>
<entry>Определяет расположение индикатора состояния (внизу или вверху). По умолчанию - bottom (внизу).</entry>
</row>
<row>
<entry>Icons Jumping</entry>
<entry>[true/false]</entry>
<entry>Определяет, будут ли прыгать значки. Значение по умолчанию &mdash; false (нет).</entry>
</row>
</tbody>
</tgroup>
</table>
</sect2>
<sect2 id="mac-classic-themes">
<title>Тема MacClassic</title>
<table>
<title>Параметры темы MacClassic</title>
<tgroup cols="3">
<tbody>
<row>
<entry>Параметр</entry>
<entry>Значение</entry>
<entry>Описание</entry>
</row>
<row>
<entry>Icon Position</entry>
<entry>[0-3, 10-13]</entry>
<entry>Расположение значков на экране. Значение по умолчанию &mdash; внизу слева.</entry>
</row>
<row>
<entry>Icons Jumping</entry>
<entry>[true/false]</entry>
<entry>Определяет, будут ли прыгать значки. Значение по умолчанию &mdash; false (нет).</entry>
</row>
<row>
<entry>Icons Visible</entry>
<entry>[true/false]</entry>
<entry>Определяет, будут ли значки видимыми. Значение по умолчанию &mdash; true (да).</entry>
</row>
<row>
<entry>Splash Screen</entry>
<entry>[название]</entry>
<entry>Название заставки.</entry>
</row>
</tbody>
</tgroup>
</table>
</sect2>
<sect2 id="themes-2k">
<title>Тема 2k</title>
<table>
<title>Параметры темы 2k</title>
<tgroup cols="3">
<tbody>
<row>
<entry>Параметр</entry>
<entry>Значение</entry>
<entry>Описание</entry>
</row>
<row>
<entry>Title Background Color</entry>
<entry>[цвет]</entry>
<entry>Фоновый цвет заголовка. Значение по умолчанию &mdash; dark blue (тёмно-синий).</entry>
</row>
<row>
<entry>Title Foreground Color</entry>
<entry>[цвет]</entry>
<entry>Цвет переднего плана заголовка. Значение по умолчанию &mdash; white (белый).</entry>
</row>
<row>
<entry>Status Text Color</entry>
<entry>[цвет]</entry>
<entry>Цвет текста состояния. По умолчанию соответствует фоновому тексту заголовка (определяемому параметром «Title Background Color»).</entry>
</row>
<row>
<entry>Rotator Color 1</entry>
<entry>[цвет]</entry>
<entry>Определяет цвет индикатора 1. Значение по умолчанию &mdash; dark blue (тёмно-синий).</entry>
</row>
<row>
<entry>Rotator Color 2</entry>
<entry>[цвет]</entry>
<entry>Определяет цвет индикатора 2. Значение по умолчанию &mdash; cyan (циан).</entry>
</row>
<row>
<entry>Rotator Speed</entry>
<entry>[значение]</entry>
<entry>Определяет скорость индикатора. Значение по умолчанию &mdash; 30.</entry>
</row>
<row>
<entry>Window Title</entry>
<entry>[текст]</entry>
<entry>Определяет текст заголовка окна.</entry>
</row>
<row>
<entry>Logo File</entry>
<entry>[имя_файла]</entry>
<entry>Определяет используемый логотип.</entry>
</row>
</tbody>
</tgroup>
</table>
</sect2>
</sect1>
</chapter>
<chapter id="from-other-applications">
<title>Использование &ksplash; в вашем собственном приложении</title>
<para>В этой главе описывается простой метод использования &ksplash; в качестве заставки для вашего приложения &kde;. Если вы не разрабатываете приложения для &kde;, вы можете опустить эту главу.</para>
<sect1 id="basic-other-reqs">
<title>Основные требования</title>
<para>Ваше приложение &kde; должно работать с &DCOP;. &DCOP; &mdash; это технология &kde;, использующаяся для коммуникации между приложениями. Если вы используете <ulink url="http://developer.kde.org">стандартную структуру приложения &kde;</ulink>, это обеспечивается автоматически. Чтобы получить информацию о &DCOP; и связанных технологиях &kde;, посетите <ulink url="http://developer.kde.org">сайт разработчиков &kde;</ulink>.</para>
</sect1>
<sect1 id="other-using">
<title>Запуск &ksplash;</title>
<para>До того, как ваше приложение начнёт вычисления, загрузку подключаемых модулей и т.д., запустите &ksplash;. Образец:</para>
<programlisting>DCOPClient *c = kapp-&gt;dcopClient();
QString error;
QCString KSplashName;
int pid = 0;
QStringList args;
args &lt;&lt; "--theme=MyCoolTheme" &lt;&lt; "--managed";
if (kapp-&gt;startServiceByDesktopName("ksplash", args, &amp;error,
&amp;KSplashName, &amp;pid))
{
KMessageBox::sorry(0, error, "Невозможно запустить KSplash");
//обработка ошибок.
}
</programlisting>
<para>Мы предполагаем, что запущено только одно окно &ksplash;. Другие случаи немного более сложны. Разъяснения смотрите в документации &DCOP;.</para>
</sect1>
<sect1 id="show-messages">
<title>Показ сообщений</title>
<para>Перед показом сообщений вам необходимо установить число шагов. Например, процедура запуска &kde; включает 7 этапов.</para>
<programlisting>QByteArray data;
QDataStream arg(data,IO_WriteOnly);
arg &lt;&lt; someNumber;
if (!(c-&gt;send(KSplashName, "KSplashIface", "setStartupItemCount(int)",
data))
// Обработка ошибок.
</programlisting>
<para>Если вы хотите, чтобы сообщение связывалось с соответствующим значком или без него, используйте</para>
<programlisting>arg &lt;&lt; QString("имя_значка") &lt;&lt; QString("название_программы") &lt;&lt;
QString("какое-то описание");
if (!(c-&gt;send(KSplashName, "KSplashIface",
"programStarted(QString,QString,QString)", data))
{
// Обработка ошибок.
}
</programlisting>
<para>Каждый раз, когда вы вызываете <constant>programStarted</constant>, шаги заканчиваются. Когда ваша программа закончила запуск, выполните следующие команды, чтобы убрать заставку:</para>
<programlisting>if (!(c-&gt;send(KSplashName, "KSplashIface", "startupComplete()", data))
{
// Обработка ошибок.
}
</programlisting>
<para>Это всё, что вам необходимо, чтобы использовать все преимущества &ksplash;.</para>
</sect1>
</chapter>
<!-- FIXME: Better to leave this out until it's written, or the translators -->
<!-- will have to still translate it ... -->
<chapter id="wrplugins">
<title>Создание новых подключаемых модулей &ksplash;</title>
<para>Создавать подключаемые модули &ksplash; нетрудно. В этой главе мы напишем простой модуль, который эмулирует экран загрузки одной очень известной операционной системы. Предполагается, что вы знакомы с основами языка C++ и хотя бы немного &mdash; с программированием для KDE/Qt.</para>
<sect1 id="basic-requirements">
<title>Основные требования</title>
<para>Мы создадим модуль с названием <literal>2k</literal>. Название используется во многих местах. Важно не исказить его, чтобы модуль был распознан &ksplash;. Модули &ksplash; являются динамически загружаемыми библиотеками со следующими объявлениями: </para>
<simplelist>
<member>Библиотеку следует называть по образцу: <filename>ksplash+названиеемы_в_нижнем_регистре</filename>. В нашем случае название будет <filename>ksplash2k</filename>.</member>
<member>Тема должна иметь свой файл desktop, который следует назвать <filename>ksplash+названиеемы_в_нижнем_регистре.desktop</filename>. В нашем случае &mdash; <filename>ksplash2k.desktop</filename>. </member>
<member>Наконец, библиотека должна возвращать класс с названием <literal>Theme+названиеемы</literal>, в нашем случае &mdash; <literal>Theme2k</literal>.</member>
</simplelist>
<para>Не беспокойтесь, если вы не поняли всё вышесказанное. Далее мы рассмотрим каждый шаг в деталях. Важной деталью является то, что класс модуля вы должны взять из <literal>ThemeEngine</literal>. </para>
</sect1>
<sect1 id="skeleton">
<title>Создание основы</title>
<para>При создании модуля мы будем использовать основу для приложения &kde;, которая обеспечит независимость от платформы во всех частях нашей работы. Убедитесь, что в вашей системе установлен пакет <filename>tdesdk</filename>. Выполните команду <literal>kapptemplate</literal>, чтобы создать приложение с названием "2k". Будет создана папка, содержащая основные файлы (такие как AUTHORS и т.п.). Нам нужна подпапка <filename class="directory">2k</filename>. Удалите все файлы в ней, и основа готова. </para>
<para>На следующем этапе вы должны создать файл <filename>.desktop</filename>, который, после установки, сообщит &ksplash;, что подключаемый модуль доступен. В соответствии с правилами наименования файлов, которые даны <link linkend="basic-requirements">в предыдущей секции</link>, создайте файл <filename>ksplash2k.desktop</filename>. Он должен содержать следующие строки: </para>
<programlisting><literal>
[Desktop Entry]
Encoding=UTF-8
Type=Service
Comment=KSplash Plugin
Name=KSplash2k
ServiceTypes=KSplash/Plugin
X-TDE-Library=ksplash2k
X-KSplash-Default=true
X-KSplash-PluginName=2k
X-KSplash-ObjectName=Theme2k
</literal>
</programlisting>
<para>Параметры <literal>Encoding</literal>, <literal>Type</literal>, <literal>Comment</literal> и <literal>ServiceTypes</literal> одинаковы для всех подключаемых модулей. Название модуля и библиотеки следуют вышеописанным правилам. Параметр <literal>X-KSplash-Default</literal> может принимать одно из двух значений (true или false). Он определяет, будет ли этот модуль показан в Центре управления KDE. За исключением некоторых очень редких случаев, его значение должно быть <constant>true</constant>. </para>
</sect1>
<sect1 id="headerfile">
<title>Объявление класса подключаемого модуля</title>
<para>Теперь, когда мы закончили подготовительную работу, начинается действительно интересная часть &mdash; создание класса, который обеспечивает нужное поведение модуля. Хотя мы вольны делать с этим классом всё, что хотим, существует несколько ограничений.</para>
<orderedlist>
<listitem><para>Классы модуля должны наследоваться от класса <constant>ThemeEngine</constant>.</para></listitem>
<listitem><para>Классы модуля следует называть в соответствии с правилом: <classname>Theme+названиеодуля</classname>.</para></listitem>
<listitem><para>Классы модуля должны обеспечивать <literal>статическую</literal> функцию с названием <function>names</function>, которая возвращает список названий, под которыми она может быть задействована.</para></listitem>
<listitem><para>Чтобы модуль можно было настраивать из Центра управления KDE, он должен включать класс, основанный на классе <literal>ThemeEngineConfig</literal>.</para></listitem>
<listitem><para>Классы модуля должны перекрывать хотя бы одну из следующих виртуальных функций: <function>slotSetText</function>, <function>slotSetPixmap</function>, <function>slotUpdateProgress</function> и <function>slotUpdateSteps</function>, чтобы обеспечить возможность использования.</para></listitem>
<listitem><para>Разработчик должен создать конструктор <literal>ThemeEngine( QWidget *parent, const char *name, const QStringList &amp;args )</literal>, чтобы модуль можно было использовать из <classname>KGenericFactory</classname>.</para></listitem>
</orderedlist>
<para>Последнее требование может показаться сложным, но, как мы увидим позже, вы можете обычно игнорировать его, добавив одну строку к исходному коду.</para>
</sect1>
<sect1 id="headercode">
<title>Код файла заголовка</title>
<para>Присвоив значения константам, мы увидим, что файл заголовков <filename>theme2k.h</filename> приобретёт вид вроде этого:</para>
<example>
<title>Файл <filename>theme2k.h</filename></title>
<programlisting>#ifndef __THEME2K_H__
#define __THEME2K_H__
#include &lt;qlabel.h&gt;
#include &lt;qwidget.h&gt;
#include &lt;kdialogbase.h&gt;
#include &lt;kpixmap.h&gt;
#include &lt;ksplash/themeengine.h&gt;
class RotWidget;
class Cfg2k: public ThemeEngineConfig
{
Q_OBJECT
public:
Cfg2k( TDEConfig * );
};
class ObjKsTheme;
class Theme2k: public ThemeEngine
{
Q_OBJECT
public:
Theme2k( QWidget *, const char *, const QStringList&amp; );
inline const QString name()
{
return( QString("KSplash2k") );
}
inline const KDialogBase *config( TDEConfig *kc )
{
return new Cfg2k( kc );
}
static QStringList names()
{
QStringList Names;
Names &lt;&lt; "KSplash2k";
Names &lt;&lt; "ks2k";
Names &lt;&lt; "2k";
Names &lt;&lt; "2000";
return( Names );
};
public slots:
inline void slotSetText( const QString&amp; s )
{
if( mText &amp;&amp; mText-&gt;text() != s ) mText-&gt;setText( s );
};
private:
void initUi();
void readSettings();
QLabel *mText;
RotWidget *mRotator;
QColor mTBgColor, mTFgColor, mRotColor1, mRotColor2, mStatusColor;
int mRotSpeed;
QString mWndTitle, mLogoFile;
};
#endif
</programlisting>
</example>
<para>Давайте проанализируем вышеприведённое. Класс <classname>Theme2k</classname>, унаследованный от <classname>ThemeEngine</classname> удовлетворяет объявлениям. Он обеспечивает метод <methodname>Theme2k::names()</methodname>, и имеет конструктор, который принимает необходимые параметры: <function>Theme2k( QWidget *, const char *, const QStringList&amp; );</function>, и к тому же обеспечивает простой метод <methodname>Theme2k::slotSetText()</methodname>. На данном этапе вам не следует беспокоиться насчёт класса <classname>RotWidget</classname>. Это небольшой элемент графического интерфейса, который делает программу более наглядной для пользователя. Наш подключаемый модуль очень прост: он не показывает ни значков, ни индикатора загрузки. Если вы хотите использовать значки, перекройте функцию <function>slotSetPixmap</function>. Подобные функции есть для установки индикатора загрузки (<function>slotUpdateSteps</function>) и увеличения счётчика (<function>slotUpdateProgress</function>) текущего шага. </para>
</sect1>
<sect1 id="Implementation">
<title>Реализация подключаемого модуля</title>
<para>Мы проверим только связанные части реализации. В приложении находится описание всей реализации. В первую очередь нам необходимо удовлетворить требованиям библиотеки:</para>
<example>
<title>Требования библиотеки</title>
<programlisting>K_EXPORT_COMPONENT_FACTORY( ksplash2k, KGenericFactory&lt;Theme2k&gt; );
</programlisting>
</example>
<para>Объявление макроса <constant>K_EXPORT_COMPONENT_FACTORY</constant> содержится в файле <filename>kgenericfactory.h</filename>. Теперь перейдём к конструктору. Так как подключаемый модуль совсем прост, конструктор тоже несложен.</para>
<example>
<title>Конструктор подключаемого модуля</title>
<programlisting>Theme2k::Theme2k( QWidget *parent, const char *name, const QStringList &amp;args
)
:ThemeEngine( parent, name, args )
{
readSettings();
initUi();
}
</programlisting>
</example>
<para>Метод <function>readSettings()</function> является иллюстрацией подходящего способа получить параметры темы (вы ведь хотите, чтобы люди могли использовать ваш модуль для своих тем?)</para>
<example>
<title>Получение параметров темы</title>
<programlisting>void Theme2k::readSettings()
{
if( !mTheme )
return;
TDEConfig *cfg = mTheme-&gt;themeConfig();
if( !cfg )
return;
cfg-&gt;setGroup( QString("KSplash Theme: %1").arg(mTheme-&gt;theme()) );
QColor DefaultTBgColor( Qt::darkBlue );
QColor DefaultTFgColor( Qt::white );
mTBgColor = cfg-&gt;readColorEntry( "Title Background Color",
&amp;DefaultTBgColor );
mTFgColor = cfg-&gt;readColorEntry( "Title Foreground Color",
&amp;DefaultTFgColor );
mStatusColor = cfg-&gt;readColorEntry("Status Text Color", &amp;mTBgColor );
QColor DefaultRot1( Qt::darkBlue );
QColor DefaultRot2( Qt::cyan );
mRotColor1 = cfg-&gt;readColorEntry( "Rotator Color 1", &amp;DefaultRot1 );
mRotColor2 = cfg-&gt;readColorEntry( "Rotator Color 2", &amp;DefaultRot2 );
mRotSpeed = cfg-&gt;readNumEntry( "Rotator Speed", 30 );
mWndTitle = cfg-&gt;readEntry( "Window Title", i18n("Please wait...") );
mLogoFile = cfg-&gt;readEntry( "Logo File", QString::null );
}
</programlisting>
</example>
<para>Так как мы работаем для пользователей, следует обеспечить подходящие параметры по умолчанию для параметров, которые не представлены в файле темы. Обратите внимание, что группу следует устанавливать следующим образом: "KSplash Theme: названиеемы", чтобы обеспечить совместимость с будущими спецификациями темы. Метод <function>initUI()</function> не представляет большого интереса, он просто организует элементы графического интерфейса. Детали указаны в приложении. </para>
</sect1>
<sect1 id="compilingfile">
<title>Компиляция подключаемого модуля</title>
<para>Для компиляции модуля мы решили использовать основу &kde;, поэтому необходимо создать файл <filename>Makefile.am</filename>. Он должен выглядеть следующим образом:</para>
<example>
<title>Файл <filename>Makefile.am</filename></title>
<programlisting>INCLUDES = $(all_includes)
kde_module_LTLIBRARIES = ksplash2k.la
ksplash2k_la_SOURCES = theme2k.cpp rotwidget.cpp
ksplash2k_la_LDFLAGS = $(all_libraries) $(KDE_RPATH)
ksplash2k_la_LIBADD = $(LIB_TDEUI) -lksplashthemes
METASOURCES = AUTO
noinst_HEADERS = theme2k.h rotwidget.h
servicesdir = $(kde_servicesdir)
services_DATA = ksplash2k.desktop
themedir = $(kde_datadir)/ksplash/Themes/2k
theme_DATA = Theme.rc Preview.png
</programlisting>
</example>
<para>Чтобы получить дальнейшую информацию по созданию <filename>Makefile.am</filename>, загляните на <ulink url="http://developer.kde.org/documentation/other/makefile_am_howto.html">веб-сайт</ulink> разработчиков &kde;. Заметим, что мы создаём тему по умолчанию, основанную на этом модуле, и прилагаем к нему графический файл фона. В качестве жеста доброй воли по отношению к пользователям создайте файл <filename>Theme.rc</filename>, иллюстрирующий примеры использования различных параметров.</para>
</sect1>
</chapter>
<chapter id="faq">
<title>Вопросы и ответы</title>
&reporting.bugs; &updating.documentation; <qandaset id="faqlist">
<qandaentry>
<question>
<para>Я не могу найти ни одной темы, которая работала бы с &ksplash;. Почему?</para>
</question>
<answer>
<para>Возможно, у вас нет соответствующих подключаемых модулей для тем. Модули содержатся в пакете <literal>tdeartwork</literal>. Скачайте, установите его и попытайтесь запустить темы снова.</para>
</answer>
</qandaentry>
<qandaentry>
<question>
<para>Что такое файл <filename>Theme.rc</filename> и как его создать?</para>
</question>
<answer>
<para><filename>Theme.rc</filename> &mdash; это файл, где вы можете задать параметры темы. Информация по нему находится в разделе <link linkend="themes">Как создавать темы для &ksplash;</link>. </para>
</answer>
</qandaentry>
</qandaset>
</chapter>
<chapter id="credits">
<title>Благодарности и лицензирование</title>
<para>&ksplash;</para>
<para>Программа: &copy; &Ravikiran.Rajagopal; &Ravikiran.Rajagopal.mail;, 2003.</para>
<itemizedlist>
<title>Помощь в разработке</title>
<listitem><para>&Brian.C.Ledbetter; &Brian.C.Ledbetter.mail;</para>
</listitem>
</itemizedlist>
<para>Документация: &copy; &Teemu.Rytilahti; &Teemu.Rytilahti.mail;, 2003.</para>
&underFDL; &underGPL; </chapter>
<appendix id="installation">
<title>Установка</title>
<sect1 id="requirements">
<title>Системные требования</title>
<para>Чтобы иметь возможность использовать возможности &ksplash; вам необходим &kde; версии 3.2 или выше. Если тема не работает, свяжитесь с её автором, чтобы выяснить, где можно взять подходящий подключаемый модуль.</para>
</sect1>
<sect1 id="compilation">
<title>Сборка и установка</title>
&install.compile.documentation; </sect1>
</appendix>
<appendix id="srccode">
<title>Исходные коды</title>
<sect1 id="theme2kcpp">
<title>Файл <filename>theme2k.cpp</filename></title>
<programlisting>#include &lt;qlabel.h&gt;
#include &lt;qwidget.h&gt;
#include &lt;tdeapplication.h&gt;
#include &lt;tdeconfig.h&gt;
#include &lt;kdebug.h&gt;
#include &lt;kdialogbase.h&gt;
#include &lt;kgenericfactory.h&gt;
#include &lt;tdeglobalsettings.h&gt;
#include &lt;tdelocale.h&gt;
#include &lt;ksplash/objkstheme.h&gt;
#include &lt;kstandarddirs.h&gt;
#include "rotwidget.h"
#include "theme2k.h"
#include "theme2k.moc"
K_EXPORT_COMPONENT_FACTORY( ksplash2k, KGenericFactory&lt;Theme2k&gt; );
Cfg2k::Cfg2k( TDEConfig * )
{}
Theme2k::Theme2k( QWidget *parent, const char *name, const QStringList &amp;args
)
:ThemeEngine( parent, name, args )
{
readSettings();
initUi();
}
void Theme2k::initUi()
{
QVBox *vbox = new QVBox( this );
vbox-&gt;setFrameShape( QFrame::WinPanel );
vbox-&gt;setFrameShadow( QFrame::Raised );
QHBox *labelBox = new QHBox( vbox );
labelBox-&gt;setPalette( mTBgColor );
labelBox-&gt;setMargin( 1 );
QLabel *lbl = new QLabel( mWndTitle, labelBox );
lbl-&gt;setFont( QFont( "Arial", 12, QFont::Bold ) );
lbl-&gt;setPaletteForegroundColor( mTFgColor );
QLabel *logo = new QLabel( vbox );
logo-&gt;setPalette( Qt::white );
QString px( locate( "appdata", mTheme-&gt;themeDir() +
(mLogoFile.isNull()?QString("/Logo.png"):mLogoFile) ) );
if (px.isNull())
px = locate("appdata","Themes/Default/splash_top.png");
if( !px.isNull() )
{
QPixmap pix( px );
logo-&gt;setPixmap( pix );
}
else
{
logo-&gt;setText( "&lt;B&gt;KDE&lt;/B&gt;2000" );
logo-&gt;setAlignment( AlignCenter|AlignVCenter );
}
mRotator = new RotWidget( vbox, mRotColor1, mRotColor2, mRotSpeed );
QHBox *hbox = new QHBox( vbox );
labelBox-&gt;setSpacing( 4 );
labelBox-&gt;setMargin( 4 );
mText = new QLabel( hbox );
mText-&gt;setPaletteForegroundColor( mStatusColor );
mText-&gt;setPaletteBackgroundColor( mTFgColor );
mText-&gt;setText( mWndTitle );
mText-&gt;setFixedHeight( 48 );
setFixedSize( vbox-&gt;sizeHint() );
QRect rect(TDEGlobalSettings::splashScreenDesktopGeometry());
move( rect.x() + (rect.width() - size().width())/2,
rect.y() + (rect.height() - size().height())/2 );
}
void Theme2k::readSettings()
{
if( !mTheme )
return;
TDEConfig *cfg = mTheme-&gt;themeConfig();
if( !cfg )
return;
cfg-&gt;setGroup( QString("KSplash Theme: %1").arg(mTheme-&gt;theme()) );
QColor DefaultTBgColor( Qt::darkBlue );
QColor DefaultTFgColor( Qt::white );
mTBgColor = cfg-&gt;readColorEntry( "Title Background Color",
&amp;DefaultTBgColor );
mTFgColor = cfg-&gt;readColorEntry( "Title Foreground Color",
&amp;DefaultTFgColor );
mStatusColor = cfg-&gt;readColorEntry("Status Text Color", &amp;mTBgColor );
QColor DefaultRot1( Qt::darkBlue );
QColor DefaultRot2( Qt::cyan );
mRotColor1 = cfg-&gt;readColorEntry( "Rotator Color 1", &amp;DefaultRot1 );
mRotColor2 = cfg-&gt;readColorEntry( "Rotator Color 2", &amp;DefaultRot2 );
mRotSpeed = cfg-&gt;readNumEntry( "Rotator Speed", 30 );
mWndTitle = cfg-&gt;readEntry( "Window Title", i18n("Please wait...") );
mLogoFile = cfg-&gt;readEntry( "Logo File", QString::null );
}
</programlisting>
</sect1>
<sect1 id="rotwidgeth">
<title>Файл <filename>rotwidget.h</filename></title>
<programlisting>#ifndef __ROTWIDGET_H__
#define __ROTWIDGET_H__
#include &lt;qlabel.h&gt;
#include &lt;qtimer.h&gt;
#include &lt;qwidget.h&gt;
#include &lt;kdialogbase.h&gt;
#include &lt;kpixmap.h&gt;
/**
* @short Display a rotating-gradient widget.
*/
class RotWidget: public QWidget
{
Q_OBJECT
public:
RotWidget( QWidget *, const QColor&amp;, const QColor&amp;, int );
~RotWidget();
private slots:
void stepEvent();
protected:
void preparePixmap( int );
void paintEvent( QPaintEvent * );
void resizeEvent( QResizeEvent * );
QColor m_color1, m_color2;
int m_step, m_speed;
QTimer *m_stepTimer;
QList&lt;KPixmap&gt; m_stepPixmap;
};
#endif
</programlisting>
</sect1>
<sect1 id="rotwidgetcpp">
<title>Файл <filename>rotwidget.cpp</filename></title>
<programlisting>#include &lt;kdebug.h&gt;
#include &lt;kdialogbase.h&gt;
#include &lt;kpixmapeffect.h&gt;
#include &lt;qlabel.h&gt;
#include &lt;qpainter.h&gt;
#include &lt;qwidget.h&gt;
#include "rotwidget.h"
#include "rotwidget.moc"
RotWidget::RotWidget( QWidget *parent, const QColor&amp; c1, const QColor&amp;
c2, int sp )
:QWidget(parent), m_color1(c1), m_color2(c2), m_step(0), m_speed(sp)
{
if( (m_speed &lt;= 0) || (m_speed &gt; 20) )
m_speed = 1;
setFixedHeight( 6 );
for( int i = 0; i &lt;= width(); i++ )
preparePixmap( i );
m_stepTimer = new QTimer( this );
connect(m_stepTimer, SIGNAL(timeout()), this, SLOT(stepEvent()));
m_stepTimer-&gt;start( 50 );
}
RotWidget::~RotWidget()
{
}
void RotWidget::stepEvent()
{
// This is inefficient as we create too many pixmaps, optimize later.
m_step += m_speed;
if( m_step &gt; width() )
m_step = 0;
repaint( true );
}
// Todo: Optimize drawing.
void RotWidget::paintEvent( QPaintEvent *pe )
{
QPainter p;
p.begin( this );
QRect r = pe-&gt;rect();
if( m_stepPixmap.at( m_step ) )
bitBlt( this, r.x(), r.y(), m_stepPixmap.at( m_step ), r.x(), r.y(),
r.width(), r.height() );
else
p.fillRect( rect(), Qt::black );
p.end();
}
void RotWidget::resizeEvent( QResizeEvent *re )
{
m_stepPixmap.clear();
for( int i = 0; i &lt;= re-&gt;size().width(); i++ )
preparePixmap( i );
}
void RotWidget::preparePixmap( int step )
{
if( step &lt; 0 )
return;
// Explicitly draw our first pixmap. The rest we will bitBlt() from here.
if( step == 0 )
{
KPixmap tmp; tmp.resize( size().width() / 2, size().height() );
KPixmap tmp2(tmp);
KPixmapEffect::gradient( tmp, m_color1, m_color2,
KPixmapEffect::HorizontalGradient );
KPixmapEffect::gradient( tmp2, m_color2, m_color1,
KPixmapEffect::HorizontalGradient );
KPixmap *px = new KPixmap( size() );
QPainter p;
p.begin( px );
p.drawPixmap( 0, 0, tmp );
p.drawPixmap( size().width()/2, 0, tmp2 );
p.end();
m_stepPixmap.append( px );
}
else if( m_stepPixmap.at( step-1 ) )
{
QPixmap *prev = m_stepPixmap.at( step-1 );
QPixmap next; next.resize( size() );
// convert
// prev = "[------------]"
// to
// next = "------------]["
bitBlt( &amp;next, 0, 0, prev, 1, 0, prev-&gt;width()-1, prev-&gt;height()
);
bitBlt( &amp;next, width()-1, 0, prev, 0, 0, 1, prev-&gt;height() );
KPixmap *n = new KPixmap( next );
m_stepPixmap.append( n );
}
}
</programlisting>
</sect1>
</appendix>
&documentation.index;
</book>