Cambiando teclas en Wayland
Teclado nuevo
Hace una semana me llegó una computadora de escritorio nueva que me compré para trabajar, pero como venía laburando hace muchos años (20?) con notebooks, también me tuve que comprar un teclado. Durante algunas semanas me estuvo dando vueltas en la cabeza la idea de comprarme un teclado mecánico. Me copaba la idea de tener un teclado que hiciese "ruidito" al escribir y sumarme a todo el hype alrededor de eso. Sin embargo hubo un instante en el que pensé:
¿Y si llega un momento en que el ruido de las teclas mecánicas me lima la bocha y quiero tirar el teclado a la basura?
Así que decidí no ir por ese lado y comprar un teclado lo más parecido al de mi notebook posible. Lo que buscaba, entonces, era no cambiar demasiado la experiencia al tipear. Así, quería que el teclado tuviese estas características:
- Retroiluminado (no farolero)
- Teclas planitas
- Distribución español (latinomericana si fuese posible)
Claro, en este punto ya había hecho todo una investigación alrededor de los teclados mecánicos. Es más, tenía uno seleccionado para compar y todo. Así que tenía que ponerme a "investigar" nuevamente. Mientras buscaba, me acordé que hacía un tiempo Fisa había tuiteado maravillas de un teclado (Satechi W3) parecido al que buscaba.
Buscando en esa marca, encontré un modelo muy parecido al de Fisa pero sin pad numérico, lo que lo hacía incluso más parecido al de mi notebook y encima en español! El Satechi X1. No tiene distribución lationamericana, pero creo que puedo vivir con eso 😜
No todo funciona bien
Una vez que me llegó la compu nueva, le conecté el teclado recién comprado, un mouse y le instalé Kubuntu 24.10. Todo andaba genial! La compu nueva es un avión y encima Plasma 6 está mejor que nunca.... hasta que encontré un problema! Había un par de teclas en el teclado intercambiadas! Cuando apretaba la tecla º
me mostraba <
y viceversa.
Era como si el que conectó los cablecitos cuando armaba el teclado se hubiese equivocado. Salvo que es una placa impresa y no tiene cables que conectar. Al principio pensé que era una mala configuración de distribución del teclado en KDE, pero por desgracia no era eso.
Atrás de mi escritorio tengo una vieja iMac G3 con teclado en castellano. ¿Pasaría lo mismo si conectase ese teclado a la nueva compu?
La respuesta es No. El viejo teclado de la iMac G3 funcionaba perfecto... es decir cada tecla hace exactamente lo que promete.
¿Como cuernos arreglo esto?
Escribí un tweet post en BlueSky contando esto, y Facundo me respondió con un post en su blog donde explica como funciona el teclado en Linux y como solucionó un problema parecido. El post está buenísimo, vayan a leerlo!
Sin embargo a pesar de que ambos usamos KDE sobre Ubuntu la solución que él implementa a mi no me sirve.
Paraaaaaá!! Quién sos?!! Tan especial sos que una solución perfectamente documentada no te sirve???
Bueno, sí, como servir me sirve. Aprendí muchísimo de como funciona el teclado en Linux. Lo que pasa es que estoy usando Wayland y no X11.
¿Me querés decir por qué cuernos usas Wayland en vez del RECONTRA probado X11, Jose?
Buenos, decidí usar Wayland cuando instalé la nueva compu por dos motivos. El primero es porque parece estar lo suficientemente sólido como para darle una oportunidad. Y el segundo motivo es porque Plasma 6 tiene una feature que te permite tiling windows de manera muy fácil que en X11 no anda y que tengo ganas de usar.
Como decía, siguiendo la solución que describe Facu en su post pude arreglarlo en X11 pero en Wayland eso no funciona. (De hecho encontré una forma de arreglarlo para X11 sin modificar archivos del sistema, pero eso vendrá en otro post 😉)
La solución que encontré funciona tanto para X11 como para Wayland. Pero vos que estás leyendo esto podrías parafrasear a Pipo Gorosito y decir: "Bueno, al final mucho 'Biri biri' pero no contás como lo arreglaste!"
Bueno, bueno, ahí vamos!
Manos a la obra
Hay un comando super piola que me ayudó muchísimo a entender que pasaba con mi teclado nuevo. Ese comando es showkey
. Este comando te dice cuál es el código de la tecla que estás pulsando. Así por ejemplo al pulsar la teclas º
y <
en mi nuevo teclado veía:
$ sudo showkey el modo del teclado era ¿DESCONOCIDO? [ si lo está intentando bajo las X, podría no funcionar ya que el servidor X también está leyendo /dev/console ] press any key (program terminates 10s after last keypress)... código de tecla 28 liberada ºcódigo de tecla 86 pulsada código de tecla 86 liberada <código de tecla 41 pulsada código de tecla 41 liberada
Entonces para el Satechi X1 tengo:
-
º
-> código 86 -
<
-> código 41
Pero en el teclado de la iMac G3 (que funciona bien) veía:
$ sudo showkey el modo del teclado era ¿DESCONOCIDO? [ si lo está intentando bajo las X, podría no funcionar ya que el servidor X también está leyendo /dev/console ] press any key (program terminates 10s after last keypress)... código de tecla 28 liberada ºcódigo de tecla 41 pulsada código de tecla 41 liberada <código de tecla 86 pulsada código de tecla 86 liberada
Es decir:
-
º
-> código 41 -
<
-> código 86
Ahí comprobé lo que veía al pulsar las teclas: Ambas estaban intercambiadas.
Pero claro esos son los códigos
de las teclas. ¿Cuales son los nombres de esas mismas teclas?
Para eso vamos a necesitar instalar una utilidad extra: evtest
:
$ sudo apt install evtest
Ahora si ejecutamos esa utilidad veremos:
$ sudo evtest No device specified, trying to scan all of /dev/input/event* Available devices: /dev/input/event0: Power Button /dev/input/event1: AT Translated Set 2 keyboard /dev/input/event10: Generalplus Usb Audio Device /dev/input/event11: HD-Audio Generic HDMI/DP,pcm=3 /dev/input/event12: HD-Audio Generic HDMI/DP,pcm=7 /dev/input/event13: HD-Audio Generic HDMI/DP,pcm=8 /dev/input/event14: HD-Audio Generic HDMI/DP,pcm=9 /dev/input/event15: HD-Audio Generic Mic /dev/input/event16: HD-Audio Generic Headphone /dev/input/event17: Logitech M720 Triathlon Multi-Device Mouse /dev/input/event2: Video Bus /dev/input/event8: SONiX Satechi Compact Keyboard Select the device event number [0-17]:
Eelijo 8
que es el teclado en cuestión y
Para la tecla que en el teclado tiene impreso º
pero que en pantalla muestra <
veo:
Event: time 1740947733.403546, -------------- SYN_REPORT ------------ Event: time 1740947734.449231, type 4 (EV_MSC), code 4 (MSC_SCAN), value 70064 Event: time 1740947734.449231, type 1 (EV_KEY), code 86 (KEY_102ND), value 1 Event: time 1740947734.449231, -------------- SYN_REPORT ------------ <Event: time 1740947734.519201, type 4 (EV_MSC), code 4 (MSC_SCAN), value 70064 Event: time 1740947734.519201, type 1 (EV_KEY), code 86 (KEY_102ND), value 0
y para la tecla que tiene impreso <
pero que en pantalla muestra º
veo:
Event: time 1740947763.400241, -------------- SYN_REPORT ------------ Event: time 1740947766.543270, type 4 (EV_MSC), code 4 (MSC_SCAN), value 70035 Event: time 1740947766.543270, type 1 (EV_KEY), code 41 (KEY_GRAVE), value 1 Event: time 1740947766.543270, -------------- SYN_REPORT ------------ ºEvent: time 1740947766.588388, type 4 (EV_MSC), code 4 (MSC_SCAN), value 70035 Event: time 1740947766.588388, type 1 (EV_KEY), code 41 (KEY_GRAVE), value 0
Con esta utilidad volvemos a comprobar los códigos de cada tecla, pero también sus nombres (name
) y el valor (value
).
Así cada tecla tiene
- Tecla impresa
º
pero que en partalla muestra<
-> código 86 -> nombreKEY_102ND
-> valor70064
- Tecla impresa
<
pero que en pantalla muestraº
-> código 41 -> nombreKEY_GRAVE
-> valor70035
Ya tenemos los nombres de las teclas a intercambiar y sus valores. Lo que quiero ahora es intercambiar esas teclas SOLO para mi teclado Satechi X1, porque si conecto un teclado que no tiene este inconveniente, quiero que siga funcionando bien.
La información de los dispositivos conectados a la PC lo podemos ver en el archivo: /proc/bus/input/devices
, en mi caso veo:
cat /proc/bus/input/devices | grep -A7 -B1 Satechi I: Bus=0003 Vendor=0c45 Product=7016 Version=0111 N: Name="SONiX Satechi Compact Keyboard" P: Phys=usb-0000:c5:00.3-1.2/input0 S: Sysfs=/devices/pci0000:00/0000:00:08.1/0000:c5:00.3/usb1/1-1/1-1.2/1-1.2:1.0/0003:0C45:7016.0005/input/input9 U: Uniq= H: Handlers=sysrq kbd event9 leds B: PROP=0 B: EV=120013 B: KEY=7 ff800000000007ff e0b2ffdf01cfffff fffffffffffffffe
De toda esta información lo que nos interesa es la segunda fila donde se define el nombre del dispositivo:
N: Name="SONiX Satechi Compact Keyboard"
El siguiente paso es crear un archivo que se llame por ejemplo: 99-satechi-x1.hwdb
con el siguiente contenido:
evdev:name:SONiX Satechi Compact Keyboard:* KEYBOARD_KEY_70064=grave KEYBOARD_KEY_70035=102nd
Lo que dice este archivo es que la tecla KEYBOARD_KEY_70064
(la tecla que emite el valor 70064
y en mi caso es la tecla que tiene impreso º
pero que en pantalla muestra <
) va a ser grave
(KET_GRAVE
) y que la tecla KEYBOARD_KEY_70035
(la tecla que emite el valor 70035
y que en mi caso es la tecla que tiene impreso <
pero que en paranlla muestra º
) va a ser 102nd
(KEY_102ND
). Y esos cambios solo se aplican al dispositivo: SONiX Satechi Compact Keyboard
.
Lo que queda es bien simple:
sudo cp 99-satechi-x1.hwdb /etc/udev/hwdb.d
sudo systemd-hwdb update
sudo udevadm trigger
Y voilà! Ahora la tecla º
muestra en pantalla º
y la tecla <
muestra en pantalla <
!!!