xorg7 + evdev: mapeado de botones del ratón

Me ha dado por volver a pasarme el doom3, al que no jugaba desde xorg-6.8, donde todo iba de maravilla. Pero en xorg-7, el driver evdev mapea los botones físicos como:

1-2-3: izquierdo, central, derecho
4-5: rueda vertical
6-7: rueda horizontal
8-9-10....: resto de botones

El problema es que el doom3 sólo reconoce los botones físicos hasta el 5, además de la rueda del ratón, así que es imposible usar los botones laterales (una chapuza que han arreglado a medias en quake4, que ya soporta 8, con lo que se puede usar al menos 1 de los dos laterales). Con el driver mouse (o el evdev de xorg-6.8, que era un hack) se podía cambiar esto sin muchos problemas, con ayuda de zaxismapping y xmodmap. Pero con xorg-7 y evdev la única manera en la que he sido capaz de hacerlo ha sido parcheando el driver evdev para cambiar la asignación física de los botones del ratón (el driver parece que ignora completamente zaxismapping, con lo que los botones físicos 4 y 5 siempre son ocupados por la rueda vertical, evitando que los laterales puedan ser usados en doom3).

¿Alguien sabe de alguna manera más "limpia" de hacer esto? Llevo peleándome con zaxismapping y xmodmap toda la mañana, hasta que me harté y recurrí a la solución bestia de cambiar el código.
Aquí otro afectado por el nuevo driver de evedev. Se configura mucho más fácil pero el no poder cambiar el orden de los botones te juega malas pasados en los juegos mal programados.

Por lo que sé, el nuevo evdev ignora adrede a ZAxisMapping y xmodmap porque supuestamente siempre los mapea bien, cosa que sabemos que no es verdad. A mi en conreto me los mapea así:
Imagen

Yo no tengo tiempo de investigar pero una mirada rápida al código al principio muestra
static int wheel_up_button = 4;
static int wheel_down_button = 5;
static int wheel_left_button = 6;
static int wheel_right_button = 7;


Tal vez jugando con esos valores consigas algo, pero seria demasiado fácil y bonito como para ser verdad :/

Si te enteras de algo avisas.

Saludozzzzzzz
Sí, te los mapea como a mí (tengo el MX510). Y no creas, arreglarlo es tan sencillo como crees. El parche que comentaba que hice para remapear los botones es bien simple:

--- ../xf86-input-evdev-1.0.0.5/src/evdev.c     2005-09-24 00:32:23.000000000 +0200
+++ ./src/evdev.c       2006-04-12 12:51:15.000000000 +0200
@@ -83,10 +83,10 @@
     int kernel24;
} EvdevRec, *EvdevPtr;

-static int wheel_up_button = 4;
-static int wheel_down_button = 5;
-static int wheel_left_button = 6;
-static int wheel_right_button = 7;
+static int wheel_up_button = 9;
+static int wheel_down_button = 10;
+static int wheel_left_button = 11;
+static int wheel_right_button = 12;

static void
PostButtonClicks(InputInfoPtr pInfo, int button, int count)
@@ -181,7 +181,7 @@
             case BTN_FORWARD:
             case BTN_BACK:
             case BTN_TASK:
-                xf86PostButtonEvent(pInfo->dev, 0, ev.code - BTN_LEFT + 5,
+                xf86PostButtonEvent(pInfo->dev, 0, ev.code - BTN_LEFT + 1,
                                     value, 0, 0);
                 break;

Simplemente muevo los asignados a las ruedas a las posiciones 9-12 y los que antes iban de 8 a 12 (BTN_SIDE, BTN_EXTRA, BTN_FORWARD, BTN_BACK y BTN_TASK) los paso a 4-8.

Pero buscaba la manera de hacerlo sin parchear. Es un coñazo mantener versiones parcheadas de los ebuilds cada vez que sale una nueva versión del paquete.

(edit)

Ah, se me olvidaba: una vez cambiada la asignación física, tienes que usar Xmodmap para que funcione la rueda (forzosamente tiene que tener mapeados los botones 4 5). Así que
pointer = 1 3 2 6 7 8 9 10 4 5 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32

Así, aunque la rueda siga teniendo los botones 4 y 5, los botones *físicos* son en realidad 9 y 10, y el doom3 lo que mira son los físicos, no los mapeados. Con lo que se pueden usar sin problemas para recargar y para el cubo de almas XD
Lo teniamos delante y no lo veiamos ;). Tan sencillo como usar la opción "ButtonMapping" en el xorg.conf.
http://forums.gentoo.org/viewtopic.php?t=455793

Espero que te sirva.

Saludozzzzzzz
Nop, ya lo había probado y no me hace ni caso. Puedo poner lo que quiera en la opción ButtonMapping, que xorg lo ignora completamente, igual que ZAxisMapping. Con evdev lo único que me ha funcionado ha sido el parche.

Gracias de todos modos.
4 respuestas