martes, 26 de agosto de 2008

Multitouch en touchpads Synaptics


En mi última entrada sobre el controlador Synaptics (Control total del driver Synaptics en GTK), os hacía un resumen con un par de ejemplos prácticos sobre cómo controlar los eventos que envia el driver y adaptarlos a nuestras necesidades. La mención a GTK venía dada porque el frontend gráfico que controla el driver en Gnome tiene algunas carencias (no controla todos los parámetros).

En los comentarios, josvazg me preguntaba si esa configuración era "multitouch".

La respuesta rápida (y correcta) es: sí, es multitouch. La respuesta completa es: si, el multitouch, pero no como tú quieres.

Es multitouch porque precisamente Synaptics frente a otros controladores (como el Sentelic del MSI Wind que mencionaba en la entrada), acepta parámetros avanzados que permiten el reconocimiento de la presión de dos o más dedos, e incluso reconocer la palma de la mano frente a un dedo, para evitar el movimiento del puntero si hemos puesto la mano encima sin querer.

Si leemos el manual del driver en XOrg/XFree86, nos dice que:

Por defecto, un touchpad Synaptics opera en modo compatible emulando un ratón estándar. Sin embargo, usando un driver dedicado, se dispone de características más avanzadas, como:
  1. Movimiento con aceleración y velocidad ajustables no lineales.
  2. Eventos de botón a través de toques cortos del touchpad.
  3. Eventos de botón dobles a través de toques cortos dobles sobre el touchpad.
  4. Arrastre a través de toques cortos y mantenimiento del dedo en el touchpad.
  5. Eventos de botón central y derecho en la esquina superior o inferior del touchpad.
  6. Scroll vertical (eventos en los botones 4 y 5) al mover el dedo en el lateral derecho del touchpad.
  7. El botón arriba/abajo envía eventos 4 y 5.
  8. Scroll horizontal (eventos en los botones 6 y 7) moviendo el dedo en la parte inferior del touchpad.
  9. Los multibotones envían eventos 4 y 5 para hacer scroll vertical y 6/7 para hacer scroll horizontal.
  10. Detección de dedos ajustable.
  11. Pulsaciones con varios dedos: dos dedos para el botón central y tres dedos para el botón derecho (necesita soporte de hardware, no todos los modelos implementan esta característica).
  12. Velocidad de movimiento dependiente de la presión.
  13. Configuración en tiempo real usando memoria compartida. Lo que significa que puedes cambiar la configuración de los parámetros sin reiniciar el servidor X.
Nótese que dependiendo del firmware del touchpad, alguna de estas características pueden estar disponibles incluso sin usar el driver synaptics. Nótese también que algunas funciones no están disponibles en todos los modelos de touchpads, porque necesitan tener soporte de hardware/firmware (por ejemplo para la presión de varios dedos).
En mi anterior entrada apenas hemos tocado un par de parámetros de todos los mencionados arriba. Mencionábamos que podíamos hacer scroll vertical y horizontal (aunque no vimos cómo), y que podíamos intercambiar los botones (4 y 5) para emular los botones central y derecho simplemente haciendo tapping (presión) con dos o tres dedos. Este último punto ya significa que tenemos multitouch. Pero hay más.

El toque con dos dedos para emular el botón derecho de un ratón lo resolvimos con el siguiente parámetro en xorg.conf:

Option "TapButton2" "3"

Para el toque con tres dedos para emular el botón central del ratón usamos el siguiente parámetro en el mismo fichero:

Option "TapButton3" "2"

Os animo a que investigueis el manual del driver (usando man synaptics) para que veais que es posible configurar cosas como la duración máxima en tiempo (en milisegundos) para detectar una pulsación (con MaxTapTime), la activación o desactivación del scroll vertical (VertEdgeScroll) u horizontal (HorizEdgeScroll), la definición de las áreas de pulsación, de scroll, el factor mínimo de aceleración (MinSpeed), el máximo (MaxSpeed), el factor global de aceleración (AccelFactor) ... y otros muchos parámetros.

Scroll con dos dedos

Por ejemplo, una de las cosas que no comenté tiene que ver también con el multitouch: el parámetro VertTwoFingerScroll permite activar o desactivar el scroll vertical utilizando dos dedos sobre cualquier parte del pad. Análogamente, HorizTwoFingerScroll hace lo mismo, pero con el scroll horizontal. Pero es que además podemos controlar la cantidad de movimiento usando los parámetros VertScrollDelta y HorizScrollDelta para los dos parámetros anteriores, respectivamente.

No puedo entrar en esta entrada en todas las posibilidades disponibles, pero de nuevo os invito a leer el manual, mi entrada anterior, y experimentar con las posibilidades que más os convengan a cada uno.

Swipe & Pinch

Lo que sí haré es terminar mencionando un artículo que cubre la parte de la pregunta de josvagz que no funciona simplemente con el driver original: "Añade suporte de gestos multitoque a un portátil equipado con touchpad", de IBM, que mediante algunos scripts de Perl y synaptics permite hacer "swipping" y "pinching" de la forma en que muestra el siguiente video:



Se que hay muchas otras cosas que se podrían hacer, pero permitidme que, al menos por ahora, y hasta que pueda jugar con ellas, lo dejemos aquí.

5 comentarios:

josvazg dijo...

Frames, gracias por la aclaración. Me he sentido famoso incluso ;-)

En resumen, entiendo que el driver a bajo nivel SI es multitouch, pero sin "gestos", o mejor dicho, no hay eventos predefinidos para "los gestos".

Supongo que el script Perl demostrado en el video toma eventos crudos (de bajo nivel) con 1 o más dedos y detecta el tipo de movimiento, luego si ve que se está haciendo un gesto, lanza un evento 'de alto nivel'.

En el enlace al articulo de IBM veo el fuente de los Perl que hacen esto.

Gracias otra vez.

josvazg dijo...

Otra duda que me surje...

¿Esto está solo disponible para los 90x y el 1000H o también el 701 lo puede hacer?

(Es solo cuestión de software, o quizá el 701 no es capaz de detectar más de un dedo, aunque synaptics si pudiese)

Ivan dijo...

Yo entiendo que es puramente tema del driver, aunque la superfície del touchpad es importante... ya que no me veo haciendo virguerias en 4cm^2.

frames dijo...

josvazg, es exactamente como dices en tu primer comentario.

En cuanto a qué Eee PCs pueden usar esto, veíamos en otro comentario que las series 701 y 1000 llevan touchpad Synaptics, así que son susceptibles de aceptar estas configuraciones. El 900 y 901 llevan un Elantech, aunque parece que también funciona con el driver de Synaptics de Xorg con algunas modificaciones.

kvi dijo...

Al parecer para que funcione con los elantech a parte de tener el kernel 2.6.24-21-eeepc y añadir en el xorg.conf la opción "SHMConfig" "true" como dice el artículo hay que crear un nuevo fichero en /etc/modprobe.d/ llamado psmouse con la línea options psmouse elantech=1
De esta forma se activaría el soporte para los touchpads de los 901 y 1000(H).
Más información en:
https://answers.launchpad.net/ubuntu-eee/+question/43213

Publicar un comentario