[PATCH-RESEND] dix: move cursor realize code to its own function

Tiago Vignatti tiago.vignatti at nokia.com
Thu Jan 14 07:18:41 PST 2010


The semantic remains, only code was moved: reuse chunk of code to realize
cursor on both AllocARGBCursor and AllocGlyphCursor.

(sh*t, git-diff got cracked and is confusing!)

Signed-off-by: Tiago Vignatti <tiago.vignatti at nokia.com>
---
 dix/cursor.c |  201 +++++++++++++++++++++++----------------------------------
 1 files changed, 81 insertions(+), 120 deletions(-)

diff --git a/dix/cursor.c b/dix/cursor.c
index 6103b15..4b9a418 100644
--- a/dix/cursor.c
+++ b/dix/cursor.c
@@ -159,6 +159,62 @@ CheckForEmptyMask(CursorBitsPtr bits)
     bits->emptyMask = TRUE;
 }
 
+static int
+RealizeCursorAllScreens(CursorPtr pCurs)
+{
+    DeviceIntPtr pDev;
+    ScreenPtr   pscr;
+    int nscr;
+
+    /*
+     * realize the cursor for every screen
+     * Do not change the refcnt, this will be changed when ChangeToCursor
+     * actually changes the sprite.
+     */
+    for (nscr = 0; nscr < screenInfo.numScreens; nscr++)
+    {
+        pscr = screenInfo.screens[nscr];
+        for (pDev = inputInfo.devices; pDev; pDev = pDev->next)
+        {
+            if (DevHasCursor(pDev))
+            {
+                if (!( *pscr->RealizeCursor)(pDev, pscr, pCurs))
+                {
+                    /* Realize failed for device pDev on screen pscr.
+                     * We have to assume that for all devices before, realize
+                     * worked. We need to rollback all devices so far on the
+                     * current screen and then all devices on previous
+                     * screens.
+                     */
+                    DeviceIntPtr pDevIt = inputInfo.devices; /*dev iterator*/
+                    while(pDevIt && pDevIt != pDev)
+                    {
+                        if (DevHasCursor(pDevIt))
+                            ( *pscr->UnrealizeCursor)(pDevIt, pscr, pCurs);
+                        pDevIt = pDevIt->next;
+                    }
+                    while (--nscr >= 0)
+                    {
+                        pscr = screenInfo.screens[nscr];
+                        /* now unrealize all devices on previous screens */
+                        pDevIt = inputInfo.devices;
+                        while (pDevIt)
+                        {
+                            if (DevHasCursor(pDevIt))
+                                ( *pscr->UnrealizeCursor)(pDevIt, pscr, pCurs);
+                            pDevIt = pDevIt->next;
+                        }
+                        ( *pscr->UnrealizeCursor)(pDev, pscr, pCurs);
+                    }
+                    return FALSE;
+                }
+            }
+        }
+    }
+
+    return TRUE;
+}
+
 /**
  * does nothing about the resource table, just creates the data structure.
  * does not copy the src and mask bits
@@ -176,9 +232,7 @@ AllocARGBCursor(unsigned char *psrcbits, unsigned char *pmaskbits,
 {
     CursorBitsPtr  bits;
     CursorPtr 	pCurs;
-    int		rc, nscr;
-    ScreenPtr 	pscr;
-    DeviceIntPtr pDev; 
+    int rc;
 
     *ppCurs = NULL;
     pCurs = (CursorPtr)xcalloc(sizeof(CursorRec) + sizeof(CursorBits), 1);
@@ -222,63 +276,20 @@ AllocARGBCursor(unsigned char *psrcbits, unsigned char *pmaskbits,
     /* security creation/labeling check */
     rc = XaceHook(XACE_RESOURCE_ACCESS, client, cid, RT_CURSOR,
 		  pCurs, RT_NONE, NULL, DixCreateAccess);
-    if (rc != Success) {
-	dixFreePrivates(pCurs->devPrivates);
-	FreeCursorBits(bits);
-	xfree(pCurs);
-	return rc;
-    }
-	
-    /*
-     * realize the cursor for every screen
-     * Do not change the refcnt, this will be changed when ChangeToCursor
-     * actually changes the sprite.
-     */
-    for (nscr = 0; nscr < screenInfo.numScreens; nscr++)
-    {
-        pscr = screenInfo.screens[nscr];
-        for (pDev = inputInfo.devices; pDev; pDev = pDev->next)
-        {
-            if (DevHasCursor(pDev))
-            {
-                if (!( *pscr->RealizeCursor)(pDev, pscr, pCurs))
-                {
-                    /* Realize failed for device pDev on screen pscr.
-                     * We have to assume that for all devices before, realize
-                     * worked. We need to rollback all devices so far on the
-                     * current screen and then all devices on previous
-                     * screens.
-                     */
-                    DeviceIntPtr pDevIt = inputInfo.devices; /*dev iterator*/
-                    while(pDevIt && pDevIt != pDev)
-                    {
-                        if (DevHasCursor(pDevIt))
-                            ( *pscr->UnrealizeCursor)(pDevIt, pscr, pCurs);
-                        pDevIt = pDevIt->next;
-                    }
-                    while (--nscr >= 0)
-                    {
-                        pscr = screenInfo.screens[nscr];
-                        /* now unrealize all devices on previous screens */
-                        pDevIt = inputInfo.devices;
-                        while (pDevIt)
-                        {
-                            if (DevHasCursor(pDevIt))
-                                ( *pscr->UnrealizeCursor)(pDevIt, pscr, pCurs);
-                            pDevIt = pDevIt->next;
-                        }
-                        ( *pscr->UnrealizeCursor)(pDev, pscr, pCurs);
-                    }
-                    dixFreePrivates(pCurs->devPrivates);
-                    FreeCursorBits(bits);
-                    xfree(pCurs);
-                    return BadAlloc;
-                }
-            }
-        }
+    if (rc != Success)
+        goto error;
+
+    if (RealizeCursorAllScreens(pCurs)) {
+        *ppCurs = pCurs;
+        return Success;
     }
-    *ppCurs = pCurs;
-    return rc;
+
+error:
+    dixFreePrivates(pCurs->devPrivates);
+    FreeCursorBits(bits);
+    xfree(pCurs);
+
+    return BadAlloc;
 }
 
 int
@@ -294,10 +305,7 @@ AllocGlyphCursor(Font source, unsigned sourceChar, Font mask, unsigned maskChar,
     int rc;
     CursorBitsPtr  bits;
     CursorPtr 	pCurs;
-    int		nscr;
-    ScreenPtr 	pscr;
     GlyphSharePtr pShare;
-    DeviceIntPtr pDev;
 
     rc = dixLookupResourceByType((pointer *)&sourcefont, source, RT_FONT, client,
 				 DixUseAccess);
@@ -444,67 +452,20 @@ AllocGlyphCursor(Font source, unsigned sourceChar, Font mask, unsigned maskChar,
     /* security creation/labeling check */
     rc = XaceHook(XACE_RESOURCE_ACCESS, client, cid, RT_CURSOR,
 		  pCurs, RT_NONE, NULL, DixCreateAccess);
-    if (rc != Success) {
-	dixFreePrivates(pCurs->devPrivates);
-	FreeCursorBits(bits);
-	xfree(pCurs);
-	return rc;
-    }
-	
-    /*
-     * realize the cursor for every screen
-     */
-    for (nscr = 0; nscr < screenInfo.numScreens; nscr++)
-    {
-        pscr = screenInfo.screens[nscr];
-
-        for (pDev = inputInfo.devices; pDev; pDev = pDev->next)
-        {
-            if (DevHasCursor(pDev))
-            {
-                if (!( *pscr->RealizeCursor)(pDev, pscr, pCurs))
-                {
-                    /* Realize failed for device pDev on screen pscr.
-                     * We have to assume that for all devices before, realize
-                     * worked. We need to rollback all devices so far on the
-                     * current screen and then all devices on previous
-                     * screens.
-                     */
-                    DeviceIntPtr pDevIt = inputInfo.devices; /*dev iterator*/
-                    while(pDevIt && pDevIt != pDev)
-                    {
-                        if (DevHasCursor(pDevIt))
-                            ( *pscr->UnrealizeCursor)(pDevIt, pscr, pCurs);
-                        pDevIt = pDevIt->next;
-                    }
+    if (rc != Success)
+        goto error;
 
-                    (*pscr->UnrealizeCursor)(inputInfo.pointer, pscr, pCurs);
+    if (RealizeCursorAllScreens(pCurs)) {
+        *ppCurs = pCurs;
+        return Success;
+    }
 
-                    while (--nscr >= 0)
-                    {
-                        pscr = screenInfo.screens[nscr];
-                        /* now unrealize all devices on previous screens */
-                        ( *pscr->UnrealizeCursor)(inputInfo.pointer, pscr, pCurs);
+error:
+    dixFreePrivates(pCurs->devPrivates);
+    FreeCursorBits(bits);
+    xfree(pCurs);
 
-                        pDevIt = inputInfo.devices;
-                        while (pDevIt)
-                        {
-                            if (DevHasCursor(pDevIt))
-                                ( *pscr->UnrealizeCursor)(pDevIt, pscr, pCurs);
-                            pDevIt = pDevIt->next;
-                        }
-                        ( *pscr->UnrealizeCursor)(pDev, pscr, pCurs);
-                    }
-                    dixFreePrivates(pCurs->devPrivates);
-                    FreeCursorBits(bits);
-                    xfree(pCurs);
-                    return BadAlloc;
-                }
-            }
-        }
-    }
-    *ppCurs = pCurs;
-    return Success;
+    return BadAlloc;
 }
 
 /** CreateRootCursor
-- 
1.6.0.4



More information about the xorg-devel mailing list