Пример #1
0
int
ddxProcessArgument(int argc, char *argv[], int i)
{
    static Bool firstTime = TRUE;
    static int lastScreen = -1;
    vfbScreenInfo *currentScreen;

    if (firstTime)
    {
	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]);       \
      UseMsg();                                                         \
      FatalError("Required argument to %s not specified\n", argv[i]);   \
    }
    
    if (strcmp (argv[i], "-screen") == 0)	/* -screen n WxHxD */
    {
	int screenNum;
	CHECK_FOR_REQUIRED_ARGUMENTS(2);
	screenNum = atoi(argv[i+1]);
	/* The protocol only has a CARD8 for number of screens in the
	   connection setup block, so don't allow more than that. */
	if ((screenNum < 0) || (screenNum >= 255))
	{
	    ErrorF("Invalid screen number %d\n", screenNum);
	    UseMsg();
	    FatalError("Invalid screen number %d passed to -screen\n",
		       screenNum);
	}

	if (vfbNumScreens <= screenNum)
	{
	    vfbScreens = realloc(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,
			&vfbScreens[screenNum].height,
			&vfbScreens[screenNum].depth))
	{
	    ErrorF("Invalid screen configuration %s\n", argv[i+2]);
	    UseMsg();
	    FatalError("Invalid screen configuration %s for -screen %d\n",
		   argv[i+2], screenNum);
	}

	lastScreen = screenNum;
	return 3;
    }

    if (strcmp (argv[i], "-pixdepths") == 0)	/* -pixdepths list-of-depth */
    {
	int depth, ret = 1;

	CHECK_FOR_REQUIRED_ARGUMENTS(1);
	while ((++i < argc) && (depth = atoi(argv[i])) != 0)
	{
	    if (depth < 0 || depth > 32)
	    {
		ErrorF("Invalid pixmap depth %d\n", depth);
		UseMsg();
		FatalError("Invalid pixmap depth %d passed to -pixdepths\n",
			   depth);
	    }
	    vfbPixmapDepths[depth] = TRUE;
	    ret++;
	}
	return ret;
    }

    if (strcmp (argv[i], "+render") == 0)	/* +render */
    {
	Render = TRUE;
	return 1;
    }

    if (strcmp (argv[i], "-render") == 0)	/* -render */
    {
	Render = FALSE;
#ifdef COMPOSITE
	noCompositeExtension = TRUE;
#endif
	return 1;
    }

    if (strcmp (argv[i], "-blackpixel") == 0)	/* -blackpixel n */
    {
	CHECK_FOR_REQUIRED_ARGUMENTS(1);
	currentScreen->blackPixel = atoi(argv[++i]);
	return 2;
    }

    if (strcmp (argv[i], "-whitepixel") == 0)	/* -whitepixel n */
    {
	CHECK_FOR_REQUIRED_ARGUMENTS(1);
	currentScreen->whitePixel = atoi(argv[++i]);
	return 2;
    }

    if (strcmp (argv[i], "-linebias") == 0)	/* -linebias n */
    {
	CHECK_FOR_REQUIRED_ARGUMENTS(1);
	currentScreen->lineBias = atoi(argv[++i]);
	return 2;
    }

#ifdef HAVE_MMAP
    if (strcmp (argv[i], "-fbdir") == 0)	/* -fbdir directory */
    {
	CHECK_FOR_REQUIRED_ARGUMENTS(1);
	pfbdir = argv[++i];
	fbmemtype = MMAPPED_FILE_FB;
	return 2;
    }
#endif /* HAVE_MMAP */

#ifdef HAS_SHM
    if (strcmp (argv[i], "-shmem") == 0)	/* -shmem */
    {
	fbmemtype = SHARED_MEMORY_FB;
	return 1;
    }
#endif

    return 0;
}
Пример #2
0
int
ddxProcessArgument(int argc, char *argv[], int i)
{
    static Bool firstTime = TRUE;

    if (firstTime)
    {
	vfbInitializeDefaultScreens();
	vfbInitializePixmapDepths();
        firstTime = FALSE;
    }

#define CHECK_FOR_REQUIRED_ARGUMENTS(num) \
    if (((i + num) >= argc) || (!argv[i + num])) {                      \
      ErrorF("Required argument to %s not specified\n", argv[i]);       \
      UseMsg();                                                         \
      FatalError("Required argument to %s not specified\n", argv[i]);   \
    }
    
    if (strcmp (argv[i], "-screen") == 0)	/* -screen n WxHxD */
    {
	int screenNum;
	CHECK_FOR_REQUIRED_ARGUMENTS(2);
	screenNum = atoi(argv[i+1]);
	if (screenNum < 0 || screenNum >= MAXSCREENS)
	{
	    ErrorF("Invalid screen number %d\n", screenNum);
	    UseMsg();
	    FatalError("Invalid screen number %d passed to -screen\n",
		       screenNum);
	}
	if (3 != sscanf(argv[i+2], "%dx%dx%d",
			&vfbScreens[screenNum].width,
			&vfbScreens[screenNum].height,
			&vfbScreens[screenNum].depth))
	{
	    ErrorF("Invalid screen configuration %s\n", argv[i+2]);
	    UseMsg();
	    FatalError("Invalid screen configuration %s for -screen %d\n",
		   argv[i+2], screenNum);
	}

	if (screenNum >= vfbNumScreens)
	    vfbNumScreens = screenNum + 1;
	lastScreen = screenNum;
	return 3;
    }

    if (strcmp (argv[i], "-pixdepths") == 0)	/* -pixdepths list-of-depth */
    {
	int depth, ret = 1;

	CHECK_FOR_REQUIRED_ARGUMENTS(1);
	while ((++i < argc) && (depth = atoi(argv[i])) != 0)
	{
	    if (depth < 0 || depth > 32)
	    {
		ErrorF("Invalid pixmap depth %d\n", depth);
		UseMsg();
		FatalError("Invalid pixmap depth %d passed to -pixdepths\n",
			   depth);
	    }
	    vfbPixmapDepths[depth] = TRUE;
	    ret++;
	}
	return ret;
    }

    if (strcmp (argv[i], "+render") == 0)	/* +render */
    {
	Render = TRUE;
	return 1;
    }

    if (strcmp (argv[i], "-render") == 0)	/* -render */
    {
	Render = FALSE;
#ifdef COMPOSITE
	noCompositeExtension = TRUE;
#endif
	return 1;
    }

    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;
	}
	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;
	}
	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;
	}
	return 2;
    }

#ifdef HAS_MMAP
    if (strcmp (argv[i], "-fbdir") == 0)	/* -fbdir directory */
    {
	CHECK_FOR_REQUIRED_ARGUMENTS(1);
	pfbdir = argv[++i];
	fbmemtype = MMAPPED_FILE_FB;
	return 2;
    }
#endif /* HAS_MMAP */

#ifdef HAS_SHM
    if (strcmp (argv[i], "-shmem") == 0)	/* -shmem */
    {
	fbmemtype = SHARED_MEMORY_FB;
	return 1;
    }
#endif

    return 0;
}