diff options
author | Michel Dänzer <michel.daenzer@amd.com> | 2016-10-05 18:01:29 +0900 |
---|---|---|
committer | Michel Dänzer <michel@daenzer.net> | 2016-10-13 18:29:00 +0900 |
commit | 011ce3297d924e78ef0254b0451561946bd8be8d (patch) | |
tree | 5d69ea862c2c85f9bbb9468d958346401ca73843 /hw | |
parent | e3f53aa3a8dfc323c75837cd41e35b8e895d547e (diff) |
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>
Diffstat (limited to 'hw')
-rw-r--r-- | hw/xfree86/ramdac/xf86HWCurs.c | 20 |
1 files changed, 16 insertions, 4 deletions
diff --git a/hw/xfree86/ramdac/xf86HWCurs.c b/hw/xfree86/ramdac/xf86HWCurs.c index e8966ed35..c45590229 100644 --- a/hw/xfree86/ramdac/xf86HWCurs.c +++ b/hw/xfree86/ramdac/xf86HWCurs.c @@ -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 */ |