(M)  s i s t e m a   o p e r a c i o n a l   m a g n u x   l i n u x ~/ · documentação · suporte · sobre

  Página seguinte Página anterior Índice

197. Configuração do X

Foge ao escopo deste texto a discussão detalhada do tratamento de eventos no X. Para maiores informações consulte os documentos mencionados na seção Bibliografia comentada, mas é importante esclarecer que o evento enviado pelo servidor ao cliente não contém o código numérico da tecla, chamado keycode na terminologia do X. Ao invés disso, é enviado um símbolo, chamado keysymbol ou keysym, obtido pela consulta a uma tabela de conversão mantida na memória do servidor. Esta tabela pode ser modificada total ou parcialmente a qualquer momento por meio de requisições definidas no protocolo X. É responsabilidade do cliente e não do servidor interpretar o keysym, o que significa que a aplicação deve saber esperar por mais um caracter ao receber uma ``tecla morta'' para compor uma letra acentuada.

Desde a revisão 5 do X existe na bibliotaca de funções do X (Xlib) um mecanismo sofisticado de suporte à acentuação por meio das funções XmbLookupString e XwcLookupString, mas seu uso é responsabilidade da aplicação, mesmo no caso da tecla Compose. Isto deve-se so fato de o X Consortium ter chegado à conclusão de que o sistema de mapeamento de teclas não tratava de forma satisfatória toda a imensa variedade de línguas escritas nas várias partes do mundo. Deste modo, decidiu-se que o ``peso'' relativo à gestão do teclado fosse transferido para as aplicações X, o que cria problemas com as mais antigas, que continuam tratando a entrada de texto com a função XLookupString, que existia nas versões anteriores do X. Esta função não processa as seqüências de acentos e letras de modo transparente às aplicações.

Por essas razões é normalmente mais difícil conseguir acrescentar suporte à geração de caracteres acentuados a aplicativos que rodam sob o X, principalmente quando não se possui o código fonte. Existem duas soluções, descritas adiante na seção  Contornando os limites 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''.

Existe um programa chamado xmodmap capaz de ler um arquivo contendo uma tabela de conversão keycode-->keysym e enviá-la, na forma de mensagens no protocolo X, ao servidor. Ele cumpre uma função correspondente à do comando loadkeys.

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).

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

197.1 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.

197.2 X display manager (XDM)

O X Display Manager (xdm) é o programa padrão de login do X Window System. Ele não reconhece teclas mortas, mas pode ser modificado para isto, conforme mostrado na sação  Correção da libXaw.

Se o sistema executa diretamente o X ao dar boot é preciso carregar o mapa de teclado antes que o XDM apresente a tela de o login, porque nos teclados ABNT-2 e português alguns símbolos são gerados por teclas cujos códigos numéricos não são os mesmos do teclado americano. O usuário pode ter problemas se usar caracteres como ``['' ou ``]'' em sua senha.

É 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 nas outras distribuições. 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.

197.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>, sendo 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 procura 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!

197.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!

197.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.

197.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. Como não é possível modificar muitos deles, é preciso encontrar outro tipo de solução.

Felizmente o Linux, assim como a maioria dos sistemas operativos 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

Existem duas alternativas, conforme descrito a seguir.

Alteração da biblioteca Xlib

O francês Thomas Quinot implementou uma modificação para a biblioteca de funções do X introduzindo o tratamento de acentos na função XLookupString, mencionada anteriormente. 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. 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.

Correção da libXaw

O X Window System vem com uma bibliotaca simples de interface com o usuário chamada X Athena Widgets, usada por programas como Xedit, XFig e muitos outros. Xaw incorpora um mecanismo de composição por teclas mortas. O único problema é que é preciso ligar o resource ``international'' das caixas de texto, colocando algo como

    *Text*international: True
no arquivo .Xdefaults e estabelecer uma variável de ambiente LANG contendo ``pt'', por exemplo. A maioria das aplicações Xaw não configura o ``international'' e, pior ainda, sempre que eu tentei usá-lo tudo que obtive foi um feio `@' no lugar dos caracteres acentuados.

Há uma correção para a libXaw, da autoria deste vosso humilde servo, disponível via WWW em

http://linusp.usp.br/ casantos/Xaw-dead-keys/

Análise das duas soluções

A abordagem de Quinot resolve o problema de muitas aplicações que lêem texto sem usar as funções da Xaw. XFig e XPaint são bons exemplos. Eu estou trabalhando neles, mas por enquanto pode-se ``resolver'' o problema do XFig digitando o texto na área de desenho sem acentos e depois usando o recurso ``edit''. Para o XPaint ainda não há solução, lamento.

Por outro lado, há duas vantagens da minha solução: ela segue o princípio do X de ``mecanismo e não política'' e a libXaw é mais fácil de recompilar separada do resto do X do que a Xlib. Além disso ela fará seus dentes mais brancos, sua grama mais verde, sua água mais pura e seus cabelos muito mais macios.


Página seguinte Página anterior Índice