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