# Criar temas para o ecrã de boas-vindas do &kdm;

Esta secção descreve a criação dos temas para o ecrã de boas-vindas. Para obter mais exemplos que incluam imagens, veja os temas-padrão instalados e os temas da página Web respectiva.

## Introdução ao Tema

Os temas do &kdm; podem ser criados se definir um ficheiro XML que siga a especificação em `$`KDEDIR`/share/apps/doc/kdm/greeter.dtd`. Os ficheiros dos temas são guardados na pasta `$`KDEDIR`/share/apps/kdm/themes/`nome-tema``. A pasta dos temas deverá conter um ficheiro chamado `KdmGreeterTheme.desktop`, o qual tem um formato semelhante ao dos outros ficheiros `.desktop`, sendo semelhante ao seguinte:

    [KdmGreeterTheme]
    Greeter=circulos.xml
    Name=Círculos
    Description=Tema com círculos azuis
    Author=Bond, James Bond
    Copyright=(c) 2002 Bond, James Bond
    Screenshot=imagem.png

Os campos `Name`, `Description`, `Author` e `Copyright` poderão ser traduzidos como acontece nos outros ficheiros `.desktop`. Todos os ficheiros que sejam mencionados deverão estar na pasta do próprio tema. O campo `Screenshot` aponta para um ficheiro que deverá ser uma imagem em 200x150 do tema em acção (está correcto não ter nenhuma, mas é mais agradável para o utilizador). O item `Greeter` aponta para um ficheiro XML que contém a descrição do tema.

Logo que tenha testado por completo um tema, crie um pacote que contém a pasta, tal como seria instalada na pasta `$`KDEDIR`/share/apps/kdm/themes`. Este é o formato-padrão para distribuir temas do &kdm;.

## Descrição Detalhada do Formato XML do Tema

### Nó do Topo

Os temas do &kdm; são ficheiros XML com a marca <greeter> no seu topo. O nó de topo é um nó de item do tipo `rect` com uma disposição fixa implícita.

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

Dentro da marca 'greeter' poderão existir os nós descritos nas secções seguintes deste documento. Alguns destes nós são contentores (nós de disposição, nós de itens) que poderão conter ainda outros nós.

### Nós de Itens

Um tema do &kdm; é criado ao definir uma hierarquia de nós de itens e disposição. Os nós de itens poderão ter o seguinte valor para o atributo `type`:

button

- Um campo de botão. Este campo usa um botão do Qt.

  Também é possível fazer com que outro item actue como se fosse um botão, definindo o seu atributo `button` como sendo `true`. Contudo, é melhor usar os botões do Qt nos temas do &kdm;, dado que são acessíveis para pessoas com necessidades especiais.

entry

- Um item de introdução de dados, como um campo de texto ou uma lista. Lembre-se que este é apenas um espaço de colocação para itens do Qt.

label

- Uma legenda de texto. Deverá conter um nó `text` ou um nó `stock` para definir o texto.

list

- Um item de navegação de fotos das pessoas.

pixmap

- Uma imagem rasterizada num formato que o Qt suporta, ⪚ PNG, JPEG, Tiff, etc.

rect

- Um rectângulo simples.

svg

- Uma imagem vectorial no formato SVG.

Por exemplo:

    <item type="label">

Um item que actua como um botão:

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

Por omissão, o ecrã de autenticação do &kdm; irá desaparecer após a autenticação. Isto poderá resultar numa intermitência entre o ecrã de autenticação e a sessão. O atributo `background` permite aos utilizadores indicarem os elementos do item que são a imagem de fundo. Quando for usado, isto fará com que o &kdm; remova todos os itens fora do fundo do ecrã e apresente os outros itens `background` restantes na janela de topo. Isto poderá ser usado para criar uma transição suave entre o ecrã de autenticação e a sessão:

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

Para usar um fundo diferente para a transição da autenticação do que é usado na autenticação, o tema deverá definir dois nós de itens (que deverão conter imagens rasterizadas ou SVG, por exemplo). O item que corresponder ao fundo do ecrã de boas-vindas não deverá ter a propriedade `background`, enquanto o item que corresponde ao fundo de transição deverá ter a propriedade `background`. Por exemplo :

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

Nas configurações em vários ecrãs, os temas poderão também definir a aparência dos outros ecrãs diferentes do ecrã em que aparece a mensagem de boas-vindas - contudo, tipicamente só aparecem os itens de fundo nesse caso. Se quiser indicar em que ecrãs um dado item deverá aparecer, poderá usar o atributo `screen` com o valor igual a `greeter`, `other` ou `all`, o que corresponde ao ecrã da mensagem de boas-vindas, nos outros ecrãs onde esta mensagem não aparece ou em todos, respectivamente.

Cada item poderá ter um nome próprio com o atributo `id`. Alguns ID's são reconhecidos pelo &kdm; para dar a esses itens uma função especial:

Itens `button` e itens com o atributo `button="true"`.

- Os botões tipicamente despoletam algumas acções. Para além disso, o &kdm; irá esconder os botões cujas acções não estejam disponíveis por alguma razão.

  Id Acção
  - chooser_button Executa o seleccionador do XDMCP.
  - disconnect_button Desligar da sessão remota.
  - session_button Abre o menu de selecção do tipo de sessão.
  - system_button Abre um menu de selecção completa com várias opções e acções, dependendo da configuração.

Itens `label`

- O &kdm; irá mostrar/esconder estes itens e definir o seu texto com base no estado da janela de autenticação.

  Id Função
  - pam-error Isto mostra a mensagem A autenticação falhou..

Itens de incorporação de elementos

- O &kdm; irá incorporar os itens particulares do Qt nestes itens.

  Id Função
  - user-entry Campo de introdução do nome do utilizador.
  - pw-entry Campo de introdução da senha.
  - domain-entry Alguns 'plugins' de conversação usam este campo para questionar o nome de um domínio. Se este campo estiver presente, os itens envolventes relacionados com este deverão ter nós de apresentação com o tipo `plugin-domain-entry`.
  - talker Este item deverá ser do tipo `rect`. Ele representa a área quente do ecrã de boas-vindas: contém os itens `label` e `entry` que dizem respeito ao processo de autenticação. Se um dado 'plugin' de conversação não corresponder aos itens existente com as suas necessidades, tenta incorporar um item complexo com uma disposição própria neste item, substituindo por completo o locutor do tema. Estritamente falando, os temas do &kdm; não necessitam de fornecer desenhos de locutores de todo, dado que todos os 'plugins0 de autenticação do &kdm; podem tirar partido do item `talker`.
  - userlist Este item deverá ser do tipo `list`. Se a funcionalidade da lista de utilizadores estiver activa, o &kdm; irá incorporar o item da lista de utilizadores aqui. Caso contrário, este item fica escondido.
  - xconsole Este item deverá ser do tipo `rect`. Se a funcionalidade do `xconsole` incorporado estiver compilada e activada, o &kdm; irá incorporar o item de registo da consola aqui. Caso contrário, este item fica escondido.

Outros itens

- O &kdm; irá mostrar/esconder os itens que dependerem da configuração e do estado actual do ecrã de boas-vindas. O &kdm; não impõe requisitos de tipos sobre eles, se bem que estes digam respeito normalmente a um tipo em particular.

  Id Mostrar apenas quando ...
  - timed-label ... estiver uma autenticação temporizada em curso.
  - caps-lock-warning ... o Caps Lock estiver activo.
  - xauth-warning ... o &X-Server; não necessitar de autorização do X para se ligar.
  - userlist-rect ... a lista de utilizadores estiver activa. Ao incorporar o item `userlist` dentro deste, é possível criar algo semelhante a uma moldura em torno da lista, apresentando-a apenas quando for apresentada a lista de utilizadores propriamente dita.
  - xconsole-rect ... o `xconsole` incorporado estiver activo. É semelhante ao `userlist-rect`.

### Nós Contentores de Disposição

Os nós de disposição aparecem dentro dos nós de itens e contêm mais outros nós de itens. O tipo do nó de disposição determina a organização dos nós-filhos. Um nó de item pode conter um nó de disposição de cada tipo.

#### Nós de Caixas

Os nós de caixas organizam automaticamente os seus filhos numa fila. São definidos da seguinte forma:

    <box orientation="alinhamento" min-width="núm" min-height="núm"
        xpadding="núm" ypadding="núm" spacing="núm"
        homogeneous="booleano">

Onde o `núm` corresponde ao número de pixels e o `booleano` como `true` ou `false`. O valor do `alinhamento` poderá ser `horizontal` ou `vertical`. Se deixar algum atributo desactivado, será igual a zero nos números, `false` para os booleanos e `vertical` para a orientação.

O espaço é a distância entre os itens-filhos vizinhos. O preenchimento é a margem exterior da caixa. Se a caixa for homogénea, é reservada a mesma quantidade de espaço para cada item-filho.

#### Nós Fixos

O nó 'fixed' é um contentor que tem os seus filhos dispostos em coordenadas exactas. O tamanho do contentor é o menor rectângulo que conseguir conter todos os filhos. O nó 'fixed' não tem atributos extra e por isso basta escrever:

    <fixed>

e colocar outros itens com nós de posição adequados dentro dele.

### Nós de Posição

Cada item poderá definir a sua posição e tamanho com o nó `pos`. Por exemplo:

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

Se o tamanho não for definido, será o tamanho natural do item, chamado de "sugestão de tamanho". Lembre-se que nem todos os itens têm uma sugestão de tamanho útil.

Tanto a posição como o tamanho podem ser definidos como uma percentagem e serão calculados em relação ao tamanho do contentor envolvente neste caso. Para os itens de topo, é a percentagem do ecrã completo. Ao adicionar acentos circunflexos (`^`) à definição do tamanho, é possível modificá-lo como sendo o tamanho do item envolvente do item envolvente, e assim por diante.

Se o item tiver uma caixa, o `width` e o `height` poderão ser definidos como `box`, o que significa que terá a largura e a altura da caixa, o que corresponde aos itens na caixa mais o preenchimento.

Poderá definir um dos atributos `width` ou `height` como sendo `scale`, o que significa que deverá ser dimensionado em relação à escala relativa da outra dimensão, baseando-se na sua sugestão de tamanho. Use isto para manter automaticamente as proporções das imagens dimensionadas.

Se o atributo `expand` for definido e for igual a `true`, este item será expandido na caixa envolvente o mais possível (inclusive poderá ter mais espaço, se estiver disponível).

Se o `width` ou o `height` forem um número simples, um valor negativo representa um deslocamento a partir do tamanho do contentor envolvente. Lembre-se que é possível definir um deslocamento positivo, escrevendo dois sinais negativos.

Em qualquer um dos casos, é possível restringir o tamanho final com os atributos `min-width`, `min-height`, `max-width` e `max-height`, que poderão ser definidos da mesma forma que o `width` e o `height`.

Se o `x` ou o `y` forem um número simples, um valor negativo representa um deslocamento face ao extremo direito ou inferior, respectivamente, ao contrário da situação predefinida no extremo esquerdo ou superior, respectivamente.

Também é possível especificar o ponto dentro do item a que a posição diz respeito. Este chama-se 'anchor' e poderá ser igual a um dos seguintes valores `n`, `ne`, `e`, `se`, `s`, `sw`, `w` e `nw`, ou então `c` que correspondem respectivamente aos diferentes cantos/lados (baseado nas direcções de um mapa topográfico) ou ao centro (por omissão). O valor por omissão é o `nw`, que corresponde ao canto superior esquerdo. Por exemplo:

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

### Nós de Apresentação

Poderá indicar o atributo `type` para referir que certos itens só podem ser apresentados se o tipo estiver definido. Se anteceder o tipo com um ponto de exclamação (`!`) irá inverter a condição. Os valores válidos incluem os seguintes:

Tipo Mostrar se ...
- `chooser` a mudança para a autenticação remota for permitida.
- `halt` e `reboot` o encerramento do sistema for permitido.
- `system` sem condições (sempre definido no &kdm;).
- `plugin-``nome-item` o 'plugin' de conversação tiver um campo de introdução de dados correspondente.

Por exemplo:

    <show type="chooser"/>

Em alternativa, poderá definir um valor `min-screen-width` ou `min-screen-height` para indicar que certos itens só deverão aparecer se a resolução do ecrã tiver pelo menos o valor definido. Por exemplo:

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

### Nós Normais/Activos/Pré-Iluminados

A aparência da maior parte dos tipos de itens poderá ser parametrizada com as seguintes marcas:

`normal`

- Estado normal.

`prelight`

- Quando o cursor do rato passa por cima do item.

`active`

- Quando se carrega um botão do rato sobre o item.

O conjunto exacto de atributos disponíveis depende do tipo de item:

`rect`

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

  Qualquer um dos atributos poderá ser omitido; nesse caso, é usado o predefinido (o exemplo representa a predefinição). O `alpha` é um número de vírgula-flutuante entre zero (transparente) e um (opaco). A `color` é um cardinal seguido de um número hexadecimal de seis algarismos; o formato é `#``rrggbb`. Em alternativa, a `color` pode ser definida como um número de oito algarismos, onde os dois primeiros são os valores da transparência.

`label`

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

  Os atributos `alpha` e `color` são definidos como nos itens rect.

  O `font` segue o formato `lista de famílias` `opções de estilo` `tamanho`. Cada um destes componentes é opcional.

  A `lista de famílias` é uma lista separada por vírgulas de famílias de tipos de letra como por exemplo helvetica, monospace, etc.

  As `opções de estilo` são uma lista delimitada por espaços de palavras-chave do estilo, peso e esticamento das categorias; em cada categoria existe no máximo uma instância. O estilo poderá ser `normal`, `italic` ou `oblique`. O peso poderá ser `ultra-light`, `light`, `medium`, `semi-bold`, `bold`, `ultra-bold` ou `heavy`. Os esticamentos são compostos por `ultra-condensed`, `extra-condensed`, `condensed`, `semi-condensed`, `normal`, `semi-expanded`, `expanded`, `extra-expanded` e `ultra-expanded`.

  O `tamanho` tanto pode ser um número de vírgula flutuante que representa o tamanho em pontos (1/72 polegada) ou um inteiro seguido de `px` para representar o tamanho em pixels. Os tamanhos dos pontos são preferíveis, dado que são independentes da resolução do ecrã.

  Se algum dos atributos for omitido, são usados os valores do nó de estilo. Se não estiver definida nenhuma cor para o texto, é usado o branco. O tipo de letra predefinido é o que está configurado no &kdmrc;.

`pixmap`

`svg`

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

  O `file` define o ficheiro que contém a imagem. Os locais dos ficheiros relativos baseiam-se na pasta do tema.

  O `wallpaper` poderá ser usado em vez do `file` para que o &kdm; procure pelas imagens nos locais normais para papéis de parede do &kde;. São suportados os pacotes de papéis de parede do Plasma.

  O `element` define o ID do elemento de um ficheiro SVG. Se estiver em branco, será representada toda a imagem SVG.

  No caso dos nós `pixmap`, é possível fornecer várias imagens, de modo a usar a que tenha a melhor qualidade para uma dada resolução. Os nomes dos ficheiros com marcas de tamanho têm o formato `nome-de-base``-``largura` `x` `altura``.``extensão`. Se existir um ficheiro com um nome não-formatado para tamanhos, o &kdm; só irá aceitar uma correspondência perfeita para um dado tamanho, caso contrário irá usar o ficheiro original. Se tudo isso não se aplicar, irá tentar descobrir uma imagem cujas dimensões se aproximem mais do tamanho necessário, caso não se encontre uma correspondência perfeita.

  O `scalemode` define como ajustar o tamanho das imagens que não correspondam ao tamanho do elemento. O `free` (valor por omissão) significa que a imagem será dimensionada para ter o tamanho correcto, provocando alguma possível distorção nas suas proporções. Os outros dois modos mantêm as proporções da imagem: o `fit` significa que a imagem será ampliada para o tamanho máximo que caiba na geometria do elemento. A imagem será centrada. A área restante não será pintada por este elemento, pelo que deverá ser colocada no topo de um `rect` com cores sólidas. O `crop` corresponde a ampliar a imagem para o tamanho mínimo que preencha por completo a geometria do elemento. A imagem será recortada de forma simétrica.

  O `tint` e o `alpha` geram uma definição de cor como nos itens `rect`. Cada pixel da imagem é multiplicado por esta cor a nível de cada componente.

### Nós de Estilo dos Itens

Esta marca possibilita alterar a aparência das legendas e dos itens do Qt incorporados no tema, p.ex. os campos de texto, os botões ou a lista de utilizadores. A configuração do estilo é herdada pelos itens-filhos, mas poderá ser substituída individualmente. Os valores por omissão são retirados do &kdmrc;.

O atributo `font` define o tipo de letra de todos os itens. Para os itens com uma função de introdução de dados, este poderá ser substituído pelo atributo `edit-font`. Os tipos de letra são definidos da mesma forma que nos nós normais/activos/pré-iluminados.

Normalmente, o motor de temas tenta realmente remover todos os contornos dos itens do Qt, para que se incorporem de forma transparente no tema. Nos casos em que isso não seja o desejado, o atributo `frame` poderá ser definido como `true`.

O atributo `guistyle` pode ser usado para substituir o estilo de interface do Qt para os elementos incorporados. O valor por omissão é indicado em `GUIStyle` no &kdmrc;

É possível definir praticamente a paleta inteira dos itens que estão documentados na página da Trolltech. Os nomes dos atributos são compostos a partir de um âmbito, um papel da cor e um sufixo. Os âmbitos possíveis são - por ordem de precedência crescente - `all-` para todos os grupos de cores, sem âmbito para os grupos de cores activa e inactiva e o `active-`, `inactive-` e `disabled-` para o grupo de cores respectivo. Os papéis das cores suportados são `window`, `window-text`, `base`, `alternate-base`, `text`, `bright-text`, `highlight`, `highlighted-text`, `button` e `button-text`. O sufixo poderá ser `-color` ou `-alpha`, tendo o significado respectivo que tem nos nós normais/activos/pré-iluminados.

Como uma alternativa à definição da paleta incorporada, o atributo `colorscheme` poderá ser usado para carregar um esquema completo do &kde;. O valor por omissão é dado pelo `ColorScheme` do &kdmrc;. As definições individuais do `color` irão substituir as cores do esquema.

Exemplo:

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

### Nós de Cores do Navegador de Caras

Os nós de cores permitem substituir a cor de fundo dos itens no navegador de caras. O `labelcolor` e o `altlabelcolor` são essencialmente equivalentes, respectivamente, ao `all-base-color` e `all-alternate-base-color` nos nós de estilo. Se só for definida a `labelcolor`, os fundos alternados dos itens ficam desactivados.

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

### Nós de Texto

As marcas de texto são usadas pelas legendas. Estas poderão ser usadas para mostrar texto traduzido da seguinte forma (se o atributo `xml:lang` estiver omitido, é usado o local POSIX):

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

Os nós de texto poderão conter as seguintes sequências especiais de texto, que serão traduzidas da seguinte forma:

Sequência Expansão
- %% Um carácter % literal
- %c Data e hora do relógio de parede
- %d Nome do ecrã (variável de ambiente `DISPLAY`)
- %h Nome da máquina (resultado do `gethostname`)
- %m Nome da máquina (resultado do `uname` da estrutura machine)
- %n Nome do nó (componente nodename do resultado do `uname`)
- %o Nome do domínio (resultado do `getdomainname`)
- %r Nome da versão (componente release do resultado do `uname`)
- %s Nome do sistema (componente sysname do resultado do `uname`)
- %t Número restante de segundos até ser efectuada a autenticação temporizado, para além da forma plural de 'i18n' apropriada dos segundos
- %u Utilizador da autenticação temporizada
- _ Faz com que o seguinte carácter seja um acelerador

O `%t` e o `%u` pretendem ser usados apenas internamente para mostrar a mensagem `timed-label`, que é actualizada automaticamente todos os segundos.

### Nós de 'Stock'

Algumas legendas traduzidas comuns poderão ser definidas com as marcas de 'stock'. A marca `text` é ignorada se for usada a marca `stock`. Deverá realmente usar as legendas em 'stock' em vez de colocar todas as traduções nos temas. Isto conduz a tempos de carregamento mais reduzidos e a melhores traduções. Os seguintes valores são válidos:

Tipo Expansão
- caps-lock-warning O Caps Lock está activo
- chooser Selecção de _XDMCP
- quit _Sair
- disconnect D_esligar
- halt Desligar _computador
- língua Lín_gua
- autenticação _Utilizador
- sessão _Tipo de Sessão
- reboot Rei_niciar
- system _Menu
- timed-label O utilizador %u autenticar-se-á daqui a %t
- domain-label _Domínio:
- username-label _Utilizador:
- password-label Sen_ha:
- welcome-label Bem-vindo ao %h

Por exemplo:

    <stock type="welcome-label"/>

### Nós de Companhia

Os itens que não provocam directamente uma acção poderão ter um companheiro atribuído. Este item de companhia fica em primeiro plano quando o outro item fica activado (ao carregar nele com o rato ou com um acelerador de uma `label`).

O companheiro é referenciado pelo seu ID com o atributo `idref`. Obviamente deverá ter um ID atribuído. Por exemplo:

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