<?xml version="1.0" ?>
<!DOCTYPE book PUBLIC "-//KDE//DTD DocBook XML V4.2-Based Variant V1.1//EN" "dtd/kdex.dtd" [
  <!ENTITY ksplash "KSplash">
  <!ENTITY package "kdebase">
  <!ENTITY % addindex "IGNORE">
  <!ENTITY % Italian "INCLUDE">
]>

<book lang="&language;">

<bookinfo>
<title
>Manuale di &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
>Massimiliano</firstname
><surname
>Donno</surname
><affiliation
><address
><email
>massidonno@infinito.it</email
></address
></affiliation
><contrib
>Traduzione del manuale</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; è un ottimo splash screen che visualizza il progresso di una applicazione in caricamento.</para>
</abstract>

<keywordset>
<keyword
>KDE</keyword>
<keyword
>kdebase</keyword>
<keyword
>ksplash</keyword>
<keyword
>ksplashml</keyword>
<keyword
>splashscreen</keyword>
<keyword
>sciroppo per gli occhi</keyword>
</keywordset>

</bookinfo>

<chapter id="introduction">
<title
>Introduzione</title>

<para
>&ksplash; è un ottimo splash screen che visualizza il progresso di una applicazione in caricamento. Per favore riporta qualsiasi problema o richieste di funzionalità aggiuntive alla mailing list di &kde;. Le funzionalità principali di &ksplash;: </para>
<simplelist>
<member
>Possibilità di usare Temi</member>
<member
>Usa i plugin per una completa personalizzazione</member>
<member
>Può essere usato da qualsiasi applicazione che usa DCOP</member>
</simplelist>

<para
>Questo manuale ti mostra come creare dei temi usabili con i plugin che sono già disponibili. Se nessuno dei plugin disponibili soddisfa i tuoi gusti, puoi imparare come personalizzare completamente le sembianze di &ksplash; scrivendo un plugin in C++. </para>
</chapter>

<chapter id="using-themes">
<title
>Usare Temi</title>

<para
>Per usare i temi del sito <ulink url="http://www.kde-look.org"
>KDE-Look</ulink
>, estraili in <filename
>~/.kde/share/apps/ksplash/Themes/</filename
> per ogni singolo utente, o in <filename
>$<envar
>KDEDIR</envar
>/share/apps/ksplash/Themes/</filename
> per renderli disponibili a tutti gli utenti del sistema.</para>

<para
>Puoi anche usare il modulo <guilabel
>Schermata d'avvio</guilabel
>in <guilabel
>Aspetto e Temi</guilabel
> nel centro di controllo di &kde; per fare ciò in automatico.</para>

<sect1 id="using-kcontrol-module">
<title
>Usare il modulo di &kcontrol;</title>

<para
>Questo modulo permette di installare, testare e rimuovere temi di &ksplash;.</para>

<para
>Su un lato del modulo c'è una lista di temi di &ksplash; subito disponibili. Appena se ne seleziona uno, verrà visualizzata un anteprima nella parte centrale della finestra. Quando ne hai selezionato uno che desideri usare, premi <guibutton
>Applica</guibutton
>. Premi <guibutton
>Ripristina </guibutton
> per uscire dal modulo senza effettuare le modifiche, e <guibutton
>Valori predefiniti</guibutton
> per ripristinare la schermata di avvio predefinita.</para>

<para
>Per installare nuovi moduli, premi <guibutton
>Aggiungi...</guibutton
>, e trova il tema sul tuo computer. Non devi decomprimere il file del tema, puoi tranquillamente selezionare il file del tema compresso. Installare un tema non significa cambiare quello attualmente in uso fin quando non lo si seleziona esplicitamente dalla lista e si preme <guibutton
>Applica</guibutton
>.</para>

<para
>Puoi anche vedere un anteprima dello splash screen in azione, per vedere come si comporta nell'uso reale, per esempio per renderti conto di come sono le animazioni. Puoi testare il tema selezionandolo dalla lista e cliccare il bottone <guibutton
>Prova</guibutton
>.</para>

<para
>Puoi anche rimuovere un tema che non vuoi più usare, selezionandolo e premendo il bottone <guilabel
>Rimuovi</guilabel
>. Nota che un utente semplice potrebbe non avere i permessi per rimuovere il tema installato per tutti gli utenti del sistema. Ti raccomando inoltre di non rimuovere lo splash screen <guilabel
>Predefinito</guilabel
>.</para>

</sect1>

</chapter>

<chapter id="themes">
<title
>Come creare temi per &ksplash;</title>
<sect1 id="themes-general">
<title
>Generale</title>
<para
>Creare un tuo tema per &ksplash; è semplice. Una volta terminato il tuo tema, puoi postarlo a <ulink url="http://www.kde-look.org"
> KDE-Look</ulink
> per permettere ad altri utenti di utilizzarlo.</para>

<sect2 id="theme-syntax">
<title
>Identifica il tuo tema</title>

<para
>Creiamo un tema chiamato <literal
>MyCoolTheme</literal
>. Per permettere al tema di essere riconosciuto da &ksplash; deve essere memorizzato nella cartella chiamata <filename class="directory"
>MyCoolTheme </filename
> sotto <filename class="directory"
> ~/.kde/apps/ksplash/Themes/</filename
>. Deve contenere anche un file chiamato <filename
>Theme.rc</filename
>, contenente le impostazioni per il tema. Puoi specificare un gran numero di elementi speciali del tema, cambiare il motore dei plugin da usare, e così via. Non hai bisogno di utilizzare tutte le impostazioni disponibili, perchè generalmente le opzioni predefinite sono già buone. La sintassi di base per le linee nel file<filename
>Theme.rc</filename
> è <literal
>[opzione] = [valore]</literal
>. Puoi trovare la definizione delle varie opzioni nelle sezioni successive.</para>

<example>
<title
>Semplice file <filename
>Theme.rc</filename
></title>
<programlisting
>[KSplash Theme: MyCoolTheme]
Name = MioTemaFico
Description = Un tema simpatico usando il motore XpLike
Version = 1.0
Author = Real Name &lt;realmail@mail.com&gt;
## Usa il motore XpLike per questo tema.
Engine = XpLike
Show Icon = false
Welcome Text = Sto caricando KDE
</programlisting>
</example>

<para
>Dopo aver specificato il nome, la descrizione e l'autore del tema, devi scegliere un motore per il tema (anche conosciuto come plugin). Dopodichè puoi personalizzare le varie funzionalità del motore assegnando una coppia di valori chiave come nel seguente file di esempio.</para>

<para
>Il nome della cartella sotto la quale i file del tema sono memorizzati (<filename class="directory"
> ~/.kde/apps/ksplash/Themes/MyCoolTheme</filename
> nel nostro caso) e l'identificativo del tema (<literal
>[KSplash Theme: MyCoolTheme] </literal
> nel nostro caso) nel file <filename
>Theme.rc</filename
> DEVE essere lo stesso. Altrimenti &ksplash; non riconoscerà il tema. </para>

</sect2>

<sect2 id="theme-files">
<title
>File di Sfondo</title>

<para
>Quando &ksplash; parte, tenta di cercare un immagine di sfondo per la risoluzione dello schermo attuale, sempre se il motore del tema ne usa uno. Il file dell'immagine di sfondo deve essere chiamto nel seguente formato: <filename
>Background-<replaceable
>LLLxAAA </replaceable
>.png</filename
>.</para>

<para
>Per esempio potresti usare un file chiamato <filename
>Background-1024x768 </filename
>. Se l'immagine di sfondo per la risoluzione dello schermo attuale non può essere trovata, ksplash tenta di ridimensionare la immagine originale <filename
>Background.png</filename
> o il file specificato in <filename
>Theme.rc</filename
> per meglio asservire la risoluzione corrente. Il ridimensionamento al volo prenderà un certo tempo, quindi dovresti provvedere diverse immagini di sfondo per almeno le seguenti risoluzioni: 1280x1024, 1024x768 e 800x600.</para>
</sect2>
</sect1>

<sect1 id="theme-engines">
<title
>Opzioni per i motori del tema</title>

<sect2 id="standard-themes">
<title
>Tema standard</title>
<table>
<title
>Opzioni del tema standard (nel file di configurazione vanno riportati i comandi in inglese, la traduzione è solo esplicativa ed è un commento, in stile script per la shell, cioè tutto quello che segue il carattere #)</title>
<tgroup cols="3">
<tbody>
<row>
<entry
>Name #Nome</entry>
<entry
>Argument #Argomento</entry>
<entry
>Explanation #Spiegazione</entry>
</row>
<!-- Statusbar -->
<row>
<entry
>Statusbar Position #posizione della barra di stato</entry>
<entry
>[top/bottom] #alto/basso</entry>
<entry
>Scambia la posizione della barra di stato sullo schermo. Predefinito è bottom (in basso).</entry>
</row>
<row>
<entry
>Statusbar Visible #barra di stato visibile</entry>
<entry
>[true/false] #si/no</entry>
<entry
>Indica se la barra di stato deve essere visualizzata. Predefinito è true (visualizzata).</entry>
</row>
<row>
<entry
>Progress Visible #barra di progresso visibile</entry>
<entry
>[true/false] #si/no</entry>
<entry
>Indica se il progresso del caricamento deve essere mostrato. Predefinito è true (visualizzato).</entry>
</row>
<!-- Fonts -->
<row>
<entry
>Statusbar Font #Carattere della barra di stato</entry>
<entry
>[fontname] #nome del carattere</entry>
<entry
>Il carattere usato nella barra di stato. Predefinito è Helvetica.</entry>
</row>
<row>
<entry
>Statusbar Font Size #dimensione del carattere della barra di stato</entry>
<entry
>[size] #dimensione</entry>
<entry
>La dimensione del carattere nella barra di stato. Predefinito è 16.</entry>
</row>
<row>
<entry
>Statusbar Font Bold #Carattere grassetto per la barra di stato</entry>
<entry
>[true/false] #si/no</entry>
<entry
>Indica se il carattere della barra di stato deve essere grassetto. Predefinito è true (grassetto).</entry>
</row>
<row>
<entry
>Statusbar Font Italic #Carattere corsivo per la barra di stato</entry>
<entry
>[true/false] #si/no</entry>
<entry
>Indica se il carattere della barra di stato deve essere corsivo. Predefinito è false (non in corsivo).</entry>
</row>
<!-- Misc. things -->
<row>
<entry
>Statusbar Foreground #Primo piano della barra di stato</entry>
<entry
>[color] #colore</entry>
<entry
>Il colore di primo piano della barra di stato. Predefinito è white (bianco).</entry>
</row>
<row>
<entry
>Statusbar Background #sfondo della barra di stato</entry>
<entry
>[color] #colore</entry>
<entry
>Il colore di sfondo della barra di stato. Predefinito è black (nero).</entry>
</row>
<row>
<entry
>Statusbar Icon #Icona della barra di stato</entry>
<entry
>[true/false] #si/no</entry>
<entry
>Indica se la barra di stato deve avere un icona.</entry>
</row>
<row>
<entry
>Icons Visible #icone visibili</entry>
<entry
>[true/false] #si/no</entry>
<entry
>Indica se l'icona deve essere visibile. Predefinito è true (visibile).</entry>
</row>
<row>
<entry
>Icons Jumping #salto tra icone</entry>
<entry
>[true/false] #si/no</entry>
<entry
>Indica se l'icona deve saltare. Predefinito è true (salta).</entry>
</row>
<row>
<entry
>Icon Position #posizione delle icone</entry>
<entry
>[0-3,10-13]</entry>
<entry
>Posizione dove le icone sono mostrate. Predefinito è bottom-left (in basso a sinistra).</entry>
</row>
<row>
<entry
>Splash Screen #schermata di splash</entry>
<entry
>[name] #nome</entry>
<entry
>Cambia l'immagine dello splash screen visualizzato.</entry>
</row>
</tbody>
</tgroup>
</table>
</sect2>

<sect2 id="redmond-themes">
<title
>tema Redmond</title>
<table>
<title
>opzioni del tema Redmond</title>
<tgroup cols="3">
<tbody>
<row>
<entry
>Name #Nome</entry>
<entry
>Argument #Argomento</entry>
<entry
>Explanation #Spiegazione</entry>
</row>
<!-- Main elements -->
<row>
<entry
>Background Image #immagine di sfondo</entry>
<entry
>[filename] #nome del file</entry>
<entry
>Immagine di sfondo definita dall'utente.</entry>
</row>
<row>
<entry
>User Icon #icona utente</entry>
<entry
>[Iconname] #nome icona</entry>
<entry
>Nome dell'icona standard da usare. Predefinito è<constant
>go</constant
>.</entry>
</row>
<row>
<entry
>Welcome Text #messaggio di benvenuto</entry>
<entry
>[text] #testo</entry>
<entry
>Testo mostrato nello splash screen. Predefinito è "Welcome".</entry>
</row>
<row>
<entry
>Username Text #testo del nome utente</entry>
<entry
>[text] #testo</entry>
<entry
>Testo mostrato al posto del nome reale dell'utente.</entry>
</row>
<!-- Positioning elements -->
<row>
<entry
>Welcome Text Position #posizione del testo di benvenuto</entry>
<entry
>[x,y]</entry>
<entry
>Posizione dello schermo dove è piazzato il testo di benvenuto.</entry>
</row>
<row>
<entry
>Username Text Position #posizione del testo del nome utente</entry>
<entry
>[x,y]</entry>
<entry
>Posizione dello schermo dove è piazzato il nome utente.</entry>
</row>
<row>
<entry
>Action Text Position #posizione del testo dove è l'azione corrente</entry>
<entry
>[x,y]</entry>
<entry
>Posizione dello schermo dove avviene la azione corrente.</entry>
</row>
<row>
<entry
>Icon Position #posizione delle icone</entry>
<entry
>[x,y]</entry>
<entry
>Posizione dello schermo dove è visualizzata l'icona dell'utente.</entry>
</row>
<!-- Show to show.. -->
<row>
<entry
>Show Welcome Text #mostra testo di benvenuto</entry>
<entry
>[true/false] #si/no</entry>
<entry
>Decide se mostrare o no il testo di benvenuto. Predefinito è true (si).</entry>
</row>
<row>
<entry
>Show Welcome Shadow #mostra l'ombra del testo di benvenuto</entry>
<entry
>[true/false] #si/no</entry>
<entry
>Decide se mostrare o no l'ombra del testo di benvenuto. Predefinito è true.</entry>
</row>
<row>
<entry
>Show Username #mostra nome utente</entry>
<entry
>[true/false] #si/no</entry>
<entry
>Decide se mostrare o no il nome utente. Predefinito è true.</entry>
</row>
<row>
<entry
>Show Action #mostra l'azione corrente</entry>
<entry
>[true/false] #si/no</entry>
<entry
>Decide se mostrare o no l'azione corrente. Predefinito è true.</entry>
</row>
<row>
<entry
>Show Icon #mostra l'icona</entry>
<entry
>[true/false] #si/no</entry>
<entry
>Decide se mostrare o no l'icona. Predefinito è true.</entry>
</row>
<row>
<entry
>Use KDM User Icon #usa le icone utenti di KDM</entry>
<entry
>[true/false] #si/no</entry>
<entry
>Mostra le icone di login dell'utente. Predefinito è true.</entry>
</row>
</tbody>
</tgroup>
</table>
</sect2>

<sect2 id="macx-themes">
<title
>Tema MacX</title>
<table>
<title
>Opzioni del tema MacX</title>
<tgroup cols="3">
<tbody>
<row>
<entry
>Name #Nome</entry>
<entry
>Argument #Argomento</entry>
<entry
>Explanation #Spiegazione</entry>
</row>
<row>
<entry
>Icon Size Minimum #minima dimensione icone</entry>
<entry
>[size] #dimensione</entry>
<entry
>Assegna la dimensione minima delle icone. Predefinito è 16.</entry>
</row>
<row>
<entry
>Icon Size Maximum #massima dimensione delle icone</entry>
<entry
>[size] #dimensione</entry>
<entry
>Assegna la dimensione massima delle icone. Predefinito è 64.</entry>
</row>
<row>
<entry
>Optimized Icon Rendering #ottimizzazione presentazione icone</entry>
<entry
>[true/false] #si/no</entry>
<entry
>Ottimizza il rendering delle icone. Predefinito è true.</entry>
</row>
<row>
<entry
>Progress Bar Visible #barra di progresso visibile</entry>
<entry
>[true/false] #si/no</entry>
<entry
>Predefinito è true</entry>
</row>
<row>
<entry
>Progress Bar Position #posizione barra di progresso</entry>
<entry
>[top/bottom] #alto/basso</entry>
<entry
>Decide se mostrare la barra di stato in basso o in alto. Predefinito è bottom (basso).</entry>
</row>
<row>
<entry
>Icons Jumping #salto tra icone</entry>
<entry
>[true/false] #si/no</entry>
<entry
>Indica se le icone devono saltare. Predefinito è false.</entry>
</row>
</tbody>
</tgroup>
</table>
</sect2>

<sect2 id="mac-classic-themes">
<title
>Tema MacClassic</title>
<table>
<title
>Opzioni del tema MacClassic</title>
<tgroup cols="3">
<tbody>
<row>
<entry
>Name #Nome</entry>
<entry
>Argument #Argomento</entry>
<entry
>Explanation #Spiegazione</entry>
</row>
<row>
<entry
>Icon Position #posizione delle icone</entry>
<entry
>[0-3,10-13]</entry>
<entry
>Posizione delle icone sullo schermo. Predefinito è bottom-left (giu-sinistra).</entry>
</row>
<row>
<entry
>Icons Jumping #salto tra icone</entry>
<entry
>[true/false] #si/no</entry>
<entry
>Indica se le icone devono saltare. Predefinito è false.</entry>
</row>
<row>
<entry
>Icons Visible #icone visibili</entry>
<entry
>[true/false] #si/no</entry>
<entry
>Indica se l'icona deve essere visibile. Predefinito è true (visibile).</entry>
</row>
<row>
<entry
>Splash Screen #schermata di splash</entry>
<entry
>[name] #nome</entry>
<entry
>Cambia l'immagine dello splash screen visualizzato.</entry>
</row>
</tbody>
</tgroup>
</table>
</sect2>

<sect2 id="themes-2k">
<title
>Tema 2k</title>
<table>
<title
>Opzioni del tema 2k</title>
<tgroup cols="3">
<tbody>
<row>
<entry
>Name #Nome</entry>
<entry
>Argument #Argomento</entry>
<entry
>Explanation #Spiegazione</entry>
</row>
<row>
<entry
>Title Background Color #colore dello sfondo del titolo</entry>
<entry
>[color] #colore</entry>
<entry
>Il colore di sfondo del titolo. Predefinito è dark blue (blu).</entry>
</row>
<row>
<entry
>Title Foreground Color #colore del primo piano del titolo</entry>
<entry
>[color] #colore</entry>
<entry
>Il colore di primo piano del titolo. Predefinito è white (bianco).</entry>
</row>
<row>
<entry
>Status Text Color #Colore del testo di stato</entry>
<entry
>[color] #colore</entry>
<entry
>Il colore del testo della barra di stato. Predefinito è lo stesso colore dello sfondo del titolo.</entry>
</row>
<row>
<entry
>Rotator Color 1 #colore rotatore 1</entry>
<entry
>[color] #colore</entry>
<entry
>Definisce il colore del rotatore 1. Predefinito è dark blue.</entry>
</row>
<row>
<entry
>Rotator Color 2 #colore rotatore 2</entry>
<entry
>[color] #colore</entry>
<entry
>Definisce il colore del rotatore 2. Predefinito è cyan (celeste).</entry>
</row>
<row>
<entry
>Rotator Speed #velocità del rotatore</entry>
<entry
>[value] #valore</entry>
<entry
>Definisce la velocità del rotatore. Predefinito è 30.</entry>
</row>
<row>
<entry
>Window Title #Titolo della finestra</entry>
<entry
>[text] #testo</entry>
<entry
>Specifica il titolo della finestra.</entry>
</row>
<row>
<entry
>Logo File #file dello stemma</entry>
<entry
>[filename] #nome del file</entry>
<entry
>Definisce il logo usato.</entry>
</row>
</tbody>
</tgroup>
</table>
</sect2>
</sect1>
</chapter>

<chapter id="from-other-applications">
<title
>Usare &ksplash; Dalle proprie applicazioni.</title>

<para
>In questo capitolo descriviamo un semplice metodo per usare &ksplash; come splash screen per le tue applicazioni &kde;. Se non sviluppi applicazioni per &kde; puoi saltare questo capitolo.</para>

<sect1 id="basic-other-reqs">
<title
>Requisiti di base</title>

<para
>Le tue applicazioni &kde; devono esportare funzioni &DCOP;. &DCOP; è la tecnologia di &kde; usata per comunicare con le applicazioni. Se usi <ulink url="http://developer.kde.org"
>l'infrastruttura delle applicazioni di &kde;</ulink
> standard, questo avverrà automaticamente. Per informazioni su &DCOP; e le tecnologie &kde; visita <ulink url="http://developer.kde.org"
>l'angolo dello sviluppatore &kde;</ulink
>.</para>
</sect1>

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

<para
>Prima che l'applicazione inizi intensivi cicli di calcolo, o prima di caricare i plugin, &etc;, invoca &ksplash; nel seguente modo:</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, "Impossibile invocare KSplash");
  // Qui gestisci gli errori.
}
</programlisting>

<para
>Qui assumiamo che esiste una sola istanza di &ksplash; in esecuzione. Altri casi sono leggermente più complessi. Per favore vedi la documentazione &DCOP; per maggiori dettagli.</para>
</sect1>

<sect1 id="show-messages">
<title
>Mostrare messaggi</title>

<para
>Prima di visualizzare qualsiasi messaggio, devi impostare il numero di passi che vuoi visualizzare. Per esempio la procedura di partenza di &kde; impiega 7 passi.</para>

<programlisting
>QByteArray data;
    QDataStream arg(data,IO_WriteOnly);
    arg &lt;&lt; someNumber;
    if (!(c-&gt;send(KSplashName, "KSplashIface", "setStartupItemCount(int)", data))
      // Processamento degli errori qui.
</programlisting>

<para
>Quando vuoi mostrare un messaggio con o senza un icona, usa</para>

<programlisting
>arg &lt;&lt; QString("iconName") &lt;&lt; QString("programName") &lt;&lt; QString("Some description");
    if (!(c-&gt;send(KSplashName, "KSplashIface", "programStarted(QString,QString,QString)", data))
    {
      // Processamento degli errori qui .
    }
</programlisting>

<para
>Ogni volta che chiami la funzione <constant
>programStarted</constant
>, il passo compiuto viene incrementato. Quando il tuo programma ha finito la fase di startup, fai la seguente cosa per mandar via lo splash screen:</para>

<programlisting
>if (!(c-&gt;send(KSplashName, "KSplashIface", "startupComplete()", data))
    {
      // Qui gestisci gli errori.
    }
</programlisting>

<para
>Ecco fatto! Non hai bisogno di nient'altro per sfruttare tutto quello che &ksplash; ti offre.</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
>Scrivere nuovi plugin per &ksplash;</title>

<para
>Scrivere un nuovo plugin di &ksplash; non è difficile. In questo capitolo scriveremo un semplice plugin che emula lo splash screen di un noto sistema operativo. Questo tutorial premette che tu conosca le basi del C++ e un po di programmazione di KDE/Qt.</para>

<sect1 id="basic-requirements">
<title
>Requisiti di base</title>
<para
>Creeremo un plugin chiamato <literal
>2k</literal
>. Il nome del plugin è usato in vari posti, ed è importante che questo nome venga usato sempre senza modifiche, per permettere a &ksplash; di riconoscerlo. I plugin di &ksplash; sono librerie caricabili dinamicamente con la seguente convenzione sui nomi: </para>
<simplelist>
<member
>La libreria deve essere chiamata come <filename
>ksplash+nomedeltemaminuscolo</filename
>. Nel nostro esempio sarà <filename
>ksplash2k</filename
>.</member>
<member
>Deve esserci un file .desktop corrispondente chiamato <filename
>ksplash+nomedeltemaminuscolo.desktop</filename
>. Nel nostro esempio sarà <filename
>ksplash2k.desktop</filename
>. </member>
<member
>Infine l'oggetto restituito dalla libreria deve essere una classe, chiamata <literal
>Theme+nometema</literal
>. Nel nostro esempio la classe si chiamerà <literal
>Theme2k</literal
>.</member>
</simplelist>
<para
>Non preoccuparti se non hai capito quanto detto. Considereremo ognuno di questi punti in maggior dettaglio più avanti nel manuale. Un altro dettaglio molto importante è che la classe del plugin deve essere derivata dalla classe <literal
>ThemeEngine</literal
>. </para>
</sect1>
<sect1 id="skeleton">
<title
>Creare l'infrastruttura.</title>
<para
>Useremo l'infrastrurrura delle applicazioni di &kde;, che si prenderà cura della compilazione del plugin e ci garantirà l'indipendenza dalla piattaforma senza nessun lavoro da parte nostra. Per fare ciò assicurati di avere il pacchetto <filename
>kdesdk</filename
> installato. Esegui il comando <literal
>kapptemplate</literal
> per produrre un applicazione chiamata "2k". Verrà creata una cartella che contiene file generici come AUTHORS, &etc;. Quello che ci interessa è una sottocartella chiamata <filename class="directory"
>2k</filename
>. Vai in questa cartella e cancella tutti i file presenti. Ora abbiamo lo scheletro di applicazione che ci serve. </para>
<para
>Il prossimo passo consiste nel creare un file <filename
>.desktop</filename
> che, una volta installato, dirà a &ksplash; che il nostro plugin è disponibile. Coerentemente con la nomenclatura portata avanti nella <link linkend="basic-requirements"
>sezione precedente</link
>, crea un file chiamato <filename
>ksplash2k.desktop</filename
> nella sottocartella suddetta. Deve contenere le seguenti linee. </para>
<programlisting
><literal>
[Desktop Entry]
Encoding=UTF-8
Type=Service
Comment=KSplash Plugin
Name=KSplash2k
ServiceTypes=KSplash/Plugin
X-KDE-Library=ksplash2k
X-KSplash-Default=true
X-KSplash-PluginName=2k
X-KSplash-ObjectName=Theme2k
</literal
>
</programlisting>
<para
>Le linee <literal
>Encoding</literal
>, <literal
>Type</literal
>, <literal
>Comment</literal
> e <literal
>ServiceTypes</literal
> sono le stesse per tutti i plugin. Il nome del plugin e della libreria seguono la stessa nomenclatura già usata. La linea <literal
>X-KSplash-Default</literal
> accetta un valore booleano che determina se il plugin deve essere visualizzato nel modulo di configurazione nel centro di controllo. Ad eccezione di pochi casi, questa linea deve essere <constant
>true</constant
>. </para>
</sect1>
<sect1 id="headerfile">
<title
>Dichiarazione delle classi dei plugin</title>
<para
>Adesso che abbiamo svolto le faccende preliminari, andiamo con la parte più divertente, creando una classe che fornirà il comportamento che vogliamo. Siete liberi di fare quasi tutto quello che volete con questa classe, segendo delle semplici restrizioni.</para>
<orderedlist>
<listitem
><para
>Le classi dei plugin devono ereditare la classe <constant
>ThemeEngine</constant
>.</para
></listitem>
<listitem
><para
>Le classi dei plugin devono essere nominate in accordo al ruolo: <classname
>Tema+NomePlugin</classname
>.</para
></listitem>
<listitem
><para
>Le classi dei plugin devono avere una funzione <literal
>static</literal
> chiamata <function
>names</function
> che ritorna una lista di nomi attraverso i quali possono essere invocate.</para
></listitem>
<listitem
><para
>Se il plugin può essere configurato nel modulo del centro di controllo, dovrebbe provvedere una classe basata su <literal
>ThemeEngineConfig </literal
> per la configurazione.</para
></listitem>
<listitem
><para
>Le classi dei plugin devono sovrascrivere almeno una delle seguenti funzioni <function
>slotSetText</function
>, <function
>slotSetPixmap</function
>, <function
>slotUpdateProgress</function
> e <function
>slotUpdateSteps</function
> per renderle funzionanti.</para
></listitem>
<listitem
><para
>Il costruttore deve prendere la forma <literal
>ThemeEngine( QWidget *parent, const char *name, const QStringList &amp;args )</literal
> di modo che possa essere usato con la classe <classname
>KGenericFactory</classname
>.</para
></listitem>
</orderedlist>
<para
>L'ultima richiesta può sembrare complicata ma, come vedremo dopo, aggiungendo una singola linea al tuo file sorgente, puoi ignorarla.</para>
</sect1>
<sect1 id="headercode">
<title
>Codice per il file di header</title>
<para
>Dati i vincoli, possiamo ora vedere il file header <filename
>theme2k.h</filename
> che sarà:</para>
<example>
<title
>Listato di <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
>Analizziamo il listato precedente. La classe <classname
>Theme2k</classname
> soddisfa la convenzione di nomi voluta, ed è ereditata dalla classe <classname
>ThemeEngine</classname
>. Fornisce un metodo <methodname
>Theme2k::names()</methodname
>, ed ha un costruttore che prende i parametri richiesti: <function
>Theme2k( QWidget *, const char *, const QStringList&amp; );</function
> e fornisce un semplice metodo <methodname
>Theme2k::slotSetText()</methodname
>. Per il momento non dobbiamo preoccuparci della classe <classname
>RotWidget</classname
>. Si tratta di un piccolo widget che fornisce alcuni effetti grafici. Il nostro plugin è molto semplice e non mostra icone o barre di progresso. Se vuoi mostrare delle icone devi overloadare la funzione <function
>slotSetPixmap </function
>. Funzioni simili esistono per impostare l'intervallo della barra di progresso (<function
>slotUpdateSteps</function
>) e incrementare il passo corrente (<function
>slotUpdateProgress</function
>). </para>
</sect1>
<sect1 id="Implementation">
<title
>Implementazione dei plugin</title>
<para
>Esamineremo solo le parti rilevanti dell'implementazione. Per il listato completo vedi in appendice. La prima cosa che faremo è ottenere i requisiti delle librerie:</para>
<example>
<title
>Requisiti delle librerie</title>
<programlisting
>K_EXPORT_COMPONENT_FACTORY( libksplash2k, KGenericFactory&lt;Theme2k&gt; );
</programlisting>
</example>
<para
>La macro <constant
>K_EXPORT_COMPONENT_FACTORY</constant
> è dichiarata in <filename
>kgenericfactory.h</filename
>. E ora il costruttore! Dato che questo plugin è super semplice, il costruttore è alquanto semplice.</para>
<example>
<title
>Costruttore del plugin</title>
<programlisting
>Theme2k::Theme2k( QWidget *parent, const char *name, const QStringList &amp;args  )
    :ThemeEngine( parent, name, args )
{
  readSettings();
  initUi();
}
</programlisting>
</example>
<para
>Il metodo <function
>readSettings()</function
> illustra il modo giusto per ottenere le impostazioni del tuo tema (Di sicuro vuoi che altre persone utilizzino il tuo plugin nel loro tema, giusto?)</para>
<example>
<title
>Ottenere le impostazioni del tema</title>
<programlisting
>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( "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
>Siccome noi amiamo i nostri utenti, forniremo dei parametri di default che non sono presenti nel file del tema. Nota che dovresti sempre impostare il gruppo come "KSplash Theme: nome del tema" per rimanere compatibili con le future spacifiche per i temi. Il metodo <function
>initUI()</function
> non è interessante, in quanto crea semplicemente il widget. Per favore vedi in appendice per i dettagli. </para>
</sect1>
<sect1 id="compilingfile">
<title
>Compilare il plugin</title>
<para
>Dato che abbiamo deciso di utilizzare l'infrastruttura delle applicazioni di &kde; per compilare il plugin, dobbiamo creare un <filename
>Makefile.am</filename
>. Dovrebbe apparire come segue:</para>
<example>
<title
>Listato di <filename
>Makefile.am</filename
></title>
<programlisting
>INCLUDES = $(all_includes)

kde_module_LTLIBRARIES = libksplash2k.la

libksplash2k_la_SOURCES = theme2k.cpp rotwidget.cpp
libksplash2k_la_LDFLAGS = $(all_libraries) $(KDE_RPATH)
libksplash2k_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
>Per maggiori informazioni su come scrivere un  file <filename
> Makefile.am</filename
> per &kde;, per favore vedi il <ulink url="http://developer.kde.org/documentation/other/makefile_am_howto.html"
>sito</ulink
> degli sviluppatori di &kde;. La cosa da notare è che noi forniamo un tema predefinito basato su questo plugin, nonchè un anteprima di esso. Per una questione di cortesia ai tuoi utenti, dovresti fornire un file di esempio <filename
>Theme.rc</filename
> che illustra le varie opzioni.</para>
</sect1>
</chapter>

<chapter id="faq">
<title
>Domande e risposte</title>
&reporting.bugs; &updating.documentation; <qandaset id="faqlist">
<qandaentry>
<question>
<para
>Non riesco a trovare nessun tema che funzioni in &ksplash;. Perchè?</para>
</question>
<answer>
<para
>Probabilmente non hai il corretto plugin per il tema. I plugin sono nel pacchetto <literal
>kde-artwork</literal
>. Scaricalo e installalo, e poi riprova.</para>
</answer>
</qandaentry>
<qandaentry>
<question>
<para
>Cos'è il file <filename
>Theme.rc</filename
> e come ne faccio uno?</para>
</question>
<answer>
<para
><filename
>Theme.rc</filename
> è il file dove puoi specificare le impostazioni del tema. Per maggiori informazioni guarda <link linkend="themes"
>Come to fare temi per &ksplash;</link
>. </para>
</answer>
</qandaentry>
</qandaset>
</chapter>

<chapter id="credits">
<title
>Riconoscimenti e License</title>

<para
>&ksplash;</para>

<para
>Copyright &copy; programma 2003 &Ravikiran.Rajagopal; &Ravikiran.Rajagopal.mail;</para>

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

<para
>Copyright &copy; documentazione 2003 &Teemu.Rytilahti; &Teemu.Rytilahti.mail;</para>
&underFDL; &underGPL; </chapter>

<appendix id="installation">
<title
>installazione</title>

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

<para
>Per usare correttamente &ksplash; hai bisogno di &kde; versione 3.2 o superiore. Alcuni temi potrebbero richiedere specifici plugin. Se un tema non funziona, per favore contatta l'autore del tema per trovare come ottenere i plugin appropriati.</para>

</sect1>

<sect1 id="compilation">
<title
>Compilazione e Installazione</title>
&install.compile.documentation; </sect1>
</appendix>
<appendix id="srccode">
<title
>Codice sorgente</title>
<sect1 id="theme2kcpp">
<title
>Listato di <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( libksplash2k, 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( "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
>Listato di <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
>Listato di <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>

<!--
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
-->
