[PATCH] mi: removed the invisible cursor sprite; use NullCursor instead.

Oliver McFadden oliver.mcfadden at nokia.com
Sun May 16 22:38:55 PDT 2010


On Mon, 2010-05-17 at 06:50 +0200, Mcfadden Oliver (Nokia-D/Helsinki)
wrote:
> Previously the cursor code would be called even with a "hidden" cursor.
> This was because the X server used an invisible 1x1 cursor sprite,
> rather than a NULL cursor.
> 
> This will help performance when XDefineCursor() is never called, and
> also when the cursor is hidden via XFixesHideCursor() as there are no
> damage events generated via the MI functions.
> 
> Note that this only applies for software cursors.
> 
> Signed-off-by: Oliver McFadden <oliver.mcfadden at nokia.com>
> ---
Note the easiest way to see the improvement with this is to just define
SPRITE_DEBUG_ENABLE. I haven't found a good, reliable way (e.g.
automated test) to detect it at runtime, unfortunately.

>  mi/mipointer.c  |   16 ++++++++++++----
>  xfixes/cursor.c |   40 ++--------------------------------------
>  2 files changed, 14 insertions(+), 42 deletions(-)
> 
> diff --git a/mi/mipointer.c b/mi/mipointer.c
> index 296c57f..fb52419 100644
> --- a/mi/mipointer.c
> +++ b/mi/mipointer.c
> @@ -164,8 +164,12 @@ miPointerCloseScreen (int index, ScreenPtr pScreen)
>  static Bool
>  miPointerRealizeCursor (DeviceIntPtr pDev, ScreenPtr pScreen, CursorPtr pCursor)
>  {
> -    SetupScreen(pScreen);
> -    return (*pScreenPriv->spriteFuncs->RealizeCursor) (pDev, pScreen, pCursor);
> +    if (pCursor)
> +    {
> +	SetupScreen(pScreen);
> +	return (*pScreenPriv->spriteFuncs->RealizeCursor) (pDev, pScreen, pCursor);
> +    }
> +    return TRUE;
>  }
>  
>  static Bool
> @@ -173,8 +177,12 @@ miPointerUnrealizeCursor (DeviceIntPtr  pDev,
>                            ScreenPtr     pScreen,
>                            CursorPtr     pCursor)
>  {
> -    SetupScreen(pScreen);
> -    return (*pScreenPriv->spriteFuncs->UnrealizeCursor) (pDev, pScreen, pCursor);
> +    if (pCursor)
> +    {
> +	SetupScreen(pScreen);
> +	return (*pScreenPriv->spriteFuncs->UnrealizeCursor) (pDev, pScreen, pCursor);
> +    }
> +    return TRUE;
>  }
>  
>  static Bool
> diff --git a/xfixes/cursor.c b/xfixes/cursor.c
> index d5f8b29..083e54f 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;
> @@ -151,8 +150,8 @@ CursorDisplayCursor (DeviceIntPtr pDev,
>  	CursorVisible = EnableCursor;
>  
>      if (cs->pCursorHideCounts != NULL || !CursorVisible) {
> -        ret = ((*pScreen->RealizeCursor)(pDev, pScreen, pInvisibleCursor) &&
> -	       (*pScreen->DisplayCursor) (pDev, pScreen, pInvisibleCursor));
> +        ret = ((*pScreen->RealizeCursor)(pDev, pScreen, NullCursor) &&
> +	       (*pScreen->DisplayCursor) (pDev, pScreen, NullCursor));
>      } else {
>  	ret = (*pScreen->DisplayCursor) (pDev, pScreen, pCursor);
>      }
> @@ -1036,37 +1035,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)
>  {
> @@ -1095,10 +1063,6 @@ XFixesCursorInit (void)
>      CursorWindowType = CreateNewResourceType(CursorFreeWindow,
>  					     "XFixesCursorWindow");
>  
> -    pInvisibleCursor = createInvisibleCursor();
> -    if (pInvisibleCursor == NULL)
> -	return BadAlloc;
> -
>      return CursorClientType && CursorHideCountType && CursorWindowType;
>  }
>  




More information about the xorg-devel mailing list