[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