<?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 "kdebase">
  <!ENTITY % addindex "IGNORE">
  <!ENTITY % Spanish "INCLUDE">
]>

<book lang="&language;">

<bookinfo>
<title
>Manual de &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
>Marcos</firstname
> <surname
>Fouces Lago</surname
> <affiliation
><address
><email
>mfouces@yahoo.es</email
></address
></affiliation
> <contrib
>Traductor</contrib
> </othercredit
> <othercredit role="translator"
> <firstname
>Santiago</firstname
> <surname
>Fernández Sancho</surname
> <affiliation
><address
><email
>santi@kde-es.org</email
></address
></affiliation
> <contrib
>Traductor</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; es una bonita pantalla que le muestra el progreso de una aplicación que se esté cargando.</para>
</abstract>

<keywordset>
<keyword
>KDE</keyword>
<keyword
>kdebase</keyword>
<keyword
>ksplash</keyword>
<keyword
>ksplashml</keyword>
<keyword
>splashscreen</keyword>
<keyword
>eye candy</keyword>
</keywordset>

</bookinfo>

<chapter id="introduction">
<title
>Introducción</title>

<para
>&ksplash; es una bonita pantalla que muestra el progreso de una aplicación que se esté cargando. Por favor, informe de cualquier problema o petición de característica a través de las listas de correo de &kde;. Las características principales de &ksplash; son: </para>
<simplelist>
<member
>Es posible utilizar temas.</member>
<member
>Utiliza complementos para conseguir una personalización completa.</member>
<member
>Puede ser utilizado por cualquier aplicación que utilice DCOP.</member>
</simplelist>

<para
>Este manual le mostrará cómo crear temas para utilizar con los complementos que estén disponibles. Si ninguno de los complementos disponibles satisface sus gustos, puede aprender a personalizar por completo el aspecto de &ksplash; escribiendo un complemento en C++. </para>
</chapter>

<chapter id="using-themes">
<title
>Utilizar temas</title>

<para
>Para utilizar los temas de <ulink url="http://www.kde-look.org"
>KDE-Look</ulink
>, extraígalos a <filename
>~/.kde/share/apps/ksplash/Themes/</filename
> para un usuario concreto, o a <filename
>$<envar
>KDEDIR</envar
>/share/apps/ksplash/Themes/</filename
> para que estén disponibles para todos los usuarios de su sistema.</para>

<para
>También puede utilizar el módulo <guilabel
>Pantalla anunciadora</guilabel
> en <guilabel
>Aspecto</guilabel
> en el centro de control de &kde; para hacer esto automáticamente.</para>

<sect1 id="using-kcontrol-module">
<title
>Utilizar el módulo de &kcontrol;</title>

<para
>Este módulo le permite instalar, comprobar y eliminar temas de &ksplash;.Este módulo le permite instalar, comprobar y eliminar temas de &ksplash;.</para>

<para
>En la parte inferior de este módulo hay una lista con los temas disponibles para &ksplash;. Una vez que haya seleccionado una, se mostrará una previsualización en la parte principal de la ventana. Una vez que haya seleccionado la que desea utilizar, pulse <guibutton
>Aceptar</guibutton
> o <guibutton
>Aplicar</guibutton
>. Pulse <guibutton
>Cancelar</guibutton
> para salir del módulo sin hacer cambios, y <guibutton
>Predeterminados</guibutton
> para restaurar los valores predeterminados de la pantalla.</para>

<para
>Para instalar nuevos módulos, pulse <guibutton
>Añadir...</guibutton
>, y encuentre el tema en su ordenador. No necesita desempaquetar el archivo con el tema, solo tiene que seleccionar el archivo comprimido. El hecho de instalar un tema no hace de él el tema en uso, deberá seleccionarlo de la lista y pulsar <guibutton
>Aceptar</guibutton
> o <guibutton
>Aplicar</guibutton
>.</para>

<para
>Aunque pueda ver una vista previa de la pantalla anunciadora, puede que quiera ver cómo aparece realmente, por ejemplo, para ver cómo es la animación. Podrá verificar los temas seleccionables pulsando el botón <guibutton
>Test</guibutton
>.</para>

<para
>También podrá eliminar temas que no vaya a volver a utilizar, seleccionándolos y pulsando el botón <guibutton
>Eliminar</guibutton
>. Tenga en cuenta que su cuenta de usuario puede no tener permisos para eliminar los temas instalados para todo el sistema. También es recomendable no desinstalar la pantalla anunciadora <guilabel
>predeterminada</guilabel
>.</para>

</sect1>

</chapter>

<chapter id="themes">
<title
>Cómo hacer temas para &ksplash;</title>
<sect1 id="themes-general">
<title
>General</title>
<para
>Hacer sus propios temas para &ksplash; es sencillo. Una vez que haya terminado su tema podrá enviarlo a <ulink url="http://www.kde-look.org"
>KDE-Look</ulink
> para que otros puedan utilizarlo.</para>

<sect2 id="theme-syntax">
<title
>Identificar su tema</title>

<para
>Permítanos crear un tema llamado <literal
>MiBonitoTema</literal
>. Para que el tema sea reconocido por &ksplash;, debería guardarse en una carpeta llamada <filename class="directory"
>MiBonitoTema</filename
> en <filename class="directory"
>~/.kde/apps/ksplash/Themes/</filename
>. Debería tener un archivo llamado <filename
>Theme.rc</filename
>, conteniendo las configuraciones del tema. Puede especificar numerosas cosas en el tema, cambiar el complemento del motor de uso, etc. No necesita utilizar todas las configuraciones disponibles. Normalmente los valores predeterminados suelen ser correctos. La sintaxis básica para las entradas del archivo <filename
>Theme.rc</filename
> es <literal
>[opción] = [valor]</literal
>. Podrá encontrar las definiciones de varias opciones en las siguientes secciones.</para>

<example>
<title
>Un archivo <filename
>Theme.rc</filename
> sencillo</title>
<programlisting
>[KSplash Theme: MiBonitoTema]
Name = MiBonitoTema
Description = Un bonito tema utilizando el motor XpLike
Version = 1.0
Author = Nombre real &lt;nombrereal@correo.com&gt;
## Utiliza el motor XpLike para este tema.
Engine = XpLike
Show Icon = false
Welcome Text = Cargando KDE
</programlisting>
</example>

<para
>Después de especificar el nombre, la descripción y el autor del tema, debe seleccionar el motor del tema (es un complemento). A continuación podrá personalizar varias características del motor del tema asignando pares clave-valor como en el ejemplo anterior.</para>

<important>
<para
>Es importante que el nombre del directorio bajo el que se hayan guardado los archivos del tema (<filename class="directory"
>~/.kde/apps/ksplash/Themes/MiBonitoTema</filename
> en nuestro caso) y el identificador (<literal
>[KSplash Theme: MiBonitoTema]</literal
> en nuestro caso) en el archivo <filename
>Theme.rc</filename
> sean idénticos. Sino &ksplash; no reconocerá el tema.</para>
</important>

</sect2>

<sect2 id="theme-files">
<title
>Archivos de fondo</title>

<para
>Cuando se inicia &ksplash;, intenta encontrar una imagen de fondo para su resolución de pantalla actual, si es que el motor del tema utiliza una. El archivo de imagen del fondo debería tener un nombre que siga el formato <filename
>Background-<replaceable
>WWWxHHH</replaceable
>.png</filename
>.</para>

<para
>Por ejemplo, podría utilizar un archivo llamado <filename
>Background-1024x768</filename
>. Sino puede encontrar una imagen de fondo para su resolución de pantalla, intenta redimensionar el <filename
>Background.png</filename
> original o el archivo especificado en <filename
>Theme.rc</filename
> para adaptarlo a la resolución actual. Redimensionar la imagen sobre la marcha llevará cierto tiempo, por tanto, debería proporcionar imágenes de fondo, al menos para los siguientes tamaños: 1280x1024, 1024x768 y 800x600.</para>
</sect2>
</sect1>

<sect1 id="theme-engines">
<title
>Opciones del motor de temas</title>

<sect2 id="default-themes">
<title
>Tema predeterminado</title>
<table>
<title
>Opciones del tema predeterminado</title>
<tgroup cols="3">
<tbody>
<row>
<entry
>Nombre</entry>
<entry
>Argumento</entry>
<entry
>Descripción</entry>
</row>
<!-- Statusbar -->
<row>
<entry
>Mostrar siempre el progreso</entry>
<entry
>[true/false] (verdadero/falso)</entry>
<entry
>Indica si se debe mostrar el progreso de carga. El valor predeterminado es true (verdadero).</entry>
</row>
<row>
<entry
>Etiqueta del segundo plano</entry>
<entry
>[color]</entry>
<entry
>Determina el color que se utilizará en el texto de la barra de estado. El valor predeterminado es #FFFFFF (blanco).</entry>
</row>
<!-- Misc. things -->
<row>
<entry
>Iconos destelleantes</entry>
<entry
>[true/false] (verdadero/falso)</entry>
<entry
>Indica si se mostrarán los iconos con «destellos». El valor predeterminado es true (verdadero).</entry>
</row>
</tbody>
</tgroup>
</table>
</sect2>

<sect2 id="standard-themes">
<title
>Tema estándar</title>
<table>
<title
>Opciones del tema estándar</title>
<tgroup cols="3">
<tbody>
<row>
<entry
>Nombre</entry>
<entry
>Argumento</entry>
<entry
>Descripción</entry>
</row>
<!-- Statusbar -->
<row>
<entry
>Statusbar Position</entry>
<entry
>[top/bottom] (arriba/abajo)</entry>
<entry
>Cambia la posición de la barra de estado en la pantalla. El valor predeterminado es bottom (abajo).</entry>
</row>
<row>
<entry
>Statusbar Visible</entry>
<entry
>[true/false] (verdadero/falso)</entry>
<entry
>Indica si se debe mostrar la barra de estado. El valor predeterminado es true (verdadero).Indica si se debe mostrar la barra de estado. El valor predeterminado es true (verdadero).</entry>
</row>
<row>
<entry
>Progress Visible</entry>
<entry
>[true/false] (verdadero/falso)</entry>
<entry
>Indica si se debe mostrar el progreso de carga. El valor predeterminado es true (verdadero).</entry>
</row>
<!-- Fonts -->
<row>
<entry
>Statusbar Font</entry>
<entry
>[nombreletra]</entry>
<entry
>El tipo de letra utilizado en la barra de estado. El valor predeterminado es Helvetica.El tipo de letra utilizado en la barra de estado. El valor predeterminado es Helvetica.</entry>
</row>
<row>
<entry
>Statusbar Font Size</entry>
<entry
>[tamaño]</entry>
<entry
>El tamaño de la letra para la barra de estado. El valor predeterminado es 16.El tamaño de la letra para la barra de estado. El valor predeterminado es 16.</entry>
</row>
<row>
<entry
>Statusbar Font Bold</entry>
<entry
>[true/false] (verdadero/falso)</entry>
<entry
>Indica si la letra de la barra de estado debe estar en negrita. El valor predeterminado es true (verdadero).Indica si la letra de la barra de estado debe estar en negrita. El valor predeterminado es true (verdadero).</entry>
</row>
<row>
<entry
>Statusbar Font Italic</entry>
<entry
>[true/false] (verdadero/falso)</entry>
<entry
>Indica si la letra de la barra de estado debe estar en cursiva. El valor predeterminado es false (falso).Indica si la letra de la barra de estado debe estar en cursiva. El valor predeterminado es false (falso).</entry>
</row>
<!-- Misc. things -->
<row>
<entry
>Statusbar Foreground</entry>
<entry
>[color]</entry>
<entry
>El color del primer plano de la barra de estado. El valor predeterminado es white (blanco).El color del primer plano de la barra de estado. El valor predeterminado es white (blanco).</entry>
</row>
<row>
<entry
>Statusbar Background</entry>
<entry
>[color]</entry>
<entry
>El color del fondo de la barra de estado. El valor predeterminado es black (negro).El color del fondo de la barra de estado. El valor predeterminado es black (negro).</entry>
</row>
<row>
<entry
>Statusbar Icon</entry>
<entry
>[true/false] (verdadero/falso)</entry>
<entry
>Indica si la barra de estado tendrá un icono.</entry>
</row>
<row>
<entry
>Icons Visible</entry>
<entry
>[true/false] (verdadero/falso)</entry>
<entry
>Indica si los iconos serán visibles. El valor predeterminado es true (verdadero).Indica si los iconos serán visibles. El valor predeterminado es true (verdadero).</entry>
</row>
<row>
<entry
>Icons Jumping</entry>
<entry
>[true/false] (verdadero/falso)</entry>
<entry
>Indica si los iconos saltarán. El valor predeterminado es true (verdadero).Indica si los iconos saltarán. El valor predeterminado es true (verdadero).</entry>
</row>
<row>
<entry
>Icon Position</entry>
<entry
>[0-3,10-13]</entry>
<entry
>Indica la posición en la que se muestran los iconos. El valor predeterminado es abajo a la izquierda.Indica la posición en la que se muestran los iconos. El valor predeterminado es abajo a la izquierda.</entry>
</row>
<row>
<entry
>Splash Screen</entry>
<entry
>[nombre]</entry>
<entry
>Cambia la imagen que se muestra en la pantalla de inicio.</entry>
</row>
</tbody>
</tgroup>
</table>
</sect2>

<sect2 id="redmond-themes">
<title
>Tema Redmond</title>
<table>
<title
>Opciones del tema Redmon</title>
<tgroup cols="3">
<tbody>
<row>
<entry
>Nombre</entry>
<entry
>Argumento</entry>
<entry
>Descripción</entry>
</row>
<!-- Main elements -->
<row>
<entry
>Background Image</entry>
<entry
>[nombrearchivo]</entry>
<entry
>Imagen a utilizar como fondo.</entry>
</row>
<row>
<entry
>User Icon</entry>
<entry
>[nombreicono]</entry>
<entry
>Nombre del icono estándar que se utilizará para el usuario. El valor predeterminado es <constant
>go</constant
>.</entry>
</row>
<row>
<entry
>Welcome Text</entry>
<entry
>[texto]</entry>
<entry
>Texto que se muestra en la pantalla de inicio. El valor predeterminado es «Bienvenido».Texto que se muestra en la pantalla de inicio. El valor predeterminado es «Bienvenido».</entry>
</row>
<row>
<entry
>Username Text</entry>
<entry
>[texto]</entry>
<entry
>Texto que se muestra en lugar del nombre real del usuario.</entry>
</row>
<!-- Positioning elements -->
<row>
<entry
>Welcome Text Position</entry>
<entry
>[x,y]</entry>
<entry
>Posición en la que se mostrará el texto de Bienvenida.</entry>
</row>
<row>
<entry
>Username Text Position</entry>
<entry
>[x,y]</entry>
<entry
>Posición de la pantalla en la que se mostrará el nombre del usuario.</entry>
</row>
<row>
<entry
>Action Text Position</entry>
<entry
>[x,y]</entry>
<entry
>Posición de la pantalla en la que se mostrará la acción que se está realizando.Posición de la pantalla en la que se mostrará la acción que se está realizando.</entry>
</row>
<row>
<entry
>Icon Position</entry>
<entry
>[x,y]</entry>
<entry
>Posición de la pantalla en la que se mostrará el icono de usuario.</entry>
</row>
<!-- Show to show.. -->
<row>
<entry
>Show Welcome Text</entry>
<entry
>[true/false] (verdadero/falso)</entry>
<entry
>Indica si se mostrará el texto de bienvenida. El valor predeterminado es true (verdadero).Indica si se mostrará el texto de bienvenida. El valor predeterminado es true (verdadero).</entry>
</row>
<row>
<entry
>Show Welcome Shadow</entry>
<entry
>[true/false] (verdadero/falso)</entry>
<entry
>Indica si se sombreará el texto de bienvenida. El valor predeterminado es true (verdadero).Indica si se sombreará el texto de bienvenida. El valor predeterminado es true (verdadero).</entry>
</row>
<row>
<entry
>Show Username</entry>
<entry
>[true/false] (verdadero/falso)</entry>
<entry
>Indica si se mostrará el nombre de usuario. El valor predeterminado es true (verdadero).Indica si se mostrará el nombre de usuario. El valor predeterminado es true (verdadero).</entry>
</row>
<row>
<entry
>Show Action</entry>
<entry
>[true/false] (verdadero/falso)</entry>
<entry
>Indica si se mostrará la acción que se está llevando a cabo. El valor predeterminado es true (verdadero).Indica si se mostrará la acción que se está llevando a cabo. El valor predeterminado es true (verdadero).</entry>
</row>
<row>
<entry
>Show Icon</entry>
<entry
>[true/false] (verdadero/falso)</entry>
<entry
>Indica si se mostrará el icono. El valor predeterminado es true (verdadero).Indica si se mostrará el icono. El valor predeterminado es true (verdadero).</entry>
</row>
<row>
<entry
>Use KDM User Icon</entry>
<entry
>[true/false] (verdadero/falso)</entry>
<entry
>Indica si se mostrará el icono de acceso del usuario. El valor predeterminado es true (verdadero).Indica si se mostrará el icono de acceso del usuario. El valor predeterminado es true (verdadero).</entry>
</row>
</tbody>
</tgroup>
</table>
</sect2>

<sect2 id="macx-themes">
<title
>Tema MacX</title>
<table>
<title
>Opciones del tema MacX</title>
<tgroup cols="3">
<tbody>
<row>
<entry
>Nombre</entry>
<entry
>Argumento</entry>
<entry
>Descripción</entry>
</row>
<row>
<entry
>Icon Size Minimum</entry>
<entry
>[tamaño]</entry>
<entry
>Establece el tamaño mínimo de los iconos. El valor predeterminado es 16.Establece el tamaño mínimo de los iconos. El valor predeterminado es 16.</entry>
</row>
<row>
<entry
>Icon Size Maximum</entry>
<entry
>[tamaño]</entry>
<entry
>Establece el tamaño máximo de los iconos. El valor predeterminado es 64.Establece el tamaño máximo de los iconos. El valor predeterminado es 64.</entry>
</row>
<row>
<entry
>Optimized Icon Rendering</entry>
<entry
>[true/false] (verdadero/falso)</entry>
<entry
>Indica si se optimizará la presentación del icono. El valor predeterminado es true (verdadero).Indica si se optimizará la presentación del icono. El valor predeterminado es true (verdadero).</entry>
</row>
<row>
<entry
>Progress Bar Visible</entry>
<entry
>[true/false] (verdadero/falso)</entry>
<entry
>Indica si la barra de progreso estará visible. El valor predeterminado es true (verdadero).Indica si la barra de progreso estará visible. El valor predeterminado es true (verdadero).</entry>
</row>
<row>
<entry
>Progress Bar Position</entry>
<entry
>[top/bottom] (arriba/abajo)</entry>
<entry
>Indica si la barra de estado se situará en la parte superior o inferior. El valor predeterminado es bottom (abajo).</entry>
</row>
<row>
<entry
>Icons Jumping</entry>
<entry
>[true/false] (verdadero/falso)</entry>
<entry
>Indica si los iconos saltarán. El valor predeterminado es false (falso).Indica si los iconos saltarán. El valor predeterminado es false (falso).</entry>
</row>
</tbody>
</tgroup>
</table>
</sect2>

<sect2 id="mac-classic-themes">
<title
>Tema MacClassic</title>
<table>
<title
>Opciones del tema MacClassic</title>
<tgroup cols="3">
<tbody>
<row>
<entry
>Nombre</entry>
<entry
>Argumento</entry>
<entry
>Descripción</entry>
</row>
<row>
<entry
>Icon Position</entry>
<entry
>[0-3,10-13]</entry>
<entry
>Posición de los iconos en la pantalla. El valor predeterminado es abajo a la izquierda.Posición de los iconos en la pantalla. El valor predeterminado es abajo a la izquierda.</entry>
</row>
<row>
<entry
>Icons Jumping</entry>
<entry
>[true/false] (verdadero/falso)</entry>
<entry
>Indica si los iconos saltarán. El valor predeterminado es false (falso).Indica si los iconos saltarán. El valor predeterminado es false (falso).</entry>
</row>
<row>
<entry
>Icons Visible</entry>
<entry
>[true/false] (verdadero/falso)</entry>
<entry
>Indica si los iconos serán visibles. El valor predeterminado es true (verdadero).Indica si los iconos serán visibles. El valor predeterminado es true (verdadero).</entry>
</row>
<row>
<entry
>Splash Screen</entry>
<entry
>[nombre]</entry>
<entry
>Cambia la imagen que se muestra en la pantalla de inicio.</entry>
</row>
</tbody>
</tgroup>
</table>
</sect2>

<sect2 id="themes-2k">
<title
>Tema 2k</title>
<table>
<title
>Opciones del tema 2k</title>
<tgroup cols="3">
<tbody>
<row>
<entry
>Nombre</entry>
<entry
>Argumento</entry>
<entry
>Descripción</entry>
</row>
<row>
<entry
>Title Background Color</entry>
<entry
>[color]</entry>
<entry
>Color del fondo del título. El valor predeterminado es dark blue (azul oscuro).Color del fondo del título. El valor predeterminado es dark blue (azul oscuro).</entry>
</row>
<row>
<entry
>Title Foreground Color</entry>
<entry
>[color]</entry>
<entry
>Color del primer plano del título. El valor predeterminado es white (blanco).Color del primer plano del título. El valor predeterminado es white (blanco).</entry>
</row>
<row>
<entry
>Status Text Color</entry>
<entry
>[color]</entry>
<entry
>Color del texto de estado. De forma predeterminada será el mismo que el del fondo.Color del texto de estado. De forma predeterminada será el mismo que el del fondo.</entry>
</row>
<row>
<entry
>Rotator Color 1</entry>
<entry
>[color]</entry>
<entry
>Define el color del rotador 1. El valor predeterminado es dark blue (azul oscuro).Define el color del rotador 1. El valor predeterminado es dark blue (azul oscuro).</entry>
</row>
<row>
<entry
>Rotator Color 2</entry>
<entry
>[color]</entry>
<entry
>Define el color del rotador 2. El valor predeterminado es cyan (azul cian).Define el color del rotador 2. El valor predeterminado es cyan (azul cian).</entry>
</row>
<row>
<entry
>Rotator Speed</entry>
<entry
>[valor]</entry>
<entry
>Define la velocidad de giro. El valor predeterminado es 30.</entry>
</row>
<row>
<entry
>Window Title</entry>
<entry
>[texto]</entry>
<entry
>Especifica el texto del título de la ventana.</entry>
</row>
<row>
<entry
>Logo File</entry>
<entry
>[nombrearchivo]</entry>
<entry
>Define el logotipo utilizado.</entry>
</row>
</tbody>
</tgroup>
</table>
</sect2>
</sect1>
</chapter>

<chapter id="from-other-applications">
<title
>Utilizar &ksplash; dentro de su aplicación.</title>

<para
>En este capítulo describiremos un método sencillo para utilizar &ksplash; como la pantalla de inicio de su aplicación &kde;. Sino desarrolla aplicaciones para &kde; puede saltarse este capítulo.</para>

<sect1 id="basic-other-reqs">
<title
>Requisitos básicos</title>

<para
>Sus aplicaciones &kde;, deberían ser capaces de utilizar &DCOP;. &DCOP; es la tecnología de &kde; utilizada para la comunicación entre aplicaciones. Si utiliza la <ulink url="http://developer.kde.org"
>estructura de aplicación &kde;</ulink
> estándar, se incluirá automáticamente. Para obtener información sobre &DCOP; y las tecnologías relacionadas con &kde;, vea la <ulink url="http://developer.kde.org"
>página de los desarrolladores de &kde;</ulink
>.</para>
</sect1>

<sect1 id="other-using">
<title
>Iniciando &ksplash;</title>

<para
>Antes de que su aplicación se inicie comience a trabajar, o antes de que comience a cargar complementos, &etc;, llame a &ksplash; de la siguiente forma:</para>

<programlisting
>DCOPClient *c = kapp-&gt;dcopClient();
QString error;
QCString KSplashName;
int pid = 0;
QStringList args;
args &lt;&lt; "--theme=MiBonitoTema" &lt;&lt; "--managed";
if (kapp-&gt;startServiceByDesktopName("ksplash", args, &amp;error, &amp;KSplashName, &amp;pid))
{
  KMessageBox::sorry(0, error, "Imposible llamar a KSplash");
  // Aquí se procesará el error.
}
</programlisting>

<para
>Asumiremos que solo hay una instancia de &ksplash; en ejecución. El resto de los casos son algo más complejos. Por favor, vea la documentación de &DCOP; para obtener detalles más amplios.</para>
</sect1>

<sect1 id="show-messages">
<title
>Mostrar mensajes</title>

<para
>Antes de mostrar cualquier mensaje, necesitará definir el número de pasos que se mostrarán. Por ejemplo, el procedimiento de inicio de &kde; utiliza 7 pasos.</para>

<programlisting
>QByteArray data;
    QDataStream arg(data,IO_WriteOnly);
    arg &lt;&lt; cualquierNumero;
    if (!(c-&gt;send(KSplashName, "KSplashIface", "setStartupItemCount(int)", data))
      // Aquí se procesará el error.
</programlisting>

<para
>Cuando quiera mostrar un mensaje, con o sin icono, utilice:</para>

<programlisting
>arg &lt;&lt; QString("nombreIcono") &lt;&lt; QString("nombrePrograma") &lt;&lt; QString("Alguna descripción");
    if (!(c-&gt;send(KSplashName, "KSplashIface", "programStarted(QString,QString,QString)", data))
    {
      // Aquí se procesará el error.
    }
</programlisting>

<para
>Cada vez que llame a <constant
>programStarted</constant
>, se incrementarán los pasos completados. Cuando su programa haya terminado de iniciarse, haga lo siguiente para hacer que la pantalla de inicio desaparezca:</para>

<programlisting
>if (!(c-&gt;send(KSplashName, "KSplashIface", "startupComplete()", data))
    {
      // Aquí se procesará el error.
    }
</programlisting>

<para
>¡Ya está! si es que no necesita nada más de todas las posibilidades que le ofrece &ksplash;.¡Ya está! si es que no necesita nada más de todas las posibilidades que le ofrece &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
>Escribiendo nuevos complementos para &ksplash;</title>

<para
>Escribir complementos nuevos para &ksplash; no es difícil. En este capítulo, escribiremos un complemento sencillo que emulará la pantalla de inicio de un sistema operativo bien conocido. Este tutorial asume que tiene conocimientos básicos de C++ y un poco de programación KDE/Qt.</para>

<sect1 id="basic-requirements">
<title
>Requisitos básicos</title>
<para
>Crearemos un complemento llamado <literal
>2k</literal
>. El nombre del complemento se utiliza en varios lugares, y es importante que lo utilice consistentemente para que el complemento sea reconocido por &ksplash;. Los complementos de &ksplash; son bibliotecas que se pueden cargar dinámicamente y que siguen la siguiente convención para los nombres: </para>
<simplelist>
<member
>La biblioteca debería llamarse <filename
>ksplash+nombretemaenminusculas</filename
>. En nuestro caso será <filename
>ksplash2k</filename
>.</member>
<member
>Debería tener su correspondiente archivo desktop llamado <filename
>ksplash+nombretemaenminusculas.desktop</filename
>. En nuestro caso será <filename
>ksplash2k.desktop</filename
>. </member>
<member
>Finalmente, el objeto devuelto por la biblioteca debería ser una clase llamada <literal
>Theme+nombretema</literal
>. En nuestro caso, será <literal
>Theme2k</literal
>.</member>
</simplelist>
<para
>No se preocupe sino entiende todo lo anterior. Veremos cada uno de estos puntos con más detalle posteriormente. Otro detalle importante es que la clase del complemento debería derivar de <literal
>ThemeEngine</literal
>. </para>
</sect1>
<sect1 id="skeleton">
<title
>Construir la estructura del esqueleto</title>
<para
>Utilizaremos la estructura de una aplicación &kde; para construir el complemento de forma que sea independiente de la plataforma, y ello, sin ningún trabajo por nuestra parte. Para hacer esto asegúrese de que tiene instalado el paquete <filename
>kdesdk</filename
>. Ejecute la orden <literal
>kapptemplate</literal
> para crear una aplicación llamada «2k». Esto creará una estructura de carpetas que contendrán archivos genéricos tales como AUTHORS, &etc;. Estamos más interesados en la subcarpeta llamada <filename class="directory"
>2k</filename
>. Vaya a la subcarpeta y borre todos sus archivos. Ahora ya tenemos el esqueleto que necesitamos. </para>
<para
>El siguiente paso es crear un archivo <filename
>.desktop</filename
> que, cuando se instale, le diga a &ksplash; que nuestro complemento está disponible. De acuerdo con la convención de nombre tratada en la <link linkend="basic-requirements"
>sección anterior</link
>, crearemos un archivo llamado <filename
>ksplash2k.desktop</filename
> en esta carpeta. Debería contener las siguientes líneas: </para>
<programlisting
><literal>
[Desktop Entry]
Encoding=UTF-8
Type=Service
Comment=Complemento KSplash
Name=KSplash2k
ServiceTypes=KSplash/Plugin
X-KDE-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
> y <literal
>ServiceTypes</literal
> son iguales para todas los complementos. El nombre del complemento y de la biblioteca siguen las convenciones tratadas antes. La entrada <literal
>X-KSplash-Default</literal
> es un valor lógico que determina si se mostrará en el módulo de configuración del panel de control de forma predeterminada. Excepto para casos muy raros debería ser <constant
>true</constant
> (verdadero). </para>
</sect1>
<sect1 id="headerfile">
<title
>Declaración de la clase del complemento</title>
<para
>Ya tenemos el trabajo previo hecho, déjenos introducirle en la parte más divertida, crear una clase que proporcionará el comportamiento deseado. A pesar de que somos libres para que esta clase haga lo que queramos, existen algunas restricciones.</para>
<orderedlist>
<listitem
><para
>Las clases de los complementos deben heredarse de la clase <constant
>ThemeEngine</constant
>.</para
></listitem>
<listitem
><para
>Las clases de los complementos deben nombrarse de acuerdo con la regla: <classname
>Tema+NombreExtension</classname
>.</para
></listitem>
<listitem
><para
>Las clases de los complementos deberían proporcionar una función <literal
>static</literal
> llamada <function
>names</function
> que devuelva una lista de nombres que puedan ser llamados.</para
></listitem>
<listitem
><para
>Si el complemento puede configurarse en el módulo del centro de control, debería proporcionar una clase basada en <literal
>ThemeEngineConfig</literal
> para la configuración.</para
></listitem>
<listitem
><para
>Las clases de los complementos pueden sobreescribir, al menos, las funciones virtuales <function
>slotSetText</function
>, <function
>slotSetPixmap</function
>, <function
>slotUpdateProgress</function
> y <function
>slotUpdateSteps</function
> para hacerlo utilizable.</para
></listitem>
<listitem
><para
>El constructor debería tener la forma <literal
>ThemeEngine( QWidget *parent, const char *name, const QStringList &amp;args )</literal
>, y por tanto, puede ser utilizado con <classname
>KGenericFactory</classname
>.</para
></listitem>
</orderedlist>
<para
>El último requisito puede parecer complicado, pero, como se verá posteriormente bastará con añadir una línea a sus archivos fuente, y que generalmente podrá ignorar.</para>
</sect1>
<sect1 id="headercode">
<title
>Código para el archivo de cabecera</title>
<para
>Proporciona las constantes, y veremos que el archivo de cabecera <filename
>theme2k.h</filename
> debería ser algo parecido a esto:</para>
<example>
<title
>Listado de <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( KConfig * );
};

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( KConfig *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
>Analicemos el listado anterior. La clase <classname
>Theme2k</classname
> cumple con la convención de nombres, y está heredada de <classname
>ThemeEngine</classname
>. Proporciona <methodname
>Theme2k::names()</methodname
>, y tiene un constructor que toma los parámetros requeridos: <function
>Theme2k( QWidget *, const char *, const QStringList&amp; );</function
> y también proporciona un método simple <methodname
>Theme2k::slotSetText()</methodname
>. Por el momento no se preocupe de la clase <classname
>RotWidget</classname
>. Es un pequeño componente que proporcionará algo que le gustará al usuario. Nuestro complemento es muy simple y no muestra iconos en la barra de progreso. Si desea mostrar iconos, sobreescriba la función <function
>slotSetPixmap</function
>. Existen funciones similares para configurar los pasos de la barra de progreso (<function
>slotUpdateSteps</function
>) e incrementan el paso actual (<function
>slotUpdateProgress</function
>). </para>
</sect1>
<sect1 id="Implementation">
<title
>Implementación del complemento</title>
<para
>Sólo examinaremos las partes relevantes de la implementación. Para obtener la impletación completa, véa el apéndice. Lo primero que haremos es cargar la librería:</para>
<example>
<title
>Librería requerida</title>
<programlisting
>K_EXPORT_COMPONENT_FACTORY( ksplash2k, KGenericFactory&lt;Theme2k&gt; );K_EXPORT_COMPONENT_FACTORY( ksplash2k, KGenericFactory&lt;Theme2k&gt; );
</programlisting>
</example>
<para
>La macro <constant
>K_EXPORT_COMPONENT_FACTORY</constant
> está declarada en <filename
>kgenericfactory.h</filename
>. ¡Ahora vamos con el constructor! Como esta es un complemento muy sencillo, el constructor es muy sencillo.</para>
<example>
<title
>Constructor del complemento</title>
<programlisting
>Theme2k::Theme2k( QWidget *parent, const char *name, const QStringList &amp;args
 )
    :ThemeEngine( parent, name, args )
{
  readSettings();
  initUi();
}
</programlisting>
</example>
<para
>El método <function
>readSettings()</function
> ilustra la forma de obtener la configuración de su tema (Desea que la gente utilice sus complementos ¿no es cierto?).</para>
<example>
<title
>Obtener las configuraciones del tema</title>
<programlisting
>void Theme2k::readSettings()
{
  if( !mTheme )
    return;

  KConfig *cfg = mTheme-&gt;themeConfig();
  if( !cfg )
    return;

  cfg-&gt;setGroup( QString("Tema KSplash: %1").arg(mTheme-&gt;theme()) );

  QColor DefaultTBgColor( Qt::darkBlue );
  QColor DefaultTFgColor( Qt::white );

  mTBgColor = cfg-&gt;readColorEntry( "Color del fondo del título", &amp;DefaultTBgColor );
  mTFgColor = cfg-&gt;readColorEntry( "Color del primer plano del título", &amp;DefaultTFgColor );
  mStatusColor = cfg-&gt;readColorEntry("Status Text Color", &amp;mTBgColor );

  QColor DefaultRot1( Qt::darkBlue );
  QColor DefaultRot2( Qt::cyan );
  mRotColor1 = cfg-&gt;readColorEntry( "Color del rotator 1", &amp;DefaultRot1 );
  mRotColor2 = cfg-&gt;readColorEntry( "Color del rotador 2", &amp;DefaultRot2 );

  mRotSpeed = cfg-&gt;readNumEntry( "Velocidad de rotación", 30 );
  mWndTitle = cfg-&gt;readEntry( "Título de la ventana", i18n("Por favor espere...") );
  mLogoFile = cfg-&gt;readEntry( "Archivo de logotipo", QString::null );
}
</programlisting>
</example>
<para
>Cómo deseamos que nuestros usuarios sean razonables proporcionaremos valores predeterminados adecuados a los parámetros que no existan en el archivo del tema. Tenga en cuenta que siempre debería configurar nuestro grupo con «KSplash Theme: nombretema» para hacerlo compatible con futuras especificaciones del tema. El método <function
>initUI</function
> no es muy interesante, y simplemente construye el componente. Por favor, véa el apéndice para obtener más detalles. </para>
</sect1>
<sect1 id="compilingfile">
<title
>Compilar el complemento</title>
<para
>Puesto que hemos decidido utilizar una estructura &kde; para compilar el complemento, necesitaremos crear un <filename
>Makefile.am</filename
>. Debería ser algo similar a:</para>
<example>
<title
>Contenido de <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_KDEUI) -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
>Para obtener más información de cómo escribir archivos <filename
>Makefile.am</filename
> para &kde;, por favor vea el <ulink url="http://developer.kde.org/documentation/other/makefile_am_howto.html"
>sitio web de los desarrolladores de &kde;</ulink
>. Lo único que debe tener en cuenta es proporcionar un tema predeterminado basado en este complemento y proporcionar una imagen para ella. Como muestra de cortesía hacia nuestros usuarios, debería proporcionar un archivo <filename
>Theme.rc</filename
> de ejemplo ilustrando el uso de las diferentes opciones.</para>
</sect1>
</chapter>

<chapter id="faq">
<title
>Preguntas y respuestas</title>
&reporting.bugs; &updating.documentation; <qandaset id="faqlist">
<qandaentry>
<question>
<para
>No puedo encontrar ningún tema que funcione en &ksplash; ¿Por qué?</para>
</question>
<answer>
<para
>Probablemente no tenga los complementos correctos para el tema. Los complementos se encuentran en el paquete <literal
>kde-artwork</literal
>. Descárguelo, instálelo e inténtelo de nuevo.</para>
</answer>
</qandaentry>
<qandaentry>
<question>
<para
>¿Qué es el archivo <filename
>Theme.rc</filename
> y cómo puedo hacer uno?¿Qué es el archivo <filename
>Theme.rc</filename
> y cómo puedo hacer uno?</para>
</question>
<answer>
<para
><filename
>Theme.rc</filename
> es el archivo en el que puede especificar una configuración del tema. Para obtener más información, eche un vistazo a <link linkend="themes"
>Cómo hacer temas para &ksplash;</link
>. </para>
</answer>
</qandaentry>
</qandaset>
</chapter>

<chapter id="credits">
<title
>Créditos y licencia</title>

<para
>&ksplash;</para>

<para
>Derechos de autor del programa &copy; 2003 &Ravikiran.Rajagopal; &Ravikiran.Rajagopal.mail;.</para>

<itemizedlist>
<title
>Contribuciones</title>
<listitem
><para
>&Brian.C.Ledbetter; &Brian.C.Ledbetter.mail;.</para>
</listitem>
</itemizedlist>

<para
>Derechos de autor de la documentación &copy; 2003 &Teemu.Rytilahti; &Teemu.Rytilahti.mail;.</para>
&underFDL; &underGPL; </chapter>

<appendix id="installation">
<title
>Instalación</title>

<sect1 id="requirements">
<title
>Requisitos</title>

<para
>Para utilizar &ksplash;, necesita &kde; 3.2 o superior. Algunos temas puede requerir también complementos adicionales. Si un tema no funciona, contacte con su autor para pedirle información.</para>

</sect1>

<sect1 id="compilation">
<title
>Compilación e instalación</title>
&install.compile.documentation; </sect1>
</appendix>
<appendix id="srccode">
<title
>Código fuente</title>
<sect1 id="theme2kcpp">
<title
>Listado de <filename
>theme2k.cpp</filename
></title>
<programlisting
>#include &lt;qlabel.h&gt;
#include &lt;qwidget.h&gt;

#include &lt;kapplication.h&gt;
#include &lt;kconfig.h&gt;
#include &lt;kdebug.h&gt;
#include &lt;kdialogbase.h&gt;
#include &lt;kgenericfactory.h&gt;
#include &lt;kglobalsettings.h&gt;
#include &lt;klocale.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( KConfig * )
{}

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(KGlobalSettings::splashScreenDesktopGeometry());
  move( rect.x() + (rect.width() - size().width())/2,
        rect.y() + (rect.height() - size().height())/2 );
}

void Theme2k::readSettings()
{
  if( !mTheme )
    return;

  KConfig *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( "Color del rotador 1", &amp;DefaultRot1 );
  mRotColor2 = cfg-&gt;readColorEntry( "Color del rotador 2", &amp;DefaultRot2 );

  mRotSpeed = cfg-&gt;readNumEntry( "Velocidad del rotador", 30 );
  mWndTitle = cfg-&gt;readEntry( "Ventana del título", i18n("Por favor, espere...") );
  mLogoFile = cfg-&gt;readEntry( "Archivo de logotipo", QString::null );
}
</programlisting>
</sect1>
<sect1 id="rotwidgeth">
<title
>Listado de <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 Muestra un gradiente girando.
 */
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
>Listado de <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()
{
  // Esto es ineficaz dado que creamos demasiados mapas de imagen, a optimizar después.
  m_step += m_speed;
  if( m_step &gt; width() )
    m_step = 0;
  repaint( true );
}

// por hacer. Optimizar el dibujado.
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;

  // Dibujaremos explícitamente nuestro primer punto. El resto lo hará bitBlt().
  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>

<!--
Local Variables:
mode: xml
sgml-minimize-attributes:nil
sgml-general-insert-case:lower
sgml-indent-step:0
sgml-indent-data:nil
End:

vim:tabstop=2:shiftwidth=2:expandtab
-->
