# Thema's aanmaken voor de &kdm;-begroeting

Deze sectie beschrijft het aanmaken van thema's voor de greeter met thema's. Voor voorbeelden inclusief schermafdrukken, zie de geïnstalleerde standaard thema's en de thema's van de thema-website.

## Thema-overzicht

&kdm;-thema's kunnen worden aangemaakt door een XML-bestand aan te maken die de specificatie volgt in `$`KDEDIR`/share/apps/doc/kdm/greeter.dtd`. Thema-bestanden worden opgeslagen in de map `$`KDEDIR`/share/apps/kdm/themes/`thema_naam``. De thema-map zou een bestand genaamd `KdmGreeterTheme.desktop` moeten bevatten die hetzelfde formaat heeft als andere `.desktop`-bestanden en er uit ziet als:

    [KdmGreeterTheme]
    Greeter=cirkels.xml
    Name=Cirkels
    Description=Thema met blauwe cirkels
    Author=Bond, James Bond
    Copyright=(c) 2002 Bond, James Bond
    Screenshot=schermafdruk.png

De `Name`, `Description`, `Author` en `Copyright` velden kunnen in de lokale taal worden ingevuld zoals in andere `.desktop`-bestanden. Alle genoemde bestanden zouden zich in de thema-map zelf moeten bevinden. Het `Screenshot` veld wijst naar een bestand dat een schermafbeelding zou moeten zijn van 200x150 van het thema in actie (het is OK er geen te hebben, maar het is mooier voor de gebruiker). Het `Greeter`-item wijst naar een XML-bestand dat de beschrijving bevat van het thema.

Als een thema uiteindelijk volledig is getest, dan maakt u een tarball die de map bevat zoals het zou worden geïnstalleerd in de map `$`KDEDIR`/share/apps/kdm/themes`. Dit is het standaard formaat voor het distribueren van &kdm;-thema's.

## Gedetailleerde omschrijving van het thema-xml-formaat

### Toplevel-node

&kdm; thema's zijn XML-bestanden met de <greeter>-tag aan hun oorsprong. De toplevel-node is een item-node van het type `rect` met een impliciete vaste indeling.

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

Ingebed tussen de greeter-tag kunnen de beschreven nodes zijn in de volgende secties van dit document. Enkele van deze nodes zijn containers (indelingsnodes, itemnodes) die weer andere nodes kunnen bevatten.

### Itemnodes

Een &kdm;-thema wordt aangemaakt door een hiërarchie van item- en indelingsnodes. Itemnodes kunnen de volgende waarde voor het `type`-attribuut hebben:

knop

- Een knopveld. Dit veld gebruikt een Qt-knop.

  Het is ook mogelijk om elk ander item zich als een knop te laten gedragen door zijn `button`-attribuut op `true` in te stellen. Het is echter beter om Qt-knoppen in &kdm; te gebruiken omdat deze toegankelijk voor gehandicapte gebruikers.

entry

- Een invoer-widget zoals een regelinvoervak of combovak. Merk op dat dit een plaatshouder is voor Qt-widgets.

label

- Een tekstlabel. Moet of een `text`-node bevatten of een `stock`-node om tekst te specificeren.

lijst

- Een widget voor het gezichtsbladerprogramma.

pixmap

- Een rasterafbeelding in een formaat dat Qt ondersteunt, ⪚ PNG, JPEG, Tiff, etc.

rect

- Een gewone rechthoek.

svg

- Een vectorafbeelding in SVG-formaat.

Bijvoorbeeld:

    <item type="label">

Een item dat zich gedraagt als een knop:

    <item type="rect" id="disconnect_button" button="true">.

Standaard verdwijnt het &kdm;-aanmeldscherm na authenticatie. Dit kan geflikker tot gevolg hebben tussen het aanmeldscherm en de sessie. Het `background`-attribuut stelt gebruikers in staat om te specificeren welke elementen van het thema de achtergrondafbeelding vormen. Bij gebruik zorgt dit ervoor dat &kdm; alle niet-achtergrond items uit het scherm verwijdert en de overblijvende `background`-items mengt met het beginvenster. Dit kan worden gebruikt voor een gladde overgang tussen het aanmeldscherm en de sessie:

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

Om een verschillende achtergrond te hebben voor de aanmeldtransitie dan die gebruikt wordt voor aanmelden, zou het thema twee item-nodes moeten specificeren (die bijvoorbeeld pixmaps of svg-afbeeeldingen bevatten). Het item dat overeenkomt met de begroetingsachtergrond zou geen `background`-eigenschap moeten hebben terwijl het item dat overeenkomt met de transitieachtergrond wel de `background`-eigenschap zou moeten hebben. Bijvoorbeeld :

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

Bij meerdere schermen kunnen thema's ook gespecificeerd worden voor andere schermen dan waarop de begroeting staat - maar daar verschijnen typisch alleen achtergrond items. Om te specificeren op welk scherm een item zou moeten verschijnen kan het `screen`-attribuut worden gebruikt met de waarde gekozen uit `greeter`, `other` or `all`, die terspectievelijk betekenen: het scherm waarop de begroeting staat, alle schermen waarop de begroeting niet staat en alle schermen.

Aan elk item kan een naam worden gegeven via het `id`-attribuut. Bepaalde id's worden door &kdm; herkent om deze items een speciale functie te geven:

`button`-items en items met het `button="true"`-attribuut.

- Knoppen zijn er typisch om bepaalde acties te starten. Als extra zal &kdm; knoppen verbergen waarvan de acties om de een of andere reden niet beschikbaar zijn.

  Id Actie
  - kiezer-knop Voert de XDMCP-kiezer uit.
  - verbreek-knop Verbreek de verbinding met de sessie op afstand.
  - sessie-knop Opent het selectiemenu voor het type sessie.
  - systeem-knop Opent een alles-vangen-menu met verschillende opties en acties, afhankelijk van de configuratie.

`label` items

- &kdm; zal deze labels tonen/verbergen en stelt hun tekst in afhankelijk van de status van de aanmelddialoog.

  Id Functie
  - pam-fout Dit toont het Login mislukt. bericht.

Items voor het inbedden van widgets

- &kdm; zal bepaalde Qt-widgets inbedden in deze items.

  Id Functie
  - user-entry Invoerveld voor gebruikersnaam
  - pw-entry Invoerveld voor wachtwoord
  - domein-item Sommige conversatie-plugins gebruiken dit veld om een domeinnaam op te vragen. Als dit veld aanwezig is, zouden de gerelateerde omsluitende items nodes tonen moeten hebben van het type `plugin-domain-entry`.
  - talker Dit item zou van het type `rect` moeten zijn. Het vertegenwoordigt het belangrijke gebied van de begroeting: het bevat de `label` en `invoer`-items die gehoren bij het authenticatieproces. Als een gegeven conversatie-plugin de bestaande items niet kan laten overeenkomen met wat nodig is, dan probeert het een complex widget in te bedden met een eigen indeling in dit item, aldus volledig over de talker van het thema heen te gaan. Strict gesproken hebben &kdm;-thema's het in het geheel niet nodig om een eigen talker-ontwerp te hebben, omdat alle &kdm;-authenticatie-plugins in staat zijn om gebruik te maken van het `talker`-item.
  - gebruikerslijst Het item moet van het type `list` zijn. als de lijstfunctie van de gebruiker is ingeschakeld, dan zal &kdm; het gebruikerslijst-widget hier inbedden. Anders is dit item verborgen.
  - xconsole Dit item moet van het type `rect` zijn. Als de ingebouwde functie `xconsole` mee is gecompileerd en is ingeschakeld, dan zal &kdm; de console-log-widget hier inbedden. Anders is dit item verborgen.

Andere items

- &kdm; toont/verbergt deze items afhankelijk van de configuratie en de huidige status van de begroeting. &kdm; legt geen typevereisten op ze, maar zij lenen zichzelf tot een bepaald type.

  Id Alleen getoond als ...
  - label met tijdsverloop ... aanmelden met tijdsverloop is bezig.
  - caps-lock-waarschuwing ... Caps Lock is actief.
  - xauth-waarschuwing ... de &X-Server; vereist geen X-autorisatie om te verbinden.
  - userlist-rect ... de gebruikerslijst is ingeschakeld. Door het nesten van het item `userlist` hierin, is het mogelijk om zoiets als een frame rond de lijst maken en het alleen te laten zien wanneer de gebruikerslijst zelf wordt getoond.
  - xconsole-rect ... het ingebouwde `xconsole` is ingeschakeld. Analoog met `userlist-rect`.

### Opmaakcontainer-nodes

Opmaak-nodes verschijnen in item-nodes en bevatten opnieuw item-nodes. Het type opmaak-node bepaalt de schikking van zijn kind-nodes. Een item-node kan een opmaak-node van elk type bevatten.

#### Box-nodes

Box-nodes stellen hun kinderen op in een rij. Ze worden gespecificeerd als volgt:

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

Waar `num` het aantal pixels is en `bool` is ofwel `true` of `false`. De `alignment`-waarde kan ofwel `horizontal` of `vertical` zijn. Als u een attribuut weglaat, krijgt het de standaard waarde van nul voor aantallen, `false` voor bools en `vertical` voor de oriëntatie.

De 'spacing' is de afstand tussen de naburige kind-items. De padding is de buitenmarge van de box. Als de box homogeen is, dan wordt dezelfde hoeveelheid ruimte toegekend aan elk kind-item.

#### Vaste nodes

Vast is een container waarvan de kinderen vastgelegd zijn op preciese coördinaten. De grootte van de container is de kleinste rechthoek die alle kinderen bevat. Vast heeft geen verdere attributen en dus gebruikt u alleen:

    <fixed>

Daarna stopt u andere items met juiste gepositioneerde nodes in het.

### Positie nodes

Elk item kan zijn positie en grootte specificeren via de `pos`-node. Bijvoorbeeld:

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

Als de grootte niet is gespecificeerd, dan zal het de natuurlijke grootte krijgen, de hintgrootte genoemd. Merk op dat niet alle items een bruikbare hintgrootte hebben.

Beide positie en grootte kunnen gegeven zijn in procenten en zullen in dit geval berekend worden relatief tot de grootte van de omsloten container. Voor topniveau items is het het percentage van het gehele scherm. Door een circumflex (`^`) achter te voegen aan de specificatie van de grootte is het mogelijk om het te wijzigen tot relatief aan de grootte van het omsloten item van het omsloten item enzovoort.

Als het item een box bevat, kunnen `width` en `height` worden gespecificeerd als `box` wat betekent dat zij verondersteld worden de breedte en hoogte van de box te zijn, dat zijn de items in de box plus de padding.

Een van `width` en `height` kan worden gespecificeerd als `scale` wat betekent dat het geschaald moet worden volgens de andere schaalafmetingen relatief tot zijn hintgrootte. Gebruik dit om automatisch de aspect-verhouding te behouden van geschaalde afbeeldingen.

Als het attribuut `expand` is gespecificeerd en `true` is, dan zal dit item in de omgevende box zo veel als mogelijk worden uitgebreid (dat wil zeggen dat het alle beschikbare ruimte krijgt).

Als `width` of `height` een gewoon getal is, dan representeert een negatieve waarde een offset t.o.v. de omgevende containergrootte. Merk op dat het mogelijk is om een positieve offset te specificeren door twee mintekens in te voeren.

In beide gevallen is het mogelijk de uiteindelijke grootte te beperken met de `min-width`, `min-height`, `max-width` en `max-height` attributen die kan worden gespecificeerd op dezelfde manier als `width` en `height`.

Als `x` of `y` een gewoon getal is, dan representeren negatieve waarden een offset vanaf rechter- resp. onderrand, anders dan de standaard die de linker- resp. bovenrand.

Het is ook mogelijk om te specificeren naar welk punt in het item de positie verwijst. Dit wordt het anker genoemd en het kan of `c` voor centrum zijn of een van `n`, `ne`, `e`, `se`, `s`, `sw`, `w` en `nw` wat staat voor de verschillende randen/hoeken corresponderend met richtingen op een topografische kaart. De standaard is `nw`, wat de linker bovenhoek is. Bijvoorbeeld:

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

### Nodes tonen

U kunt het attribuut `type` specificeren om aan te geven dat zekere items alleen getoond moeten worden als het type is ingesteld. Met een uitroepteken (`!`) voor het type wordt de conditie omgedraaid. Geldige waarden zijn de volgende:

Type Tonen als ...
- `chooser` overschakelen naar aanmelden op afstand is toegestaan.
- `halt` en `reboot` systeem afsluiten is toegestaan.
- `system` geen voorwaarde (altijd ingesteld in &kdm;).
- `plugin-``itemnaam` de conversation-plugin levert een overeenkomstig invoerveld.

Bijvoorbeeld:

    <show type="chooser"/>

Alternatief kunt u een `min-screen-width` specificeren of `min-screen-height` waarde om aan te geven dat bepaalde items alleen getoond moeten worden als de schermresolutie minstens de gespecificeerde grootte heeft. Bijvoorbeeld:

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

### Normale/actieve/oplichtend nodes

Het uiterlijk van de meeste item-typen kan geparameteriseerd worden met de volgende tags:

`normaal`

- Normale status.

`oplichtend`

- Wanneer de muis zich boven het item bevindt.

`actief`

- Wanneer de muisknop wordt ingedrukt op het item.

De exacte set van beschikbare attributen hangt af van het type item:

`rect`

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

  Elk van de attributen kan weggelaten worden, in welk geval de standaard wordt gebruikt (het voorbeeld representeert de standaarden). `alpha` is een drijvende komma-getal tussen nul (transparant) en één (dekkend). `color` is een nummerteken gevolgd door een zes-cijferig hex-getal; het formaat is `#``rrggbb`. Alternatief, `color` kan gespecificeerd worden als een acht-cijferig hex-getal, in welk geval de eerste twee cijfers de alfa waarde is.

`label`

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

  `alpha` en `color` zijn gespecificeerd zoals in rect items.

  `font` volgt het formaat `familie-lijst` `stijl-opties` `grootte`. Elk deel is optioneel.

  `familie-lijst` is een komma-gescheiden lijst met letterype-families zoals helvetica, monospace, etc.

  `stijl-opties` is een spatie-gescheiden lijst met sleutelwoorden van de categorieën stijl, gewicht en strekken; van elke categorie maximaal een. De stijl kan `normal`, `italic` of `oblique` zijn. Gewicht kan `ultra-light`, `light`, `medium`, `semi-bold`, `bold`, `ultra-bold` of `heavy` zijn. Toegestane strekking bestaat uit `ultra-condensed`, `extra-condensed`, `condensed`, `semi-condensed`, `normal`, `semi-expanded`, `expanded`, `extra-expanded` en `ultra-expanded`.

  `grootte` is of een drijvende komma-getal die de grootte in punten (1/72 inch) representeert of een geheel getal gevolgd door `px` die de grootte in pixels representeert. Grootte in punten wordt geprefereerd, omdat zij onafhankelijk zijn van de schermresolutie.

  Als elk attribuut is weggelaten, dan worden de waarden gegeven in de stijl-node gebruikt. Als dit geen venster-tekstkleur specificatie bevat, dan wordt wit gebruikt. Het standaard lettertype is die geconfigureerd in &kdmrc;.

`pixmap`

`svg`

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

  `file` specificeert het bestand dat de afbeelding bevat. Relatieve padnamen zijn relatief ten opzicht van de map van het thema.

  `wallpaper` kan worden gebruikt in plaats van `file` om &kdm; te laten zoeken voor afbeeldingen in de gebruikelijke locaties voor &kde;-achtergronden. Pakketten voor plasma-achtergronden worden ondersteund.

  `element` specificeert het element id van een SVG-bestand. Indien leeg, dan wordt de gehele SVG-afbeelding weergegeven.

  Voor `pixmap`-nodes is het mogelijk om meervoudige afbeeldingen te leveren, zodat de beste kwaliteit afbeelding voor een gegeven resolutie kan worden gebruikt. Bestandsnamen met een tag voor de grootte hebben het formaat `basisnaam``-``breedte` `x` `hoogte``.``extensie`. Als het bestand zonder tag voor de grootte bestaat en het is geen pakket voor een plasma-achtergrond, dan zal &kdm; alleen een perfecte overeenkomst voor een gegeven grootte accepteren en anders terugvallen op het originele bestand. Anders zal het proberen een afbeelding te vinden waarvan de afmetingen het dichts bij de vereiste grootte komen als er geen perfecte overeenkomst is gevonden.

  `scalemode` specificeert hoe de grootte van afbeeldingen die niet overeenkomen met de grootte van het element. `free` (de standaard) betekent dat de afbeelding geschaald wordt tot de juiste grootte, mogelijk met vervorming van zijn beeldverhouding. De andere twee modi handhaven de beeldverhouding van de afbeelding: `fit` betekent het in- of uitzoomen van de afbeelding tot de maximum grootte die in de afmeting van het element past. De afbeelding zal worden gecentreerd. Het overblijvende gebied zal niet door dit element worden ingevuld, dus zou het geplaatst moeten worden bovenop een volledig gevulde `rect`. `crop` betekent dat de afbeelding wordt in-/uitgezoomd tot de minimale grootte die volledig binnen de afmetingen van het element past. De afbeelding zal symmetrisch worden afgesneden.

  `tint` en `alpha` vormen een kleurspecificatie zoals in `rect`-items. Elk pixel van de afbeelding wordt volgend de component vermenigvuldigd met deze kleur.

### Widget-stijl-nodes

Deze tag maakt het mogelijk om het uiterlijk van labels en Qt-widgets ingebed in het thema te wijzigen, bijv., regelbewerking, knoppen of de gebruikerslijst. De stijlinstellingen worden geërft door kind-items, maar kunnen individueel overschreven worden. De standaarden komen van &kdmrc;.

Het attribuut `font` definieert het lettertype voor alle widgets. Voor widgets met een invoerfunctie kan het overschreven worden door het attribuut `edit-font`. Lettertypen worden gespecificeerd op dezelfde manier als in normale/actieve/oplichtende nodes.

Gewoonlijk probeert de engine voor het thema elk frame van Qt-widgets te verwijderen, zodat zij naadloos versmelten in het thema. In het geval waar dat niet gewenst is, kan het attribuut `frame` ingesteld worden op `true`.

Het attribuut `guistyle` kan gebruikt worden om de stijl van de Qt-GUI voor ingebedde widgets te overschrijven. De standaard is gegeven in `GUIStyle` in &kdmrc;

Het is mogelijk om bijna het gehele palet voor de widgets zoals gedocumenteerd in Website van Trolltech te specificeren. Attribuutnamen bestaan uit een scope, een kleurrol en een achtervoegsel. Mogelijke scopes zijn - in volgorde van toenemende voorkeur - `all-` voor alle kleurgroepen, geen scope voor de actieve en inactieve kleurgroepen en `active-`, `inactive-` en `disabled-` voor de respectievelijke kleurgroepen. Ondersteunde kleurrollen zijn `window`, `window-text`, `base`, `alternate-base`, `text`, `bright-text`, `highlight`, `highlighted-text`, `button` en `button-text`. Het achtervoegsel kan `-color` of `-alpha` zijn met de respectievelijke betekenis zoals in normale/actieve/oplichtende nodes.

Als alternatief om het palet inline te specificeren, kan het attribuut `colorscheme` worden gebruikt om een compleet &kde;-kleurschema te laden. De standaard is gegeven door `ColorScheme` in &kdmrc;. Individuele `color`-specificaties zullen de kleuren van het schema overschrijven.

Voorbeeld:

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

### Kleur-nodes voor gezichtsbladerprogramma

Kleur-nodes staan toe om de achtergrondkleur van de items in het gezichtsbladerprogramma te overschrijven. `labelcolor` en `altlabelcolor` zijn in essentie equivalent met `all-base-color` resp. `all-alternate-base-color` in stijl-nodes. Als alleen `labelcolor` is gespecificeerd, zijn alternerende achtergronden van items uitgeschakeld.

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

### Text-nodes

Tekst-tags worden door labels gebruikt. Zij kunnen worden gebruikt aan de taalregio aangepaste tekst te tonen als volgt (als het attribuut `xml:lang` is weggelaten, dan wordt de POSIX-locale aangenomen):

    <text xml:lang="nl">Optie</text>

Text-nodes kunnen de volgende speciale tekenreeksen bevatten die als volgt vertaalt zullen worden:

Sequentie Expansie
- %% Het letterlijk %-teken
- %c Huidige datum en tijd
- %d Schermnaam (`DISPLAY` omgevingsvariabele)
- %h Hostnaam (`gethostname` uitvoer)
- %m Machinenaam (machine-onderdeel van `uname` uitvoer)
- %n Nodenaam (nodename-onderdeel van `uname` uitvoer)
- %o Domeinnaam (`getdomainname`-uitvoer)
- %r Uitgavenaam (release-onderdeel van `uname` uitvoer)
- %s Systeemnaam (sysname-onderdeel van `uname` uitvoer)
- %t Resterend aantal seconden totdat getimede aanmelding wordt gedaan, plus de bijbehorende i18n-meervoudsvorm van seconde
- %u Gebruikersnaam voor aanmelden
- _ Zorgt er voor dat het volgende teken een versneller is

`%t` en `%u` zijn bedoeld om alleen interne te worden gebruikt om het `timed-label`-bericht te tonen, die elke seconde wordt bijgewerkt.

### Stock-nodes

Bepaalde gezamenlijk aan de taalregio aangepaste labels kunnen worden gespecificeerd via de stock-tags. De `text`-tag wordt genegeerd als de `stock`-tag wordt gebruikt. U zou echt de stock-labels moeten gebruiken in plaats van gewoon alle vertalingen in de thema's te stoppen. Dit levert snellere laadtijden en waarschijnlijk betere vertalingen. De volgende waarden zijn geldig:

Type Expansie
- caps-lock-waarschuwing Caps Lock is geactiveerd
- chooser XDMCP-kieze_r
- stop _Stoppen
- verbinding verbreken Verbinding v_erbreken
- stoppen _Uitschakelen
- taal Taa_l
- aanmelden _Aanmelden
- sessie Sessie_type
- herstarten Her_starten
- system _Menu
- label met tijdsverloop Gebruiker %u meldt zich aan bij %t
- domain-label _Domein:
- username-label Gebr_uikersnaam:
- password-label Wa_chtwoord:
- welcome-label Welkom bij %h

Bijvoorbeeld:

    <stock type="welcome-label"/>

### Buddy-nodes

Items die niet direct een actie veroorzaken kunnen aan een buddy worden toegekend. De buddy krijgt invoerfocus wanneer het item wordt geactiveerd (door te klikken of te drukken op een versneller van een `label`).

De buddy wordt gerefereerd door een id met het attribuut `idref`. Natuurlijk, moet het een id gegeven worden. Voorbeeld:

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