Commit 011ce329 authored by Michel Dänzer's avatar Michel Dänzer Committed by Michel Dänzer

xf86Cursor: Use PRIME master xf86CursorScreenRec::HotX/Y for slaves

xf86CursorScreenRec::HotX/Y contain 0 for PRIME slave screens.

Fixes incorrect HW cursor position on PRIME slave screens.

Also hoist the hotspot translation out from xf86ScreenSet/MoveCursor to
xf86Set/MoveCursor, since the hotspot position is a property of the
cursor, not the screen.

v2:
* Squash patches 1 & 2 of the v1 series, since it's basically the same
  problem
* Use the master screen's xf86CursorScreenRec::HotX/Y instead of
  CursorRec::bits->x/yhot, since CursorRec::bits can be NULL (Hans de
  Goede)
Reviewed-by: default avatarHans de Goede <hdegoede@redhat.com>
parent e3f53aa3
......@@ -179,8 +179,8 @@ xf86ScreenSetCursor(ScreenPtr pScreen, CursorPtr pCurs, int x, int y)
bits =
dixLookupScreenPrivate(&pCurs->devPrivates, CursorScreenKey, pScreen);
x -= infoPtr->pScrn->frameX0 + ScreenPriv->HotX;
y -= infoPtr->pScrn->frameY0 + ScreenPriv->HotY;
x -= infoPtr->pScrn->frameX0;
y -= infoPtr->pScrn->frameY0;
if (!pCurs->bits->argb || !xf86DriverHasLoadCursorARGB(infoPtr))
if (!bits) {
......@@ -211,8 +211,14 @@ xf86ScreenSetCursor(ScreenPtr pScreen, CursorPtr pCurs, int x, int y)
Bool
xf86SetCursor(ScreenPtr pScreen, CursorPtr pCurs, int x, int y)
{
xf86CursorScreenPtr ScreenPriv =
(xf86CursorScreenPtr) dixLookupPrivate(&pScreen->devPrivates,
xf86CursorScreenKey);
ScreenPtr pSlave;
x -= ScreenPriv->HotX;
y -= ScreenPriv->HotY;
if (!xf86ScreenSetCursor(pScreen, pCurs, x, y))
return FALSE;
......@@ -263,8 +269,8 @@ xf86ScreenMoveCursor(ScreenPtr pScreen, int x, int y)
xf86CursorScreenKey);
xf86CursorInfoPtr infoPtr = ScreenPriv->CursorInfoPtr;
x -= infoPtr->pScrn->frameX0 + ScreenPriv->HotX;
y -= infoPtr->pScrn->frameY0 + ScreenPriv->HotY;
x -= infoPtr->pScrn->frameX0;
y -= infoPtr->pScrn->frameY0;
(*infoPtr->SetCursorPosition) (infoPtr->pScrn, x, y);
}
......@@ -272,8 +278,14 @@ xf86ScreenMoveCursor(ScreenPtr pScreen, int x, int y)
void
xf86MoveCursor(ScreenPtr pScreen, int x, int y)
{
xf86CursorScreenPtr ScreenPriv =
(xf86CursorScreenPtr) dixLookupPrivate(&pScreen->devPrivates,
xf86CursorScreenKey);
ScreenPtr pSlave;
x -= ScreenPriv->HotX;
y -= ScreenPriv->HotY;
xf86ScreenMoveCursor(pScreen, x, y);
/* ask each slave driver to move the cursor */
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment