Next Previous Contents

## 5. Configuração do X

Quando o servidor X está ativo, ele coloca o teclado do computador em um modo de operação chamado raw (cru), em oposição ao modo normal, chamado cooked (isto mesmo: cozido). No modo raw o sistema operativo não processa seqüências acento-letra. O servidor X é uma daquelas raras aplicações que, por dever de ofício, tem que tratar o teclado ``em baixo nível''.

O X vem equipado com um utilitário destinado à configuração do teclado, chamado xmodmap, que cumpre uma função correspondente à do comando loadkeys, ou seja, lê um arquivo de mapa de teclado do X, expecificando as equivalências entre os keycodes e respectivos keysymbols.

Eis um excerto deste arquivo:

        keycode 47 = ccedilla Ccedilla dead_acute dead_doubleacute
        keycode 48 = masculine ordfeminine dead_circumflex dead_caron
        keycode 49 = backslash bar notsign
        keycode 50 = Shift_L
        keycode 51 = dead_tilde dead_circumflex dead_grave dead_breve

Observem que, ao contrário do loadkeys, o xmodmap não possui um diretório padrão onde o arquivo é procurado.

A configuração do X não interfere de forma alguma com a configuração do modo de texto. De facto, é possível ter o seu X bem configurado, e no entanto não ter realizado qualquer tipo de configuração ao modo de texto, e vice-versa. Outro ponto importante de se observar é que os códigos numéricos das teclas no X não correspondem aos do console. A tecla Backspace, por exemplo, tem o número 14 no console, e 22 no X (em um computador do tipo IBM-PC).

As versões 3.2 e posteriores do XFree86 permitam definir dead-keys, mas o seu tratamento é responsabilidade da aplicação, conforme visto na seção Modo texto versus Sistema de Janelas X. Há modos de contornar esta limitação e tornar o tratamento de dead-keys transparente às aplicações, conforme mostrado na seção Contornando os limites do X.

Dividimos a configuração em duas partes: Uma que deve ser feita antes do login do usuário e outra depois.

## 5.1 Configuração do xinit

Junto com este documento são fornecidos vários mapas de teclado para uso no X. Para automatizar o processo de configuração do teclado basta copiar o arquivo adequado para o diretório `/usr/X11R6/lib/X11/xinit`, onde normalmente ficam os arquivos de início da seção de trabalho no X. Na distribuição Slackware esse diretório é um link simbólico para `/var/X11R6/lib/xinit` e na Debian e na Red Hat para `/etc/X11/xinit`.

Nas distribuições Slackware e Red Hat, verifique se no referido diretório existe um arquivo chamado `.Xmodmap`. Se existir, copie o `Xmodmap.`<alguma-coisa> para ele, ou faça um link. Normalmente o arquivo de configuração `xinitrc` possui os comandos para carregá-lo automaticamente. Veja o seguinte trecho:

        #!/bin/sh
        # $XConsortium: xinitrc.cpp,v 1.4 91/08/22 11:41:34 rws Exp $

        userresources=$HOME/.Xresources
        usermodmap=$HOME/.Xmodmap
        sysresources=/usr/X11R6/lib/X11/xinit/.Xresources
        sysmodmap=/usr/X11R6/lib/X11/xinit/.Xmodmap

        # merge in defaults and keymaps

        if [ -f $sysresources ]; then
            xrdb -merge $sysresources
        fi

        if [ -f $sysmodmap ]; then
            xmodmap $sysmodmap
        fi

Na distribuição Debian o mapa de teclado padrão do X é `/etc/X11/Xmodmap`, basta copiar o mapa desejado para aquele arquivo. Ele será carregado pelo xinitrc, que por sua vez é um link simbólico para `/etc/X11/Xsession`, sempre que iniciar a seção de trabalho do usuário.

## 5.2 Configuração do XDM

Existe ainda um pequeno problema: no meu computador, por exemplo, o sistema carrega diretamente o X ao dar boot e o login é feito pelo X Display Manager (xdm). Como o xdm faz o login antes de iniciar a seção de trabalho, o mapa de teclado não será carregado, o que pode criar problemas se o usuário usa caracteres como ``['' ou ``]'' em sua senha, pois nos teclados ABNT-2 e português esses símbolos são gerados por teclas cujos códigos numéricos não são os mesmos do teclado americano.

É preciso fazer uma pequena alteração no arquivo de configuração Xsetup_0. Esse arquivo deve estar no diretório `/usr/X11R6/lib/X11/xdm`, que na Slackware é um link simbólico para `/var/X11R6/lib/xdm` e `/etc/X11/xdm` na Debian e -- sujeito a confirmação -- RedHat. Eis o conteúdo completo desse arquivo:

        #!/bin/sh
        #
        # /usr/X11R6/lib/X11/xdm/Xsetup_0
        #

        sysresources=/usr/X11R6/lib/X11/xinit/.Xresources
        sysmodmap=/usr/X11R6/lib/X11/xinit/.Xmodmap

        # merge in defaults and keymaps

        if [ -r $sysresources ]; then
            xrdb -merge $sysresources
        fi

        if [ -r $sysmodmap ]; then
            xmodmap $sysmodmap
        fi

        xconsole -geometry 480x130-0-0 -daemon -notify -verbose -exitOnFail

A distribuição Debian tem um `Xsetup_0` um pouco diferente, em `/etc/X11/xdm/Xsetup_0`, mas basta acrescentar-lhe o seguinte:

        sysmodmap=/etc/X11/Xmodmap
        sysresources=/etc/X11/Xresources

        if [ -f $sysresources ]; then
          xrdb -merge $sysresources
        fi

        if [ -f $sysmodmap ]; then
          xmodmap $sysmodmap
        fi

Se no seu computador o login do usuário também for feito sempre via xdm, não é necessário mexer no xinitrc, como mostrado na seção anterior, já que o mapa de teclado será carregado antes do início na seção do usuário.

## 5.3 Compose

Uma das coisas mais importantes a definir quando vamos utilizar acentuação por meio de dead-keys é o conjunto de regras de composição. Essas regras determinam, por exemplo que a composição do caracter ' com a letra e gerará um é.

Ao contrário do console, no qual podemos definir as regras de composição no próprio mapa de teclado, no X essas regras são colocadas no arquivo `/usr/X11R6/lib/X11/locale/???/Compose`, onde ??? é a codificação em uso (no nosso caso, iso8859-1).

Para facilitar o uso dos mapas para teclados que não têm o c-cedilhado, como o US+ (veja adiante) é conveniente definirmos uma nova regra de composição, permitindo que o Ç seja gerado pela seqüência `'C`. Se não fizermos isso, seremos obrigados a digitar `<dead_cedilla-C>`, sedo o dead_cedilla produzido pela combinação `AltGR-=`, o que não é nada confortável. Além disso, no teclado americano somos obrigados a usar as aspas duplas para gerar o trema.

O arquivo `Compose` fornecido foi feito procurando imitar ao máximo o comportamento do console e possui as seguintes facilidades para geração de caracteres:

- C-cedilha: tecla `Ç` ou seqüência <acento-agudo>-C
- Apóstrofo: tecla `'` ou seqüências <acento-agudo>-<acento-agudo> e <acento-agudo>-<espaço>
- Acento grave: seqüências <acento-grave>-<acento-grave> e <acento-grave>-<espaço>
- Aspas: tecla `"` ou seqüência <trema>-<trema>
- Trema: seqüência <trema>-<espaço>
- Til: seqüências <til>-<espaço> e <til>-<til>
- Circumflexo: seqüências <circumflexo>-<espaço> e <circumflexo>-<circumflexo>

Para incluirmos as novas regras, basta aplicar uma alteração à definição original. O arquivo `Compose.patch` pode ser obtido via WWW na página do Portuguese HOWTO. Para aplicar a atualização, copie-o para o diretório `/usr/X11R6/lib/X11/locale/iso8859-1/`, faça uma cópia de reserva do `Compose` original e invoque o utilitário patch:

        cp -p Compose Compose.backup
        patch < Compose.patch

Caso você prefira não aplicar o ``patch'', um arquivo `Compose` pronto também é fornecido. Lembre-se de fazer cópia do original antes de substituí-lo!

## 5.4 Locale

Para os usuários brasileiros, pode haver mais uma alteração a fazer no X. Conforme vimos na seção Biblioteca libc, uma variável de ambiente (LANG ou LC_ALL) configura o suporte internacional existente na biblioteca de funções padrão do sistema (libc). A biblioteca de funções do X (Xlib) usa a variável LANG para identificar a língua em uso mas até a revisão 6.3, na qual é baseado o XFree86, não era incluída a combinação ``pt_BR'', correspondente a Português/Brasil. Como resultado, cada vez que executarmos um aplicativo X com LC_ALL definido como ``pt_BR'' ele emitirá a mensagem ``Warning: locale not supported by Xlib, locale set to C''.

Para incluir o local pt_BR no X11R6.3 basta alterar três arquivos existentes no diretório `/usr/X11R6/lib/X11/locale`. Pegue o arquivo `Xlocale.patch` via WWW na página do Portuguese HOWTO. Para aplicar a atualização, copie-o para o diretório `/usr/X11R6/lib/X11/locale`, faça uma cópia de reserva dos arquivos a serem alterados e invoque o utilitário patch:

        cp -p compose.dir compose.dir.backup
        cp -p locale.alias locale.alias.backup
        cp -p locale.dir locale.dir.backup
        patch < Xlocale.patch

Caso você prefira não aplicar o ``patch'', arquivos prontos também são fornecidos. Lembre-se de fazer cópias dos originais antes de substituí-los!

Em setembro de 1998 o fix-2 da revisão 6.4 do X Window System incluiu oficialmente o suporte ao local pt_BR. Infelizmente neste mesmo fix-2 foi introduzida uma falha em uma das funções de tratamento de input contexts da Xlib que provoca violações de acesso à memória. Uma das aplicações afetadas é o processador de textos LyX. Uma correção provavelmente será incluída no fix-4. O X11R6.4 deverá ser a base para a versão 4 do XFree86.

## 5.5 Geração de mapas com o XKeyCaps

O programa XKeyCaps, criado por Jamie Zawinski é uma interface gráfica para o `xmodmap`, que mostra na tela o desenho de um teclado e permite modificar interativamente os símbolos gerados por cada tecla e gerar automaticamente o arquivo `.Xmodmap` correspondente.

Ele pode ser obtido via WWW em http://www.jwz.org/xkeycaps/ e, a partir da versão 2.43, já incoropra também suporte para o desenho brasileiro (ABNT2), uma contribuição de Andre Gerhard.

## 5.6 Contornando os limites do X

Conforme foi explicado na seção Modo texto versus Sistema de Janelas X, o tratamento de acentos deve ser feito pela aplicação, mas ainda há muitos programas que não levam isto em consideração, tais como Netscape Navigator/Communicator e Nedit. Como não é possível modificar muitos deles, é preciso encontrar outro tipo de solução.

### Alteração da biblioteca Xlib

Linux, assim como a maioria dos sistemas operacionais modernos, usa um sistema de vínculo de programas a bibliotecas de funções chamado ``ligação dinâmica'' (dynamic binding). Deste modo, podemos modificar o comportamento de um programa alterando uma dessas bibliotecas. Maiores informações sobre este tema pode ser obtida nos manuais do Linux com os comandos

        man ld.so
        man ldconfig
        man ldd
        man dlopen

Thomas Quinot criou uma alteração para a biblioteca de funções do X (Xlib) introduzindo o tratamento de acentos na função XLookupString, Tudo que se tem a fazer é substituir o arquivo contendo esta biblioteca por outro, que pode ser obtido via internet no endereço

> http://web.fdn.fr/~tquinot/dead-keys.en.html

Existem duas versões do arquivo, uma para sistemas onde as bibliotecas do X suportam o uso seguro de threads (Debian 2.x, Red Hat 5.x, etc.) e outra para os sistemas que não possuem tal atributo (Slackware, Caldera 1.x). Se você não sabe o que são threads não se preocupe com isso, mas saiba que eles permitem criar um programa capaz de se dividir em sub-processos que rodam concorrentemente em um computador. Para analisar sua Xlib rode o seguinte comando:

> nm --dynamic /usr/X11R6/lib/libXext.so.6|grep _Xglobal_lock

Se aparecer ```U _Xglobal_lock`'' seu sistema suporta threads e o arquivo a obter é `libX11-XF3.3.1-TS.tar.gz`. Se não aparecer, seu sistema não suporta threads e o arquivo a obter é `libX11-XF3.3.1.tar.gz`. Tendo obtido o arquivo, copie-o para um diretório temporário e extraia seu conteúdo. Mova o arquivo `/usr/X11R6/libX11.so.6.1` para outro diretório, para preservá-lo. Não é suficiente renomeá-lo! Remova-o para um diretório cujo nome não esteja contido no arquivo `/etc/ld.so.conf`. Depois, mova o novo arquivo para o lugar do antigo e rode o programa ldconfig (isto deve ser feito pelo usuário root):

        cp libX11-XF3.3.1-TS.tar.gz /tmp
        cd /tmp
        tar xzf libX11-XF3.3.1-TS.tar.gz
        mkdir /usr/X11R6/oldlib
        mv /usr/X11R6/lib/libX11.so.6.1 /usr/X11R6/oldlib
        mv libX11.so.6.1 /usr/X11R6/lib
        chown root:root /usr/X11R6/lib/libX11.so.6.1
        chmod 755 /usr/X11R6/lib/libX11.so.6.1
        /sbin/ldconfig

É aconselhável que a operação seja realizada quando nenhuma aplicação X estiver rodando. A seguir, edite o arquivo de configuração do servidor X, chamado `XF86Config`. Este arquivo fica no diretório `/etc` (Slackware) ou `/etc/X11` (Debian, Red Hat). Procure a seção ``Keyboard'' e inclua a opção ``XkbDisable'', conforme mostrado a seguir:

        Section "Keyboard"
           Protocol        "Standard"
           XkbDisable
        EndSection

A opção XkbDisable inabilita a extensão XKEYBOARD do servidor X, o que neste caso serve para sinalizar à função XLookupString que ela deve tratar os acentos. Se quisermos voltar ao comportamento normal, basta retirar a opção do `XF86Config`.

Configure o mapa de teclado do X conforme explicado nas seções anteriores deste documento. Para testar o resultado, rode o programa xedit e digite alguns caracteres acentuados.

### Alteração no kernel do Linux

> Esta seção é baseada em contribuição enviada por Bruno Barberi Gnecco e na documentação do diacrd. Podem haver ainda alguns erros e se alguém os detectar, por favor avise-me.

Seguindo a regra geral do mundo *nix, existe sempre mais de um modo se resolver o mesmo problema. Conforme vimos anteriormente, existem dois modos de operação do teclado, chamados raw e cooked. Estes modos de operação podem ser mudados com o programa kbd_mode, integrante do pacote kbd, o que não é recomendável fazer a não ser para restaurar o estado do console após um desastre com o servidor X, por exemplo. No modo raw o kernel não processa os diacríticos (acentos).

Cedric Adjih criou uma alteração para o kernel que permitia tratar os acentos mesmo em modo raw, inicialmente voltada para o teclado de desenho francês. Enéas Queiroz, André D. Balsa e Claudemir Todo Bom fizeram melhorias e o adaptaram para os teclados internacional, português e ABNT. O tratemanto de acentos é feito parte pelo kernel, parte por um processo que roda em retaguarda (daemon) chamado diacrd, conforme descrito a seguir:

- Uma modificação no kernel faz que todos os dados lidos do teclado sejam redirecionados para um dispositivo especial do sistema chamado `/dev/rawkbd` quando o teclado estiver em modo raw.
- Os dados que o kernel grava no `/dev/rawkbd` são lidos pelo programa `diacrd`, que processa as seqüências acento-letra e reescreve no `/dev/rawkbd` os caracteres acentuados na forma de códigos de varredura (scancodes) que normalmente não existem no teclado.
- O kernel lê no `/dev/rawkbd` os códigos gravados pelo `diacrd` e os passa à aplicação, que no caso é o servidor X.
- O servidor X mapeia os códigos de varredura para caracteres. Um mapa de teclado especial permite então gerar as letras acentuadas.

O diacrd pode ser obtido via FTP anônimo no endereço

> ftp://metalab.unc.edu/pub/Linux/system/keyboards

Há versões diferentes, de acordo com o tipo de teclado e, pelo menos por enquanto, não se pode reconfigurá-lo sem recompilar. Para fazer a instalação, de acordo com o arquivo ``README'', deve-se fazer o seguinte (pelo usuário root):

- Obtenha o arquivo -.tar.gz correspondente a seu teclado. Extraia seu conteúdo, o que deverá criar um diretório chamado `diacrd-<versão>`.
- Edite o arquivo `diacrd.c` e remova os comentários desejados, de acordo com suas preferências. Pode-se incluir capacidade de rodar o programa xmodmap e ejetar o CD-ROM sob controle do pressionamento de uma combinação de teclas.
- Aplique a modificação no kernel. Para isto, execute o comando ``make patch-usr-src''.
- Crie o dispositivo `/dev/rawkbd` executando o comando ``make rawkbd''.
- Compile o diacrd e instale-o executando os comandos ``make'' e ``make install''.
- Compile e instale o kernel, com os comandos

          cd /usr/src/linux
          make config
          make zlilo

  Para maiores informações sobre compilação/instalação do kernel, leia o Kernel-HOWTO, disponível via Internet nos repositórios do LDP mencionados na seção Onde encontrar a versão mais atual.
- Dê um ``reboot'' no computador. Verifique se o suporte ao dispositivo rawkbd foi instalado com sucesso com o comando

          dmesg | grep RAWKBD

  Deve aparecer

          RAWKBD interface for diacriticals translation enabled...

  e teste o dispositivo `/dev/rawkbd` com o comando

          printf "### TESTANDO ###" >> /dev/rawkbd

  Veja na seção Configuração do console como carregar um mapa com suporte à acentuação. O pacote diacrd vem com um arquivo chamada `usintl.map`, que corresponde ao nosso `us+.map`. Se seu teclado não for do tipo americano, use o `pt.map` ou `abnt-2.map`.
- Substitua o arquivo `/usr/X11R6/lib/X11/xkb/keycodes/xfree86` pelo arquivo fornecido junto com o diacrd.
- Se tudo correr bem, rode o programa diacrd. Depois ative o X e use o xmodmap para carregar o mapa `xmodmap.diacrd`.

Se a geração de acentos funcionar, é preciso tornar permanentes as alterações necessárias. Pode-se fazê-lo incluindo a carga do diacrd no arquivo `/etc/rc.d/rc.local` (Slackware).

> Se algum dos leitores tiver criado um script de ativação do diacrd para a distribuição Debian ou Red Hat, por favor envie-o para que seja incluído aqui.

Mais informações sobre o diacrd podem ser encontradas no ``Dead keys Mini-HOWTO'' de Claudemir Todo Bom, disponível em http://linux.unicamp.br/docs/diversos/deadkeys.html.

### Comparação entre as duas soluções

Em termos de resultados práticos, a Xlib modificada e o diacrd são equivalentes. Há porém algumas diferenças entre as duas soluções que merecem atenção.

Diacrd exige uma alteração no kernel do Linux para resolver um problema que o kernel já resolve, o que não deixa de parecer um tanto redundante. A dependência de um processo de usuário (o daemon kerneld) é uma desvantagem, pois se esse programa deixar de funcionar perde-se o suporte à acentuação no X. Trata-se de uma solução ainda em desenvolvimento e, segundo o conteúdo da documentação que o acompanha, o ideal seria que todo o tratamento fosse feito pelo kernel, sem depender de outro programa.

Até o momento da publicação deste HOWTO, o diacrd ainda não era compatível com a versão 2.2 do kernel do Linux.

A solução via Xlib é, pelo menos em teoria, totalmente transparente às aplicações e permite reconfiguração em tempo de execução, bastando alterar o mapa de teclado do X e as regras de composição. Já o diacrd precisa ser recompilado se quisermos trocar o tipo de teclado, mas é possível que novas versões incorporem algum recurso de reconfiguração.

O diacrd só funciona no teclado do próprio computador. Se quisermos usar um display remoto, seja um terminal X, seja um outro computador, não teremos suporte à acentuação. A troca da Xlib, por outro lado, enquadra-se plenamente na filosofia do X de que o servidor provê mecanismo, deixando a cargo da aplicação a definição de políticas. Exemplo da vantagem deste paradigma é poder usar as técnicas descritas na seção Configuração do X em outros sistemas operativos e com terminais X.

A solução via Xlib parece-me mais ``limpa'' e é minha predileta, mas, como sempre, fica a critério do usuário ou do administrador do sistema qual alternativa escolher. De qualquer modo, sempre é bom lembrar qua ambas as soluções são remendos. Considerando-se a rápida evolução que está a ocorrer no campo do software livre, com o desenvolvimendo de ambientes de trabalho como KDE, GNOME e GNUStep, podemos supor que em breve nenhum desses remendos será mais necessário.

Next Previous Contents