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:
parent
20e84b0b44
commit
f9e3a2955d
|
@ -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++)
|
||||||
|
|
Loading…
Reference in New Issue
Block a user