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:
parent
eeb8454755
commit
20e84b0b44
|
@ -105,6 +105,14 @@ typedef struct
|
||||||
|
|
||||||
static int vfbNumScreens;
|
static int vfbNumScreens;
|
||||||
static vfbScreenInfo vfbScreens[MAXSCREENS];
|
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];
|
static Bool vfbPixmapDepths[33];
|
||||||
#ifdef HAS_MMAP
|
#ifdef HAS_MMAP
|
||||||
static char *pfbdir = NULL;
|
static char *pfbdir = NULL;
|
||||||
|
@ -112,7 +120,6 @@ static char *pfbdir = NULL;
|
||||||
typedef enum { NORMAL_MEMORY_FB, SHARED_MEMORY_FB, MMAPPED_FILE_FB } fbMemType;
|
typedef enum { NORMAL_MEMORY_FB, SHARED_MEMORY_FB, MMAPPED_FILE_FB } fbMemType;
|
||||||
static fbMemType fbmemtype = NORMAL_MEMORY_FB;
|
static fbMemType fbmemtype = NORMAL_MEMORY_FB;
|
||||||
static char needswap = 0;
|
static char needswap = 0;
|
||||||
static int lastScreen = -1;
|
|
||||||
static Bool Render = TRUE;
|
static Bool Render = TRUE;
|
||||||
|
|
||||||
#define swapcopy16(_dst, _src) \
|
#define swapcopy16(_dst, _src) \
|
||||||
|
@ -133,24 +140,6 @@ vfbInitializePixmapDepths(void)
|
||||||
vfbPixmapDepths[i] = FALSE;
|
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
|
static int
|
||||||
vfbBitsPerPixel(int depth)
|
vfbBitsPerPixel(int depth)
|
||||||
{
|
{
|
||||||
|
@ -265,14 +254,20 @@ int
|
||||||
ddxProcessArgument(int argc, char *argv[], int i)
|
ddxProcessArgument(int argc, char *argv[], int i)
|
||||||
{
|
{
|
||||||
static Bool firstTime = TRUE;
|
static Bool firstTime = TRUE;
|
||||||
|
static int lastScreen = -1;
|
||||||
|
vfbScreenInfo *currentScreen;
|
||||||
|
|
||||||
if (firstTime)
|
if (firstTime)
|
||||||
{
|
{
|
||||||
vfbInitializeDefaultScreens();
|
|
||||||
vfbInitializePixmapDepths();
|
vfbInitializePixmapDepths();
|
||||||
firstTime = FALSE;
|
firstTime = FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (lastScreen == -1)
|
||||||
|
currentScreen = &defaultScreenInfo;
|
||||||
|
else
|
||||||
|
currentScreen = &vfbScreens[lastScreen];
|
||||||
|
|
||||||
#define CHECK_FOR_REQUIRED_ARGUMENTS(num) \
|
#define CHECK_FOR_REQUIRED_ARGUMENTS(num) \
|
||||||
if (((i + num) >= argc) || (!argv[i + num])) { \
|
if (((i + num) >= argc) || (!argv[i + num])) { \
|
||||||
ErrorF("Required argument to %s not specified\n", argv[i]); \
|
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",
|
FatalError("Invalid screen number %d passed to -screen\n",
|
||||||
screenNum);
|
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,
|
||||||
&vfbScreens[screenNum].height,
|
&vfbScreens[screenNum].height,
|
||||||
|
@ -303,8 +302,6 @@ ddxProcessArgument(int argc, char *argv[], int i)
|
||||||
argv[i+2], screenNum);
|
argv[i+2], screenNum);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (screenNum >= vfbNumScreens)
|
|
||||||
vfbNumScreens = screenNum + 1;
|
|
||||||
lastScreen = screenNum;
|
lastScreen = screenNum;
|
||||||
return 3;
|
return 3;
|
||||||
}
|
}
|
||||||
|
@ -346,61 +343,22 @@ ddxProcessArgument(int argc, char *argv[], int i)
|
||||||
|
|
||||||
if (strcmp (argv[i], "-blackpixel") == 0) /* -blackpixel n */
|
if (strcmp (argv[i], "-blackpixel") == 0) /* -blackpixel n */
|
||||||
{
|
{
|
||||||
Pixel pix;
|
|
||||||
CHECK_FOR_REQUIRED_ARGUMENTS(1);
|
CHECK_FOR_REQUIRED_ARGUMENTS(1);
|
||||||
pix = atoi(argv[++i]);
|
currentScreen->blackPixel = atoi(argv[++i]);
|
||||||
if (-1 == lastScreen)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
for (i = 0; i < MAXSCREENS; i++)
|
|
||||||
{
|
|
||||||
vfbScreens[i].blackPixel = pix;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
vfbScreens[lastScreen].blackPixel = pix;
|
|
||||||
}
|
|
||||||
return 2;
|
return 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (strcmp (argv[i], "-whitepixel") == 0) /* -whitepixel n */
|
if (strcmp (argv[i], "-whitepixel") == 0) /* -whitepixel n */
|
||||||
{
|
{
|
||||||
Pixel pix;
|
|
||||||
CHECK_FOR_REQUIRED_ARGUMENTS(1);
|
CHECK_FOR_REQUIRED_ARGUMENTS(1);
|
||||||
pix = atoi(argv[++i]);
|
currentScreen->whitePixel = atoi(argv[++i]);
|
||||||
if (-1 == lastScreen)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
for (i = 0; i < MAXSCREENS; i++)
|
|
||||||
{
|
|
||||||
vfbScreens[i].whitePixel = pix;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
vfbScreens[lastScreen].whitePixel = pix;
|
|
||||||
}
|
|
||||||
return 2;
|
return 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (strcmp (argv[i], "-linebias") == 0) /* -linebias n */
|
if (strcmp (argv[i], "-linebias") == 0) /* -linebias n */
|
||||||
{
|
{
|
||||||
unsigned int linebias;
|
|
||||||
CHECK_FOR_REQUIRED_ARGUMENTS(1);
|
CHECK_FOR_REQUIRED_ARGUMENTS(1);
|
||||||
linebias = atoi(argv[++i]);
|
currentScreen->lineBias = atoi(argv[++i]);
|
||||||
if (-1 == lastScreen)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
for (i = 0; i < MAXSCREENS; i++)
|
|
||||||
{
|
|
||||||
vfbScreens[i].lineBias = linebias;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
vfbScreens[lastScreen].lineBias = linebias;
|
|
||||||
}
|
|
||||||
return 2;
|
return 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -993,6 +951,11 @@ InitOutput(ScreenInfo *screenInfo, int argc, char **argv)
|
||||||
|
|
||||||
/* initialize screens */
|
/* initialize screens */
|
||||||
|
|
||||||
|
if (vfbNumScreens < 1)
|
||||||
|
{
|
||||||
|
vfbScreens[0] = defaultScreenInfo;
|
||||||
|
vfbNumScreens = 1;
|
||||||
|
}
|
||||||
for (i = 0; i < vfbNumScreens; i++)
|
for (i = 0; i < vfbNumScreens; i++)
|
||||||
{
|
{
|
||||||
if (-1 == AddScreen(vfbScreenInit, argc, argv))
|
if (-1 == AddScreen(vfbScreenInit, argc, argv))
|
||||||
|
|
Loading…
Reference in New Issue
Block a user