Hi,

On 06-10-16 11:45, Michel Dänzer wrote:
From: Michel Dänzer <[email protected]>

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)

Signed-off-by: Michel Dänzer <[email protected]>

v2 series looks good to me, both patches are:

Reviewed-by: Hans de Goede <[email protected]>

REgards,

Hans

---
 hw/xfree86/ramdac/xf86HWCurs.c | 20 ++++++++++++++++----
 1 file changed, 16 insertions(+), 4 deletions(-)

diff --git a/hw/xfree86/ramdac/xf86HWCurs.c b/hw/xfree86/ramdac/xf86HWCurs.c
index e8966ed..c455902 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 */

_______________________________________________
[email protected]: X.Org development
Archives: http://lists.x.org/archives/xorg-devel
Info: https://lists.x.org/mailman/listinfo/xorg-devel

Reply via email to