Inspired by Jon Turney's "Xwin: Simplify screen option processing"
patch, which does something similar for the Xwin server.

Besides making the code more readable, this eliminates most of Xvfb's
references to MAXSCREENS.

Signed-off-by: Jamey Sharp <[email protected]>
---
I spent a long time trying to figure out why -blackpixel and -whitepixel
were being ignored sometimes, before discovering that depth must be at
most 8bpp for them to matter. Apparently I'm too young for this crap.

 hw/vfb/InitOutput.c |   91 +++++++++++++++------------------------------------
 1 files changed, 27 insertions(+), 64 deletions(-)

diff --git a/hw/vfb/InitOutput.c b/hw/vfb/InitOutput.c
index 6d827eb..f710828 100644
--- a/hw/vfb/InitOutput.c
+++ b/hw/vfb/InitOutput.c
@@ -105,6 +105,14 @@ typedef struct
 
 static int vfbNumScreens;
 static vfbScreenInfo vfbScreens[MAXSCREENS];
+static vfbScreenInfo defaultScreenInfo = {
+    .width  = VFB_DEFAULT_WIDTH,
+    .height = VFB_DEFAULT_HEIGHT,
+    .depth  = VFB_DEFAULT_DEPTH,
+    .blackPixel = VFB_DEFAULT_BLACKPIXEL,
+    .whitePixel = VFB_DEFAULT_WHITEPIXEL,
+    .lineBias = VFB_DEFAULT_LINEBIAS,
+};
 static Bool vfbPixmapDepths[33];
 #ifdef HAS_MMAP
 static char *pfbdir = NULL;
@@ -112,7 +120,6 @@ static char *pfbdir = NULL;
 typedef enum { NORMAL_MEMORY_FB, SHARED_MEMORY_FB, MMAPPED_FILE_FB } fbMemType;
 static fbMemType fbmemtype = NORMAL_MEMORY_FB;
 static char needswap = 0;
-static int lastScreen = -1;
 static Bool Render = TRUE;
 
 #define swapcopy16(_dst, _src) \
@@ -133,24 +140,6 @@ vfbInitializePixmapDepths(void)
        vfbPixmapDepths[i] = FALSE;
 }
 
-static void
-vfbInitializeDefaultScreens(void)
-{
-    int i;
-
-    for (i = 0; i < MAXSCREENS; i++)
-    {
-       vfbScreens[i].width  = VFB_DEFAULT_WIDTH;
-       vfbScreens[i].height = VFB_DEFAULT_HEIGHT;
-       vfbScreens[i].depth  = VFB_DEFAULT_DEPTH;
-       vfbScreens[i].blackPixel = VFB_DEFAULT_BLACKPIXEL;
-       vfbScreens[i].whitePixel = VFB_DEFAULT_WHITEPIXEL;
-       vfbScreens[i].lineBias = VFB_DEFAULT_LINEBIAS;
-       vfbScreens[i].pfbMemory = NULL;
-    }
-    vfbNumScreens = 1;
-}
-
 static int
 vfbBitsPerPixel(int depth)
 {
@@ -265,14 +254,20 @@ int
 ddxProcessArgument(int argc, char *argv[], int i)
 {
     static Bool firstTime = TRUE;
+    static int lastScreen = -1;
+    vfbScreenInfo *currentScreen;
 
     if (firstTime)
     {
-       vfbInitializeDefaultScreens();
        vfbInitializePixmapDepths();
         firstTime = FALSE;
     }
 
+    if (lastScreen == -1)
+       currentScreen = &defaultScreenInfo;
+    else
+       currentScreen = &vfbScreens[lastScreen];
+
 #define CHECK_FOR_REQUIRED_ARGUMENTS(num) \
     if (((i + num) >= argc) || (!argv[i + num])) {                      \
       ErrorF("Required argument to %s not specified\n", argv[i]);       \
@@ -292,6 +287,10 @@ ddxProcessArgument(int argc, char *argv[], int i)
            FatalError("Invalid screen number %d passed to -screen\n",
                       screenNum);
        }
+
+       for (; vfbNumScreens <= screenNum; ++vfbNumScreens)
+           vfbScreens[vfbNumScreens] = defaultScreenInfo;
+
        if (3 != sscanf(argv[i+2], "%dx%dx%d",
                        &vfbScreens[screenNum].width,
                        &vfbScreens[screenNum].height,
@@ -303,8 +302,6 @@ ddxProcessArgument(int argc, char *argv[], int i)
                   argv[i+2], screenNum);
        }
 
-       if (screenNum >= vfbNumScreens)
-           vfbNumScreens = screenNum + 1;
        lastScreen = screenNum;
        return 3;
     }
@@ -346,61 +343,22 @@ ddxProcessArgument(int argc, char *argv[], int i)
 
     if (strcmp (argv[i], "-blackpixel") == 0)  /* -blackpixel n */
     {
-       Pixel pix;
        CHECK_FOR_REQUIRED_ARGUMENTS(1);
-       pix = atoi(argv[++i]);
-       if (-1 == lastScreen)
-       {
-           int i;
-           for (i = 0; i < MAXSCREENS; i++)
-           {
-               vfbScreens[i].blackPixel = pix;
-           }
-       }
-       else
-       {
-           vfbScreens[lastScreen].blackPixel = pix;
-       }
+       currentScreen->blackPixel = atoi(argv[++i]);
        return 2;
     }
 
     if (strcmp (argv[i], "-whitepixel") == 0)  /* -whitepixel n */
     {
-       Pixel pix;
        CHECK_FOR_REQUIRED_ARGUMENTS(1);
-       pix = atoi(argv[++i]);
-       if (-1 == lastScreen)
-       {
-           int i;
-           for (i = 0; i < MAXSCREENS; i++)
-           {
-               vfbScreens[i].whitePixel = pix;
-           }
-       }
-       else
-       {
-           vfbScreens[lastScreen].whitePixel = pix;
-       }
+       currentScreen->whitePixel = atoi(argv[++i]);
        return 2;
     }
 
     if (strcmp (argv[i], "-linebias") == 0)    /* -linebias n */
     {
-       unsigned int linebias;
        CHECK_FOR_REQUIRED_ARGUMENTS(1);
-       linebias = atoi(argv[++i]);
-       if (-1 == lastScreen)
-       {
-           int i;
-           for (i = 0; i < MAXSCREENS; i++)
-           {
-               vfbScreens[i].lineBias = linebias;
-           }
-       }
-       else
-       {
-           vfbScreens[lastScreen].lineBias = linebias;
-       }
+       currentScreen->lineBias = atoi(argv[++i]);
        return 2;
     }
 
@@ -993,6 +951,11 @@ InitOutput(ScreenInfo *screenInfo, int argc, char **argv)
 
     /* initialize screens */
 
+    if (vfbNumScreens < 1)
+    {
+       vfbScreens[0] = defaultScreenInfo;
+       vfbNumScreens = 1;
+    }
     for (i = 0; i < vfbNumScreens; i++)
     {
        if (-1 == AddScreen(vfbScreenInit, argc, argv))
-- 
1.7.0

_______________________________________________
[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