Xvfb: Simplify screen option processing.

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 <jamey@minilop.net>
Reviewed-by: Tiago Vignatti <tiago.vignatti@nokia.com>
This commit is contained in:
Jamey Sharp 2010-04-26 18:09:23 -07:00
parent eeb8454755
commit 20e84b0b44

View File

@ -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))