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