diff -ur xf86-input-evdev-2.0.99.1.orig/src/evdev.c xf86-input-evdev-2.0.99.1/src/evdev.c --- xf86-input-evdev-2.0.99.1.orig/src/evdev.c 2008-10-21 16:20:58.000000000 +0000 +++ xf86-input-evdev-2.0.99.1/src/evdev.c 2008-10-21 16:12:37.000000000 +0000 @@ -221,13 +221,14 @@ { struct input_event ev; int len, value; - int dx, dy; + int dx, dy, tmp; unsigned int abs; unsigned int button; EvdevPtr pEvdev = pInfo->private; dx = 0; dy = 0; + tmp = 0; abs = 0; while (xf86WaitForInput (pInfo->fd, 0) > 0) { @@ -363,6 +364,11 @@ } if (dx != 0 || dy != 0) { + if (pEvdev->swap_axes) { + tmp = dx; + dx = dy; + dy = tmp; + } if (pEvdev->invert_x) dx *= -1; if (pEvdev->invert_y) @@ -381,8 +387,8 @@ */ if (abs && pEvdev->tool) { int abs_x, abs_y; - abs_x = pEvdev->abs_x; - abs_y = pEvdev->abs_y; + abs_x = (pEvdev->swap_axes) ? pEvdev->abs_y : pEvdev->abs_x; + abs_y = (pEvdev->swap_axes) ? pEvdev->abs_x : pEvdev->abs_y; if (pEvdev->invert_x) abs_x = pEvdev->max_x - abs_x; if (pEvdev->invert_y) @@ -1366,6 +1372,7 @@ pEvdev->reopen_attempts = xf86SetIntOption(pInfo->options, "ReopenAttempts", 10); pEvdev->invert_x = xf86SetBoolOption(pInfo->options, "InvertX", FALSE); pEvdev->invert_y = xf86SetBoolOption(pInfo->options, "InvertY", FALSE); + pEvdev->swap_axes = xf86SetBoolOption(pInfo->options, "SwapAxes", FALSE); pEvdev->noXkb = noXkbExtension; /* parse the XKB options during kbd setup */ diff -ur xf86-input-evdev-2.0.99.1.orig/src/evdev.h xf86-input-evdev-2.0.99.1/src/evdev.h --- xf86-input-evdev-2.0.99.1.orig/src/evdev.h 2008-10-21 16:20:58.000000000 +0000 +++ xf86-input-evdev-2.0.99.1/src/evdev.h 2008-10-21 16:21:49.000000000 +0000 @@ -64,6 +64,7 @@ int flags; int tool; int buttons; /* number of buttons */ + BOOL swap_axes; BOOL invert_x; BOOL invert_y;