Signed-off-by: Tiago Vignatti <[email protected]>
---
 hw/xfree86/common/xf86Cursor.c        |   67 ++++++++++++++++++---------------
 hw/xfree86/common/xf86xv.c            |    3 +-
 hw/xfree86/dixmods/extmod/xf86dga2.c  |    4 +-
 hw/xfree86/os-support/bsd/arm_video.c |    5 +-
 4 files changed, 45 insertions(+), 34 deletions(-)

diff --git a/hw/xfree86/common/xf86Cursor.c b/hw/xfree86/common/xf86Cursor.c
index 6740faf..1bdcaaf 100644
--- a/hw/xfree86/common/xf86Cursor.c
+++ b/hw/xfree86/common/xf86Cursor.c
@@ -77,7 +77,7 @@ static miPointerScreenFuncRec xf86PointerScreenFuncs = {
   NULL
 };
 
-static xf86ScreenLayoutRec xf86ScreenLayout[MAXSCREENS];
+static xf86ScreenLayoutRec *xf86ScreenLayout;
 
 static Bool HardEdges;
 
@@ -572,14 +572,18 @@ FillOutEdge(xf86EdgePtr pEdge, int limit)
 }
 
 /*
- * xf86InitOrigins() can deal with a maximum of 32 screens
- * on 32 bit architectures, 64 on 64 bit architectures.
+ * xf86InitOrigins() used to use a bitmask so that it was limited to 32
+ * screens on a 32-bit architecture, and 64 screens on a 64-bit
+ * architecture.  Instead of using a bitmask, we use an array; instead
+ * of copying screensLeft to prevScreensLeft and comparing to see if
+ * anything changed, we introduce the "changed" variable.  Another way
+ * to implement this function is presented in
+ * Xserver/hw/dmx/dmxcursor.c.
  */
-
 void
 xf86InitOrigins(void)
 {
-    unsigned long screensLeft, prevScreensLeft, mask;
+    int *screensLeft = NULL;
     screenLayoutPtr screen;
     ScreenPtr pScreen;
     int x1, x2, y1, y2, left, right, top, bottom;
@@ -590,19 +594,21 @@ xf86InitOrigins(void)
     /* need to have this set up with a config file option */
     HardEdges = FALSE;
 
-    bzero(xf86ScreenLayout, MAXSCREENS * sizeof(xf86ScreenLayoutRec));
-       
-    screensLeft = prevScreensLeft = (1 << xf86NumScreens) - 1;
+    MAXSCREENSALLOC_FATAL(xf86ScreenLayout);
+    MAXSCREENSALLOC_FATAL(screensLeft);
+    for (i = 0; i < xf86NumScreens; i++)
+        screensLeft[i] = 1;
 
     while(1) {
-       for(mask = screensLeft, i = 0; mask; mask >>= 1, i++) {
-           if(!(mask & 1L)) continue;
+        int changed = 0;
+        for (i = 0; i < xf86NumScreens; i++) {
+            if (!screensLeft[i]) continue;
 
            screen = &xf86ConfigLayout.screens[i];
 
            if (screen->refscreen != NULL &&
                screen->refscreen->screennum >= xf86NumScreens) {
-               screensLeft &= ~(1 << i);
+        ++changed, screensLeft[i] = 0;
                xf86Msg(X_WARNING, "Not including screen \"%s\" in origins 
calculation.\n",
                        screen->screen->id);
                continue;
@@ -660,7 +666,7 @@ xf86InitOrigins(void)
            case PosAbsolute:
                dixScreenOrigins[i].x = screen->x;
                dixScreenOrigins[i].y = screen->y;
-               screensLeft &= ~(1 << i);
+               ++changed, screensLeft[i] = 0;
                break;
            case PosRelative:
                ref = screen->refscreen->screennum;
@@ -668,10 +674,10 @@ xf86InitOrigins(void)
                    ErrorF("Referenced uninitialized screen in Layout!\n");
                    break;
                }
-               if(screensLeft & (1 << ref)) break;
+               if(screensLeft[ref]) break;
                dixScreenOrigins[i].x = dixScreenOrigins[ref].x + screen->x;
                dixScreenOrigins[i].y = dixScreenOrigins[ref].y + screen->y;
-               screensLeft &= ~(1 << i);
+               ++changed, screensLeft[i] = 0;;
                break;
            case PosRightOf:
                ref = screen->refscreen->screennum;
@@ -679,12 +685,12 @@ xf86InitOrigins(void)
                    ErrorF("Referenced uninitialized screen in Layout!\n");
                    break;
                }
-               if(screensLeft & (1 << ref)) break;
+               if(screensLeft[ref]) break;
                pScreen = xf86Screens[ref]->pScreen;
                dixScreenOrigins[i].x = 
                        dixScreenOrigins[ref].x + pScreen->width;
                dixScreenOrigins[i].y = dixScreenOrigins[ref].y;
-               screensLeft &= ~(1 << i);
+               ++changed, screensLeft[i] = 0;
                break;
            case PosLeftOf:
                ref = screen->refscreen->screennum;
@@ -692,12 +698,12 @@ xf86InitOrigins(void)
                    ErrorF("Referenced uninitialized screen in Layout!\n");
                    break;
                }
-               if(screensLeft & (1 << ref)) break;
+               if(screensLeft[ref]) break;
                pScreen = xf86Screens[i]->pScreen;
                dixScreenOrigins[i].x = 
                        dixScreenOrigins[ref].x - pScreen->width;
                dixScreenOrigins[i].y = dixScreenOrigins[ref].y;
-               screensLeft &= ~(1 << i);
+               ++changed, screensLeft[i] = 0;
                break;
            case PosBelow:
                ref = screen->refscreen->screennum;
@@ -705,12 +711,12 @@ xf86InitOrigins(void)
                    ErrorF("Referenced uninitialized screen in Layout!\n");
                    break;
                }
-               if(screensLeft & (1 << ref)) break;
+               if(screensLeft[ref]) break;
                pScreen = xf86Screens[ref]->pScreen;
                dixScreenOrigins[i].x = dixScreenOrigins[ref].x;
                dixScreenOrigins[i].y = 
                        dixScreenOrigins[ref].y + pScreen->height;
-               screensLeft &= ~(1 << i);
+               ++changed, screensLeft[i] = 0;
                break;
            case PosAbove:
                ref = screen->refscreen->screennum;
@@ -718,12 +724,12 @@ xf86InitOrigins(void)
                    ErrorF("Referenced uninitialized screen in Layout!\n");
                    break;
                }
-               if(screensLeft & (1 << ref)) break;
+               if(screensLeft[ref]) break;
                pScreen = xf86Screens[i]->pScreen;
                dixScreenOrigins[i].x = dixScreenOrigins[ref].x;
                dixScreenOrigins[i].y = 
                        dixScreenOrigins[ref].y - pScreen->height;
-               screensLeft &= ~(1 << i);
+               ++changed, screensLeft[i] = 0;
                break;
            default:
                ErrorF("Illegal placement keyword in Layout!\n");
@@ -732,21 +738,21 @@ xf86InitOrigins(void)
 
        }
 
-       if(!screensLeft) break;
-
-       if(screensLeft == prevScreensLeft) {
+    if(!changed) {
+        int n, count;
        /* All the remaining screens are referencing each other.
           Assign a value to one of them and go through again */
-           i = 0;
-           while(!((1 << i) & screensLeft)){ i++; }
+        for (i = 0; i < xf86NumScreens; i++)
+            if (screensLeft[i]) break;
+
+        if (i >= xf86NumScreens) break; /* Finished */
 
            ref = xf86ConfigLayout.screens[i].refscreen->screennum;
            dixScreenOrigins[ref].x = dixScreenOrigins[ref].y = 0;
-           screensLeft &= ~(1 << ref);
+           screensLeft[ref] = 0;
        }
-
-       prevScreensLeft = screensLeft;
     }
+    MAXSCREENSFREE(screensLeft);
 
     /* justify the topmost and leftmost to (0,0) */
     minX = dixScreenOrigins[0].x;
@@ -847,6 +853,7 @@ xf86ReconfigureLayout(void)
 {
     int i;
 
+    MAXSCREEN_ASSERT_INIT();
     for (i = 0; i < MAXSCREENS; i++) {
        xf86ScreenLayoutPtr sl = &xf86ScreenLayout[i];
        /* we don't have to zero these, xf86InitOrigins() takes care of that */
diff --git a/hw/xfree86/common/xf86xv.c b/hw/xfree86/common/xf86xv.c
index bdcc4fc..3aaa623 100644
--- a/hw/xfree86/common/xf86xv.c
+++ b/hw/xfree86/common/xf86xv.c
@@ -186,7 +186,7 @@ typedef struct {
    int num;
 } OffscreenImageRec;
 
-static OffscreenImageRec OffscreenImages[MAXSCREENS];
+static OffscreenImageRec *OffscreenImages;
 
 Bool
 xf86XVRegisterOffscreenImages(
@@ -194,6 +194,7 @@ xf86XVRegisterOffscreenImages(
     XF86OffscreenImagePtr images,
     int num
 ){
+    MAXSCREENSALLOC_FATAL(OffscreenImages);
     OffscreenImages[pScreen->myNum].num = num;
     OffscreenImages[pScreen->myNum].images = images;
 
diff --git a/hw/xfree86/dixmods/extmod/xf86dga2.c 
b/hw/xfree86/dixmods/extmod/xf86dga2.c
index 5367bcc..96732e8 100644
--- a/hw/xfree86/dixmods/extmod/xf86dga2.c
+++ b/hw/xfree86/dixmods/extmod/xf86dga2.c
@@ -27,6 +27,7 @@
 #include "dgaproc.h"
 #include "xf86dgaext.h"
 #include "protocol-versions.h"
+#include "globals.h"
 
 #include <string.h>
 
@@ -57,7 +58,7 @@ static void XDGAResetProc(ExtensionEntry *extEntry);
 
 static void DGAClientStateChange (CallbackListPtr*, pointer, pointer);
 
-static ClientPtr DGAClients[MAXSCREENS];
+static ClientPtr *DGAClients;
 
 unsigned char DGAReqCode = 0;
 int DGAErrorBase;
@@ -93,6 +94,7 @@ XFree86DGAExtensionInit(INITARGS)
                                StandardMinorOpcode))) {
        int i;
 
+    MAXSCREENSALLOC_FATAL(DGAClients);
        for(i = 0; i < MAXSCREENS; i++)
             DGAClients[i] = NULL;
 
diff --git a/hw/xfree86/os-support/bsd/arm_video.c 
b/hw/xfree86/os-support/bsd/arm_video.c
index 466a8a0..c68591a 100644
--- a/hw/xfree86/os-support/bsd/arm_video.c
+++ b/hw/xfree86/os-support/bsd/arm_video.c
@@ -533,7 +533,7 @@ xf86DisableIO()
 #define        DEV_MEM_IOBASE  0x43000000
 #endif
 
-static Bool ScreenEnabled[MAXSCREENS];
+static Bool *ScreenEnabled;
 static Bool ExtendedEnabled = FALSE;
 static Bool InitDone = FALSE;
 
@@ -549,7 +549,7 @@ int ScreenNum;
        struct memAccess *memInfoP;
        int *Size;
 #endif
-
+    MAXSCREENSALLOC_FATAL(ScreenEnabled);
        ScreenEnabled[ScreenNum] = TRUE;
 
        if (ExtendedEnabled)
@@ -635,6 +635,7 @@ int ScreenNum;
         struct memAccess *memInfoP;
 #endif
 
+    MAXSCREENSALLOC_FATAL(ScreenEnabled);
        ScreenEnabled[ScreenNum] = FALSE;
 
 #ifdef __arm32__
-- 
1.6.0.4

_______________________________________________
[email protected]: X.Org development
Archives: http://lists.x.org/archives/xorg-devel
Info: http://lists.x.org/mailman/listinfo/xorg-devel

Reply via email to