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_breveObservem 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.
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.
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.
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:
�
ou seq��ncia
<acento-agudo>-C'
ou seq��ncias
<acento-agudo>-<acento-agudo> e
<acento-agudo>-<espa�o>"
ou seq��ncia <trema>-<trema>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!
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.
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.
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.
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 dlopenThomas 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.
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:
/dev/rawkbd
quando o teclado estiver em modo raw./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./dev/rawkbd
os c�digos gravados pelo
diacrd
e os passa � aplica��o, que no caso � o servidor X.O diacrd pode ser obtido via FTP an�nimo no endere�o
ftp://metalab.unc.edu/pub/Linux/system/keyboardsH� 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):
diacrd-<vers�o>
.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./dev/rawkbd
executando o comando
``make rawkbd''.cd /usr/src/linux make config make zliloPara 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.
dmesg | grep RAWKBDDeve aparecer
RAWKBD interface for diacriticals translation enabled...e teste o dispositivo
/dev/rawkbd
com o comando
printf "### TESTANDO ###" >> /dev/rawkbdVeja 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
./usr/X11R6/lib/X11/xkb/keycodes/xfree86
pelo arquivo fornecido junto com o diacrd.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.
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.