diff -uNr xorg-server-1.9.0.orig//hw/xfree86/common/xf86Xinput.c xorg-server-1.9.0/hw/xfree86/common/xf86Xinput.c --- xorg-server-1.9.0.orig//hw/xfree86/common/xf86Xinput.c 2010-08-13 07:53:48.000000000 +0200 +++ xorg-server-1.9.0/hw/xfree86/common/xf86Xinput.c 2010-08-28 21:31:10.000000000 +0200 @@ -106,6 +106,8 @@ #include "os.h" +#define RR_Rotate_All (RR_Rotate_0|RR_Rotate_90|RR_Rotate_180|RR_Rotate_270) + EventListPtr xf86Events = NULL; /** @@ -1359,4 +1361,73 @@ EnableDevice(dev, TRUE); } +/* Taken from evdev-properties.h. */ +#define EVDEV_PROP_SWAP_AXES "Evdev Axes Swap" +#define EVDEV_PROP_INVERT_AXES "Evdev Axis Inversion" + +/* This is a hack until we get device -> CRTC association. */ +void +xf86InputRotationNotify(Rotation rotation) +{ + DeviceIntPtr dev; + LocalDevicePtr local; + int ret; + int swap_axes = 0; + CARD8 invert[2] = { 0, 0 }; + static Atom prop_swap = 0, prop_invert = 0; + static int atom_generation = -1; + + if (atom_generation != serverGeneration) { + prop_swap = 0; + prop_invert = 0; + } + + switch (rotation & RR_Rotate_All) { + case RR_Rotate_0: + swap_axes = 1; + invert[0] = 0; + invert[1] = 0; + break; + case RR_Rotate_90: + swap_axes = 0; + invert[0] = 0; + invert[1] = 1; + break; + case RR_Rotate_180: + swap_axes = 1; + invert[0] = 0; + invert[1] = 0; + break; + case RR_Rotate_270: + swap_axes = 0; + invert[0] = 0; + invert[1] = 1; + break; + } + + if (!prop_swap) + prop_swap = MakeAtom(EVDEV_PROP_SWAP_AXES, + strlen(EVDEV_PROP_SWAP_AXES), TRUE); + if (!prop_invert) + prop_invert = MakeAtom(EVDEV_PROP_INVERT_AXES, + strlen(EVDEV_PROP_INVERT_AXES), TRUE); + + for (dev = inputInfo.devices; dev; dev = dev->next) { + local = dev->public.devicePrivate; + ret = XIChangeDeviceProperty(dev, prop_swap, XA_INTEGER, 8, + PropModeReplace, 1, &swap_axes, FALSE); + if (ret != Success) { + xf86Msg(X_ERROR, "Changing swap_xy property failed!\n"); + continue; + } + ret = XIChangeDeviceProperty(dev, prop_invert, XA_INTEGER, 8, + PropModeReplace, 2, invert, FALSE); + if (ret != Success) { + xf86Msg(X_ERROR, "Changing invert property failed!\n"); + continue; + } + } +} + + /* end of xf86Xinput.c */ diff -uNr xorg-server-1.9.0.orig//hw/xfree86/modes/xf86Crtc.c xorg-server-1.9.0/hw/xfree86/modes/xf86Crtc.c --- xorg-server-1.9.0.orig//hw/xfree86/modes/xf86Crtc.c 2010-07-20 05:24:12.000000000 +0200 +++ xorg-server-1.9.0/hw/xfree86/modes/xf86Crtc.c 2010-08-28 21:28:48.000000000 +0200 @@ -387,6 +387,12 @@ if (didLock) crtc->funcs->unlock (crtc); + /* + * Rotate Touchscreen + */ + xf86InputRotationNotify(crtc->rotation); + + return ret; }