diff -Nur xorg-server-1.7.0.orig/hw/xfree86/common/xf86Xinput.c xorg-server-1.7.0/hw/xfree86/common/xf86Xinput.c --- xorg-server-1.7.0.orig/hw/xfree86/common/xf86Xinput.c 2009-09-24 07:12:00.000000000 +0200 +++ xorg-server-1.7.0/hw/xfree86/common/xf86Xinput.c 2009-10-08 11:45:50.000000000 +0200 @@ -95,6 +95,8 @@ #include "os.h" +#define RR_Rotate_All (RR_Rotate_0|RR_Rotate_90|RR_Rotate_180|RR_Rotate_270) + EventListPtr xf86Events = NULL; /** @@ -1086,4 +1088,67 @@ 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: + break; + case RR_Rotate_90: + swap_axes = 1; + invert[0] = 1; + break; + case RR_Rotate_180: + invert[0] = 1; + invert[1] = 1; + break; + case RR_Rotate_270: + swap_axes = 1; + 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 -Nur xorg-server-1.7.0.orig/hw/xfree86/modes/xf86Crtc.c xorg-server-1.7.0/hw/xfree86/modes/xf86Crtc.c --- xorg-server-1.7.0.orig/hw/xfree86/modes/xf86Crtc.c 2009-10-01 08:27:36.000000000 +0200 +++ xorg-server-1.7.0/hw/xfree86/modes/xf86Crtc.c 2009-10-08 11:28:42.000000000 +0200 @@ -391,6 +391,12 @@ if (didLock) crtc->funcs->unlock (crtc); + /* + * Rotate Touchscreen + */ + xf86InputRotationNotify(crtc->rotation); + + return ret; }