static Bool winInitVisualsShadowDD (ScreenPtr pScreen) { winScreenPriv(pScreen); winScreenInfo *pScreenInfo = pScreenPriv->pScreenInfo; DWORD dwRedBits, dwGreenBits, dwBlueBits; /* Count the number of ones in each color mask */ dwRedBits = winCountBits (pScreenPriv->dwRedMask); dwGreenBits = winCountBits (pScreenPriv->dwGreenMask); dwBlueBits = winCountBits (pScreenPriv->dwBlueMask); /* Store the maximum number of ones in a color mask as the bitsPerRGB */ if (dwRedBits == 0 || dwGreenBits == 0 || dwBlueBits == 0) pScreenPriv->dwBitsPerRGB = 8; else if (dwRedBits > dwGreenBits && dwRedBits > dwBlueBits) pScreenPriv->dwBitsPerRGB = dwRedBits; else if (dwGreenBits > dwRedBits && dwGreenBits > dwBlueBits) pScreenPriv->dwBitsPerRGB = dwGreenBits; else pScreenPriv->dwBitsPerRGB = dwBlueBits; ErrorF ("winInitVisualsShadowDD - Masks %08x %08x %08x BPRGB %d d %d " "bpp %d\n", (unsigned int) pScreenPriv->dwRedMask, (unsigned int) pScreenPriv->dwGreenMask, (unsigned int) pScreenPriv->dwBlueMask, (int) pScreenPriv->dwBitsPerRGB, (int) pScreenInfo->dwDepth, (int) pScreenInfo->dwBPP); /* Create a single visual according to the Windows screen depth */ switch (pScreenInfo->dwDepth) { case 24: case 16: case 15: #if defined(XFree86Server) /* Create the real visual */ if (!miSetVisualTypesAndMasks (pScreenInfo->dwDepth, TrueColorMask, pScreenPriv->dwBitsPerRGB, TrueColor, pScreenPriv->dwRedMask, pScreenPriv->dwGreenMask, pScreenPriv->dwBlueMask)) { ErrorF ("winInitVisualsShadowDD - miSetVisualTypesAndMasks " "failed for TrueColor\n"); return FALSE; } #ifdef XWIN_EMULATEPSEUDO if (!pScreenInfo->fEmulatePseudo) break; /* Setup a pseudocolor visual */ if (!miSetVisualTypesAndMasks (8, PseudoColorMask, 8, -1, 0, 0, 0)) { ErrorF ("winInitVisualsShadowDD - miSetVisualTypesAndMasks " "failed for PseudoColor\n"); return FALSE; } #endif #else /* XFree86Server */ /* Create the real visual */ if (!fbSetVisualTypesAndMasks (pScreenInfo->dwDepth, TrueColorMask, pScreenPriv->dwBitsPerRGB, pScreenPriv->dwRedMask, pScreenPriv->dwGreenMask, pScreenPriv->dwBlueMask)) { ErrorF ("winInitVisualsShadowDD - fbSetVisualTypesAndMasks " "failed for TrueColor\n"); return FALSE; } #ifdef XWIN_EMULATEPSEUDO if (!pScreenInfo->fEmulatePseudo) break; /* Setup a pseudocolor visual */ if (!fbSetVisualTypesAndMasks (8, PseudoColorMask, 8, 0, 0, 0)) { ErrorF ("winInitVisualsShadowDD - fbSetVisualTypesAndMasks " "failed for PseudoColor\n"); return FALSE; } #endif #endif /* XFree86Server */ break; case 8: #if defined(XFree86Server) if (!miSetVisualTypesAndMasks (pScreenInfo->dwDepth, pScreenInfo->fFullScreen ? PseudoColorMask : StaticColorMask, pScreenPriv->dwBitsPerRGB, pScreenInfo->fFullScreen ? PseudoColor : StaticColor, pScreenPriv->dwRedMask, pScreenPriv->dwGreenMask, pScreenPriv->dwBlueMask)) { ErrorF ("winInitVisualsShadowDD - miSetVisualTypesAndMasks " "failed\n"); return FALSE; } #else /* XFree86Server */ if (!fbSetVisualTypesAndMasks (pScreenInfo->dwDepth, pScreenInfo->fFullScreen ? PseudoColorMask : StaticColorMask, pScreenPriv->dwBitsPerRGB, pScreenPriv->dwRedMask, pScreenPriv->dwGreenMask, pScreenPriv->dwBlueMask)) { ErrorF ("winInitVisualsShadowDD - fbSetVisualTypesAndMasks " "failed\n"); return FALSE; } #endif /* XFree86Server */ break; default: ErrorF ("winInitVisualsShadowDD - Unknown screen depth\n"); return FALSE; } #if CYGDEBUG winDebug ("winInitVisualsShadowDD - Returning\n"); #endif return TRUE; }
int ddxProcessArgument (int argc, char *argv[], int i) { static Bool s_fBeenHere = FALSE; winScreenInfo *screenInfoPtr = NULL; /* Initialize once */ if (!s_fBeenHere) { #ifdef DDXOSVERRORF /* * This initialises our hook into VErrorF () for catching log messages * that are generated before OsInit () is called. */ OsVendorVErrorFProc = OsVendorVErrorF; #endif s_fBeenHere = TRUE; /* Initialize only if option is not -help */ if (!IS_OPTION("-help") && !IS_OPTION("-h") && !IS_OPTION("--help") && !IS_OPTION("-version") && !IS_OPTION("--version")) { /* Log the version information */ winLogVersionInfo (); /* Log the command line */ winLogCommandLine (argc, argv); /* * Initialize default screen settings. We have to do this before * OsVendorInit () gets called, otherwise we will overwrite * settings changed by parameters such as -fullscreen, etc. */ winErrorFVerb (2, "ddxProcessArgument - Initializing default " "screens\n"); winInitializeScreenDefaults(); } } #if CYGDEBUG winDebug ("ddxProcessArgument - arg: %s\n", argv[i]); #endif /* * Look for the '-help' and similar options */ if (IS_OPTION ("-help") || IS_OPTION("-h") || IS_OPTION("--help")) { /* Reset logfile. We don't need that helpmessage in the logfile */ g_pszLogFile = NULL; g_fNoHelpMessageBox = TRUE; UseMsg(); exit (0); return 1; } if (IS_OPTION ("-version") || IS_OPTION("--version")) { /* Reset logfile. We don't need that versioninfo in the logfile */ g_pszLogFile = NULL; winLogVersionInfo (); exit (0); return 1; } /* * Look for the '-screen scr_num [width height]' argument */ if (IS_OPTION ("-screen")) { int iArgsProcessed = 1; int nScreenNum; int iWidth, iHeight, iX, iY; int iMonitor; #if CYGDEBUG winDebug ("ddxProcessArgument - screen - argc: %d i: %d\n", argc, i); #endif /* Display the usage message if the argument is malformed */ if (i + 1 >= argc) { return 0; } /* Grab screen number */ nScreenNum = atoi (argv[i + 1]); /* Validate the specified screen number */ if (nScreenNum < 0) { ErrorF ("ddxProcessArgument - screen - Invalid screen number %d\n", nScreenNum); UseMsg (); return 0; } /* Initialize default values for any new screens Note that default values can't change after a -screen option is seen, so it's safe to do this for each screen as it is introduced */ winInitializeScreens(nScreenNum+1); /* look for @m where m is monitor number */ if (i + 2 < argc && 1 == sscanf(argv[i + 2], "@%d", (int *) &iMonitor)) { struct GetMonitorInfoData data; if (!QueryMonitor(iMonitor, &data)) { ErrorF ("ddxProcessArgument - screen - " "Querying monitors is not supported on NT4 and Win95\n"); } else if (data.bMonitorSpecifiedExists == TRUE) { winErrorFVerb(2, "ddxProcessArgument - screen - Found Valid ``@Monitor'' = %d arg\n", iMonitor); iArgsProcessed = 3; g_ScreenInfo[nScreenNum].fUserGaveHeightAndWidth = FALSE; g_ScreenInfo[nScreenNum].fUserGavePosition = TRUE; g_ScreenInfo[nScreenNum].dwWidth = data.monitorWidth; g_ScreenInfo[nScreenNum].dwHeight = data.monitorHeight; g_ScreenInfo[nScreenNum].dwUserWidth = data.monitorWidth; g_ScreenInfo[nScreenNum].dwUserHeight = data.monitorHeight; g_ScreenInfo[nScreenNum].dwInitialX = data.monitorOffsetX; g_ScreenInfo[nScreenNum].dwInitialY = data.monitorOffsetY; } else { /* monitor does not exist, error out */ ErrorF ("ddxProcessArgument - screen - Invalid monitor number %d\n", iMonitor); UseMsg (); exit (0); return 0; } } /* Look for 'WxD' or 'W D' */ else if (i + 2 < argc && 2 == sscanf (argv[i + 2], "%dx%d", (int *) &iWidth, (int *) &iHeight)) { winErrorFVerb (2, "ddxProcessArgument - screen - Found ``WxD'' arg\n"); iArgsProcessed = 3; g_ScreenInfo[nScreenNum].fUserGaveHeightAndWidth = TRUE; g_ScreenInfo[nScreenNum].dwWidth = iWidth; g_ScreenInfo[nScreenNum].dwHeight = iHeight; g_ScreenInfo[nScreenNum].dwUserWidth = iWidth; g_ScreenInfo[nScreenNum].dwUserHeight = iHeight; /* Look for WxD+X+Y */ if (2 == sscanf (argv[i + 2], "%*dx%*d+%d+%d", (int *) &iX, (int *) &iY)) { winErrorFVerb (2, "ddxProcessArgument - screen - Found ``X+Y'' arg\n"); g_ScreenInfo[nScreenNum].fUserGavePosition = TRUE; g_ScreenInfo[nScreenNum].dwInitialX = iX; g_ScreenInfo[nScreenNum].dwInitialY = iY; /* look for WxD+X+Y@m where m is monitor number. take X,Y to be offsets from monitor's root position */ if (1 == sscanf (argv[i + 2], "%*dx%*d+%*d+%*d@%d", (int *) &iMonitor)) { struct GetMonitorInfoData data; if (!QueryMonitor(iMonitor, &data)) { ErrorF ("ddxProcessArgument - screen - " "Querying monitors is not supported on NT4 and Win95\n"); } else if (data.bMonitorSpecifiedExists == TRUE) { g_ScreenInfo[nScreenNum].dwInitialX += data.monitorOffsetX; g_ScreenInfo[nScreenNum].dwInitialY += data.monitorOffsetY; } else { /* monitor does not exist, error out */ ErrorF ("ddxProcessArgument - screen - Invalid monitor number %d\n", iMonitor); UseMsg (); exit (0); return 0; } } } /* look for WxD@m where m is monitor number */ else if (1 == sscanf(argv[i + 2], "%*dx%*d@%d", (int *) &iMonitor)) { struct GetMonitorInfoData data; if (!QueryMonitor(iMonitor, &data)) { ErrorF ("ddxProcessArgument - screen - " "Querying monitors is not supported on NT4 and Win95\n"); } else if (data.bMonitorSpecifiedExists == TRUE) { winErrorFVerb (2, "ddxProcessArgument - screen - Found Valid ``@Monitor'' = %d arg\n", iMonitor); g_ScreenInfo[nScreenNum].fUserGavePosition = TRUE; g_ScreenInfo[nScreenNum].dwInitialX = data.monitorOffsetX; g_ScreenInfo[nScreenNum].dwInitialY = data.monitorOffsetY; } else { /* monitor does not exist, error out */ ErrorF ("ddxProcessArgument - screen - Invalid monitor number %d\n", iMonitor); UseMsg (); exit (0); return 0; } } } else if (i + 3 < argc && 1 == sscanf (argv[i + 2], "%d", (int *) &iWidth) && 1 == sscanf (argv[i + 3], "%d", (int *) &iHeight)) { winErrorFVerb (2, "ddxProcessArgument - screen - Found ``W D'' arg\n"); iArgsProcessed = 4; g_ScreenInfo[nScreenNum].fUserGaveHeightAndWidth = TRUE; g_ScreenInfo[nScreenNum].dwWidth = iWidth; g_ScreenInfo[nScreenNum].dwHeight = iHeight; g_ScreenInfo[nScreenNum].dwUserWidth = iWidth; g_ScreenInfo[nScreenNum].dwUserHeight = iHeight; if (i + 5 < argc && 1 == sscanf (argv[i + 4], "%d", (int *) &iX) && 1 == sscanf (argv[i + 5], "%d", (int *) &iY)) { winErrorFVerb (2, "ddxProcessArgument - screen - Found ``X Y'' arg\n"); iArgsProcessed = 6; g_ScreenInfo[nScreenNum].fUserGavePosition = TRUE; g_ScreenInfo[nScreenNum].dwInitialX = iX; g_ScreenInfo[nScreenNum].dwInitialY = iY; } } else { winErrorFVerb (2, "ddxProcessArgument - screen - Did not find size arg. " "dwWidth: %d dwHeight: %d\n", (int) g_ScreenInfo[nScreenNum].dwWidth, (int) g_ScreenInfo[nScreenNum].dwHeight); iArgsProcessed = 2; g_ScreenInfo[nScreenNum].fUserGaveHeightAndWidth = FALSE; } /* Calculate the screen width and height in millimeters */ if (g_ScreenInfo[nScreenNum].fUserGaveHeightAndWidth) { g_ScreenInfo[nScreenNum].dwWidth_mm = (g_ScreenInfo[nScreenNum].dwWidth / monitorResolution) * 25.4; g_ScreenInfo[nScreenNum].dwHeight_mm = (g_ScreenInfo[nScreenNum].dwHeight / monitorResolution) * 25.4; } /* Flag that this screen was explicity specified by the user */ g_ScreenInfo[nScreenNum].fExplicitScreen = TRUE; /* * Keep track of the last screen number seen, as parameters seen * before a screen number apply to all screens, whereas parameters * seen after a screen number apply to that screen number only. */ iLastScreen = nScreenNum; return iArgsProcessed; } /* * Is this parameter attached to a screen or global? * * If the parameter is for all screens (appears before * any -screen option), store it in the default screen * info * * If the parameter is for a single screen (appears * after a -screen option), store it in the screen info * for that screen * */ if (iLastScreen == -1) { screenInfoPtr = &defaultScreenInfo; } else { screenInfoPtr = &(g_ScreenInfo[iLastScreen]); } /* * Look for the '-engine n' argument */ if (IS_OPTION ("-engine")) { DWORD dwEngine = 0; CARD8 c8OnBits = 0; /* Display the usage message if the argument is malformed */ if (++i >= argc) { UseMsg (); return 0; } /* Grab the argument */ dwEngine = atoi (argv[i]); /* Count the one bits in the engine argument */ c8OnBits = winCountBits (dwEngine); /* Argument should only have a single bit on */ if (c8OnBits != 1) { UseMsg (); return 0; } screenInfoPtr->dwEnginePreferred = dwEngine; /* Indicate that we have processed the argument */ return 2; } /* * Look for the '-fullscreen' argument */ if (IS_OPTION ("-fullscreen")) { #if defined(XWIN_MULTIWINDOW) || defined(XWIN_MULTIWINDOWEXTWM) if (!screenInfoPtr->fMultiMonitorOverride) screenInfoPtr->fMultipleMonitors = FALSE; #endif screenInfoPtr->fFullScreen = TRUE; /* Indicate that we have processed this argument */ return 1; } /* * Look for the '-lesspointer' argument */ if (IS_OPTION ("-lesspointer")) { screenInfoPtr->fLessPointer = TRUE; /* Indicate that we have processed this argument */ return 1; } /* * Look for the '-nodecoration' argument */ if (IS_OPTION ("-nodecoration")) { #if defined(XWIN_MULTIWINDOW) || defined(XWIN_MULTIWINDOWEXTWM) if (!screenInfoPtr->fMultiMonitorOverride) screenInfoPtr->fMultipleMonitors = FALSE; #endif screenInfoPtr->fDecoration = FALSE; /* Indicate that we have processed this argument */ return 1; } #ifdef XWIN_MULTIWINDOWEXTWM /* * Look for the '-mwextwm' argument */ if (IS_OPTION ("-mwextwm")) { if (!screenInfoPtr->fMultiMonitorOverride) screenInfoPtr->fMultipleMonitors = TRUE; screenInfoPtr->fMWExtWM = TRUE; /* Indicate that we have processed this argument */ return 1; } /* * Look for the '-internalwm' argument */ if (IS_OPTION ("-internalwm")) { if (!screenInfoPtr->fMultiMonitorOverride) screenInfoPtr->fMultipleMonitors = TRUE; screenInfoPtr->fMWExtWM = TRUE; screenInfoPtr->fInternalWM = TRUE; /* Indicate that we have processed this argument */ return 1; } #endif /* * Look for the '-rootless' argument */ if (IS_OPTION ("-rootless")) { #if defined(XWIN_MULTIWINDOW) || defined(XWIN_MULTIWINDOWEXTWM) if (!screenInfoPtr->fMultiMonitorOverride) screenInfoPtr->fMultipleMonitors = FALSE; #endif screenInfoPtr->fRootless = TRUE; /* Indicate that we have processed this argument */ return 1; } #ifdef XWIN_MULTIWINDOW /* * Look for the '-multiwindow' argument */ if (IS_OPTION ("-multiwindow")) { #if defined(XWIN_MULTIWINDOW) || defined(XWIN_MULTIWINDOWEXTWM) if (!screenInfoPtr->fMultiMonitorOverride) screenInfoPtr->fMultipleMonitors = TRUE; #endif screenInfoPtr->fMultiWindow = TRUE; /* Indicate that we have processed this argument */ return 1; } #endif /* * Look for the '-multiplemonitors' argument */ if (IS_OPTION ("-multiplemonitors") || IS_OPTION ("-multimonitors")) { #if defined(XWIN_MULTIWINDOW) || defined(XWIN_MULTIWINDOWEXTWM) screenInfoPtr->fMultiMonitorOverride = TRUE; #endif screenInfoPtr->fMultipleMonitors = TRUE; /* Indicate that we have processed this argument */ return 1; } /* * Look for the '-nomultiplemonitors' argument */ if (IS_OPTION ("-nomultiplemonitors") || IS_OPTION ("-nomultimonitors")) { #if defined(XWIN_MULTIWINDOW) || defined(XWIN_MULTIWINDOWEXTWM) screenInfoPtr->fMultiMonitorOverride = TRUE; #endif screenInfoPtr->fMultipleMonitors = FALSE; /* Indicate that we have processed this argument */ return 1; } /* * Look for the '-scrollbars' argument */ if (IS_OPTION ("-scrollbars")) { screenInfoPtr->fScrollbars = TRUE; /* Indicate that we have processed this argument */ return 1; } #ifdef XWIN_CLIPBOARD /* * Look for the '-clipboard' argument */ if (IS_OPTION ("-clipboard")) { /* Now the default, we still accept the arg for backwards compatibility */ g_fClipboard = TRUE; /* Indicate that we have processed this argument */ return 1; } /* * Look for the '-noclipboard' argument */ if (IS_OPTION ("-noclipboard")) { g_fClipboard = FALSE; /* Indicate that we have processed this argument */ return 1; } #endif /* * Look for the '-ignoreinput' argument */ if (IS_OPTION ("-ignoreinput")) { screenInfoPtr->fIgnoreInput = TRUE; /* Indicate that we have processed this argument */ return 1; } /* * Look for the '-emulate3buttons' argument */ if (IS_OPTION ("-emulate3buttons")) { int iArgsProcessed = 1; int iE3BTimeout = WIN_DEFAULT_E3B_TIME; /* Grab the optional timeout value */ if (i + 1 < argc && 1 == sscanf (argv[i + 1], "%d", &iE3BTimeout)) { /* Indicate that we have processed the next argument */ iArgsProcessed++; } else { /* * sscanf () won't modify iE3BTimeout if it doesn't find * the specified format; however, I want to be explicit * about setting the default timeout in such cases to * prevent some programs (me) from getting confused. */ iE3BTimeout = WIN_DEFAULT_E3B_TIME; } screenInfoPtr->iE3BTimeout = iE3BTimeout; /* Indicate that we have processed this argument */ return iArgsProcessed; } /* * Look for the '-depth n' argument */ if (IS_OPTION ("-depth")) { DWORD dwBPP = 0; /* Display the usage message if the argument is malformed */ if (++i >= argc) { UseMsg (); return 0; } /* Grab the argument */ dwBPP = atoi (argv[i]); screenInfoPtr->dwBPP = dwBPP; /* Indicate that we have processed the argument */ return 2; } /* * Look for the '-refresh n' argument */ if (IS_OPTION ("-refresh")) { DWORD dwRefreshRate = 0; /* Display the usage message if the argument is malformed */ if (++i >= argc) { UseMsg (); return 0; } /* Grab the argument */ dwRefreshRate = atoi (argv[i]); screenInfoPtr->dwRefreshRate = dwRefreshRate; /* Indicate that we have processed the argument */ return 2; } /* * Look for the '-clipupdates num_boxes' argument */ if (IS_OPTION ("-clipupdates")) { DWORD dwNumBoxes = 0; /* Display the usage message if the argument is malformed */ if (++i >= argc) { UseMsg (); return 0; } /* Grab the argument */ dwNumBoxes = atoi (argv[i]); screenInfoPtr->dwClipUpdatesNBoxes = dwNumBoxes; /* Indicate that we have processed the argument */ return 2; } #ifdef XWIN_EMULATEPSEUDO /* * Look for the '-emulatepseudo' argument */ if (IS_OPTION ("-emulatepseudo")) { screenInfoPtr->fEmulatePseudo = TRUE; /* Indicate that we have processed this argument */ return 1; } #endif /* * Look for the '-nowinkill' argument */ if (IS_OPTION ("-nowinkill")) { screenInfoPtr->fUseWinKillKey = FALSE; /* Indicate that we have processed this argument */ return 1; } /* * Look for the '-winkill' argument */ if (IS_OPTION ("-winkill")) { screenInfoPtr->fUseWinKillKey = TRUE; /* Indicate that we have processed this argument */ return 1; } /* * Look for the '-nounixkill' argument */ if (IS_OPTION ("-nounixkill")) { screenInfoPtr->fUseUnixKillKey = FALSE; /* Indicate that we have processed this argument */ return 1; } /* * Look for the '-unixkill' argument */ if (IS_OPTION ("-unixkill")) { screenInfoPtr->fUseUnixKillKey = TRUE; /* Indicate that we have processed this argument */ return 1; } /* * Look for the '-notrayicon' argument */ if (IS_OPTION ("-notrayicon")) { screenInfoPtr->fNoTrayIcon = TRUE; /* Indicate that we have processed this argument */ return 1; } /* * Look for the '-trayicon' argument */ if (IS_OPTION ("-trayicon")) { screenInfoPtr->fNoTrayIcon = FALSE; /* Indicate that we have processed this argument */ return 1; } /* * Look for the '-fp' argument */ if (IS_OPTION ("-fp")) { CHECK_ARGS (1); g_cmdline.fontPath = argv[++i]; return 0; /* Let DIX parse this again */ } /* * Look for the '-query' argument */ if (IS_OPTION ("-query")) { CHECK_ARGS (1); g_fXdmcpEnabled = TRUE; g_pszQueryHost = argv[++i]; return 0; /* Let DIX parse this again */ } /* * Look for the '-auth' argument */ if (IS_OPTION ("-auth")) { g_fAuthEnabled = TRUE; return 0; /* Let DIX parse this again */ } /* * Look for the '-indirect' or '-broadcast' arguments */ if (IS_OPTION ("-indirect") || IS_OPTION ("-broadcast")) { g_fXdmcpEnabled = TRUE; return 0; /* Let DIX parse this again */ } /* * Look for the '-config' argument */ if (IS_OPTION ("-config") || IS_OPTION ("-xf86config")) { CHECK_ARGS (1); #ifdef XWIN_XF86CONFIG g_cmdline.configFile = argv[++i]; #else winMessageBoxF ("The %s option is not supported in this " "release.\n" "Ignoring this option and continuing.\n", MB_ICONINFORMATION, argv[i]); #endif return 2; } /* * Look for the '-configdir' argument */ if (IS_OPTION ("-configdir")) { CHECK_ARGS (1); #ifdef XWIN_XF86CONFIG g_cmdline.configDir = argv[++i]; #else winMessageBoxF ("The %s option is not supported in this " "release.\n" "Ignoring this option and continuing.\n", MB_ICONINFORMATION, argv[i]); #endif return 2; } /* * Look for the '-keyboard' argument */ if (IS_OPTION ("-keyboard")) { #ifdef XWIN_XF86CONFIG CHECK_ARGS (1); g_cmdline.keyboard = argv[++i]; #else winMessageBoxF ("The -keyboard option is not supported in this " "release.\n" "Ignoring this option and continuing.\n", MB_ICONINFORMATION); #endif return 2; } /* * Look for the '-logfile' argument */ if (IS_OPTION ("-logfile")) { CHECK_ARGS (1); g_pszLogFile = argv[++i]; #ifdef RELOCATE_PROJECTROOT g_fLogFileChanged = TRUE; #endif return 2; } /* * Look for the '-logverbose' argument */ if (IS_OPTION ("-logverbose")) { CHECK_ARGS (1); g_iLogVerbose = atoi(argv[++i]); return 2; } #ifdef XWIN_CLIPBOARD /* * Look for the '-nounicodeclipboard' argument */ if (IS_OPTION ("-nounicodeclipboard")) { g_fUnicodeClipboard = FALSE; /* Indicate that we have processed the argument */ return 1; } #endif if (IS_OPTION ("-xkbrules")) { CHECK_ARGS (1); g_cmdline.xkbRules = argv[++i]; return 2; } if (IS_OPTION ("-xkbmodel")) { CHECK_ARGS (1); g_cmdline.xkbModel = argv[++i]; return 2; } if (IS_OPTION ("-xkblayout")) { CHECK_ARGS (1); g_cmdline.xkbLayout = argv[++i]; return 2; } if (IS_OPTION ("-xkbvariant")) { CHECK_ARGS (1); g_cmdline.xkbVariant = argv[++i]; return 2; } if (IS_OPTION ("-xkboptions")) { CHECK_ARGS (1); g_cmdline.xkbOptions = argv[++i]; return 2; } if (IS_OPTION ("-keyhook")) { g_fKeyboardHookLL = TRUE; return 1; } if (IS_OPTION ("-nokeyhook")) { g_fKeyboardHookLL = FALSE; return 1; } if (IS_OPTION ("-swcursor")) { g_fSoftwareCursor = TRUE; return 1; } if (IS_OPTION ("-silent-dup-error")) { g_fSilentDupError = TRUE; return 1; } if (IS_OPTION("-wgl")) { g_fNativeGl = TRUE; return 1; } if (IS_OPTION("-nowgl")) { g_fNativeGl = FALSE; return 1; } return 0; }
static Bool winQueryRGBBitsAndMasks (ScreenPtr pScreen) { winScreenPriv(pScreen); BITMAPINFOHEADER *pbmih = NULL; Bool fReturn = TRUE; LPDWORD pdw = NULL; DWORD dwRedBits, dwGreenBits, dwBlueBits; /* Color masks for 8 bpp are standardized */ if (GetDeviceCaps (pScreenPriv->hdcScreen, RASTERCAPS) & RC_PALETTE) { /* * RGB BPP for 8 bit palletes is always 8 * and the color masks are always 0. */ pScreenPriv->dwBitsPerRGB = 8; pScreenPriv->dwRedMask = 0x0L; pScreenPriv->dwGreenMask = 0x0L; pScreenPriv->dwBlueMask = 0x0L; return TRUE; } /* Color masks for 24 bpp are standardized */ if (GetDeviceCaps (pScreenPriv->hdcScreen, PLANES) * GetDeviceCaps (pScreenPriv->hdcScreen, BITSPIXEL) == 24) { ErrorF ("winQueryRGBBitsAndMasks - GetDeviceCaps (BITSPIXEL) " "returned 24 for the screen. Using default 24bpp masks.\n"); /* 8 bits per primary color */ pScreenPriv->dwBitsPerRGB = 8; /* Set screen privates masks */ pScreenPriv->dwRedMask = WIN_24BPP_MASK_RED; pScreenPriv->dwGreenMask = WIN_24BPP_MASK_GREEN; pScreenPriv->dwBlueMask = WIN_24BPP_MASK_BLUE; return TRUE; } /* Allocate a bitmap header and color table */ pbmih = (BITMAPINFOHEADER*) malloc (sizeof (BITMAPINFOHEADER) + 256 * sizeof (RGBQUAD)); if (pbmih == NULL) { ErrorF ("winQueryRGBBitsAndMasks - malloc failed\n"); return FALSE; } /* Get screen description */ if (winQueryScreenDIBFormat (pScreen, pbmih)) { /* Get a pointer to bitfields */ pdw = (DWORD*) ((CARD8*)pbmih + sizeof (BITMAPINFOHEADER)); #if CYGDEBUG winDebug ("%s - Masks: %08x %08x %08x\n", __FUNCTION__, pdw[0], pdw[1], pdw[2]); winDebug ("%s - Bitmap: %dx%d %d bpp %d planes\n", __FUNCTION__, pbmih->biWidth, pbmih->biHeight, pbmih->biBitCount, pbmih->biPlanes); winDebug ("%s - Compression: %d %s\n", __FUNCTION__, pbmih->biCompression, (pbmih->biCompression == BI_RGB?"(BI_RGB)": (pbmih->biCompression == BI_RLE8?"(BI_RLE8)": (pbmih->biCompression == BI_RLE4?"(BI_RLE4)": (pbmih->biCompression == BI_BITFIELDS?"(BI_BITFIELDS)":"" ))))); #endif /* Handle BI_RGB case, which is returned by Wine */ if (pbmih->biCompression == BI_RGB) { dwRedBits = 5; dwGreenBits = 5; dwBlueBits = 5; pScreenPriv->dwBitsPerRGB = 5; /* Set screen privates masks */ pScreenPriv->dwRedMask = 0x7c00; pScreenPriv->dwGreenMask = 0x03e0; pScreenPriv->dwBlueMask = 0x001f; } else { /* Count the number of bits in each mask */ dwRedBits = winCountBits (pdw[0]); dwGreenBits = winCountBits (pdw[1]); dwBlueBits = winCountBits (pdw[2]); /* Find maximum bits per red, green, blue */ if (dwRedBits > dwGreenBits && dwRedBits > dwBlueBits) pScreenPriv->dwBitsPerRGB = dwRedBits; else if (dwGreenBits > dwRedBits && dwGreenBits > dwBlueBits) pScreenPriv->dwBitsPerRGB = dwGreenBits; else pScreenPriv->dwBitsPerRGB = dwBlueBits; /* Set screen privates masks */ pScreenPriv->dwRedMask = pdw[0]; pScreenPriv->dwGreenMask = pdw[1]; pScreenPriv->dwBlueMask = pdw[2]; } } else { ErrorF ("winQueryRGBBitsAndMasks - winQueryScreenDIBFormat failed\n"); free (pbmih); fReturn = FALSE; } /* Free memory */ free (pbmih); return fReturn; }
/* See Porting Layer Definition - p. 20 */ Bool winFinishScreenInitFB (int index, ScreenPtr pScreen, int argc, char **argv) { winScreenPriv(pScreen); winScreenInfo *pScreenInfo = pScreenPriv->pScreenInfo; VisualPtr pVisual = NULL; char *pbits = NULL; #if defined(XWIN_CLIPBOARD) || defined(XWIN_MULTIWINDOW) int iReturn; #endif /* Create framebuffer */ if (!(*pScreenPriv->pwinAllocateFB) (pScreen)) { ErrorF ("winFinishScreenInitFB - Could not allocate framebuffer\n"); return FALSE; } /* * Grab the number of bits that are used to represent color in each pixel. */ if (pScreenInfo->dwBPP == 8) pScreenInfo->dwDepth = 8; else pScreenInfo->dwDepth = winCountBits (pScreenPriv->dwRedMask) + winCountBits (pScreenPriv->dwGreenMask) + winCountBits (pScreenPriv->dwBlueMask); winErrorFVerb (2, "winFinishScreenInitFB - Masks: %08x %08x %08x\n", (unsigned int) pScreenPriv->dwRedMask, (unsigned int) pScreenPriv->dwGreenMask, (unsigned int) pScreenPriv->dwBlueMask); /* Init visuals */ if (!(*pScreenPriv->pwinInitVisuals) (pScreen)) { ErrorF ("winFinishScreenInitFB - winInitVisuals failed\n"); return FALSE; } /* Setup a local variable to point to the framebuffer */ pbits = pScreenInfo->pfb; /* Apparently we need this for the render extension */ miSetPixmapDepths (); /* Start fb initialization */ if (!fbSetupScreen (pScreen, pScreenInfo->pfb, pScreenInfo->dwWidth, pScreenInfo->dwHeight, monitorResolution, monitorResolution, pScreenInfo->dwStride, pScreenInfo->dwBPP)) { ErrorF ("winFinishScreenInitFB - fbSetupScreen failed\n"); return FALSE; } /* Override default colormap routines if visual class is dynamic */ if (pScreenInfo->dwDepth == 8 && (pScreenInfo->dwEngine == WIN_SERVER_SHADOW_GDI || (pScreenInfo->dwEngine == WIN_SERVER_SHADOW_DDNL && pScreenInfo->fFullScreen) || (pScreenInfo->dwEngine == WIN_SERVER_SHADOW_DD && pScreenInfo->fFullScreen))) { winSetColormapFunctions (pScreen); /* * NOTE: Setting whitePixel to 255 causes Magic 7.1 to allocate its * own colormap, as it cannot allocate 7 planes in the default * colormap. Setting whitePixel to 1 allows Magic to get 7 * planes in the default colormap, so it doesn't create its * own colormap. This latter situation is highly desireable, * as it keeps the Magic window viewable when switching to * other X clients that use the default colormap. */ pScreen->blackPixel = 0; pScreen->whitePixel = 1; } /* Place our save screen function */ pScreen->SaveScreen = winSaveScreen; /* Finish fb initialization */ if (!fbFinishScreenInit (pScreen, pScreenInfo->pfb, pScreenInfo->dwWidth, pScreenInfo->dwHeight, monitorResolution, monitorResolution, pScreenInfo->dwStride, pScreenInfo->dwBPP)) { ErrorF ("winFinishScreenInitFB - fbFinishScreenInit failed\n"); return FALSE; } /* Save a pointer to the root visual */ for (pVisual = pScreen->visuals; pVisual->vid != pScreen->rootVisual; pVisual++); pScreenPriv->pRootVisual = pVisual; /* * Setup points to the block and wakeup handlers. Pass a pointer * to the current screen as pWakeupdata. */ pScreen->BlockHandler = winBlockHandler; pScreen->WakeupHandler = winWakeupHandler; pScreen->blockData = pScreen; pScreen->wakeupData = pScreen; /* Render extension initialization, calls miPictureInit */ if (!fbPictureInit (pScreen, NULL, 0)) { ErrorF ("winFinishScreenInitFB - fbPictureInit () failed\n"); return FALSE; } #ifdef RANDR /* Initialize resize and rotate support */ if (!winRandRInit (pScreen)) { ErrorF ("winFinishScreenInitFB - winRandRInit () failed\n"); return FALSE; } #endif /* * Backing store support should reduce network traffic and increase * performance. */ miInitializeBackingStore (pScreen); /* KDrive does miDCInitialize right after miInitializeBackingStore */ /* Setup the cursor routines */ #if CYGDEBUG winDebug ("winFinishScreenInitFB - Calling miDCInitialize ()\n"); #endif miDCInitialize (pScreen, &g_winPointerCursorFuncs); /* KDrive does winCreateDefColormap right after miDCInitialize */ /* Create a default colormap */ #if CYGDEBUG winDebug ("winFinishScreenInitFB - Calling winCreateDefColormap ()\n"); #endif if (!winCreateDefColormap (pScreen)) { ErrorF ("winFinishScreenInitFB - Could not create colormap\n"); return FALSE; } /* Initialize the shadow framebuffer layer */ if ((pScreenInfo->dwEngine == WIN_SERVER_SHADOW_GDI || pScreenInfo->dwEngine == WIN_SERVER_SHADOW_DD || pScreenInfo->dwEngine == WIN_SERVER_SHADOW_DDNL) #ifdef XWIN_MULTIWINDOWEXTWM && !pScreenInfo->fMWExtWM #endif ) { #if CYGDEBUG winDebug ("winFinishScreenInitFB - Calling shadowSetup ()\n"); #endif if (!shadowSetup(pScreen)) { ErrorF ("winFinishScreenInitFB - shadowSetup () failed\n"); return FALSE; } /* Wrap CreateScreenResources so we can add the screen pixmap to the Shadow framebuffer after it's been created */ pScreenPriv->pwinCreateScreenResources = pScreen->CreateScreenResources; pScreen->CreateScreenResources = winCreateScreenResources; } #ifdef XWIN_MULTIWINDOWEXTWM /* Handle multi-window external window manager mode */ if (pScreenInfo->fMWExtWM) { winDebug ("winScreenInit - MultiWindowExtWM - Calling RootlessInit\n"); RootlessInit(pScreen, &winMWExtWMProcs); winDebug ("winScreenInit - MultiWindowExtWM - RootlessInit returned\n"); rootless_CopyBytes_threshold = 0; /* FIXME: How many? Profiling needed? */ rootless_CopyWindow_threshold = 1; winWindowsWMExtensionInit (); } #endif /* Handle rootless mode */ if (pScreenInfo->fRootless) { /* Define the WRAP macro temporarily for local use */ #define WRAP(a) \ if (pScreen->a) { \ pScreenPriv->a = pScreen->a; \ } else { \ ErrorF("null screen fn " #a "\n"); \ pScreenPriv->a = NULL; \ } /* Save a pointer to each lower-level window procedure */ WRAP(CreateWindow); WRAP(DestroyWindow); WRAP(RealizeWindow); WRAP(UnrealizeWindow); WRAP(PositionWindow); WRAP(ChangeWindowAttributes); WRAP(SetShape); /* Assign rootless window procedures to be top level procedures */ pScreen->CreateWindow = winCreateWindowRootless; pScreen->DestroyWindow = winDestroyWindowRootless; pScreen->PositionWindow = winPositionWindowRootless; /*pScreen->ChangeWindowAttributes = winChangeWindowAttributesRootless;*/ pScreen->RealizeWindow = winMapWindowRootless; pScreen->UnrealizeWindow = winUnmapWindowRootless; pScreen->SetShape = winSetShapeRootless; /* Undefine the WRAP macro, as it is not needed elsewhere */ #undef WRAP } #ifdef XWIN_MULTIWINDOW /* Handle multi window mode */ else if (pScreenInfo->fMultiWindow) { /* Define the WRAP macro temporarily for local use */ #define WRAP(a) \ if (pScreen->a) { \ pScreenPriv->a = pScreen->a; \ } else { \ ErrorF("null screen fn " #a "\n"); \ pScreenPriv->a = NULL; \ } /* Save a pointer to each lower-level window procedure */ WRAP(CreateWindow); WRAP(DestroyWindow); WRAP(RealizeWindow); WRAP(UnrealizeWindow); WRAP(PositionWindow); WRAP(ChangeWindowAttributes); WRAP(ReparentWindow); WRAP(RestackWindow); WRAP(ResizeWindow); WRAP(MoveWindow); WRAP(CopyWindow); WRAP(SetShape); /* Assign multi-window window procedures to be top level procedures */ pScreen->CreateWindow = winCreateWindowMultiWindow; pScreen->DestroyWindow = winDestroyWindowMultiWindow; pScreen->PositionWindow = winPositionWindowMultiWindow; /*pScreen->ChangeWindowAttributes = winChangeWindowAttributesMultiWindow;*/ pScreen->RealizeWindow = winMapWindowMultiWindow; pScreen->UnrealizeWindow = winUnmapWindowMultiWindow; pScreen->ReparentWindow = winReparentWindowMultiWindow; pScreen->RestackWindow = winRestackWindowMultiWindow; pScreen->ResizeWindow = winResizeWindowMultiWindow; pScreen->MoveWindow = winMoveWindowMultiWindow; pScreen->CopyWindow = winCopyWindowMultiWindow; pScreen->SetShape = winSetShapeMultiWindow; /* Undefine the WRAP macro, as it is not needed elsewhere */ #undef WRAP } #endif /* Wrap either fb's or shadow's CloseScreen with our CloseScreen */ pScreenPriv->CloseScreen = pScreen->CloseScreen; pScreen->CloseScreen = pScreenPriv->pwinCloseScreen; #if defined(XWIN_CLIPBOARD) || defined(XWIN_MULTIWINDOW) /* Create a mutex for modules in separate threads to wait for */ iReturn = pthread_mutex_init (&pScreenPriv->pmServerStarted, NULL); if (iReturn != 0) { ErrorF ("winFinishScreenInitFB - pthread_mutex_init () failed: %d\n", iReturn); return FALSE; } /* Own the mutex for modules in separate threads */ iReturn = pthread_mutex_lock (&pScreenPriv->pmServerStarted); if (iReturn != 0) { ErrorF ("winFinishScreenInitFB - pthread_mutex_lock () failed: %d\n", iReturn); return FALSE; } /* Set the ServerStarted flag to false */ pScreenPriv->fServerStarted = FALSE; #endif #ifdef XWIN_MULTIWINDOWEXTWM pScreenPriv->fRestacking = FALSE; #endif #if defined(XWIN_MULTIWINDOW) || defined(XWIN_MULTIWINDOWEXTWM) if (FALSE #ifdef XWIN_MULTIWINDOW || pScreenInfo->fMultiWindow #endif #ifdef XWIN_MULTIWINDOWEXTWM || pScreenInfo->fInternalWM #endif ) { #if CYGDEBUG || YES winDebug ("winFinishScreenInitFB - Calling winInitWM.\n"); #endif /* Initialize multi window mode */ if (!winInitWM (&pScreenPriv->pWMInfo, &pScreenPriv->ptWMProc, &pScreenPriv->ptXMsgProc, &pScreenPriv->pmServerStarted, pScreenInfo->dwScreen, (HWND)&pScreenPriv->hwndScreen, #ifdef XWIN_MULTIWINDOWEXTWM pScreenInfo->fInternalWM || #endif FALSE)) { ErrorF ("winFinishScreenInitFB - winInitWM () failed.\n"); return FALSE; } } #endif /* Tell the server that we are enabled */ pScreenPriv->fEnabled = TRUE; /* Tell the server that we have a valid depth */ pScreenPriv->fBadDepth = FALSE; #if CYGDEBUG || YES winDebug ("winFinishScreenInitFB - returning\n"); #endif return TRUE; }
Bool winInitVisualsPrimaryDD (ScreenPtr pScreen) { winScreenPriv(pScreen); winScreenInfo *pScreenInfo = pScreenPriv->pScreenInfo; DWORD dwRedBits, dwGreenBits, dwBlueBits; /* Count the number of ones in each color mask */ dwRedBits = winCountBits (pScreenPriv->dwRedMask); dwGreenBits = winCountBits (pScreenPriv->dwGreenMask); dwBlueBits = winCountBits (pScreenPriv->dwBlueMask); /* Store the maximum number of ones in a color mask as the bitsPerRGB */ if (dwRedBits > dwGreenBits && dwRedBits > dwBlueBits) pScreenPriv->dwBitsPerRGB = dwRedBits; else if (dwGreenBits > dwRedBits && dwGreenBits > dwBlueBits) pScreenPriv->dwBitsPerRGB = dwGreenBits; else pScreenPriv->dwBitsPerRGB = dwBlueBits; ErrorF ("winInitVisualsPrimaryDD - Masks: %08x %08x %08x bpRGB: %d\n", pScreenPriv->dwRedMask, pScreenPriv->dwGreenMask, pScreenPriv->dwBlueMask, pScreenPriv->dwBitsPerRGB); /* Create a single visual according to the Windows screen depth */ switch (pScreenInfo->dwDepth) { case 24: case 16: case 15: if (!miSetVisualTypesAndMasks (pScreenInfo->dwDepth, TrueColorMask, pScreenPriv->dwBitsPerRGB, TrueColor, pScreenPriv->dwRedMask, pScreenPriv->dwGreenMask, pScreenPriv->dwBlueMask)) { ErrorF ("winInitVisualsPrimaryDD - " "miSetVisualTypesAndMasks failed\n"); return FALSE; } break; case 8: #if CYGDEBUG ErrorF ("winInitVisuals - Calling miSetVisualTypesAndMasks\n"); #endif /* CYGDEBUG */ if (!miSetVisualTypesAndMasks (pScreenInfo->dwDepth, PseudoColorMask, pScreenPriv->dwBitsPerRGB, PseudoColor, pScreenPriv->dwRedMask, pScreenPriv->dwGreenMask, pScreenPriv->dwBlueMask)) { ErrorF ("winInitVisualsPrimaryDD - " "miSetVisualTypesAndMasks failed\n"); return FALSE; } #if CYGDEBUG ErrorF ("winInitVisualsPrimaryDD - Returned from " "miSetVisualTypesAndMasks\n"); #endif /* CYGDEBUG */ break; default: ErrorF ("winInitVisualsPrimaryDD - Unknown screen depth\n"); return FALSE; } ErrorF ("winInitVisualsPrimaryDD - Returning\n"); return TRUE; }
static Bool winQueryRGBBitsAndMasks (ScreenPtr pScreen) { winScreenPriv(pScreen); BITMAPINFOHEADER *pbmih = NULL; Bool fReturn = TRUE; LPDWORD pdw = NULL; DWORD dwRedBits, dwGreenBits, dwBlueBits; /* Color masks for 8 bpp are standardized */ if (GetDeviceCaps (pScreenPriv->hdcScreen, RASTERCAPS) & RC_PALETTE) { /* * RGB BPP for 8 bit palletes is always 8 * and the color masks are always 0. */ pScreenPriv->dwBitsPerRGB = 8; pScreenPriv->dwRedMask = 0x0L; pScreenPriv->dwGreenMask = 0x0L; pScreenPriv->dwBlueMask = 0x0L; return TRUE; } /* Color masks for 24 bpp are standardized */ if (GetDeviceCaps (pScreenPriv->hdcScreen, PLANES) * GetDeviceCaps (pScreenPriv->hdcScreen, BITSPIXEL) == 24) { ErrorF ("winQueryRGBBitsAndMasks - GetDeviceCaps (BITSPIXEL) " "returned 24 for the screen. Using default 24bpp masks.\n"); /* 8 bits per primary color */ pScreenPriv->dwBitsPerRGB = 8; /* Set screen privates masks */ pScreenPriv->dwRedMask = WIN_24BPP_MASK_RED; pScreenPriv->dwGreenMask = WIN_24BPP_MASK_GREEN; pScreenPriv->dwBlueMask = WIN_24BPP_MASK_BLUE; return TRUE; } /* Allocate a bitmap header and color table */ pbmih = (BITMAPINFOHEADER*) malloc (sizeof (BITMAPINFOHEADER) + 256 * sizeof (RGBQUAD)); if (pbmih == NULL) { ErrorF ("winQueryRGBBitsAndMasks - malloc failed\n"); return FALSE; } /* Get screen description */ if (winQueryScreenDIBFormat (pScreen, pbmih)) { /* Get a pointer to bitfields */ pdw = (DWORD*) ((CARD8*)pbmih + sizeof (BITMAPINFOHEADER)); #if CYGDEBUG ErrorF ("winQueryRGBBitsAndMasks - Masks: %08x %08x %08x\n", pdw[0], pdw[1], pdw[2]); #endif /* Count the number of bits in each mask */ dwRedBits = winCountBits (pdw[0]); dwGreenBits = winCountBits (pdw[1]); dwBlueBits = winCountBits (pdw[2]); /* Find maximum bits per red, green, blue */ if (dwRedBits > dwGreenBits && dwRedBits > dwBlueBits) pScreenPriv->dwBitsPerRGB = dwRedBits; else if (dwGreenBits > dwRedBits && dwGreenBits > dwBlueBits) pScreenPriv->dwBitsPerRGB = dwGreenBits; else pScreenPriv->dwBitsPerRGB = dwBlueBits; /* Set screen privates masks */ pScreenPriv->dwRedMask = pdw[0]; pScreenPriv->dwGreenMask = pdw[1]; pScreenPriv->dwBlueMask = pdw[2]; } else { ErrorF ("winQueryRGBBitsAndMasks - winQueryScreenDIBFormat failed\n"); free (pbmih); fReturn = FALSE; } /* Free memory */ free (pbmih); return fReturn; }