[PATCH 4/7] Create xfixes invisible cursor only when it is first used.
Keith Packard
keithp at keithp.com
Wed May 12 14:45:08 PDT 2010
This mostly ensures that the cursor is created after the server is up
and running with all of the DevPrivate keys initialized. However, it
will also save a tiny amount of memory on systems where the invisible
cursor is never used.
Signed-off-by: Keith Packard <keithp at keithp.com>
---
xfixes/cursor.c | 78 +++++++++++++++++++++++++++++-------------------------
1 files changed, 42 insertions(+), 36 deletions(-)
diff --git a/xfixes/cursor.c b/xfixes/cursor.c
index b7e6c7b..c39f10d 100644
--- a/xfixes/cursor.c
+++ b/xfixes/cursor.c
@@ -58,7 +58,7 @@ static RESTYPE CursorClientType;
static RESTYPE CursorHideCountType;
static RESTYPE CursorWindowType;
static CursorPtr CursorCurrent[MAXDEVICES];
-static CursorPtr pInvisibleCursor = NULL;
+static CursorPtr pInvisibleCursor;
static int CursorScreenPrivateKeyIndex;
static DevPrivateKey CursorScreenPrivateKey = &CursorScreenPrivateKeyIndex;
@@ -132,6 +132,45 @@ static Bool CursorVisible = FALSE;
Bool EnableCursor = TRUE;
+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;
+}
+
+static Bool
+haveInvisibleCursor(void)
+{
+ if (!pInvisibleCursor)
+ pInvisibleCursor = createInvisibleCursor();
+ return pInvisibleCursor != NULL;
+}
+
static Bool
CursorDisplayCursor (DeviceIntPtr pDev,
ScreenPtr pScreen,
@@ -150,7 +189,7 @@ CursorDisplayCursor (DeviceIntPtr pDev,
if (ConnectionInfo)
CursorVisible = EnableCursor;
- if (cs->pCursorHideCounts != NULL || !CursorVisible) {
+ if ((cs->pCursorHideCounts != NULL || !CursorVisible) && haveInvisibleCursor()) {
ret = ((*pScreen->RealizeCursor)(pDev, pScreen, pInvisibleCursor) &&
(*pScreen->DisplayCursor) (pDev, pScreen, pInvisibleCursor));
} else {
@@ -1036,37 +1075,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,9 +1103,7 @@ XFixesCursorInit (void)
CursorWindowType = CreateNewResourceType(CursorFreeWindow,
"XFixesCursorWindow");
- pInvisibleCursor = createInvisibleCursor();
- if (pInvisibleCursor == NULL)
- return BadAlloc;
+ pInvisibleCursor = NULL;
return CursorClientType && CursorHideCountType && CursorWindowType;
}
--
1.7.1
More information about the xorg-devel
mailing list