# Skapa teman för inloggningshanterarens välkomstruta

Det här avsnittet beskriver hur teman skapas för välkomstrutan med teman.Se installerade standardteman och teman från webbsidan med teman för exempel som innehåller skärmbilder.

## Översikt av teman

Inloggningshanterarens teman kan skapas genom att skapa en XML-filsom följer specifikationen i `$`KDEDIR`/share/apps/doc/kdm/greeter.dtd`. Temafiler lagras i katalogen `$`KDEDIR`/share/apps/kdm/themes/theme_name`. Temakatalogen ska innehålla en fil som heter `KdmGreeterTheme.desktop` som har ett format som liknar andra `.desktop`-filer och ser ut så här:

    [KdmGreeterTheme]
    Greeter=circles.xml
    Name=Circles
    Description=Theme with blue circles
    Author=Bond, James Bond
    Copyright=(c) 2002 Bond, James Bond
    Screenshot=screenshot.png

Fälten `Name`, `Description`, `Author` och `Copyright` kan översättas precis som i andra `.desktop`-filer. Alla filer som nämns ska vara i själva temakatalogen. Fältet `Screenshot` pekar på en fil som ska vara en 200x150 skärmbild av temat när det används (det är ok att inte ha en, men den gör det trevligare för användaren). Posten `Greeter` pekar på en XML-fil som innehåller temats beskrivning.

När ett tema väl har testats fullständigt, skapa ett tar-arkiv som innehåller katalogen som den skulle installeras i katalogen `$`KDEDIR`/share/apps/kdm/themes`. Det är standardformatet för att distribuera inloggningshanterarens teman.

## Detaljerad beskrivning av temats XML-format

### Toppnivånod

Inloggningshanterarens teman är XML-filer med taggen <greeter> i roten. Toppnivånoden är en objektnod av typen `rect` med en implicit fast layout.

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

Inne i taggen greeter kan noder finnas som beskrivs i nästa avsnitt av dokumentet. Vissa av dessa noder är behållare (layoutnoder, objektnoder) som återigen kan innehålla andra noder.

### Objektnoder

Ett tema för inloggningshanteraren skapas genom att ange en hierarki av objekt- och layoutnoder. Objektnoder kan ha följande värden på egenskapen `type`:

button

  Ett knappfält. Fältet använder en Qt-knapp.

  Det är också möjligt att få vilket annat objekt som helst att bete sig som en knapp genom att ange egenskapen `button` som `true`. Det är dock bättre att använda Qt-knappar i inloggningshanteraren eftersom de är tillgängliga för handikappade användare.

entry

  En grafisk inmatningskomponent som en radeditor eller kombinationsruta. Observera att det är endast en platsmarkör för grafiska Qt-komponenter.

label

  En textetikett. Måste antingen innehålla en textnod eller en standardnod för att ange texten.

list

  En grafisk komponent för att bläddra efter ansiktsbilder.

pixmap

  En rastrerad bild med ett format som Qt stöder, t.ex. PNG, JPEG, Tiff, etc.

rect

  En enkel rektangel.

svg

  En vektorbild med SVG-format.

Till exempel:

    <item type="label">

Ett objekt som fungerar som en knapp:

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

Normalt försvinner Inloggningshanterarens skärm efter behörighetskontrollen. Det kan orsaka flimmer mellan inloggningsskärmen och sessionen. Egenskapen `background` låter användare ange vilka element i temat som är bakgrundsbilden. När den används, får den Inloggningshanteraren att ta bort alla objekt som inte hör till bakgrunden och återge kvarstående bakgrundsobjekt på rotfönstret. Det kan användas för att skapa en jämn övergång mellan inloggningsskärmen och sessionen:

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

För att använda en annan bakgrund vid inloggningsövergången än den som används vid inloggning, ska temat ange två objektnoder (som till exempel kan innehålla punktavbildningar eller SVG-objekt). Objektet som motsvarar välkomstrutans bakgrund ska inte ha egenskapen `background`, medan objektet som motsvarar övergångsbakgrunden ska ha egenskapen `background`. Till exempel:

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

För arrangemang med flera skärmar, kan teman också ange utseendet hos andra skärmar än den som välkomstrutan finns på, men oftast visas bara bakgrundsobjekt där. För att ange vilken eller vilka skärmar ett objekt ska visas på, kan egenskapen `screen` användas, med värdet ett av `greeter`, `other` eller `all`, vilket i tur och ordning betyder skärmen med välkomstrutan, alla skärmar utan välkomstruta eller alla skärmar.

Varje objekt kan ges ett namn via egenskapen `id`. Vissa sådana egenskaper känns igen av inloggningshanteraren, så att objekten får specialfunktioner:

Objekt `button` och objekt med egenskapen `button="true"`.

  Knappar utlöser typiskt vissa åtgärder. Dessutom döljer inloggningshanteraren knappar vars åtgärder av någon anledning inte är tillgängliga.

  Id
  Åtgärd
  chooser_button
  Kör XDMCP-väljaren.
  disconnect_button
  Kopplar ner från en fjärrsession.
  session_button
  Visar menyn för val av sessionstyp.
  system_button
  Visar en meny som fångar allt med diverse alternativ och åtgärder, beroende på inställningarna.
Objekt `label`

  Inloggningshanteraren visar eller döljer etiketterna och ställer in deras text beroende på inloggningsdialogrutans tillstånd.

  Id
  Funktion
  pam-error
  Det här visar meddelandet Inloggningen misslyckades.
Objekt inbäddade i grafiska komponenter

  Inloggningshanteraren inbäddar särskilda grafiska Qt-komponenter i dessa objekt.

  Id
  Funktion
  user-entry
  Inmatningsfält använt för inmatning av användarnamn.
  pw-entry
  Inmatningsfält för lösenordsinmatning.
  domain-entry
  Vissa konversationsinsticksprogram använder fältet för att efterfråga ett domännamn. Om fältet finns, ska tillhörande omgivande objekt ha visningsnoder med typen `plugin-domain-entry`.
  talker
  Objektet ska ha typen `rect`. Det representerar den aktiva delen av välkomstrutan: den innehåller objekten `label` och `entry` som rör behörighetskontrollprocessen. Om ett givet konversationsinsticksprogram inte kan passa ihop befintliga objekt med sitt behov, försöker det inbädda en sammansatt grafisk komponent med en egen layout i objektet, och överskrider på så sätt helt och hållet temats talker. Strängt taget behöver inte Inloggningshanterarens teman tillhandahålla någon egenkonstruerad talker alls, eftersom alla insticksprogram för behörighetskontroll i Inloggningshanteraren kan utnyttja `talker`-objektet.
  userlist
  Objektet måste ha typen `list`. Om funktionen med användarlista är aktiverad, inbäddar Inloggningshanteraren den grafiska användarlistan här. Annars är objektet dolt.
  xconsole
  Objektet ska ha typen `rect`. Om den inbyggda funktionen `xconsole` är inkompilerad och aktiverad, inbäddar inloggningshanteraren terminalkomponenten här. Annars är objektet dolt.
Övriga objekt

  Inloggningshanteraren visar eller döljer objekten beroende på inställningarna och välkomstrutans aktuella tillstånd. Inloggningshanteraren tvingar inte på dem några typkrav, men oftast lämpar de sig för en viss typ.

  Id
  Visas bara när ...
  timed-label
  ... tidsbegränsad inloggning pågår.
  caps-lock-warning
  ... Caps Lock är aktivt.
  xauth-warning
  ... &X-Server; inte kräver någon X-behörighetskontroll för att ansluta.
  userlist-rect
  ... användarlistan är aktiverad. Genom att placera objektet `userlist` i detta, är det möjligt att skapa någonting som ser ut som en ram omkring listan och få den att bara visas när själva användarlistan visas.
  xconsole-rect
  ... den inbyggda terminalen `xconsole` är aktiverad. Jämförbar med `userlist-rect`.

### Noder med layoutinnehåll

Layoutnoder ingår inne i objektnoder, och innehåller själv objektnoder. Layoutnodens typ bestämmer hur ingående noder arrangeras. En objektnod kan innehålla en layoutnod av varje typ.

#### Rutnoder

Rutnoder arrangerar automatiskt underliggande noder i en rad. De anges på följande sätt:

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

Här betyder num antal bildpunkter, och bool betyder antingen `true` eller `false`. Värdet alignment kan antingen vara `horizontal` eller `vertical`. Om någon egenskap inte anges, får den värdet noll för tal, `false` för Booleska värden och `vertical` för orienteringen.

Mellanrummet (spacing) är avståndet mellan ingående objekt som ligger intill varandra. Utfyllnaden (padding) är rutans yttre marginal. Om rutan är homogen, tilldelas varje ingående objekt samma utrymme.

#### Fasta noder

Fasta noder är behållare vars underliggande objekt placeras ut på exakta koordinater. Behållarens storlek är den minsta rektangel som innehåller alla underliggande objekt. Fasta noder har inga extra egenskaper, så man använder bara:

    <fixed>

Därefter placeras andra objekt med lämpliga positionsnoder inne i den.

### Positionsnoder

Varje objekt kan ange sin position och storlek via noden `pos`. Till exempel:

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

Om storleken inte anges, blir den objektets naturliga storlek, vilket kallas storlekstipset. Observera att alla objekt inte har användbara storlekstips.

Både position och storlek kan anges med procent, och beräknas i detta fall relativt till den omgivande behållarens storlek. För toppnivåobjekt är det procent av hela skärmen. Genom att lägga till cirkumflextecken (`^`) i storleksangivelsen är det möjligt att ändra den till att vara relativ i förhållande till det omgivande objektets omgivning, och så vidare.

Om objektet innehåller en ruta, kan bredd (`width`) och höjd (`height`) anges som `box`, för att ange att det är meningen att de ska vara rutans bredd och höjd, det vill säga objekten i rutan plus utfyllnaden.

Endera bredden (`width`) eller höjden (`height`) kan anges som `scale`, vilket betyder att den ska skalas enligt den andra dimensionens skala relativt dess storlekstips. Använd det för att automatiskt bevara proportionen hos skalade bilder.

Om egenskapen `expand` är angiven och har värdet `true`, expanderas objektet i den omgivande rutan så mycket som möjligt (det vill säga att det får större utrymme om det är tillgängligt).

Om bredden (`width`) eller höjden (`height`) är enkla tal, representerar ett negativt värde ett avstånd från i motsats till normalvärdet från vänsterkanten respektive överkanten.

I båda fallen är det möjligt att begränsa den slutliga storleken med egenskaperna `min-width`, `min-height`, `max-width` och `max-height` som kan anges på samma sätt som `width` och `height`.

Om `x` och `y` är enkla tal, representerar ett negativt värde ett avstånd från högerkanten respektive underkanten, i motsats till normalvärdet från vänsterkanten respektive överkanten.

Det är också möjligt att ange vilken punkt inne i objektet som positionen hänvisar till. Det kallas ankaret och kan antingen vara `c` för centrerad, eller ett av `n` (nord), `ne` (nordöst), `e` (öst), `se` (sydöst), `s` (syd), `sw` (sydväst), `w` (väst) och `nw` (nordväst) som står för de olika kanterna eller hörnen som motsvarar riktningarna på en topografisk karta. Förvalt värde är `nw`, vilket är det övre vänstra hörnet. Till exempel:

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

### Visningsnoder

Du kan specificera egenskapen `typ` för att ange att vissa objekt bara ska visas om typen är definierad. Om typen föregås av ett utropstecken (`!`) fås det omvända villkoret. Giltiga värden omfattar följande:

Typ
Visa om ...
chooser
byte till fjärrlogin är tillåtet.
halt
och `reboot`
avstängning av systemet är tillåten.
system
inget villkor (alltid på i inloggningshanteraren).
plugin-
postnamn
konversationsinsticksprogrammet tillhandahåller ett motsvarande inmatningsfält

Till exempel:

    <show type="chooser"/>

Som alternativ kan man ange värden `min-screen-width` eller `min-screen-height` för att ange att vissa objekt bara ska visas om skärmupplösningen är minst den angivna storleken. Till exempel:

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

### Normala, aktiva, förmarkerade noder

Utseendet för de flesta objekttyper kan parametriseras via följande taggar:

`normal`

  Normalt tillstånd.

`prelight`

  När musen hålls stilla över objektet.

`active`

  När en musknapp klickas på objektet.

Den exakta uppsättningen egenskaper beror på objekttypen:

`rect`

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

  Endera av egenskaperna kan utelämnas, och i så fall används förvalt värde (exemplet motsvarar förvalda värden). `alpha` är ett flyttal mellan noll (genomskinligt) och ett (ogenomskinligt). `color` är ett nummertecken följt av ett hexadecimalt tal med sex siffror: formatet är `#`rrggbb. Som alternativ kan `color` anges som ett hexadecimalt tal med åtta siffror. I detta fall är de två första siffrorna alfavärdet.
`label`

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

  `alpha` och `color` anges som för rect-objekt.

  `font` följer formatet family-list style-options size. Varje del är valfri.

  family-list är en lista av teckensnitt åtskilda med kommatecken som helvetica, monospace, etc.

  style-options är en lista med nyckelord åtskilda med mellanslag från kategorierna stil, grovlek och sträckning, som mest en från varje kategori. Stilen kan vara `normal`, `italic` eller `oblique`. Grovleken kan vara `ultra-light`, `light`, `medium`, `semi-bold`, `bold`, `ultra-bold` eller `heavy`. Tillåtna sträckningar omfattar `ultra-condensed`, `extra-condensed`, `condensed`, `semi-condensed`, `normal`, `semi-expanded`, `expanded`, `extra-expanded` och `ultra-expanded`.

  size är antingen ett flyttal som representerar storleken i punkter (1/72 tum) eller ett heltal följt av `px` som representerar storleken i bildpunkter. Punktstorlekar är att föredra, eftersom de är oberoende av skärmens upplösning.

  Om någondera egenskap utelämnas, används värden från stilnoden. Om det inte ger någon specifikation av fönstertextfärgen, används vit. Standardteckensnittet är det som ställs in i &kdmrc;.

`pixmap`
`svg`

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

  `file` anger filen som innehåller bilden. Relativa sökvägar är relativa i förhållande till temats katalog.

  `wallpaper` kan användas istället för `file` för att låta &kdm; söka efter bilder på de vanliga platserna för skrivbordsunderlägg i &kde;. Plasma-paket med skrivbordsunderlägg stöds.

  `element` anger elementidentifieraren i en SVG-fil. Om det är tomt, återges hela SVG-bilden.

  För `pixmap`-noder, är det möjligt att tillhandahålla flera bilder, så att bilden med bäst kvalitet för en viss upplösning kan användas. Filnamn markerade med storlek har formatet basnamn`-`bredd `x` höjd`.`filändelse. Om en fil utan storleksmarkering finns och den inte är ett Plasma-paket med skrivbordsunderlägg, accepterar &kdm; bara att en given storlek stämmer perfekt, och återgår annars till originalfilen. Annars försöker det hitta en bild som hamnar närmast den begärda storleken, om ingen stämmer perfekt.

  `scalemode` anger hur storleken på bilder som inte motsvarar elementets storlek justeras. `free` (standardvärdet) betyder att helt enkelt skala bilden till rätt storlek, möjligen med förvrängning av dess proportion. De övriga två metoderna behåller bildens proportion: `fit` betyder att zooma bilden till den maximala storlek som får plats i elementets geometri. Bilden centreras. Återstående område hanteras inte av elementet, så det bör placeras ovanpå en fylld `rect`. `crop` betyder att zooma bilden till den minsta storlek som helt fyller elementets geometri. Bilden beskärs symmetriskt.

  `tint` och `alpha` bildar en färgspecifikation som i `rect`-objekt. Varje bildpunkt i bilden multipliceras med färgen komponent för komponent.

### Stilnoder för grafiska komponenter

Den här taggen gör det möjligt att ändra utseende på etiketter och grafiska Qt-komponenter inbäddade i temat, t.ex. radeditorer, knappar eller användarlistan. Stilinställningarna ärvs av underliggande objekt, men kan individuellt överskridas. Standardvärden hämtas från &kdmrc;.

Egenskapen `font` definierar teckensnittet för alla grafiska komponenter. För komponenter med en inmatningsfunktion kan den överskridas med egenskapen `edit-font`. Teckensnitt anges på samma sätt som för normala, aktiva, och förmarkerade noder.

Oftast försöker temagränssnittet på alla sätt ta bort eventuella ramar från grafiska Qt-komponenter, så att de sömlöst smälter in i temat. I fall då det inte är önskvärt, kan egenskapen `frame` anges som `true`.

Egenskapen `guistyle` kan användas för att överskrida Qt:s grafiska gränssnittsstil för inbäddade grafiska komponenter. Standardvärdet anges av `GUIStyle` i &kdmrc;

Det är möjligt att ange nästan hela paletten för grafiska komponenter som är dokumenterad på Trolltechs hemsida. Egenskapernas namn sätts samman från en omfattning, en färgroll och ett suffix. Möjliga omfattningar är, i ökande prioritetsordning: `all-` för alla färggrupper, ingen omfattning för aktiva och inaktiva färggrupper, och `active-`, `inactive-` eller `disabled-` för respektive färggrupp. Färgroller som stöds är `window`, `window-text`, `base`, `alternate-base`, `text`, `bright-text`, `highlight`, `highlighted-text`, `button` och `button-text`. Suffixet kan vara `-color` eller `-alpha` med respektive betydelse som för normala, aktiva, och förmarkerade noder.

Som ett alternativ till att ange paletten på plats, kan egenskapen `colorscheme` användas för att läsa in ett fullständigt färgschema i &kde;. Standardvärdet anges av `ColorScheme` i &kdmrc;. Enskilda specifikationer av `färg` överskrider färgerna i schemat.

Exempel:

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

### Färgnoder för ansiktsbildbläddraren

Färgnoder tillåter att objektens bakgrundsfärger överskrids i ansiktsbildbläddraren. `labelcolor` och `altlabelcolor` motsvarar i stort sett `all-base-color` respektive `all-alternate-base-color` i stilnoder. Om bara `labelcolor` anges, inaktiveras alternerande objektbakgrunder.

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

### Textnoder

Texttaggar används av etiketter. De kan användas för att visa översatt text enligt följande (om egenskapen `xml:lang` utelämnas, antas att POSIX ska gälla):

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

Textnoder kan innehålla vissa speciella teckenföljder, som översätts på följande sätt:

Sekvens
Expanderas till
%%
Ett bokstavligt %-tecken
%c
Nuvarande datum och tid
%d
Skärmnamn (miljövariabeln `DISPLAY`)
%h
Värddatornamn (utmatningen från `gethostname`)
%m
Datornamn (machine, en del av utmatningen från `uname`)
%n
Nodnamn (nodename, en del av utmatningen från `uname`)
%o
Domännamn (utmatningen från `getdomainname`)
%r
Utgåvenamn (release, en del av utmatningen från `uname`)
%s
Systemnamn (sysname, en del av utmatningen från `uname`)
%t
Återstående antal sekunder till tidsbegränsad inloggning utförs, samt den lämpliga i18n-pluralformen av sekund
%u
Användarnamn för tidsbegränsad inloggning
_
Orsakar följande tecken att vara en snabbtangent

`%t` och `%u` är bara avsedda att användas internt för att visa meddelandet för `timed-label`, som automatiskt uppdateras varje sekund.

### Standardnoder

Vissa vanliga översatta etiketter kan anges via standardtaggar. Taggen `text` ignoreras om taggen `stock` används. Man bör verkligen använda standardetiketterna istället för att läga in alla översättningar i temat. Det resulterar i snabbare laddningstider och troligtvis bättre översättningar. Följande värden är möjliga:

Typ
Expanderas till
caps-lock-warning
Caps Lock är aktivt
chooser
_XDMCP-väljare
quit
_Avsluta
disconnect
Koppla n_er
halt
S_täng av
language
S_pråk
login
In_loggning
session
T_yp av session
reboot
Starta _om
system
_Meny
timed-label
Användaren %u loggar in om %t
domain-label
_Domän:
username-label
An_vändarnamn:
password-label
_Lösenord:
welcome-label
Välkommen till %h

Till exempel:

    <stock type="welcome-label"/>

### Kompisnoder

Objekt som inte direkt orsakar en åtgärd kan tilldelas en kompis. Kompisen ges inmatningsfokus när objektet aktiveras (klickas på, eller snabbtangenten används för en `label`).

Kompisen refereras till med identifikationen i egenskapen `idref`. Uppenbarligen måste den ges en identifikation. Ett exempel:

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