Configurar aceleración del touchpad en teclado inalámbrico Logitech K400 con Ubuntu 16.04 automáticamente al conectarlo

febrero 20, 2018 , 0 Comments

Mi laptop del trabajo es una Dell XPS 13 con Ubuntu 16.04. Sé que el sistema está un poco desactualizado pero es el último LTS de Ubuntu hasta ahora, y estoy vago para tomarme el tiempo de instalarle Debian. Por el momento me conformo con Ubuntu, más allá de algún que otro detalle.

Recientemente empecé a usar un teclado inalámbrico que tenía desde hace un tiempo: Logitech K400. Éste incluye también un Touchpad, por lo que es bastante portátil contando con ambas funcionalidades en un dispositivo relativamente chico. En el trabajo lo uso con la laptop conectada a un monitor grande. El problema con el que me encontré fue que la aceleración del touchpad era bastante lenta. Ésto se nota más que nada conectado a dicho monitor. Por algún bug de Ubuntu o detección de hardware, no aparece la configuración para cambiar la velocidad de movimiento del touchpad en las preferencias de Mouse & Touchpad del sistema. Entre varias cosas que leí, encontré que aparentemente éste touchpad se detecta como un mouse, por eso la configuración de aceleración del touchpad de la configuración visual afecta al touchpad de la laptop, pero no el Logitech.

Teclado Logitech k400

Como siempre, me embarqué en una aventura de aprendizaje para mejorar la experiencia de usuario con Linux. Probablemente esto sea más fácil con un Ubuntu más nuevo u otra distro, pero ahí vamos… Lo primero que usamos es xinput para cambiar las propiedades del dispositivo que conectamos.

Al ejecutarlo, vemos los dispositivos y podemos identificar cuál es el que quiero cambiar. En este caso Logitech K400, con un id=15. Para estar seguros podemos desconectarlo y volver a ejecutar xinput y comprobar que es el id en cuestión:

fernando ~ $ xinput
⎡ Virtual core pointer id=2 [master pointer (3)]
⎜ ↳ Virtual core XTEST pointer id=4 [slave pointer (2)]
⎜ ↳ DLL075B:01 06CB:76AF Touchpad id=11 [slave pointer (2)]
⎜ ↳ Logitech K400 id=15 [slave pointer (2)]
⎣ Virtual core keyboard id=3 [master keyboard (2)]
↳ Virtual core XTEST keyboard id=5 [slave keyboard (3)]
↳ Power Button id=6 [slave keyboard (3)]
↳ Video Bus id=7 [slave keyboard (3)]
↳ Power Button id=8 [slave keyboard (3)]
↳ Sleep Button id=9 [slave keyboard (3)]
↳ Integrated_Webcam_HD id=10 [slave keyboard (3)]
↳ Intel Virtual Button driver id=12 [slave keyboard (3)]
↳ Intel HID events id=13 [slave keyboard (3)]
↳ AT Translated Set 2 keyboard id=14 [slave keyboard (3)]
↳ Dell WMI hotkeys id=16 [slave keyboard (3)]
↳ Logitech K400 id=17 [slave keyboard (3)]
 
Ahora, con –list-props, vemos las propiedades:
 
$ xinput –list-props
Usage: xinput list-props [ …]$ xinput list-props 15
Device ‘Logitech K400’:
Device Enabled (140): 1
Coordinate Transformation Matrix (142): 1.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 1.000000
libinput Accel Speed (282): -0.961165
libinput Accel Speed Default (283): 0.000000
libinput Accel Profiles Available (416): 1, 1
libinput Accel Profile Enabled (417): 1, 0
libinput Accel Profile Enabled Default (418): 1, 0
libinput Natural Scrolling Enabled (284): 0
libinput Natural Scrolling Enabled Default (285): 0
libinput Send Events Modes Available (260): 1, 0
libinput Send Events Mode Enabled (261): 0, 0
libinput Send Events Mode Enabled Default (262): 0, 0
libinput Left Handed Enabled (286): 0
libinput Left Handed Enabled Default (287): 0
libinput Scroll Methods Available (288): 0, 0, 1
libinput Scroll Method Enabled (289): 0, 0, 0
libinput Scroll Method Enabled Default (290): 0, 0, 0
libinput Button Scrolling Button (419): 2
libinput Button Scrolling Button Default (420): 274
libinput Middle Emulation Enabled (294): 0
libinput Middle Emulation Enabled Default (295): 0
Device Node (263): “/dev/input/event6”
Device Product ID (264): 1133, 16420
libinput Drag Lock Buttons (298):
libinput Horizonal Scroll Enabled (265): 1

La que queremos cambiar es “Accel Speed”, propiedad 282 con un valor negativo. Para cambiarla, usamos –set-prop (por más información man xinput).
<div class=’codigo’>$ xinput –set-prop 15 282 0.9</div>

Ingresamos el id del dispositivo, la propiedad y el valor que le queremos asignar. Empecé con 0.5, y fui subiendo hasta que al final lo dejé en 1.0 que me quedaba bastante cómodo. Hasta acá venimos bien, con la satisfaccion de haber encontrado fácilmente cómo cambiar la aceleración hasta encontrar una que nos sirve. Fui tan perezoso que por un tiempo metí esa línea de xinput en uno de mis scripts, y lo ejecutaba cada vez que conectaba el teclado. Esa misma pereza y un pequeño detalle adicional, me llevaron a querer automatizar más este proceso. Ya de paso aprendí alguna cosa en el camino.

En primer lugar es importante notar que el id del dispositivo (15 en el código de arriba) no siempre es el mismo. Varía según los puertos USB y si están ocupados. Y al variar el ID, también varía el valor numérico de la propiedad Accel Speed. Así que también hay que meter eso en scripts.

Lo primero es obtener el ID, y como me encanta usar expresiones regulares y las herramientas de procesamiento de texto de Unix, por ahí fui:

ID=`xinput | awk '/Logitech K400/{print $5; exit}' | sed 's/id=//'`

Con esto, procesamos la salida de xinput, la pasamos por un awk que imprime la primera línea donde aparece “Logitech K400” (porque aparece una segunda vez como teclado), y nos quedamos con el valor numérico del id en la variable ID. Seguimos con:

PROP=`xinput --list-props $ID | grep -o -P "Accel Speed \(\K[0-9]*"`

Acá listamos las propiedades del dispositivo cuyo ID guardamos en la línea anterior, y con grep sacamos el valor numérico de la propiedad Accel Speed. Por último, ejecutamos el seteo de la propiedad con las variables dinámicas y la seteamos en 1.0 que fue el valor que encontré cómodo:

xinput --set-prop $ID $PROP 1.0

Todo esto lo metemos en un script, le damos permisos de ejecución y lo dejamos guardado. En principio continuaba ejecutándolo manualmente cada vez que conectaba el teclado.

Pero hay un nivel más de perfeccionamiento, que el script se ejecute automáticamente al conectar el teclado. Para eso me puse a investigar hasta que encontré que es relativamente sencillo creando nuevas reglas udev. En el directorio /etc/udev/rules.dencontramos archivos del manejo dinámico de dispositivos. Les sugiero dar una leída a man udev para ver más. Pero básicamente podemos crear un archivo en ese directorio -entre otros- que agregue manejo dinámico cuando conectamos un dispositivo USB.

Los archivos creados ahí deben tener un nombre precedido por dos números y un guión y la extensión rules. En mi caso creé /etc/udev/rules.d/85-logitech-keyboard.rules, que se ve así:

ACTION==”add”, SUBSYSTEM==”usb”, ATTRS{idVendor}==”046d”, ATTRS{idProduct}==”c52b”, RUN+=”/usr/local/bin/logitech-keyboard”

De nuevo, acá es recomendable leer el manual de udev, pero cada parte tiene su explicación:

  • ACTION – el nombre de una acción de evento. En este caso “add”, cuando se agrega el teclado
  • SUBSYSTEM – subsistema del dispositivo del evento, en este caso usb
  • ATTRS = atributos del evento, donde reviso que el idVendor y el idProduct coincidan con los del teclado. Para obtener estos valores, ejecuté lsusb y copié los valores del teclado:
    Bus 001 Device 043: ID 046d:c52b Logitech, Inc. Unifying Receiver

    Como ven, los ID separados por : son el id del fabricante y del producto respectivamente.

  • RUN – Le digo que agregue un ejecutable al evento, en este caso el script que había escrito más arriba.

Para ir probando que el script está siendo ejecutado, podemos usar algo como agregar texto a un archivo e ir mirándolo con tail -f archivo.txt cuando conectamos y desconectamos el usb. También es útil mirar el log del sistema con tail -f /var/log/syslog que nos puede avisar si hay algún error.

Conclusión, dejé andando este script que aumenta la aceleración del touchpad de este teclado automáticamente al conectarlo. Seguramente no sea necesario si actualizo a una versión más actual de Ubuntu o paso a Debian eventualmente. Pero el conocimiento adquirido puede ser útil en un futuro, tanto por problemas con el hardware, como para agregar comportamientos automáticos durante la conexión de dispositivos. Lo dejo como referencia y ojalá a alguien más le sirva.


Some say he’s half man half fish, others say he’s more of a seventy/thirty split. Either way he’s a fishy bastard.