[PATCH 3/2] Track screens' installed colormaps as screen privates.

Jamey Sharp jamey at minilop.net
Wed Apr 21 22:34:04 PDT 2010


Several DDXes allow each screen to have at most one (or in some cases,
exactly one) installed colormap. These all use the same pattern: Declare
a global-lifetime array of MAXSCREENS ColormapPtrs, and index it by
screen number. This patch converts most of those to use screen privates
instead.

mi/micmap.c has the same pattern, except there the miInstalledMaps array
is used in the xfree86 DDX, and I guess it's part of the server's ABI.
So for now I left it alone.

Signed-off-by: Jamey Sharp <jamey at minilop.net>
---
 fb/fbcmap.c         |   16 ++++++++--------
 hw/vfb/InitOutput.c |   23 +++++++++++++----------
 hw/xnest/Color.c    |   22 +++++++++-------------
 3 files changed, 30 insertions(+), 31 deletions(-)

diff --git a/fb/fbcmap.c b/fb/fbcmap.c
index 2ff3234..b775bc3 100644
--- a/fb/fbcmap.c
+++ b/fb/fbcmap.c
@@ -36,16 +36,18 @@
 #error "You should be compiling fbcmap_mi.c instead of fbcmap.c!"
 #endif
 
+static int cmapScrPrivateKeyIndex;
+static DevPrivateKey cmapScrPrivateKey = &cmapScrPrivateKeyIndex;
 
-
-ColormapPtr FbInstalledMaps[MAXSCREENS];
+#define GetInstalledColormap(s) ((ColormapPtr) dixLookupPrivate(&(s)->devPrivates, cmapScrPrivateKey))
+#define SetInstalledColormap(s,c) (dixSetPrivate(&(s)->devPrivates, cmapScrPrivateKey, c))
 
 int
 fbListInstalledColormaps(ScreenPtr pScreen, Colormap *pmaps)
 {
     /* By the time we are processing requests, we can guarantee that there
      * is always a colormap installed */
-    *pmaps = FbInstalledMaps[pScreen->myNum]->mid;
+    *pmaps = GetInstalledColormap(pScreen)->mid;
     return (1);
 }
 
@@ -53,8 +55,7 @@ fbListInstalledColormaps(ScreenPtr pScreen, Colormap *pmaps)
 void
 fbInstallColormap(ColormapPtr pmap)
 {
-    int index = pmap->pScreen->myNum;
-    ColormapPtr oldpmap = FbInstalledMaps[index];
+    ColormapPtr oldpmap = GetInstalledColormap(pmap->pScreen);
 
     if(pmap != oldpmap)
     {
@@ -63,7 +64,7 @@ fbInstallColormap(ColormapPtr pmap)
 	if(oldpmap != (ColormapPtr)None)
 	    WalkTree(pmap->pScreen, TellLostMap, (char *)&oldpmap->mid);
 	/* Install pmap */
-	FbInstalledMaps[index] = pmap;
+	SetInstalledColormap(pmap->pScreen, pmap);
 	WalkTree(pmap->pScreen, TellGainedMap, (char *)&pmap->mid);
     }
 }
@@ -71,8 +72,7 @@ fbInstallColormap(ColormapPtr pmap)
 void
 fbUninstallColormap(ColormapPtr pmap)
 {
-    int index = pmap->pScreen->myNum;
-    ColormapPtr curpmap = FbInstalledMaps[index];
+    ColormapPtr curpmap = GetInstalledColormap(pmap->pScreen);
 
     if(pmap == curpmap)
     {
diff --git a/hw/vfb/InitOutput.c b/hw/vfb/InitOutput.c
index e7dd1d9..bcf17ef 100644
--- a/hw/vfb/InitOutput.c
+++ b/hw/vfb/InitOutput.c
@@ -429,14 +429,18 @@ ddxProcessArgument(int argc, char *argv[], int i)
     return 0;
 }
 
-static ColormapPtr InstalledMaps[MAXSCREENS];
+static int cmapScrPrivateKeyIndex;
+static DevPrivateKey cmapScrPrivateKey = &cmapScrPrivateKeyIndex;
+
+#define GetInstalledColormap(s) ((ColormapPtr) dixLookupPrivate(&(s)->devPrivates, cmapScrPrivateKey))
+#define SetInstalledColormap(s,c) (dixSetPrivate(&(s)->devPrivates, cmapScrPrivateKey, c))
 
 static int
 vfbListInstalledColormaps(ScreenPtr pScreen, Colormap *pmaps)
 {
     /* By the time we are processing requests, we can guarantee that there
      * is always a colormap installed */
-    *pmaps = InstalledMaps[pScreen->myNum]->mid;
+    *pmaps = GetInstalledColormap(pScreen)->mid;
     return (1);
 }
 
@@ -444,8 +448,7 @@ vfbListInstalledColormaps(ScreenPtr pScreen, Colormap *pmaps)
 static void
 vfbInstallColormap(ColormapPtr pmap)
 {
-    int index = pmap->pScreen->myNum;
-    ColormapPtr oldpmap = InstalledMaps[index];
+    ColormapPtr oldpmap = GetInstalledColormap(pmap->pScreen);
 
     if (pmap != oldpmap)
     {
@@ -461,7 +464,7 @@ vfbInstallColormap(ColormapPtr pmap)
 	if(oldpmap != (ColormapPtr)None)
 	    WalkTree(pmap->pScreen, TellLostMap, (char *)&oldpmap->mid);
 	/* Install pmap */
-	InstalledMaps[index] = pmap;
+	SetInstalledColormap(pmap->pScreen, pmap);
 	WalkTree(pmap->pScreen, TellGainedMap, (char *)&pmap->mid);
 
 	entries = pmap->pVisual->ColormapEntries;
@@ -502,7 +505,7 @@ vfbInstallColormap(ColormapPtr pmap)
 static void
 vfbUninstallColormap(ColormapPtr pmap)
 {
-    ColormapPtr curpmap = InstalledMaps[pmap->pScreen->myNum];
+    ColormapPtr curpmap = GetInstalledColormap(pmap->pScreen);
 
     if(pmap == curpmap)
     {
@@ -523,7 +526,7 @@ vfbStoreColors(ColormapPtr pmap, int ndef, xColorItem *pdefs)
     XWDColor *pXWDCmap;
     int i;
 
-    if (pmap != InstalledMaps[pmap->pScreen->myNum])
+    if (pmap != GetInstalledColormap(pmap->pScreen))
     {
 	return;
     }
@@ -832,10 +835,10 @@ vfbCloseScreen(int index, ScreenPtr pScreen)
 
     /*
      * XXX probably lots of stuff to clean.  For now,
-     * clear InstalledMaps[] so that server reset works correctly.
+     * clear installed colormaps so that server reset works correctly.
      */
-    for (i = 0; i < MAXSCREENS; i++)
-	InstalledMaps[i] = NULL;
+    for (i = 0; i < screenInfo.numScreens; i++)
+	SetInstalledColormap(screenInfo.screens[i], NULL);
 
     return pScreen->CloseScreen(index, pScreen);
 }
diff --git a/hw/xnest/Color.c b/hw/xnest/Color.c
index dc74947..2e6de15 100644
--- a/hw/xnest/Color.c
+++ b/hw/xnest/Color.c
@@ -34,7 +34,11 @@ is" without express or implied warranty.
 #include "XNWindow.h"
 #include "Args.h"
 
-static ColormapPtr InstalledMaps[MAXSCREENS];
+static int cmapScrPrivateKeyIndex;
+static DevPrivateKey cmapScrPrivateKey = &cmapScrPrivateKeyIndex;
+
+#define GetInstalledColormap(s) ((ColormapPtr) dixLookupPrivate(&(s)->devPrivates, cmapScrPrivateKey))
+#define SetInstalledColormap(s,c) (dixSetPrivate(&(s)->devPrivates, cmapScrPrivateKey, c))
 
 Bool
 xnestCreateColormap(ColormapPtr pCmap)
@@ -332,11 +336,7 @@ xnestDirectUninstallColormaps(ScreenPtr pScreen)
 void
 xnestInstallColormap(ColormapPtr pCmap)
 {
-  int index;
-  ColormapPtr pOldCmap;
-  
-  index = pCmap->pScreen->myNum;
-  pOldCmap = InstalledMaps[index];
+  ColormapPtr pOldCmap = GetInstalledColormap(pCmap->pScreen);
   
   if(pCmap != pOldCmap)
     {
@@ -346,7 +346,7 @@ xnestInstallColormap(ColormapPtr pCmap)
       if(pOldCmap != (ColormapPtr)None)
 	WalkTree(pCmap->pScreen, TellLostMap, (pointer)&pOldCmap->mid);
       
-      InstalledMaps[index] = pCmap;
+      SetInstalledColormap(pCmap->pScreen, pCmap);
       WalkTree(pCmap->pScreen, TellGainedMap, (pointer)&pCmap->mid);
       
       xnestSetInstalledColormapWindows(pCmap->pScreen);
@@ -357,11 +357,7 @@ xnestInstallColormap(ColormapPtr pCmap)
 void
 xnestUninstallColormap(ColormapPtr pCmap)
 {
-  int index;
-  ColormapPtr pCurCmap;
-  
-  index = pCmap->pScreen->myNum;
-  pCurCmap = InstalledMaps[index];
+  ColormapPtr pCurCmap = GetInstalledColormap(pCmap->pScreen);
   
   if(pCmap == pCurCmap)
     {
@@ -382,7 +378,7 @@ int
 xnestListInstalledColormaps(ScreenPtr pScreen, Colormap *pCmapIDs)
 {
   if (xnestInstalledDefaultColormap) {
-    *pCmapIDs = InstalledMaps[pScreen->myNum]->mid;
+    *pCmapIDs = GetInstalledColormap(pScreen)->mid;
     return 1;
   }
   else
-- 
1.7.0



More information about the xorg-devel mailing list