diff --git a/dix/events.c b/dix/events.c index e6a3fbff8..da57aa093 100644 --- a/dix/events.c +++ b/dix/events.c @@ -3139,8 +3139,8 @@ ProcWarpPointer(ClientPtr client) WindowPtr dest = NULL; int x, y, rc; ScreenPtr newScreen; - DeviceIntPtr dev = PickPointer(client); - SpritePtr pSprite = dev->spriteInfo->sprite; + DeviceIntPtr dev; + SpritePtr pSprite; REQUEST(xWarpPointerReq); REQUEST_SIZE_MATCH(xWarpPointerReq); @@ -3153,6 +3153,12 @@ ProcWarpPointer(ClientPtr client) return rc; } } + + dev = PickPointer(client); + if (dev->u.lastSlave) + dev = dev->u.lastSlave; + pSprite = dev->spriteInfo->sprite; + #ifdef PANORAMIX if(!noPanoramiXExtension) return XineramaWarpPointer(client); @@ -3219,13 +3225,12 @@ ProcWarpPointer(ClientPtr client) else if (y >= pSprite->physLimits.y2) y = pSprite->physLimits.y2 - 1; if (pSprite->hotShape) - ConfineToShape(PickPointer(client), pSprite->hotShape, &x, &y); - (*newScreen->SetCursorPosition)(PickPointer(client), newScreen, x, y, - TRUE); + ConfineToShape(dev, pSprite->hotShape, &x, &y); + (*newScreen->SetCursorPosition)(dev, newScreen, x, y, TRUE); } - else if (!PointerConfinedToScreen(PickPointer(client))) + else if (!PointerConfinedToScreen(dev)) { - NewCurrentScreen(PickPointer(client), newScreen, x, y); + NewCurrentScreen(dev, newScreen, x, y); } return Success; } diff --git a/dix/getevents.c b/dix/getevents.c index acc8a4f69..672ff7df2 100644 --- a/dix/getevents.c +++ b/dix/getevents.c @@ -999,8 +999,20 @@ GetPointerEvents(EventList *events, DeviceIntPtr pDev, int type, int buttons, events = updateFromMaster(events, pDev, &num_events); if (flags & POINTER_ABSOLUTE) + { + if (flags & POINTER_SCREEN) /* valuators are in screen coords */ + { + + valuators[0] = rescaleValuatorAxis(valuators[0], NULL, + pDev->valuator->axes + 0, + scr->width); + valuators[1] = rescaleValuatorAxis(valuators[1], NULL, + pDev->valuator->axes + 1, + scr->height); + } + moveAbsolute(pDev, &x, &y, first_valuator, num_valuators, valuators); - else { + } else { if (flags & POINTER_ACCELERATE) accelPointer(pDev, first_valuator, num_valuators, valuators, ms); moveRelative(pDev, &x, &y, first_valuator, num_valuators, valuators); diff --git a/include/input.h b/include/input.h index 3a9bfa273..2dd29f8e9 100644 --- a/include/input.h +++ b/include/input.h @@ -62,6 +62,7 @@ SOFTWARE. #define POINTER_RELATIVE (1 << 1) #define POINTER_ABSOLUTE (1 << 2) #define POINTER_ACCELERATE (1 << 3) +#define POINTER_SCREEN (1 << 4) /* Data in screen coordinates */ /*int constants for pointer acceleration schemes*/ #define PtrAccelNoOp 0 diff --git a/mi/mipointer.c b/mi/mipointer.c index 83a355ea3..567790c49 100644 --- a/mi/mipointer.c +++ b/mi/mipointer.c @@ -576,7 +576,7 @@ miPointerMove (DeviceIntPtr pDev, ScreenPtr pScreen, int x, int y) } } - nevents = GetPointerEvents(events, pDev, MotionNotify, 0, POINTER_ABSOLUTE, 0, 2, valuators); + nevents = GetPointerEvents(events, pDev, MotionNotify, 0, POINTER_SCREEN | POINTER_ABSOLUTE, 0, 2, valuators); OsBlockSignals(); #ifdef XQUARTZ