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: Hans de Goede <hdegoede@redhat.com>
This commit is contained in:
parent
e3f53aa3a8
commit
011ce3297d
|
@ -179,8 +179,8 @@ xf86ScreenSetCursor(ScreenPtr pScreen, CursorPtr pCurs, int x, int y)
|
||||||
bits =
|
bits =
|
||||||
dixLookupScreenPrivate(&pCurs->devPrivates, CursorScreenKey, pScreen);
|
dixLookupScreenPrivate(&pCurs->devPrivates, CursorScreenKey, pScreen);
|
||||||
|
|
||||||
x -= infoPtr->pScrn->frameX0 + ScreenPriv->HotX;
|
x -= infoPtr->pScrn->frameX0;
|
||||||
y -= infoPtr->pScrn->frameY0 + ScreenPriv->HotY;
|
y -= infoPtr->pScrn->frameY0;
|
||||||
|
|
||||||
if (!pCurs->bits->argb || !xf86DriverHasLoadCursorARGB(infoPtr))
|
if (!pCurs->bits->argb || !xf86DriverHasLoadCursorARGB(infoPtr))
|
||||||
if (!bits) {
|
if (!bits) {
|
||||||
|
@ -211,8 +211,14 @@ xf86ScreenSetCursor(ScreenPtr pScreen, CursorPtr pCurs, int x, int y)
|
||||||
Bool
|
Bool
|
||||||
xf86SetCursor(ScreenPtr pScreen, CursorPtr pCurs, int x, int y)
|
xf86SetCursor(ScreenPtr pScreen, CursorPtr pCurs, int x, int y)
|
||||||
{
|
{
|
||||||
|
xf86CursorScreenPtr ScreenPriv =
|
||||||
|
(xf86CursorScreenPtr) dixLookupPrivate(&pScreen->devPrivates,
|
||||||
|
xf86CursorScreenKey);
|
||||||
ScreenPtr pSlave;
|
ScreenPtr pSlave;
|
||||||
|
|
||||||
|
x -= ScreenPriv->HotX;
|
||||||
|
y -= ScreenPriv->HotY;
|
||||||
|
|
||||||
if (!xf86ScreenSetCursor(pScreen, pCurs, x, y))
|
if (!xf86ScreenSetCursor(pScreen, pCurs, x, y))
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
|
@ -263,8 +269,8 @@ xf86ScreenMoveCursor(ScreenPtr pScreen, int x, int y)
|
||||||
xf86CursorScreenKey);
|
xf86CursorScreenKey);
|
||||||
xf86CursorInfoPtr infoPtr = ScreenPriv->CursorInfoPtr;
|
xf86CursorInfoPtr infoPtr = ScreenPriv->CursorInfoPtr;
|
||||||
|
|
||||||
x -= infoPtr->pScrn->frameX0 + ScreenPriv->HotX;
|
x -= infoPtr->pScrn->frameX0;
|
||||||
y -= infoPtr->pScrn->frameY0 + ScreenPriv->HotY;
|
y -= infoPtr->pScrn->frameY0;
|
||||||
|
|
||||||
(*infoPtr->SetCursorPosition) (infoPtr->pScrn, x, y);
|
(*infoPtr->SetCursorPosition) (infoPtr->pScrn, x, y);
|
||||||
}
|
}
|
||||||
|
@ -272,8 +278,14 @@ xf86ScreenMoveCursor(ScreenPtr pScreen, int x, int y)
|
||||||
void
|
void
|
||||||
xf86MoveCursor(ScreenPtr pScreen, int x, int y)
|
xf86MoveCursor(ScreenPtr pScreen, int x, int y)
|
||||||
{
|
{
|
||||||
|
xf86CursorScreenPtr ScreenPriv =
|
||||||
|
(xf86CursorScreenPtr) dixLookupPrivate(&pScreen->devPrivates,
|
||||||
|
xf86CursorScreenKey);
|
||||||
ScreenPtr pSlave;
|
ScreenPtr pSlave;
|
||||||
|
|
||||||
|
x -= ScreenPriv->HotX;
|
||||||
|
y -= ScreenPriv->HotY;
|
||||||
|
|
||||||
xf86ScreenMoveCursor(pScreen, x, y);
|
xf86ScreenMoveCursor(pScreen, x, y);
|
||||||
|
|
||||||
/* ask each slave driver to move the cursor */
|
/* ask each slave driver to move the cursor */
|
||||||
|
|
Loading…
Reference in New Issue