/* Copyright 1993, 1998 The Open Group Copyright (C) Colin Harrison 2005-2008 Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted without fee, provided that the above copyright notice appear in all copies and that both that copyright notice and this permission notice appear in supporting documentation. The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the name of The Open Group shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization from The Open Group. */ #ifdef HAVE_XWIN_CONFIG_H #include #endif #ifdef HAVE_SYS_UTSNAME_H #include #endif #include <../xfree86/common/xorgVersion.h> #include "win.h" #include "winconfig.h" #include "winmsg.h" #include "winmonitors.h" /* * References to external symbols */ #ifdef XWIN_CLIPBOARD extern Bool g_fUnicodeClipboard; extern Bool g_fClipboard; #include "winclipboard/winclipboard.h" #endif /* * Function prototypes */ void winLogCommandLine(int argc, char *argv[]); void winLogVersionInfo(void); /* * Process arguments on the command line */ static int iLastScreen = -1; static winScreenInfo defaultScreenInfo; static void winInitializeScreenDefaults(void) { DWORD dwWidth, dwHeight; static Bool fInitializedScreenDefaults = FALSE; /* Bail out early if default screen has already been initialized */ if (fInitializedScreenDefaults) return; /* Zero the memory used for storing the screen info */ memset(&defaultScreenInfo, 0, sizeof(winScreenInfo)); /* Get default width and height */ /* * NOTE: These defaults will cause the window to cover only * the primary monitor in the case that we have multiple monitors. */ dwWidth = GetSystemMetrics(SM_CXSCREEN); dwHeight = GetSystemMetrics(SM_CYSCREEN); winErrorFVerb(2, "winInitializeScreenDefaults - primary monitor w %d h %d\n", (int) dwWidth, (int) dwHeight); /* Set a default DPI, if no '-dpi' option was used */ if (monitorResolution == 0) { HDC hdc = GetDC(NULL); if (hdc) { int dpiX = GetDeviceCaps(hdc, LOGPIXELSX); int dpiY = GetDeviceCaps(hdc, LOGPIXELSY); winErrorFVerb(2, "winInitializeScreenDefaults - native DPI x %d y %d\n", dpiX, dpiY); monitorResolution = dpiY; ReleaseDC(NULL, hdc); } else { winErrorFVerb(1, "winInitializeScreenDefaults - Failed to retrieve native DPI, falling back to default of %d DPI\n", WIN_DEFAULT_DPI); monitorResolution = WIN_DEFAULT_DPI; } } defaultScreenInfo.iMonitor = 1; defaultScreenInfo.hMonitor = MonitorFromWindow(NULL, MONITOR_DEFAULTTOPRIMARY); defaultScreenInfo.dwWidth = dwWidth; defaultScreenInfo.dwHeight = dwHeight; defaultScreenInfo.dwUserWidth = dwWidth; defaultScreenInfo.dwUserHeight = dwHeight; defaultScreenInfo.fUserGaveHeightAndWidth = WIN_DEFAULT_USER_GAVE_HEIGHT_AND_WIDTH; defaultScreenInfo.fUserGavePosition = FALSE; defaultScreenInfo.dwBPP = WIN_DEFAULT_BPP; defaultScreenInfo.dwClipUpdatesNBoxes = WIN_DEFAULT_CLIP_UPDATES_NBOXES; #ifdef XWIN_EMULATEPSEUDO defaultScreenInfo.fEmulatePseudo = WIN_DEFAULT_EMULATE_PSEUDO; #endif defaultScreenInfo.dwRefreshRate = WIN_DEFAULT_REFRESH; defaultScreenInfo.pfb = NULL; defaultScreenInfo.fFullScreen = FALSE; defaultScreenInfo.fDecoration = TRUE; #ifdef XWIN_MULTIWINDOWEXTWM defaultScreenInfo.fMWExtWM = FALSE; defaultScreenInfo.fInternalWM = FALSE; #endif defaultScreenInfo.fRootless = FALSE; #ifdef XWIN_MULTIWINDOW defaultScreenInfo.fMultiWindow = FALSE; #endif #if defined(XWIN_MULTIWINDOW) || defined(XWIN_MULTIWINDOWEXTWM) defaultScreenInfo.fMultiMonitorOverride = FALSE; #endif defaultScreenInfo.fMultipleMonitors = FALSE; defaultScreenInfo.fLessPointer = FALSE; defaultScreenInfo.iResizeMode = resizeWithRandr; defaultScreenInfo.fNoTrayIcon = FALSE; defaultScreenInfo.iE3BTimeout = WIN_E3B_DEFAULT; defaultScreenInfo.fUseWinKillKey = WIN_DEFAULT_WIN_KILL; defaultScreenInfo.fUseUnixKillKey = WIN_DEFAULT_UNIX_KILL; defaultScreenInfo.fIgnoreInput = FALSE; defaultScreenInfo.fExplicitScreen = FALSE; /* Note that the default screen has been initialized */ fInitializedScreenDefaults = TRUE; } static void winInitializeScreen(int i) { winErrorFVerb(3, "winInitializeScreen - %d\n", i); /* Initialize default screen values, if needed */ winInitializeScreenDefaults(); /* Copy the default screen info */ g_ScreenInfo[i] = defaultScreenInfo; /* Set the screen number */ g_ScreenInfo[i].dwScreen = i; } void winInitializeScreens(int maxscreens) { int i; winErrorFVerb(3, "winInitializeScreens - %i\n", maxscreens); if (maxscreens > g_iNumScreens) { /* Reallocate the memory for DDX-specific screen info */ g_ScreenInfo = realloc(g_ScreenInfo, maxscreens * sizeof(winScreenInfo)); /* Set default values for any new screens */ for (i = g_iNumScreens; i < maxscreens; i++) winInitializeScreen(i); /* Keep a count of the number of screens */ g_iNumScreens = maxscreens; } } /* See Porting Layer Definition - p. 57 */ /* * INPUT * argv: pointer to an array of null-terminated strings, one for * each token in the X Server command line; the first token * is 'XWin.exe', or similar. * argc: a count of the number of tokens stored in argv. * i: a zero-based index into argv indicating the current token being * processed. * * OUTPUT * return: return the number of tokens processed correctly. * * NOTE * When looking for n tokens, check that i + n is less than argc. Or, * you may check if i is greater than or equal to argc, in which case * you should display the UseMsg () and return 0. */ /* Check if enough arguments are given for the option */ #define CHECK_ARGS(count) if (i + count >= argc) { UseMsg (); return 0; } /* Compare the current option with the string. */ #define IS_OPTION(name) (strcmp (argv[i], name) == 0) 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 failed\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].iMonitor = iMonitor; g_ScreenInfo[nScreenNum].hMonitor = data.monitorHandle; 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 failed\n"); } else if (data.bMonitorSpecifiedExists == TRUE) { g_ScreenInfo[nScreenNum].iMonitor = iMonitor; g_ScreenInfo[nScreenNum].hMonitor = data.monitorHandle; 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 failed\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].iMonitor = iMonitor; g_ScreenInfo[nScreenNum].hMonitor = data.monitorHandle; 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; } /* 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->iResizeMode = resizeWithScrollbars; /* Indicate that we have processed this argument */ return 1; } /* * Look for the '-resize' argument */ if (IS_OPTION("-resize") || IS_OPTION("-noresize") || (strncmp(argv[i], "-resize=", strlen("-resize=")) == 0)) { winResizeMode mode; if (IS_OPTION("-resize")) mode = resizeWithRandr; else if (IS_OPTION("-noresize")) mode = notAllowed; else if (strncmp(argv[i], "-resize=", strlen("-resize=")) == 0) { char *option = argv[i] + strlen("-resize="); if (strcmp(option, "randr") == 0) mode = resizeWithRandr; else if (strcmp(option, "scrollbars") == 0) mode = resizeWithScrollbars; else if (strcmp(option, "none") == 0) mode = notAllowed; else { ErrorF("ddxProcessArgument - resize - Invalid resize mode %s\n", option); return 0; } } else { ErrorF("ddxProcessArgument - resize - Invalid resize option %s\n", argv[i]); return 0; } screenInfoPtr->iResizeMode = mode; /* 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; } /* * Look for the '-primary' argument */ if (IS_OPTION("-primary")) { fPrimarySelection = TRUE; /* Indicate that we have processed this argument */ return 1; } /* * Look for the '-noprimary' argument */ if (IS_OPTION("-noprimary")) { fPrimarySelection = 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 '-noemulate3buttons' argument */ if (IS_OPTION("-noemulate3buttons")) { screenInfoPtr->iE3BTimeout = WIN_E3B_OFF; /* Indicate that we have processed this argument */ return 1; } /* * 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 '-dpi' argument */ if (IS_OPTION("-dpi")) { g_cmdline.customDPI = 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; } if (IS_OPTION("-hostintitle")) { g_fHostInTitle = TRUE; return 1; } return 0; } /* * winLogCommandLine - Write entire command line to the log file */ void winLogCommandLine(int argc, char *argv[]) { int i; int iSize = 0; int iCurrLen = 0; #define CHARS_PER_LINE 60 /* Bail if command line has already been logged */ if (g_pszCommandLine) return; /* Count how much memory is needed for concatenated command line */ for (i = 0, iCurrLen = 0; i < argc; ++i) if (argv[i]) { /* Adds two characters for lines that overflow */ if ((strlen(argv[i]) < CHARS_PER_LINE && iCurrLen + strlen(argv[i]) > CHARS_PER_LINE) || strlen(argv[i]) > CHARS_PER_LINE) { iCurrLen = 0; iSize += 2; } /* Add space for item and trailing space */ iSize += strlen(argv[i]) + 1; /* Update current line length */ iCurrLen += strlen(argv[i]); } /* Allocate memory for concatenated command line */ g_pszCommandLine = malloc(iSize + 1); if (!g_pszCommandLine) FatalError("winLogCommandLine - Could not allocate memory for " "command line string. Exiting.\n"); /* Set first character to concatenated command line to null */ g_pszCommandLine[0] = '\0'; /* Loop through all args */ for (i = 0, iCurrLen = 0; i < argc; ++i) { /* Add a character for lines that overflow */ if ((strlen(argv[i]) < CHARS_PER_LINE && iCurrLen + strlen(argv[i]) > CHARS_PER_LINE) || strlen(argv[i]) > CHARS_PER_LINE) { iCurrLen = 0; /* Add line break if it fits */ strncat(g_pszCommandLine, "\n ", iSize - strlen(g_pszCommandLine)); } strncat(g_pszCommandLine, argv[i], iSize - strlen(g_pszCommandLine)); strncat(g_pszCommandLine, " ", iSize - strlen(g_pszCommandLine)); /* Save new line length */ iCurrLen += strlen(argv[i]); } ErrorF("XWin was started with the following command line:\n\n" "%s\n\n", g_pszCommandLine); } /* * Detect the OS */ typedef BOOL(WINAPI * LPFN_ISWOW64PROCESS) (HANDLE, PBOOL); static void winOS(void) { OSVERSIONINFOEX osvi = { 0 }; char *windowstype = "Unknown"; char *prodName = "Unknown"; char *isWow = "Unknown"; /* Get operating system version information */ osvi.dwOSVersionInfoSize = sizeof(osvi); GetVersionEx((LPOSVERSIONINFO) & osvi); /* Branch on platform ID */ switch (osvi.dwPlatformId) { case VER_PLATFORM_WIN32_NT: windowstype = "Windows NT"; if (osvi.dwMajorVersion <= 4) prodName = "Windows NT"; else if (osvi.dwMajorVersion == 6) { if (osvi.dwMinorVersion == 2) { if (osvi.wProductType == VER_NT_WORKSTATION) prodName = "Windows 8"; else prodName = "Windows Server 2012"; } else if (osvi.dwMinorVersion == 1) { if (osvi.wProductType == VER_NT_WORKSTATION) prodName = "Windows 7"; else prodName = "Windows Server 2008 R2"; } else if (osvi.dwMinorVersion == 0) { if (osvi.wProductType == VER_NT_WORKSTATION) prodName = "Windows Vista"; else prodName = "Windows Server 2008"; } } else if (osvi.dwMajorVersion == 5) { if (osvi.dwMinorVersion == 2) { if (GetSystemMetrics(SM_SERVERR2)) prodName = "Windows Server 2003 R2"; else prodName = "Windows Server 2003"; } else if (osvi.dwMinorVersion == 1) prodName = "Windows XP"; else if (osvi.dwMinorVersion == 0) { prodName = "Windows 2000"; break; } } break; case VER_PLATFORM_WIN32_WINDOWS: windowstype = "Windows"; break; } #ifdef __x86_64__ isWow = "(Win64)"; #else { /* Check if we are running under WoW64 */ LPFN_ISWOW64PROCESS fnIsWow64Process; fnIsWow64Process = (LPFN_ISWOW64PROCESS) GetProcAddress(GetModuleHandle("kernel32"), "IsWow64Process"); if (NULL != fnIsWow64Process) { wBOOL bIsWow64 = FALSE; if (fnIsWow64Process(GetCurrentProcess(), &bIsWow64)) { isWow = bIsWow64 ? " (WoW64)" : " (Win32)"; } else { /* IsWow64Process() failed */ isWow = " (WoWUnknown)"; } } else { /* OS doesn't support IsWow64Process() */ isWow = ""; } } #endif ErrorF("OS: %s %s [%s %d.%d build %d]%s\n", prodName, osvi.szCSDVersion, windowstype, (int)osvi.dwMajorVersion, (int)osvi.dwMinorVersion, (int)osvi.dwBuildNumber, isWow); } /* * winLogVersionInfo - Log version information */ void winLogVersionInfo(void) { static Bool s_fBeenHere = FALSE; if (s_fBeenHere) return; s_fBeenHere = TRUE; ErrorF("Welcome to the XWin X Server\n"); ErrorF("Vendor: %s\n", XVENDORNAME); ErrorF("Release: %d.%d.%d.%d\n", XORG_VERSION_MAJOR, XORG_VERSION_MINOR, XORG_VERSION_PATCH, XORG_VERSION_SNAP); #ifdef HAVE_SYS_UTSNAME_H { struct utsname name; if (uname(&name) >= 0) { ErrorF("OS: %s %s %s %s %s\n", name.sysname, name.nodename, name.release, name.version, name.machine); } } #endif winOS(); if (strlen(BUILDERSTRING)) ErrorF("%s\n", BUILDERSTRING); ErrorF("\n"); }