summaryrefslogtreecommitdiff
authorLuc Verhaegen <libv@skynet.be>2009-06-29 19:03:05 (GMT)
committer Luc Verhaegen <libv@skynet.be>2009-06-29 19:03:05 (GMT)
commitc7168b6e835fdf7f2837913ed8580f1911135fdd (patch)
treedd099f4915ac21b3981966d8eddca6b616cead65
parent645a0a0a6e5e57a4bb77c3b9c7d20b58d4c9ec28 (diff)
Cursor: fix logic error in cursor visibility checking.master
Cursor->(X,Y) were always null and never set until Crtc->(X,Y) were within CURSOR_MAX_(WIDTH,HEIGHT) boundaries. This only affected xf86Cursor code.
-rw-r--r--src/rhd_cursor.c33
1 files changed, 14 insertions, 19 deletions
diff --git a/src/rhd_cursor.c b/src/rhd_cursor.c
index 5c092fc..af5c2ef 100644
--- a/src/rhd_cursor.c
+++ b/src/rhd_cursor.c
@@ -225,24 +225,23 @@ convertBitsToARGB(struct rhd_Cursor_Bits *bits, CARD32 *dest,
* Returns if CRTC has a visible cursor
*/
static Bool
-hasVisibleCursor(struct rhdCrtc *Crtc)
+hasVisibleCursor(struct rhdCrtc *Crtc, int X, int Y)
{
- struct rhdCursor *Cursor = Crtc->Cursor;
- if (Cursor->X >= Crtc->X - MAX_CURSOR_WIDTH &&
- Cursor->X < Crtc->X + Crtc->Width &&
- Cursor->Y >= Crtc->Y - MAX_CURSOR_HEIGHT &&
- Cursor->Y < Crtc->Y + Crtc->Height) {
+ if (((X + MAX_CURSOR_WIDTH) < Crtc->X) &&
+ ((Y + MAX_CURSOR_HEIGHT) < Crtc->Y))
+ return FALSE;
- return TRUE;
- } else
+ if ((X >= (Crtc->X + Crtc->Width)) &&
+ (Y >= (Crtc->Y + Crtc->Height)))
return FALSE;
+
+ return TRUE;
}
/*
* Internal Driver + Xorg Interface
*/
-
void
rhdShowCursor(ScrnInfoPtr pScrn)
{
@@ -252,11 +251,9 @@ rhdShowCursor(ScrnInfoPtr pScrn)
for (i = 0; i < 2; i++) {
struct rhdCrtc *Crtc = rhdPtr->Crtc[i];
- if (Crtc->Active && Crtc->scrnIndex == pScrn->scrnIndex
- && hasVisibleCursor(Crtc)) {
-
+ if (Crtc->Active && (Crtc->scrnIndex == pScrn->scrnIndex) &&
+ hasVisibleCursor(Crtc, Crtc->Cursor->X, Crtc->Cursor->Y))
rhdCrtcShowCursor(Crtc);
- }
}
}
@@ -344,12 +341,10 @@ rhdSetCursorPosition(ScrnInfoPtr pScrn, int x, int y)
for (i = 0; i < 2; i++) {
struct rhdCrtc *Crtc = rhdPtr->Crtc[i];
- if (Crtc->Active && Crtc->scrnIndex == pScrn->scrnIndex
- && hasVisibleCursor(Crtc)) {
-
- /* Given cursor pos is always relative to frame - make absolute */
- rhdCrtcSetCursorPosition(Crtc, x+pScrn->frameX0, y+pScrn->frameY0);
- }
+ /* Cursor here is relative to frame. */
+ if (Crtc->Active && (Crtc->scrnIndex == pScrn->scrnIndex) &&
+ hasVisibleCursor(Crtc, x + pScrn->frameX0, y + pScrn->frameY0))
+ rhdCrtcSetCursorPosition(Crtc, x + pScrn->frameX0, y + pScrn->frameY0);
}
}