[PATCH] mi: removed the invisible cursor and never realize this cursor.

Oliver McFadden oliver.mcfadden at nokia.com
Thu May 20 23:44:48 PDT 2010


Previously we used an "invisible" cursor, however, this would still
cause damage events and thus unnecessary redrawing. Now we never realize
the cursor when it hasn't been defined (via XDefineCursor) or has been
hidden (via XFixesHideCursor.)

Improves performance when using software cursor sprites, primarily on
devices where you do not want a visible cursor (touchscreen tablets,
embedded devices, etc.)

Signed-off-by: Oliver McFadden <oliver.mcfadden at nokia.com>
---
v2 of [PATCH] mi: removed the invisible cursor sprite; use NullCursor instead.

 xfixes/cursor.c |   46 ++++------------------------------------------
 1 files changed, 4 insertions(+), 42 deletions(-)

diff --git a/xfixes/cursor.c b/xfixes/cursor.c
index 52bdb27..a52f3a0 100644
--- a/xfixes/cursor.c
+++ b/xfixes/cursor.c
@@ -58,7 +58,6 @@ static RESTYPE		CursorClientType;
 static RESTYPE		CursorHideCountType;
 static RESTYPE		CursorWindowType;
 static CursorPtr	CursorCurrent[MAXDEVICES];
-static CursorPtr        pInvisibleCursor = NULL;
 
 static int CursorScreenPrivateKeyIndex;
 static DevPrivateKey CursorScreenPrivateKey = &CursorScreenPrivateKeyIndex;
@@ -135,7 +134,7 @@ CursorDisplayCursor (DeviceIntPtr pDev,
 		     CursorPtr pCursor)
 {
     CursorScreenPtr	cs = GetCursorScreen(pScreen);
-    Bool		ret;
+    Bool		ret = TRUE;
     DisplayCursorProcPtr backupProc;
 
     Unwrap (cs, pScreen, DisplayCursor, backupProc);
@@ -147,11 +146,9 @@ CursorDisplayCursor (DeviceIntPtr pDev,
     if (ConnectionInfo)
 	CursorVisible = EnableCursor;
 
-    if (cs->pCursorHideCounts != NULL || !CursorVisible) {
-        ret = ((*pScreen->RealizeCursor)(pDev, pScreen, pInvisibleCursor) &&
-	       (*pScreen->DisplayCursor) (pDev, pScreen, pInvisibleCursor));
-    } else {
-	ret = (*pScreen->DisplayCursor) (pDev, pScreen, pCursor);
+    if (!cs->pCursorHideCounts && CursorVisible) {
+        ret = ((*pScreen->RealizeCursor)(pDev, pScreen, pCursor) &&
+	       (*pScreen->DisplayCursor) (pDev, pScreen, pCursor));
     }
 
     if (pCursor != CursorCurrent[pDev->id])
@@ -1031,37 +1028,6 @@ CursorFreeWindow (pointer data, XID id)
     return 1;
 }
 
-static CursorPtr
-createInvisibleCursor (void)
-{
-    CursorPtr pCursor;
-    unsigned char *psrcbits, *pmaskbits;
-    CursorMetricRec cm;
-
-    psrcbits = (unsigned char *) calloc(4, 1);
-    pmaskbits = (unsigned char *) calloc(4, 1);
-    if (psrcbits == NULL || pmaskbits == NULL) {
-	return NULL;
-    }
-
-    cm.width = 1;
-    cm.height = 1;
-    cm.xhot = 0;
-    cm.yhot = 0;
-
-    if (AllocARGBCursor(psrcbits, pmaskbits,
-			NULL, &cm,
-			0, 0, 0,
-			0, 0, 0,
-			&pCursor, serverClient, (XID)0) != Success)
-	return NullCursor;
-
-    if (!AddResource(FakeClientID(0), RT_CURSOR, (pointer) pCursor))
-	return NullCursor;
-
-    return pCursor;
-}
-
 Bool
 XFixesCursorInit (void)
 {
@@ -1090,10 +1056,6 @@ XFixesCursorInit (void)
     CursorWindowType = CreateNewResourceType(CursorFreeWindow,
 					     "XFixesCursorWindow");
 
-    pInvisibleCursor = createInvisibleCursor();
-    if (pInvisibleCursor == NULL)
-	return BadAlloc;
-
     return CursorClientType && CursorHideCountType && CursorWindowType;
 }
 
-- 
1.6.1



More information about the xorg-devel mailing list