--- evdev.c.orig 2008-10-21 00:14:58.000000000 +0000 +++ evdev.c 2008-10-21 01:20:40.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) { @@ -367,6 +368,10 @@ dx *= -1; if (pEvdev->invert_y) dy *= -1; + if (pEvdev->swap_axes) + tmp = dx; + dx = dy; + dy = tmp; xf86PostMotionEvent(pInfo->dev, FALSE, 0, 2, dx, dy); } @@ -380,13 +385,17 @@ * just works. */ if (abs && pEvdev->tool) { - int abs_x, abs_y; + int abs_x, abs_y, abs_tmp; abs_x = pEvdev->abs_x; abs_y = pEvdev->abs_y; if (pEvdev->invert_x) abs_x = pEvdev->max_x - abs_x; if (pEvdev->invert_y) abs_y = pEvdev->max_y - abs_y; + if (pEvdev->swap_axes) + abs_tmp = abs_x; + abs_x = pEvdev->max_y - abs_y; + abs_y = pEvdev->max_x - abs_tmp; xf86PostMotionEvent(pInfo->dev, TRUE, 0, 2, abs_x, abs_y); } @@ -1366,6 +1375,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 */