Eu estava tendo um problema com a configuração das teclas de função no meu notebook Vostro 1000 no Fedora 7. O grande problema era que algumas teclas era detectadas e outras não. Essas teclas que eram detectadas foi razoavelmente fáceis de configurar atráves do xmodmap. Mas havia um grande problema: As teclas que não geravam evento no xev. Então, mostrarei neste artigo como configurar as teclas das duas maneiras:

  • Usando o xmodmap para as teclas que foram detectadas
  • Usando HAL para conseguir que as teclas que não foram detectadas também funcionem.

Nessa 1ª parte mostrarei como configurar as teclas de função que o X detecta e as funções para mostrar a bateria e de ativação/desativação do Wifi (naqueles casos em que o wifi é controlado por uma tecla Fn).

Na instalação padrão do Fedora 7, as teclas de função do Vostro 1000 não foram configuradas apropriadamente. E, deixá-las sem essa configuração seria perder uma boa parte das funcionalidades da máquina, como por exemplo, ativar/desativar o Wifi, trocar a saída do vídeo para um projetor, ejetar o CD/DVD ou usar o teclado numérico. Algumas destas combinação de teclas estavam configuradas de maneira incorreta, como o teclado numérico no meu caso e outras simplesmente não faziam nada. O primeiro passo era configurar as teclas que estavam trocadas e as que o sistema conseguia detectar.

Reconfigurando com XModmap:

O primeiro passo para configurar as teclas de função é descobrir qual os keycodes das teclas. Isto é possível através de um programa chamado xev. Quando o programa abrir uma janela, digite a combinação de tecla que você quer descobrir o keycode. O resultado será algo parecido com isto:

KeyPress event, serial 29, synthetic NO, window 0x3c00001,
root 0x45, subw 0x0, time 632791109, (429,361), root:(439,458),
state 0x0, keycode 160 (keysym 0×0, NoSymbol), same_screen YES,
XLookupString gives 0 bytes:
XmbLookupString gives 0 bytes:
XFilterEvent returns: False

KeyRelease event, serial 29, synthetic NO, window 0x3c00001,
root 0x45, subw 0x0, time 632791169, (429,361), root:(439,458),
state 0x0, keycode 160 (keysym 0×0, NoSymbol), same_screen YES,
XLookupString gives 0 bytes:
XFilterEvent returns: False

Esta é uma saída quando digitei a combinação Fn+End, que faz o mute do computador. Os negritos são grifos meus. São as informações importantes que você iremos precisar para mapear as teclas para as funções que queremos.

O keycode 160 é auto-explicativo. É o codigo das teclas mapeadas. É esse codigo que usaremos. O NoSymbol significa que nenhuma função ou valor está atribuído a combinação da tecla. É esta situação que queremos. Mas aviso que poderá haver alguma outra informação. Tenha certeza que você realmente quer mudar o valor da função atribuída.

A seguir, adicione o keycode e a função no arquivo /etc/X11/Xmodmap

[root@eva01 X11]# echo “keycode 160 = XF86AudioMute” >> /etc/X11/Xmodmap
[root@eva01 X11]#

Uma lista de funções pode ser encontrada no arquivo/usr/share/X11/XKeysymDB

Reinicie o X.

Uma maneira para testar imediatamente o novo valor da tecla é usar os seguintes comandos.

[root@eva01 X11]# xmodmap -e “keycode 174=XF86AudioLowerVolume”
[root@eva01 X11]#

E a saída imediata do xev será a seguinte:

KeyPress event, serial 30, synthetic NO, window 0x3c00001,
root 0x45, subw 0x0, time 634175258, (281,269), root:(291,366),
state 0x0, keycode 174 (keysym 0x1008ff11, XF86AudioLowerVolume), same_screen YES,
XLookupString gives 0 bytes:
XmbLookupString gives 0 bytes:
XFilterEvent returns: False

KeyRelease event, serial 30, synthetic NO, window 0x3c00001,
root 0x45, subw 0x0, time 634175384, (281,269), root:(291,366),
state 0x0, keycode 174 (keysym 0x1008ff11, XF86AudioLowerVolume), same_screen YES,
XLookupString gives 0 bytes:
XFilterEvent returns: False

Simples não? Mas espera um pouco. Há teclas que não aparecem no xev. O que faremos neste caso?

É neste momento que entramos na parte mais interessante deste artigo (Pelo menos eu achei). Iremos configurar usando o HAL(Hardware Abstraction Layer, ou, em português, Camada de abstração de hardware.

Reconfigurando usando HAL:

Bem, o propósito do artigo não é explicar o que é o HAL. Então vou me ater somente nos procedimentos para configurar as teclas de função do Vostro.

E por onde começamos a nossa investigação sobre quais são as teclas que devemos configurar, se o xev não gera seus códigos? Por exemplo, se eu digitar FnF8, como eu vou saber o código? Um bom lugar para procurar é olhando o log de messages com o comando

[root@eva01 X11]# dmesg

Procurem por algo parecido com o seguinte:

atkbd.c: Unknown key pressed (translated set 2, code 0x8b on isa0060/serio0).
atkbd.c: Use 'setkeycodes e00b <keycode>’ to make it known.

O xev não detectou a tecla, mas o sistema acusou algo. E é o código em negrito que usaremos para configurar a tecla de função com HAL.

Primeiramente, precisaremos atualizar alguns pacotes relacionados ao HAL para versões mais novas. A versão que utilizaremos é a 0.5.10.

AVISO: Esta versão é um pré-release, portanto, NÃO é uma versão estável. Saiba que sempre há riscos na utilização de softwares que não são estáveis. Portanto, muito cuidado ao utilizar essas versões.

Baixe este arquivo e salve-o no diretório /etc/yum.repos.d .

Rode o yum no modo update

[root@eva01 X11]# yum update

A seguir, o yum começará a atualizar os arquivos necessários. No meu caso, os arquivos atualizados foram:

ConsoleKit-libs i386 0.2.2-0.6.20070812git.fc7.hughsie utopia 11 k
ConsoleKit-x11 i386 0.2.2-0.6.20070812git.fc7.hughsie utopia 11 k
glx-utils i386 7.1pre-0.37.20070802git.fc7.hughsie utopia 17 k
gnome-bluetooth i386 0.9.1-1.3.20070731svn.fc7.hughsie utopia 263 k
gnome-icon-theme noarch 2.19.1-2.7.20070812svn.fc7.hughsie utopia 4.0 M
gnome-power-manager i386 2.19.7-0.59.20070812svn.fc7.hughsie utopia 3.5 M
hal-info noarch 20070618-2.57.20070812git.fc7.hughsie utopia 66 k
libdrm i386 2.3.1-1.30.20070812git.fc7.hughsie utopia 21 k
mesa-libGL i386 7.1pre-0.37.20070802git.fc7.hughsie utopia 12 M
mesa-libGLU i386 7.1pre-0.37.20070802git.fc7.hughsie utopia 187 k
xorg-x11-drv-nv i386 2.1.2-1.11.20070725git.fc7.hughsie utopia 86 k
ConsoleKit i386 0.2.2-0.6.20070812git.fc7.hughsie utopia 50 k
dbus i386 1.1.3-4.6.20070812cvs.fc7.hughsie utopia 330 k
dbus-x11 i386 1.1.3-4.6.20070812cvs.fc7.hughsie utopia 17 k
gnome-bluetooth-libs i386 0.9.1-1.3.20070731svn.fc7.hughsie utopia 48 k
hal i386 0.5.10-0.36.20070812git.fc7.hughsie utopia 460 k
hal-libs i386 0.5.10-0.36.20070812git.fc7.hughsie utopia 42 k

Feito isso, eu recomendo reiniciar o Linux, de forma que as libs atualizadas seja inicializadas corretamtente. Caso você conheça uma outra maneira de aplicar todas as modificações sem reiniciar, fique à vontade de fazê-lo (e me conte como fazer também :D ).

Após a atualização dos arquivos, teremos vários arquivos *.fdi no diretório /usr/share/hal/fdi/information/10freedesktop

[root@eva01 10freedesktop]# ll
total 340
-rw-r–r– 1 root root 587 2007-08-12 18:52 10-camera-ptp.fdi
-rw-r–r– 1 root root 1256 2007-08-12 18:52 10-cd-dvd-burner.fdi
-rw-r–r– 1 root root 942 2007-08-12 18:52 10-dell-rfkill-switch-bluetooth.fdi
-rw-r–r– 1 root root 922 2007-08-12 18:52 10-dell-rfkill-switch-wlan.fdi
-rw-r–r– 1 root root 2757 2007-08-12 18:52 10-ipw-rfkill-switch.fdi
-rw-r–r– 1 root root 2769 2007-08-12 18:52 10-laptop-panel-hardware.fdi
-rw-r–r– 1 root root 5665 2007-08-12 18:52 10-recall-battery-dell.fdi
-rw-r–r– 1 root root 1520 2007-08-12 18:52 10-recall-battery-fujitsu.fdi
-rw-r–r– 1 root root 1111 2007-08-12 18:52 10-recall-battery-gateway.fdi
-rw-r–r– 1 root root 2181 2007-08-12 18:52 10-recall-battery-ibm.fdi
-rw-r–r– 1 root root 599 2007-08-12 18:52 10-recall-battery-lenovo.fdi
-rw-r–r– 1 root root 1231 2007-08-12 18:52 10-recall-battery-toshiba.fdi
-rw-r–r– 1 root root 1287 2007-08-12 18:52 10-sony-bluetooth-switch.fdi
-rw-r–r– 1 root root 6271 2007-08-12 18:52 10-usb-card-readers.fdi
-rw-r–r– 1 root root 6146 2007-08-12 18:52 10-usbcsr-mice.fdi
-rw-r–r– 1 root root 78817 2007-08-12 18:52 10-usb-music-players.fdi
-rw-r–r– 1 root root 5046 2007-08-12 18:52 10-usb-pda.fdi
-rw-r–r– 1 root root 535 2007-08-12 18:52 10-usb-zip-drives.fdi
-rw-r–r– 1 root root 4249 2007-08-12 18:52 20-video-quirk-pm-acer.fdi
-rw-r–r– 1 root root 761 2007-08-12 18:52 20-video-quirk-pm-apple.fdi
-rw-r–r– 1 root root 2330 2007-08-12 18:52 20-video-quirk-pm-asus.fdi
-rw-r–r– 1 root root 5492 2007-08-12 18:52 20-video-quirk-pm-dell.fdi
-rw-r–r– 1 root root 1011 2007-08-12 18:52 20-video-quirk-pm-fujitsu.fdi
-rw-r–r– 1 root root 3816 2007-08-12 18:52 20-video-quirk-pm-hp.fdi
-rw-r–r– 1 root root 3892 2007-08-12 18:52 20-video-quirk-pm-ibm.fdi
-rw-r–r– 1 root root 2429 2007-08-12 18:52 20-video-quirk-pm-lenovo.fdi
-rw-r–r– 1 root root 5313 2007-08-12 18:52 20-video-quirk-pm-misc.fdi
-rw-r–r– 1 root root 755 2007-08-12 18:52 20-video-quirk-pm-sony.fdi
-rw-r–r– 1 root root 2275 2007-08-12 18:52 20-video-quirk-pm-toshiba.fdi
-rw-r–r– 1 root root 28532 2007-08-12 18:52 30-keymap-acer.fdi
-rw-r–r– 1 root root 978 2007-08-12 18:52 30-keymap-compaq.fdi
-rw-r–r– 1 root root 13404 2007-09-20 22:30 30-keymap-dell.fdi
-rw-r–r– 1 root root 2060 2007-08-12 18:52 30-keymap-hp.fdi
-rw-r–r– 1 root root 904 2007-08-12 18:52 30-keymap-lenovo.fdi
-rw-r–r– 1 root root 4752 2007-08-12 18:52 30-keymap-misc.fdi
-rw-r–r– 1 root root 2583 2007-08-12 18:52 30-keymap-module-sony-laptop.fdi
-rw-r–r– 1 root root 19772 2007-08-12 18:52 30-keymap-module-thinkpad-acpi.fdi
[root@eva01 10freedesktop]#

O arquivo que nos interessa no momento é o 30-keymap-dell.fdi. Abra-o com o seu editor preferido. Ele vai ter várias entradas como esta:

...
<match key="/org/freedesktop/Hal/devices/computer:system.hardware.product" contains="D610">
<append key="input.keymap.data" type="strlist">e007:battery</append> <!-- Fn+F3 battery icon -->
<append key="input.keymap.data" type="strlist">e00b:displaytoggle</append> <!-- Fn+F8 CRT/LCD -->
<append key="input.keymap.data" type="strlist">e006:brightnessup</append> <!-- Fn+Up arrow Brightness Up -->
<append key="input.keymap.data" type="strlist">e005:brightnessdown</append> <!-- Fn+Down arrow Brightness Down -->
<append key="input.keymap.data" type="strlist">e00a:suspend</append> <!-- Fn+F1 hibernate -->
<append key="input.keymap.data" type="strlist">e008:wlan</append> <!-- Fn+F2 Turn On/Off Wireless -->
<append key="input.keymap.data" type="strlist">e009:ejectclosecd</append> <!-- Fn+F10 Eject CD -->
<append key="info.capabilities" type="strlist">input.keymap</append>
</match>
...

Adicionaremos o seguinte código:
<match key="/org/freedesktop/Hal/devices/computer:system.hardware.product" prefix="Vostro">
<match key="/org/freedesktop/Hal/devices/computer:system.hardware.product" contains="1000">
<append key="input.keymap.data" type="strlist">e007:battery</append> <!-- Fn+F3 battery icon -->
<append key="input.keymap.data" type="strlist">e008:wlan</append> <!-- Fn+F2 Turn On/Off Wireless -->
<append key="input.keymap.data" type="strlist">e009:ejectclosecd</append> <!-- Fn+F10 Eject CD -->
<append key="input.keymap.data" type="strlist">e00b:displaytoggle</append> <!-- Fn+F8 CRT/LCD -->
<append key="info.capabilities" type="strlist">input.keymap</append>
</match>
</match>

Devemos adicionar este código dentro da tag

<match key="/org/freedesktop/Hal/devices/computer:system.hardware.vendor" prefix="Dell">

Aqui eu faço algumas considerações: Por exemplo, nesta tag,

<append key="input.keymap.data" type="strlist">e00b:displaytoggle</append> <!-- Fn+F8 CRT/LCD -->

de onde eu tiro todos esses valores malucos?

Se repararem, o código e00b é o scancode referente à tecla FnF8 e deve ser único para cada botão não-mapeado. Reparem que esse é o mesmo código que apareceu no nosso log de messages. Então, quando for fazer o mapeamento das teclas não reconhecidas, é este código que usaremos.

E de onde saiu o tal displaytoogle? Esse é na verdade o nome do keycode em lowercase, presente no arquivo /usr/include/input.h. A lista toda pode ser conferida aqui.

Feitas nossas considerações, devemos reinciar o haldaemon para que as alterações tenham efeito.

[root@eva01 10freedesktop]# service haldaemon restart
Parando o daemon HAL: [ OK ]
Iniciando daemon HAL: [ OK ]
[root@eva01 10freedesktop]#

E… Voilà. As nossa teclas de função passam a funcionar do jeito que elas já deveriam estar funcionando. :) Para confirmar que elas foram realmente detectadas, tente usar novamente o xev para verificar que elas agora estão gerando eventos. No caso, a tecla FnF10 gerou a seguinte saída:

KeyPress event, serial 29, synthetic NO, window 0x3c00001,
root 0x45, subw 0x0, time 639181620, (12,113), root:(17,186),
state 0x0, keycode 253 (keysym 0x0, NoSymbol), same_screen YES,
XLookupString gives 0 bytes:
XmbLookupString gives 0 bytes:
XFilterEvent returns: False

KeyRelease event, serial 29, synthetic NO, window 0x3c00001,
root 0x45, subw 0x0, time 639181735, (12,113), root:(17,186),
state 0x0, keycode 253 (keysym 0x0, NoSymbol), same_screen YES,
XLookupString gives 0 bytes:
XFilterEvent returns: False

Se vocês repararam, faltaram duas funções muito importantes: O Suspender e o ajuste de brilho. A configuração destes demanda um pouco mais de trabalho do que simplesmente adicionar a tecla no arquivo fdi. Mas eles serão assunto das próximas partes.

Espero que vocês tenham gostado (eu gostei um bocado) e que isso seja útil a alguém.

Até a próxima parte.

Obrigado ao Richard Hughes pelo material fantástico disponibilizado e pelos pacotes do Fedora 7.

Fontes: HAL Quirk site - http://people.freedesktop.org/~hughsient/quirk/index.html