commit 3ed7168842ec7bdab65e99f704086bd6bb861ec3 Author: Pierre Willenbrock Date: Fri Jan 9 19:00:00 2009 +0100 Missing bits for dix: fix WarpPointer calls for devices with custom valuator ranges (#19297) diff --git a/dix/getevents.c b/dix/getevents.c index 96cf2f5..000d5f7 100644 --- a/dix/getevents.c +++ b/dix/getevents.c @@ -583,7 +583,8 @@ updateFromMaster(EventListPtr events, DeviceIntPtr dev, int *num_events) */ static void moveAbsolute(DeviceIntPtr dev, int *x, int *y, - int first, int num, int *valuators) + int first, int num, int *valuators, + BOOL screen) { int i; @@ -591,22 +592,25 @@ moveAbsolute(DeviceIntPtr dev, int *x, int *y, if (num >= 1 && first == 0) *x = *(valuators + 0); else - *x = dev->last.valuators[0]; + *x = (screen && dev->u.master)?dev->u.master->last.valuators[0]:dev->last.valuators[0]; if (first <= 1 && num >= (2 - first)) *y = *(valuators + 1 - first); else - *y = dev->last.valuators[1]; - - clipAxis(dev, 0, x); - clipAxis(dev, 1, y); - - i = (first > 2) ? 0 : 2; - for (; i < num; i++) - { - dev->last.valuators[i + first] = valuators[i]; - clipAxis(dev, i, &dev->last.valuators[i + first]); + *y = (screen && dev->u.master)?dev->u.master->last.valuators[1]:dev->last.valuators[1]; + + if (!screen) { + clipAxis(dev, 0, x); + clipAxis(dev, 1, y); + + i = (first > 2) ? 0 : 2; + for (; i < num; i++) + { + dev->last.valuators[i + first] = valuators[i]; + clipAxis(dev, i, &dev->last.valuators[i + first]); + } } + } /** @@ -998,16 +1002,22 @@ GetPointerEvents(EventList *events, DeviceIntPtr pDev, int type, int buttons, events = updateFromMaster(events, pDev, &num_events); if (flags & POINTER_ABSOLUTE) - moveAbsolute(pDev, &x, &y, first_valuator, num_valuators, valuators); + moveAbsolute(pDev, &x, &y, first_valuator, num_valuators, valuators, + flags & POINTER_SCREEN); else { if (flags & POINTER_ACCELERATE) accelPointer(pDev, first_valuator, num_valuators, valuators, ms); moveRelative(pDev, &x, &y, first_valuator, num_valuators, valuators); } - + /* if !flags & POINTER_SCREEN, x,y are in device coordinates */ positionSprite(pDev, &x, &y, scr, &cx, &cy, flags & POINTER_SCREEN); updateHistory(pDev, first_valuator, num_valuators, ms); + x = (flags & POINTER_SCREEN)? + rescaleValuatorAxis(x, NULL, pDev->valuator->axes + 0, scr->width):x; + y = (flags & POINTER_SCREEN)? + rescaleValuatorAxis(y, NULL, pDev->valuator->axes + 1, scr->height):y; + /* dropy x/y (device coordinates) back into valuators for next event */ pDev->last.valuators[0] = x; pDev->last.valuators[1] = y;