# Criando temas para o tela de boas-vindas do &kdm;

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

## Introdução ao Tema

Os temas do &kdm; podem ser criados definindo-se um arquivo XML que siga a especificação em `$`KDEDIR`/share/apps/doc/kdm/greeter.dtd`. Os arquivos dos temas são salvos na pasta `$`KDEDIR`/share/apps/kdm/themes/`nome-tema``. A pasta dos temas deverá conter um arquivo chamado `KdmGreeterTheme.desktop`, que tem um formato semelhante ao dos outros arquivos `.desktop`, parecendo-se com o 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 arquivos `.desktop`. Todos os arquivos que sejam mencionados deverão estar na pasta do próprio tema. O campo `Screenshot` aponta para um arquivo que deverá ser uma imagem de 200x150 do tema em ação (isto não é obrigatório, mas ter esta imagem é mais agradável para o usuário). O item `Greeter` aponta para um arquivo XML que contém a descrição do tema.

Uma vez que o tema tenha sido inteiramente testado, crie um pacote que contendo 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 arquivos 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 seçõ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`:

botão

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

  Também é possível fazer com que outro item atue 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;, uma vez que eles são acessíveis para pessoas com necessidades especiais.

entry

- Um item de entrada 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 dos usuários.

pixmap

- Uma imagem rasterizada num formato suportado pelo Qt, ⪚ PNG, JPEG, Tiff, etc.

rect

- Um retângulo simples.

svg

- Uma imagem vetorial no formato SVG.

Por exemplo:

    <item type="label">

Um item que atua como um botão:

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

Por padrão, a tela de autenticação do &kdm; irá desaparecer após a autenticação. Isto poderá resultar numa intermitência entre o tela de autenticação e a sessão. O atributo `background` permite aos usuários 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 tela e apresente os outros itens `background` restantes na janela de topo. Isto poderá ser usado para criar uma transição suave entre o tela 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 tela 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 telas, os temas poderão também definir a aparência das outras telas diferentes da que aparece a mensagem de boas-vindas - contudo, tipicamente só aparecem os itens de fundo nesse caso. Se você quiser indicar em que telas um determinado item deverá aparecer, poderá usar o atributo `screen` com o valor igual a `greeter`, `other` ou `all`, o que corresponde a tela da mensagem de boas-vindas, nas outras telas onde esta mensagem não aparece ou em todos, respectivamente.

Cada item poderá ter um nome próprio com o atributo `id`. Alguns IDs 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 disparam algumas ações. Além disso, o &kdm; irá ocultar botões cujas ações não estejam disponíveis por alguma razão.

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

Itens `label`

- O &kdm; irá mostrar/ocultar 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 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 entrada do nome do usuário.
  - pw-entry Campo de entrada da senha.
  - domain-entry Alguns plug-ins de conversação usam este campo para questionar o nome de um domínio. Se este campo estiver presente, os itens envolventes relacionados com ele 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 da tela de boas-vindas: contém os itens `label` e `entry` que dizem respeito ao processo de autenticação. Se um determinado plug-in de conversação não corresponder aos itens existentes com as suas necessidades, ele 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 fornecer desenhos de locutores, uma vez que todos os plug-ins 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 usuários estiver ativa, o &kdm; irá incorporar o item da lista de usuários aqui. Caso contrário, este item fica oculto.
  - xconsole Este item deverá ser do tipo `rect`. Se a funcionalidade do `xconsole` incorporado estiver compilada e ativada, o &kdm; irá incorporar o item de registro do console aqui. Caso contrário, este item fica oculto.

Outros itens

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

  Id Mostrar apenas quando...
  - timed-label ... existir uma autenticação temporizada em curso.
  - caps-lock-warning ... o Caps Lock estiver ativo.
  - xauth-warning ... o &X-Server; não necessitar de autorização do X para se conectar.
  - userlist-rect ... a lista de usuários estiver ativa. 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 usuários propriamente dita.
  - xconsole-rect ... o `xconsole` incorporado estiver ativo. É 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 você deixar algum atributo desativado, 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 exatas. O tamanho do contentor é o menor retâ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 porcentagem e serão calculados em relação ao tamanho do contentor envolvente neste caso. Para os itens de topo, é a porcentagem da tela inteira. 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 máximo 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 padrão no extremo esquerdo ou superior, respectivamente.

Também é possível especificar o ponto dentro do item a que a posição diz respeito. Ele chama-se 'anchor' e poderá ser igual a `c` para centralizado ou a um dos seguintes valores `n`, `ne`, `e`, `se`, `s`, `sw`, `w` e `nw`, que correspondem aos diferentes cantos/lados das direções em um mapa topográfico. O padrã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

Você pode especificar o atributo `type` para indicar que determinados itens devem somente ser exibidos se o 'type' estiver configurado. Prefixar o 'type' com um ponto de exclamação (`!`) inverte esta condição. Valores válidos incluem os seguintes:

Tipo Exibir se...
- `chooser` alternar para o login remoto é permitido.
- `halt` e `reboot` o desligamento do computador é permitido.
- `system` nenhuma condição (sempre configurado no &kdm;).
- `plugin-``nome-entrada` o plug-in de conversação fornece um campo de entrada correspondente.

Por exemplo:

    <show type="chooser"/>

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

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

### Nós Normais/Ativos/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 mouse passa por cima do item.

`ativo`

- Quando se clica um botão do mouse sobre o item.

O conjunto exato 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 padrão (o exemplo representa o padrã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 fontes 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 em pontos são preferíveis, uma vez que são independentes da resolução da tela.

  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. A fonte padrão é a que está configurada no &kdmrc;.

`pixmap`

`svg`

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

  O `file` define o arquivo que contém a imagem. Os locais dos arquivos 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 arquivo 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 determinada resolução. Os nomes dos arquivos com marcas de tamanho têm o formato `nome-de-base``-``largura` `x` `altura``.``extensão`. Se existir um arquivo com um nome não-formatado para tamanhos, o &kdm; só irá aceitar uma correspondência perfeita para um determinado tamanho, caso contrário irá usar o arquivo original. Se tudo isso não se aplicar, ele 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 padrão) significa que a imagem será dimensionada para ter o tamanho exato, 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, sendo colocado 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 usuários. A configuração do estilo é herdada pelos itens-filhos, mas poderá ser substituída individualmente. Os valores padrão são retirados do &kdmrc;.

O atributo `font` define a fonte de todos os itens. Para os itens com uma função de entrada de dados, ele poderá ser substituído pelo atributo `edit-font`. As fontes são definidas da mesma forma que nos nós normais/ativos/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 padrão é indicado em `GUIStyle` no &kdmrc;

É possível definir praticamente toda a paleta 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 ativa e inativa 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/ativos/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 padrã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 Faces

Os nós de cores permitem substituir a cor de fundo dos itens no navegador de faces. 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 desativados.

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

### Nós de Texto

As marcas de texto são usadas pelas legendas. Elas 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 caracter % literal
- %c Data e hora do relógio de parede
- %d Nome da tela (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 efetuada a autenticação temporizado, além da forma plural de 'i18n' apropriada dos segundos
- %u Usuário da autenticação temporizada
- _ Faz com que o caracter a seguir seja um acelerador

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

### Nós de 'Stock'

Algumas legendas comuns traduzidas poderão ser definidas com as marcas de 'stock'. A marca `text` é ignorada se for usada a marca `stock`. Você deverá realmente usar as legendas em 'stock' em vez de colocar todas as traduções nos temas. Isto gera 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á ativo
- chooser Seleção de _XDMCP
- quit _Sair
- disconnect D_esligar
- halt Desligar _computador
- idioma Lín_gua
- autenticação _Login
- sessão _Tipo de Sessão
- reboot _Reiniciar
- system _Menu
- timed-label O usuário %u autenticar-se-á em %t
- domain-label _Domínio:
- username-label _Usuário:
- 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 diretamente uma ação poderão ter um companheiro atribuído. Este item de companhia fica em primeiro plano quando o outro item fica ativo (ao clicar nele com o mouse 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-usuário"/>
      [...]
    </item>
    [...]
    <item type="entry" id="campo-usuário">
      [...]
    </item>