# Création de thèmes pour l'écran de bienvenue &kdm;

Cette section décrit la création de thèmes pour l'écran de bienvenue. Pour des exemples comprenant des captures d'écran, voyez les thèmes standards installés et les thèmes du site web des thèmes.

## Aperçu de la création de thèmes

Vous pouvez construire des thèmes &kdm; en créant un fichier XML qui suit la spécification de `$`KDEDIR`/share/apps/doc/kdm/greeter.dtd`. Les fichiers de thème sont conservés dans le dossier `$`KDEDIR`/share/apps/kdm/themes/`nom_du_thème`` . Le dossier du thème doit contenir un fichier nommé `KdmGreeterTheme.desktop` qui a un format similaire aux autres fichiers `.desktop` et ressemble à ceci :

    [KdmGreeterTheme]
     Greeter=cercles.xml
     Name=Cercles
     Description=Thème avec des cercles bleus
     Author=Bond, James Bond
     Copyright=(c) 2002 Bond, James Bond
     Screenshot=copie_d_écran.png

Les champs `Name`, `Description`, `Author` et `Copyright` peuvent être traduits tout comme dans d'autres fichiers `.desktop`. Tous les fichiers mentionnés doivent être dans dans le dossier du thème. Le champ `Screenshot` pointe vers un fichier qui doit être une copie d'écran de taille 200x150 du thème en situation réelle (il est possible de l'omettre, mais sa présence est préférable pour l'utilisateur). Le champ `Greeter` pointe vers un fichier XML qui contient la description du thème.

Une fois qu'un thème a été complètement testé, créez une archive au format tarball contenant le dossier tel qu'il serait installé dans le dossier `$`KDEDIR`/share/apps/kdm/themes`. Ceci est le format standard pour la distribution de thèmes &kdm;.

## Description détaillée du format XML des thèmes

### Le nœud de premier niveau

Les thèmes &kdm; sont des fichiers XML avec la balise <greeter> à leur racine. Le nœud de premier niveau est un nœud « élément » de type `rect` avec une mise en page fixe implicite.

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE greeter SYSTEM "greeter.dtd">
    <greeter>
    [...]
    </greeter>

Dans la balise « greeter », vous pouvez trouver les nœuds décris dans les sections suivantes de ce document. Certains de ces nœuds sont des conteneurs (nœuds pour la mise en page, nœuds « élément ») pouvant à leur tour contenir d'autres nœuds.

### Les nœuds « élément »

Un thème &kdm; est créé en spécifiant une hiérarchie de nœuds « élément » et de nœuds de mise en page. Les nœuds « élément » peuvent avoir la valeur suivante pour l'attribut `type` :

button

- Un champ de type bouton. Ce champ utilise un bouton Qt.

  Il est aussi possible de faire en sorte que tout autre élément se comporte comme un bouton en positionnant son attribut `button` à `true`. Cependant, il est préférable d'utiliser des boutons Qt dans les thèmes &kdm; car ceux-ci sont accessibles aux personnes ayant des problèmes d'accessibilité.

entry

- Une zone de saisie sur une ligne ou une liste déroulante. Veuillez noter que ceci est simplement un substituant aux composants graphiques de Qt.

label

- Une zone de texte. Elle doit contenir soit un nœud `texte` soit un nœud `stock` afin de spécifier le texte.

list

- Un composant graphique de sélection d'avatar.

pixmap

- Une image raster dans un format pris en charge par Qt, &pex; PNG, JPEG, Tiff, &etc;

rect

- Un rectangle plein.

svg

- Une image vectorielle au format SVG.

Par exemple :

    <item type="label">

Un item fonctionnant comme un bouton :

    <item type="rect" id="bouton-déconnexion" button="true">.

Par défaut, l'écran &kdm; disparaîtra après l'authentification. Ceci peut conduire à un scintillement de l'image entre les écrans de connexion et de session. L'attribut `background` permet aux utilisateurs de spécifier quels éléments du thème constituent l'image de fond. Lorsque cet attribut est utilisé, &kdm; supprime tous les éléments qui ne font pas partie de l'arrière-plan et effectue le rendu des éléments `background` qui restent sur la fenêtre racine. Ceci peut être utilisé pour créer une transition douce entre les écrans de connexion et de session :

    <item type="rect" background="true">
      <normal file="background.svg"/>
      <pos x="0" y="0" width="100 % "  height="-75"/>
    </élément>

Afin d'utiliser un arrière-plan différent de celui de l'écran de connexion pour la transition, le thème doit spécifier deux nœuds item (qui peuvent contenir des pixmaps ou des images SVG, par exemple). Le nœud « élément » qui correspond à l'arrière-plan de l'écran de bienvenue ne doit pas avoir d'attribut `background`, au contraire de celui qui correspond à l'arrière-plan de transition. Par exemple :

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE greeter SYSTEM "greeter.dtd">
    <greeter>
      <item type="rect" background="true">
        <normal file="background_for_login.svg" element="background"/>
        <pos x="0" y="0" width="100%"  height="100%"/>
      </item>
      <item type="rect">
        <normal file="background_for_greeter.svg"/>
        <pos x="0" y="0" width="100%"  height="100%"/>
      </item>
      [...]
    </greeter>

Dans les configurations multi-écrans, les thèmes peuvent aussi spécifier l'apparence des autres écrans que celui sur lequel est l'écran de bienvenue - mais typiquement seuls les éléments d'arrière-plan apparaîtront ici. Afin de spécifier sur quel(s) écran(s) un élément doit apparaître, l'attribut `screen` peut être utilisé avec une valeur parmi `greeter`, `other` ou `all`, ce qui signifie respectivement l'écran sur lequel l'écran de bienvenue est, tous les écrans sur lesquels l'écran de bienvenue n'est pas, et tous les écrans.

Un nom peut être donné à chaque nœud « élément » via l'attribut `id`. Certains identifiants sont reconnus par &kdm; et donnent une fonction spéciale aux nœuds « élément » afférents :

Les éléments `button` et ceux avec l'attribut `button="true"`.

- Typiquement, les boutons déclenchent certaines actions. De plus, &kdm; cachera les boutons dont les actions sont indisponibles pour une quelconque raison.

  Identifiant (id)Action
  - chooser_button Lance le sélecteur XDMCP.
  - disconnect_button Déconnexion d'une session à distance.
  - session_button Ouvre le menu de sélection du type de session.
  - system_button Ouvre une menu fourre-tout avec diverses options et actions qui dépendent de la configuration.

Éléments `label`

- &kdm; affichera/cachera ces zones de texte et définira leur texte en fonction de l'état de la boîte de dialogue.

  Identifiant (id)Fonction
  - pam-error Ceci affiche le message Échec de la connexion.

Éléments intégrant des composants graphiques

- &kdm; intégrera des composants graphiques Qt particuliers dans ces éléments.

  Identifiant (id)Fonction
  - user-entry Champ pour la saisie du nom d'utilisateur.
  - pw-entry Champ pour la saisie du mot de passe.
  - domain-entry Certains modules externes de communication utilisent ce champ pour effectuer une requête sur un nom de domaine. Si ce champ est présent, les éléments qui l'englobent doivent avoir des nœuds d'affichage avec le type `plugin-domain-entry`.
  - talker Cet élément devrait être du type `rect`. Il représente la zone chaude de l'écran de bienvenue : il contient les éléments `label` et `entry` qui concernent le processus d'authentification. Si un module externe de communication ne peut pas effectuer de correspondance entre ses besoins et les éléments existants, il tente d'embarquer, dans cet élément, un composant graphique complexe avec sa propre mise en page, ce qui a pour effet de ne pas du tout tenir compte du talker du thème. Strictement parlant, les thèmes &kdm; n'ont pas du tout besoin de fournir de propres conceptions de talker, car tous les modules externes d'authentification de &kdm; sont capables d'utiliser l'élément `talker`.
  - userlist Cet élément doit être du type `list`. Si la fonctionnalité d'affichage de la liste d'utilisateurs est activée, &kdm; embarque ici le composant graphique d'affichage de la liste d'utilisateurs. Sinon, cet élément est caché.
  - xconsole Cet élément devrait être du type `rect`. Si la fonctionnalité intégrée `xconsole` est compilée et activée, &kdm; embarquera ici le composant graphique de journalisation de console. Sinon, cet élément est caché.

Autres éléments

- &kdm; affichera ou cachera ces éléments en fonction de la configuration et de l'état actuel de l'écran de bienvenue. &kdm; ne leur impose pas d'exigences, mais ils se prêtent généralement à un type particulier.

  Identifiant (id)N'est affiché que lorsque...
  - timed-label ... une connexion temporisée est en cours.
  - caps-lock-warning ... le verrouillage majuscule est activé.
  - xauth-warning ... le &X-Server; ne requiert pas d'autorisation X pour se connecter.
  - userlist-rect ... la liste d'utilisateurs est active. En imbriquant l'élément `userlist` dans celui-ci, il est possible de créer quelque chose qui ressemble à un cadre autour de la liste et qu'il ne soit affiché que lorsque la liste d'utilisateurs elle-même est affichée.
  - xconsole-rect ... la fonctionnalité `xconsole` est activée. Est similaire à `userlist-rect`.

### Nœuds conteneurs pour la mise en page

Les nœuds de mise en page apparaissent dans les nœuds « éléments » et contiennent d'autres nœuds « élément ». Le type de nœud de mise en page détermine la disposition de ses nœuds fils. Un nœud « élément » peut contenir un nœud de mise en page de chaque type.

#### Nœuds « box »

Les nœuds « box » organisent automatiquement leurs enfants en ligne. Ils sont spécifiés ainsi :

     <box orientation="alignement " min-width="num " min-height="num"
         xpadding="num"  ypadding="num" spacing=" num"
         homogeneous="bool">

Où `num` est un nombre de pixels et `bool` vaut soit `true` soit `false`. La valeur `alignement` peut être soit `horizontal` soit `vertical`. Si vous ne mettez pas de valeur  à un attribut, sa valeur part défaut sera zéro pour les nombres, `false` pour les booléens et `vertical` pour l'orientation.

Le « spacing » est la distance séparant les nœuds « élément » enfants voisins. Le « padding » est la marge extérieure du nœud « box ». Si le nœud « box » est homogène, l'espace alloué à chaque nœud « élément » enfant est le même.

#### Nœuds « fixed »

Le nœud « fixed » est un conteneur dont les fils sont disposés à des coordonnées précises. La taille de ce conteneur est le plus petit rectangle qui contient tous les enfants. Le nœud « fixed » n'a pas d'attributs supplémentaires et vous utilisez simplement :

     <fixed>

Puis vous placez à l'intérieur de ce nœud d'autres nœuds « élément » avec des nœuds « pos » adéquats.

### Nœuds « pos »

Chaque élément peut spécifier ses position et taille via le nœud `pos`. Par exemple :

    <pos x="0" y="4" width="100 % "  height="100 % "/>

Si la taille n'est pas spécifiée, elle sera la taille naturelle du nœud « élément », appelée la taille indiquée. Remarquez que tous les « éléments » n'ont pas de taille indiquée.

À la fois la position et la taille peuvent être fournis en pourcentage et seront dans ce cas calculés relativement à la taille du conteneur les englobant. Pour les nœuds « élément » de niveau supérieur, il s'agit du pourcentage de l'écran entier. En ajoutant des accents circonflexes (`^`) à la spécification de la taille, il est possible de la modifier pour qu'elle soit relative à la taille de l'élément englobant l'élément qui l'englobe, et ainsi de suite...

Si le nœud « élément » contient un nœud « box », `width` et `height` peuvent être spécifiés à `box` afin de signifier qu'ils sont supposés être de la largeur et de la hauteur du nœud « box », c'est-à-dire les nœuds « élément » dans le nœud « box » plus le « padding ».

La valeur d'un des attributs `width` et `height` peut être spécifiée à `scale` afin de signifier qu'il devrait être recalculé en fonction de l'échelle de l'autre dimension et relativement à sa taille indiquée. Utilisez ceci afin de conserver automatiquement la proportion des images redimensionnées.

Si l'attribut `expand` est spécifié et qu'il vaut`true`, ce nœud « élément » sera développé autant que possible dans le conteneur qui l'englobe (c'est-à-dire que toute place disponible lui sera allouée).

Si `width` ou `height` sont des nombres, une valeur négative représente un décalage par rapport à la taille du conteneur qui l'englobe. Remarquez qu'il est possible de spécifier un décalage positif en utilisant deux signes négatifs.

Dans tous les cas, il est possible de contraindre la taille finale avec les attributs `min-width`, `min-height`, `max-width` et `max-height` qui peuvent être spécifiés de la même manière que `width` et `height`.

Si `x` ou `y` sont des nombres, une valeur négative représente un décalage par rapport au bord inférieur droit, à l'inverse de la valeur par défaut qui est le bord supérieur gauche.

Il est aussi possible de spécifier le point à l'intérieur du nœud « élément » auquel se réfère la position. Celui-ci est appelé l'ancre et peut au choix être `c` pour le centre, ou bien `n`, `ne`, `e`, `se`, `s`, `sw`, `w` ou `nw` qui représentent les positions cardinales des différents bords/coins. La valeur par défaut est `nw`, qui correspond au coin supérieur gauche. Par exemple :

    <pos x="10 % " y="50 % " anchor="w" width="80 % " height="95"/>

### Afficher des nœuds

Vous pouvez spécifier l'attribut `type` afin d'indiquer que certains nœuds « élément » ne devraient être affichés que si le type est défini. En préfixant le type d'un point d'exclamation (`!` ), la condition est inversée. Les valeurs valables incluent :

Type Afficher si...
- `chooser` il est permis de basculer en mode de connexion à distance.
- `halt` et `reboot` il est permis d'effectuer un arrêt du système.
- `system` aucune condition (toujours défini dans &kdm;).
- `plugin-``nom` le module externe conversation fournit un champ de saisie éponyme.

Par exemple :

    <show type="chooser"/>

De manière alternative, vous pouvez spécifier une valeur `min-screen-width` ou `min-screen-height` afin d'indiquer que certains nœuds « élément » ne doivent être affichés que si la résolution d'écran est au moins de la taille spécifiée. Par exemple :

    <show min-screen-height="768"/>

### Nœuds « Normal » / « Active » / « Prelight »

L'apparence de la plupart des types d'éléments peut être paramétrée via les balises suivantes :

`normal`

- État normal.

`prelight`

- Lorsque la souris survole l'élément.

`active`

- Lorsqu'un bouton de souris est pressé sur l'élément.

L'ensemble exact d'attributs disponibles dépend du type d'éléments :

`rect`

-     <normal color="#000000" alpha="0.0"/>

  Chacun des attributs peut être omis, auquel cas la valeur par défaut est utilisée (l'exemple représente les valeurs par défaut). `alpha` est un nombre à virgule flottante entre zéro (transparent) et un (opaque). `color` est un dièse suivi d'un nombre hexadécimal à six chiffres ; le format est `#``rrvvbb`. De manière alternative, `color` peut être spécifié comme un nombre hexadécimal à huit chiffres, auquel cas les deux premiers chiffres sont la valeur alpha.

`label`

-     <normal color="#ffffff" alpha="1.0" font="Sans  14"/>

  `alpha` et `color` sont spécifiés tout comme pour les nœuds rect.

  `font` suit le format `liste-de-famille` `options-de-style` `taille`. Chaque partie est optionnelle.

  `liste-de-famille` est une liste de familles de polices séparées par des virgules comme helvetica, monospace, etc.

  `options-de-style` est une liste de mots clés séparés par des virgules et faisant partie des catégories style, poids et élasticité ; au plus un de chaque catégorie. Le style peut être `normal`, `italic` ou `oblique`. Le poids peut être `ultra-light`, `light`, `medium`, `semi-bold`, `bold`, `ultra-bold` ou `heavy`. Les élasticités permises sont parmi `ultra-condensed`, `extra-condensed`, `condensed`, `semi-condensed`, `normal`, `semi-expanded`, `expanded`, `extra-expanded` et `ultra-expanded`.

  `taille` est soit un nombre à virgule flottante représentant la taille en points (1/72 pouce), soit un entier suivi de `px` représentant la taille en pixels. Indiquer des tailles en points est préférable, car elles sont indépendantes de la résolution d'affichage.

  Si l'un de ces attributs n'est pas spécifié, les valeurs du nœud de style sont utilisées. Si ceci n'amène à aucune spécification de couleur de texte de fenêtre, le blanc est utilisé. La police par défaut est celle configurée dans &kdmrc;.

`pixmap`

`svg`

-     <normal file="image.png" tint="#dddddd"  alpha="1.0"/>

  `file` spécifie le fichier contenant l'image. Les emplacements relatifs le sont par rapport au dossier du thème.

  `wallpaper` peut être utilisé au lieu de `file` pour que &kdm; recherche des images aux emplacements usuels de fonds d'écran de &kde;. Les paquets de fonds d'écran Plasma sont pris en charge.

  `element` spécifie l'identifiant d'élément d'un fichier SVG. S'il est vide, le rendu de l'ensemble de l'image SVG sera effectué.

  Pour les nœuds `pixmap`, il est possible de fournir plusieurs images, de telle sorte que l'image de meilleure qualité pour une résolution donnée puisse être utilisée. Le nom de fichier fait état de la taille de l'image en respectant le format suivant : `nom-de-base``-``largeur` `x` `hauteur``.``extension`. Si le fichier ne fait pas état de la taille et s'il n'est pas un paquet pour un fond d'écran Plasma, &kdm; n'acceptera seulement une correspondance exacte pour une taille donnée sinon il reviendra au fichier d'origine. Sinon il essayera de trouver une image dont la taille est quasiment la même que celle requise si aucune correspondance exacte n'est trouvée.

  `scalemode` spécifie la manière d'ajuster la taille des images qui ne correspondent pas à la taille de l'élément. `free` (par défaut) signifie de simplement redimensionner l'image à la bonne taille, ce qui peut la déformer. Les deux autres modes conservent les proportions de l'image : `fit` signifie d'agrandir l'image à la taille maximale tenant dans la forme de l'élément. L'image sera centrée. La zone restante ne sera pas remplie par cet élément, elle devrait donc être placée au-dessus d'un `rect` rempli. `rogner` signifie diminuer l'image à la taille minimale en remplissant complètement la forme de l'élément. L'image sera coupée symétriquement.

  `tint` et `alpha` forment une spécification de couleur comme pour les nœuds `rect`. Chaque pixel de l'image est multiplié par cette couleur, eu égard au composant.

### Nœuds de style de composant graphique (« widget »)

Cette balise permet de changer l'apparence d'étiquettes et des composants graphiques Qt intégrés dans le thème, par exemple des zones de saisie sur une ligne, des boutons ou la liste d'utilisateurs. Les paramètres de style sont hérités par les nœuds enfants, mais ceux-ci peuvent être outrepassés individuellement. Les valeurs par défaut sont celles configurées dans &kdmrc;.

L'attribut `font` définit la police de caractères pour tous les composants graphiques. Pour les composants graphiques ayant une fonction de saisie, il peut être outrepassé avec l'attribut `edit-font`. Les polices de caractères sont spécifiées de la même manière que pour les nœuds normal/active/prelight.

De manière usuelle, le moteur de thèmes s'efforce de supprimer tous les cadres des composants graphiques Qt, de telle sorte qu'ils fusionnent de façon transparente dans le même thème. Dans les cas où ceci ne serait pas désiré, l'attribut `frame` peut être défini à `true`.

L'attribut `guistyle` peut être utilisé afin d'outrepasser le style du GUI Qt pour les composants graphiques fournis par défaut. Le style par défaut est défini par `GUIStyle` dans &kdmrc;

Il est possible de spécifier la palette presque entière pour les composants graphiques comme documenté sur le site de Trolltech. Les noms d'attributs sont composés d'un cadre, d'un rôle de couleur et d'un suffixe. Les cadres possibles sont - par ordre d'importance croissante - `all-` pour tous les groupes de couleurs, pas de cadre pour les groupes de couleurs actif et inactif et `active-`, `inactive-` et `disabled-` pour les groupes de couleurs respectifs. Les rôles de couleurs pris en charge sont `window`, `window-text`, `base`, `alternate-base`, `text`, `bright-text`, `highlight`, `highlighted-text`, `button` et `button-text`. Le suffixe peut être `-color` ou `-alpha` avec la signification respective comme dans les normal/active/prelight nodes.

Une alternative pour spécifier la palette directement en ligne peut être l'utilisation de l'attribut `colorscheme` pour charger un jeu de couleurs &kde; complet. Par défaut, ce jeu de couleur est donné par `ColorScheme` dans &kdmrc;. Les spécifications de `couleurs` individuelles outrepasseront les couleurs du jeu de couleurs.

Exemple :

    <style edit-font="Comic 16" text-color="#dddddd"  frame="true"/>

### Nœuds de couleur de zone de sélection d'avatar

Les noeuds de couleurs permettent d'outrepasser la couleur d'arrière plan des éléments dans la zone de sélection d'avatar. `labelcolor` et `altlabelcolor` sont essentiellement équivalents à `all-base-color` respectivement `all-alternate-base-color` dans le style des noeuds. Si `labelcolor` est seulement spécifié, les éléments d'arrière plan alternatifs sont désactivés.

    <color labelcolor="#80ffffff"  altlabelcolor="#80f0f0f0"/>

### Nœuds de texte

Les balises de texte sont utilisées par les étiquettes. Elles peuvent être utilisées pour afficher un texte traduit comme suit (si l'attribut `xml:lang` est omis, la norme POSIX de la langue est supposée) :

    <text xml:lang="fr">Option</text>

Les nœuds de texte peuvent contenir les séquences de caractères spéciaux suivantes, qui seront interprétées comme suit :

Séquence Expansion
- %% Un caractère « % »
- %c Une horloge avec temps et date
- %d Nom de l'affichage (variable d'environnement `DISPLAY`)
- %h Nom d'hôte (résultat de `gethostname`)
- %m Nom de machine (partie machine du résultat de `uname`)
- %n Nom de nœud (partie nodename du résultat de `uname`)
- %o Nom de domaine (résultat de `getdomainname`)
- %r Nom de version (partie release du résultat de `uname`)
- %s Nom de système (partie sysname du résultat de `uname`)
- %t Nombre de secondes restantes avant que la connexion temporisée soit effectuée, auquel est ajouté la forme plurielle i18n adéquate de seconde
- %u Nom d'utilisateur pour la connexion temporisée
- _ A pour effet de définir le caractère suivant comme accélérateur clavier

`%t` et `%u` sont supposés être utilisés seulement en interne pour afficher le message de `timed-label` qui est automatiquement mis à jour toutes les secondes.

### Nœud « stock »

Certaines étiquettes usuelles traduites peuvent être spécifiées via les étiquettes stock. L'étiquette `text` est ignorée si l'étiquette `stock` est utilisée. Vous devriez vraiment utiliser les étiquettes stocks plutôt que d'insérer toutes les traductions dans les thèmes. Cela diminue le temps de chargement et donne de meilleures traductions. Les valeurs suivantes sont valables :

Type Expansion
- caps-lock-warning Le verrouillage majuscule est activé
- chooser Sélecteu_r XDMCP
- quit _Quitter
- disconnect Déconn_ecter
- halt Étei_ndre
- langue Lan_gue
- login _Connexion
- session _Type de session
- reboot Re_démarrer
- system _Menu
- timed-label L'utilisateur %u se connectera dans %t
- domain-label _Domaine :
- username-label _Nom d'utilisateur :
- password-label _Mot de passe :
- welcome-label Bienvenue sur %h

Par exemple :

    <stock type="welcome-label"/>

### Nœud « buddy »

Les éléments qui ne provoquent pas directement une action peuvent être assignées au buddy. Le buddy donne le focus en entrée quand l'élément est activé (cliqué ou un accélérateur d'`étiquette` appuyé).

Le buddy est référencé par identifiant avec l'attribut `idref`. Évidemment, vous devez donner un identifiant. Exemple :

    <item type="label">
      <stock type="username-label"/>
      <buddy idref="user-entry"/>
      [...]
    </item>
    [...]
    <item type="entry" id="user-entry">
      [...]
    </item>