diff -ur xorg-server-1.10.1.901//hw/xfree86/common/xf86Xinput.c git/xorg-server-1.10.1.901//hw/xfree86/common/xf86Xinput.c --- xorg-server-1.10.1.901//hw/xfree86/common/xf86Xinput.c 2011-04-28 09:25:00.000000000 +0200 +++ git/xorg-server-1.10.1.901//hw/xfree86/common/xf86Xinput.c 2011-05-19 00:31:01.178439874 +0200 @@ -99,6 +99,8 @@ return; \ } +#define RR_Rotate_All (RR_Rotate_0|RR_Rotate_90|RR_Rotate_180|RR_Rotate_270) + EventListPtr xf86Events = NULL; static int @@ -1408,4 +1410,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] = 1; + invert[1] = 1; + break; + case RR_Rotate_270: + swap_axes = 0; + invert[0] = 1; + invert[1] = 0; + 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 -ur xorg-server-1.10.1.901//hw/xfree86/modes/xf86Crtc.c git/xorg-server-1.10.1.901//hw/xfree86/modes/xf86Crtc.c --- xorg-server-1.10.1.901//hw/xfree86/modes/xf86Crtc.c 2011-04-28 09:25:00.000000000 +0200 +++ git/xorg-server-1.10.1.901//hw/xfree86/modes/xf86Crtc.c 2011-05-19 00:23:16.244383998 +0200 @@ -389,6 +389,12 @@ if (didLock) crtc->funcs->unlock (crtc); + /* + * Rotate Touchscreen + */ + xf86InputRotationNotify(crtc->rotation); + + return ret; } diff -ur xorg-server-1.10.1.901//randr/rrscreen.c git/xorg-server-1.10.1.901//randr/rrscreen.c --- xorg-server-1.10.1.901//randr/rrscreen.c 2011-02-25 04:27:32.000000000 +0100 +++ git/xorg-server-1.10.1.901//randr/rrscreen.c 2011-05-18 23:19:39.007760004 +0200 @@ -910,11 +910,6 @@ */ width = mode->mode.width; height = mode->mode.height; - if (rotation & (RR_Rotate_90|RR_Rotate_270)) - { - width = mode->mode.height; - height = mode->mode.width; - } if (width < pScrPriv->minWidth || pScrPriv->maxWidth < width) { client->errorValue = width; @@ -926,7 +921,12 @@ free(pData); return BadValue; } - + if (rotation & (RR_Rotate_90|RR_Rotate_270)) + { + width = mode->mode.height; + height = mode->mode.width; + } + if (width != pScreen->width || height != pScreen->height) { int c;