[PATCH] xfixes: Remove the invisible cursor sprite, using NullCursor instead.

Jamey Sharp jamey at minilop.net
Mon May 24 11:45:42 PDT 2010


Oliver McFadden reports that the invisible cursor sprite caused damage
events and thus unnecessary redrawing, so removing it improves
performance when using software cursor sprites, especially on those
devices where you do not want a visible cursor: touchscreen tablets,
embedded devices, etc.

For the xfree86 DDX, if hardware cursors are used, the driver is
required to provide a HideCursor function, which will be called instead
of trying to set a null cursor. I think software cursors are already
safe. The other DDXes also look safe.

As far as I can tell, there's no reason to realize a null cursor. I
think everything that handles null cursors doesn't rely on any setup in
RealizeCursor, and treats them as empty cursors.

Xnest assumes that if a cursor is created, it will be realized before it
is freed, which didn't happen if the invisible cursor was never used in
a server generation. So this fixes a segfault in Xnest as well.

Signed-off-by: Jamey Sharp <jamey at minilop.net>
Cc: Oliver McFadden <oliver.mcfadden at nokia.com>
---
I think this is working as intended. Oliver, those Save/Restore
function calls you're seeing, are they perhaps only at server reset, and
only after the first generation? How are you testing this?

 xfixes/cursor.c |   39 +--------------------------------------
 1 files changed, 1 insertions(+), 38 deletions(-)

diff --git a/xfixes/cursor.c b/xfixes/cursor.c
index 52bdb27..d3a207d 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;
@@ -148,8 +147,7 @@ CursorDisplayCursor (DeviceIntPtr pDev,
 	CursorVisible = EnableCursor;
 
     if (cs->pCursorHideCounts != NULL || !CursorVisible) {
-        ret = ((*pScreen->RealizeCursor)(pDev, pScreen, pInvisibleCursor) &&
-	       (*pScreen->DisplayCursor) (pDev, pScreen, pInvisibleCursor));
+	ret = (*pScreen->DisplayCursor) (pDev, pScreen, NullCursor);
     } else {
 	ret = (*pScreen->DisplayCursor) (pDev, pScreen, pCursor);
     }
@@ -1031,37 +1029,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 +1057,6 @@ XFixesCursorInit (void)
     CursorWindowType = CreateNewResourceType(CursorFreeWindow,
 					     "XFixesCursorWindow");
 
-    pInvisibleCursor = createInvisibleCursor();
-    if (pInvisibleCursor == NULL)
-	return BadAlloc;
-
     return CursorClientType && CursorHideCountType && CursorWindowType;
 }
 
-- 
1.7.0



More information about the xorg-devel mailing list