Make Xvfb independent of MAXSCREENS.

If a -screen option specifies a screen number higher than any previously
specified, reallocate the vfb-private array of screen-info structs.

If built with a DIX that still has a MAXSCREENS limit, asking for too
many screens won't be detected until InitOutput calls AddScreen.

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:23:27 -07:00
parent 20e84b0b44
commit f9e3a2955d

View File

@ -104,7 +104,7 @@ typedef struct
} vfbScreenInfo, *vfbScreenInfoPtr;
static int vfbNumScreens;
static vfbScreenInfo vfbScreens[MAXSCREENS];
static vfbScreenInfo *vfbScreens;
static vfbScreenInfo defaultScreenInfo = {
.width = VFB_DEFAULT_WIDTH,
.height = VFB_DEFAULT_HEIGHT,
@ -280,7 +280,7 @@ ddxProcessArgument(int argc, char *argv[], int i)
int screenNum;
CHECK_FOR_REQUIRED_ARGUMENTS(2);
screenNum = atoi(argv[i+1]);
if (screenNum < 0 || screenNum >= MAXSCREENS)
if (screenNum < 0)
{
ErrorF("Invalid screen number %d\n", screenNum);
UseMsg();
@ -288,8 +288,14 @@ ddxProcessArgument(int argc, char *argv[], int i)
screenNum);
}
for (; vfbNumScreens <= screenNum; ++vfbNumScreens)
vfbScreens[vfbNumScreens] = defaultScreenInfo;
if (vfbNumScreens <= screenNum)
{
vfbScreens = xrealloc(vfbScreens, sizeof(*vfbScreens) * (screenNum + 1));
if (!vfbScreens)
FatalError("Not enough memory for screen %d\n", screenNum);
for (; vfbNumScreens <= screenNum; ++vfbNumScreens)
vfbScreens[vfbNumScreens] = defaultScreenInfo;
}
if (3 != sscanf(argv[i+2], "%dx%dx%d",
&vfbScreens[screenNum].width,
@ -953,7 +959,7 @@ InitOutput(ScreenInfo *screenInfo, int argc, char **argv)
if (vfbNumScreens < 1)
{
vfbScreens[0] = defaultScreenInfo;
vfbScreens = &defaultScreenInfo;
vfbNumScreens = 1;
}
for (i = 0; i < vfbNumScreens; i++)