1/* 2 3Copyright 1993, 1998 The Open Group 4Copyright (C) Colin Harrison 2005-2008 5 6Permission to use, copy, modify, distribute, and sell this software and its 7documentation for any purpose is hereby granted without fee, provided that 8the above copyright notice appear in all copies and that both that 9copyright notice and this permission notice appear in supporting 10documentation. 11 12The above copyright notice and this permission notice shall be included 13in all copies or substantial portions of the Software. 14 15THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 16OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 17MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. 18IN NO EVENT SHALL THE OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR 19OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 20ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 21OTHER DEALINGS IN THE SOFTWARE. 22 23Except as contained in this notice, the name of The Open Group shall 24not be used in advertising or otherwise to promote the sale, use or 25other dealings in this Software without prior written authorization 26from The Open Group. 27 28*/ 29 30#ifdef HAVE_XWIN_CONFIG_H 31#include <xwin-config.h> 32#endif 33 34#ifdef HAVE_SYS_UTSNAME_H 35#include <sys/utsname.h> 36#endif 37 38#include <../xfree86/common/xorgVersion.h> 39#include "win.h" 40#include "winconfig.h" 41#include "winmsg.h" 42#include "winmonitors.h" 43#include "winprefs.h" 44 45#include "winclipboard/winclipboard.h" 46 47/* 48 * Function prototypes 49 */ 50 51void 52 winLogCommandLine(int argc, char *argv[]); 53 54void 55 winLogVersionInfo(void); 56 57/* 58 * Process arguments on the command line 59 */ 60 61static int iLastScreen = -1; 62static winScreenInfo defaultScreenInfo; 63 64static void 65winInitializeScreenDefaults(void) 66{ 67 DWORD dwWidth, dwHeight; 68 static Bool fInitializedScreenDefaults = FALSE; 69 70 /* Bail out early if default screen has already been initialized */ 71 if (fInitializedScreenDefaults) 72 return; 73 74 /* Zero the memory used for storing the screen info */ 75 memset(&defaultScreenInfo, 0, sizeof(winScreenInfo)); 76 77 /* Get default width and height */ 78 /* 79 * NOTE: These defaults will cause the window to cover only 80 * the primary monitor in the case that we have multiple monitors. 81 */ 82 dwWidth = GetSystemMetrics(SM_CXSCREEN); 83 dwHeight = GetSystemMetrics(SM_CYSCREEN); 84 85 winErrorFVerb(2, 86 "winInitializeScreenDefaults - primary monitor w %d h %d\n", 87 (int) dwWidth, (int) dwHeight); 88 89 /* Set a default DPI, if no '-dpi' option was used */ 90 if (monitorResolution == 0) { 91 HDC hdc = GetDC(NULL); 92 93 if (hdc) { 94 int dpiX = GetDeviceCaps(hdc, LOGPIXELSX); 95 int dpiY = GetDeviceCaps(hdc, LOGPIXELSY); 96 97 winErrorFVerb(2, 98 "winInitializeScreenDefaults - native DPI x %d y %d\n", 99 dpiX, dpiY); 100 101 monitorResolution = dpiY; 102 ReleaseDC(NULL, hdc); 103 } 104 else { 105 winErrorFVerb(1, 106 "winInitializeScreenDefaults - Failed to retrieve native DPI, falling back to default of %d DPI\n", 107 WIN_DEFAULT_DPI); 108 monitorResolution = WIN_DEFAULT_DPI; 109 } 110 } 111 112 defaultScreenInfo.iMonitor = 1; 113 defaultScreenInfo.hMonitor = MonitorFromWindow(NULL, MONITOR_DEFAULTTOPRIMARY); 114 defaultScreenInfo.dwWidth = dwWidth; 115 defaultScreenInfo.dwHeight = dwHeight; 116 defaultScreenInfo.dwUserWidth = dwWidth; 117 defaultScreenInfo.dwUserHeight = dwHeight; 118 defaultScreenInfo.fUserGaveHeightAndWidth = 119 WIN_DEFAULT_USER_GAVE_HEIGHT_AND_WIDTH; 120 defaultScreenInfo.fUserGavePosition = FALSE; 121 defaultScreenInfo.dwBPP = WIN_DEFAULT_BPP; 122 defaultScreenInfo.dwClipUpdatesNBoxes = WIN_DEFAULT_CLIP_UPDATES_NBOXES; 123#ifdef XWIN_EMULATEPSEUDO 124 defaultScreenInfo.fEmulatePseudo = WIN_DEFAULT_EMULATE_PSEUDO; 125#endif 126 defaultScreenInfo.dwRefreshRate = WIN_DEFAULT_REFRESH; 127 defaultScreenInfo.pfb = NULL; 128 defaultScreenInfo.fFullScreen = FALSE; 129 defaultScreenInfo.fDecoration = TRUE; 130 defaultScreenInfo.fRootless = FALSE; 131 defaultScreenInfo.fMultiWindow = FALSE; 132 defaultScreenInfo.fCompositeWM = TRUE; 133 defaultScreenInfo.fMultiMonitorOverride = FALSE; 134 defaultScreenInfo.fMultipleMonitors = FALSE; 135 defaultScreenInfo.fLessPointer = FALSE; 136 defaultScreenInfo.iResizeMode = resizeDefault; 137 defaultScreenInfo.fNoTrayIcon = FALSE; 138 defaultScreenInfo.iE3BTimeout = WIN_E3B_DEFAULT; 139 defaultScreenInfo.fUseWinKillKey = WIN_DEFAULT_WIN_KILL; 140 defaultScreenInfo.fUseUnixKillKey = WIN_DEFAULT_UNIX_KILL; 141 defaultScreenInfo.fIgnoreInput = FALSE; 142 defaultScreenInfo.fExplicitScreen = FALSE; 143 defaultScreenInfo.hIcon = (HICON) 144 LoadImage(GetModuleHandle(NULL), MAKEINTRESOURCE(IDI_XWIN), IMAGE_ICON, 145 GetSystemMetrics(SM_CXICON), GetSystemMetrics(SM_CYICON), 0); 146 defaultScreenInfo.hIconSm = (HICON) 147 LoadImage(GetModuleHandle(NULL), MAKEINTRESOURCE(IDI_XWIN), IMAGE_ICON, 148 GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CYSMICON), 149 LR_DEFAULTSIZE); 150 151 /* Note that the default screen has been initialized */ 152 fInitializedScreenDefaults = TRUE; 153} 154 155static void 156winInitializeScreen(int i) 157{ 158 winErrorFVerb(3, "winInitializeScreen - %d\n", i); 159 160 /* Initialize default screen values, if needed */ 161 winInitializeScreenDefaults(); 162 163 /* Copy the default screen info */ 164 g_ScreenInfo[i] = defaultScreenInfo; 165 166 /* Set the screen number */ 167 g_ScreenInfo[i].dwScreen = i; 168} 169 170void 171winInitializeScreens(int maxscreens) 172{ 173 int i; 174 175 winErrorFVerb(3, "winInitializeScreens - %i\n", maxscreens); 176 177 if (maxscreens > g_iNumScreens) { 178 /* Reallocate the memory for DDX-specific screen info */ 179 g_ScreenInfo = 180 realloc(g_ScreenInfo, maxscreens * sizeof(winScreenInfo)); 181 182 /* Set default values for any new screens */ 183 for (i = g_iNumScreens; i < maxscreens; i++) 184 winInitializeScreen(i); 185 186 /* Keep a count of the number of screens */ 187 g_iNumScreens = maxscreens; 188 } 189} 190 191/* See Porting Layer Definition - p. 57 */ 192/* 193 * INPUT 194 * argv: pointer to an array of null-terminated strings, one for 195 * each token in the X Server command line; the first token 196 * is 'XWin.exe', or similar. 197 * argc: a count of the number of tokens stored in argv. 198 * i: a zero-based index into argv indicating the current token being 199 * processed. 200 * 201 * OUTPUT 202 * return: return the number of tokens processed correctly. 203 * 204 * NOTE 205 * When looking for n tokens, check that i + n is less than argc. Or, 206 * you may check if i is greater than or equal to argc, in which case 207 * you should display the UseMsg () and return 0. 208 */ 209 210/* Check if enough arguments are given for the option */ 211#define CHECK_ARGS(count) if (i + count >= argc) { UseMsg (); return 0; } 212 213/* Compare the current option with the string. */ 214#define IS_OPTION(name) (strcmp (argv[i], name) == 0) 215 216int 217ddxProcessArgument(int argc, char *argv[], int i) 218{ 219 static Bool s_fBeenHere = FALSE; 220 winScreenInfo *screenInfoPtr = NULL; 221 222 /* Initialize once */ 223 if (!s_fBeenHere) { 224#ifdef DDXOSVERRORF 225 /* 226 * This initialises our hook into VErrorF () for catching log messages 227 * that are generated before OsInit () is called. 228 */ 229 OsVendorVErrorFProc = OsVendorVErrorF; 230#endif 231 232 s_fBeenHere = TRUE; 233 234 /* Initialize only if option is not -help */ 235 if (!IS_OPTION("-help") && !IS_OPTION("-h") && !IS_OPTION("--help") && 236 !IS_OPTION("-version") && !IS_OPTION("--version")) { 237 238 /* Log the version information */ 239 winLogVersionInfo(); 240 241 /* Log the command line */ 242 winLogCommandLine(argc, argv); 243 244 /* 245 * Initialize default screen settings. We have to do this before 246 * OsVendorInit () gets called, otherwise we will overwrite 247 * settings changed by parameters such as -fullscreen, etc. 248 */ 249 winErrorFVerb(3, "ddxProcessArgument - Initializing default " 250 "screens\n"); 251 winInitializeScreenDefaults(); 252 } 253 } 254 255#if CYGDEBUG 256 winDebug("ddxProcessArgument - arg: %s\n", argv[i]); 257#endif 258 259 /* 260 * Look for the '-help' and similar options 261 */ 262 if (IS_OPTION("-help") || IS_OPTION("-h") || IS_OPTION("--help")) { 263 /* Reset logfile. We don't need that helpmessage in the logfile */ 264 g_pszLogFile = NULL; 265 g_fNoHelpMessageBox = TRUE; 266 UseMsg(); 267 exit(0); 268 return 1; 269 } 270 271 if (IS_OPTION("-version") || IS_OPTION("--version")) { 272 /* Reset logfile. We don't need that versioninfo in the logfile */ 273 g_pszLogFile = NULL; 274 winLogVersionInfo(); 275 exit(0); 276 return 1; 277 } 278 279 /* 280 * Look for the '-screen scr_num [width height]' argument 281 */ 282 if (IS_OPTION("-screen")) { 283 int iArgsProcessed = 1; 284 int nScreenNum; 285 int iWidth, iHeight, iX, iY; 286 int iMonitor; 287 288#if CYGDEBUG 289 winDebug("ddxProcessArgument - screen - argc: %d i: %d\n", argc, i); 290#endif 291 292 /* Display the usage message if the argument is malformed */ 293 if (i + 1 >= argc) { 294 return 0; 295 } 296 297 /* Grab screen number */ 298 nScreenNum = atoi(argv[i + 1]); 299 300 /* Validate the specified screen number */ 301 if (nScreenNum < 0) { 302 ErrorF("ddxProcessArgument - screen - Invalid screen number %d\n", 303 nScreenNum); 304 UseMsg(); 305 return 0; 306 } 307 308 /* 309 Initialize default values for any new screens 310 311 Note that default values can't change after a -screen option is 312 seen, so it's safe to do this for each screen as it is introduced 313 */ 314 winInitializeScreens(nScreenNum + 1); 315 316 /* look for @m where m is monitor number */ 317 if (i + 2 < argc && 1 == sscanf(argv[i + 2], "@%d", (int *) &iMonitor)) { 318 struct GetMonitorInfoData data; 319 320 if (QueryMonitor(iMonitor, &data)) { 321 winErrorFVerb(2, 322 "ddxProcessArgument - screen - Found Valid ``@Monitor'' = %d arg\n", 323 iMonitor); 324 iArgsProcessed = 3; 325 g_ScreenInfo[nScreenNum].fUserGaveHeightAndWidth = FALSE; 326 g_ScreenInfo[nScreenNum].fUserGavePosition = TRUE; 327 g_ScreenInfo[nScreenNum].iMonitor = iMonitor; 328 g_ScreenInfo[nScreenNum].hMonitor = data.monitorHandle; 329 g_ScreenInfo[nScreenNum].dwWidth = data.monitorWidth; 330 g_ScreenInfo[nScreenNum].dwHeight = data.monitorHeight; 331 g_ScreenInfo[nScreenNum].dwUserWidth = data.monitorWidth; 332 g_ScreenInfo[nScreenNum].dwUserHeight = data.monitorHeight; 333 g_ScreenInfo[nScreenNum].dwInitialX = data.monitorOffsetX; 334 g_ScreenInfo[nScreenNum].dwInitialY = data.monitorOffsetY; 335 } 336 else { 337 /* monitor does not exist, error out */ 338 ErrorF 339 ("ddxProcessArgument - screen - Invalid monitor number %d\n", 340 iMonitor); 341 exit(1); 342 return 0; 343 } 344 } 345 346 /* Look for 'WxD' or 'W D' */ 347 else if (i + 2 < argc 348 && 2 == sscanf(argv[i + 2], "%dx%d", 349 (int *) &iWidth, (int *) &iHeight)) { 350 winErrorFVerb(2, 351 "ddxProcessArgument - screen - Found ``WxD'' arg\n"); 352 iArgsProcessed = 3; 353 g_ScreenInfo[nScreenNum].fUserGaveHeightAndWidth = TRUE; 354 g_ScreenInfo[nScreenNum].dwWidth = iWidth; 355 g_ScreenInfo[nScreenNum].dwHeight = iHeight; 356 g_ScreenInfo[nScreenNum].dwUserWidth = iWidth; 357 g_ScreenInfo[nScreenNum].dwUserHeight = iHeight; 358 /* Look for WxD+X+Y */ 359 if (2 == sscanf(argv[i + 2], "%*dx%*d+%d+%d", 360 (int *) &iX, (int *) &iY)) { 361 winErrorFVerb(2, 362 "ddxProcessArgument - screen - Found ``X+Y'' arg\n"); 363 g_ScreenInfo[nScreenNum].fUserGavePosition = TRUE; 364 g_ScreenInfo[nScreenNum].dwInitialX = iX; 365 g_ScreenInfo[nScreenNum].dwInitialY = iY; 366 367 /* look for WxD+X+Y@m where m is monitor number. take X,Y to be offsets from monitor's root position */ 368 if (1 == sscanf(argv[i + 2], "%*dx%*d+%*d+%*d@%d", 369 (int *) &iMonitor)) { 370 struct GetMonitorInfoData data; 371 372 if (QueryMonitor(iMonitor, &data)) { 373 g_ScreenInfo[nScreenNum].iMonitor = iMonitor; 374 g_ScreenInfo[nScreenNum].hMonitor = data.monitorHandle; 375 g_ScreenInfo[nScreenNum].dwInitialX += 376 data.monitorOffsetX; 377 g_ScreenInfo[nScreenNum].dwInitialY += 378 data.monitorOffsetY; 379 } 380 else { 381 /* monitor does not exist, error out */ 382 ErrorF 383 ("ddxProcessArgument - screen - Invalid monitor number %d\n", 384 iMonitor); 385 exit(1); 386 return 0; 387 } 388 } 389 } 390 391 /* look for WxD@m where m is monitor number */ 392 else if (1 == sscanf(argv[i + 2], "%*dx%*d@%d", (int *) &iMonitor)) { 393 struct GetMonitorInfoData data; 394 395 if (QueryMonitor(iMonitor, &data)) { 396 winErrorFVerb(2, 397 "ddxProcessArgument - screen - Found Valid ``@Monitor'' = %d arg\n", 398 iMonitor); 399 g_ScreenInfo[nScreenNum].fUserGavePosition = TRUE; 400 g_ScreenInfo[nScreenNum].iMonitor = iMonitor; 401 g_ScreenInfo[nScreenNum].hMonitor = data.monitorHandle; 402 g_ScreenInfo[nScreenNum].dwInitialX = data.monitorOffsetX; 403 g_ScreenInfo[nScreenNum].dwInitialY = data.monitorOffsetY; 404 } 405 else { 406 /* monitor does not exist, error out */ 407 ErrorF 408 ("ddxProcessArgument - screen - Invalid monitor number %d\n", 409 iMonitor); 410 exit(1); 411 return 0; 412 } 413 } 414 } 415 else if (i + 3 < argc && 1 == sscanf(argv[i + 2], "%d", (int *) &iWidth) 416 && 1 == sscanf(argv[i + 3], "%d", (int *) &iHeight)) { 417 winErrorFVerb(2, 418 "ddxProcessArgument - screen - Found ``W D'' arg\n"); 419 iArgsProcessed = 4; 420 g_ScreenInfo[nScreenNum].fUserGaveHeightAndWidth = TRUE; 421 g_ScreenInfo[nScreenNum].dwWidth = iWidth; 422 g_ScreenInfo[nScreenNum].dwHeight = iHeight; 423 g_ScreenInfo[nScreenNum].dwUserWidth = iWidth; 424 g_ScreenInfo[nScreenNum].dwUserHeight = iHeight; 425 if (i + 5 < argc && 1 == sscanf(argv[i + 4], "%d", (int *) &iX) 426 && 1 == sscanf(argv[i + 5], "%d", (int *) &iY)) { 427 winErrorFVerb(2, 428 "ddxProcessArgument - screen - Found ``X Y'' arg\n"); 429 iArgsProcessed = 6; 430 g_ScreenInfo[nScreenNum].fUserGavePosition = TRUE; 431 g_ScreenInfo[nScreenNum].dwInitialX = iX; 432 g_ScreenInfo[nScreenNum].dwInitialY = iY; 433 } 434 } 435 else { 436 winErrorFVerb(2, 437 "ddxProcessArgument - screen - Did not find size arg. " 438 "dwWidth: %d dwHeight: %d\n", 439 (int) g_ScreenInfo[nScreenNum].dwWidth, 440 (int) g_ScreenInfo[nScreenNum].dwHeight); 441 iArgsProcessed = 2; 442 g_ScreenInfo[nScreenNum].fUserGaveHeightAndWidth = FALSE; 443 } 444 445 /* Flag that this screen was explicitly specified by the user */ 446 g_ScreenInfo[nScreenNum].fExplicitScreen = TRUE; 447 448 /* 449 * Keep track of the last screen number seen, as parameters seen 450 * before a screen number apply to all screens, whereas parameters 451 * seen after a screen number apply to that screen number only. 452 */ 453 iLastScreen = nScreenNum; 454 455 return iArgsProcessed; 456 } 457 458 /* 459 * Is this parameter attached to a screen or global? 460 * 461 * If the parameter is for all screens (appears before 462 * any -screen option), store it in the default screen 463 * info 464 * 465 * If the parameter is for a single screen (appears 466 * after a -screen option), store it in the screen info 467 * for that screen 468 * 469 */ 470 if (iLastScreen == -1) { 471 screenInfoPtr = &defaultScreenInfo; 472 } 473 else { 474 screenInfoPtr = &(g_ScreenInfo[iLastScreen]); 475 } 476 477 /* 478 * Look for the '-engine n' argument 479 */ 480 if (IS_OPTION("-engine")) { 481 DWORD dwEngine = 0; 482 CARD8 c8OnBits = 0; 483 484 /* Display the usage message if the argument is malformed */ 485 if (++i >= argc) { 486 UseMsg(); 487 return 0; 488 } 489 490 /* Grab the argument */ 491 dwEngine = atoi(argv[i]); 492 493 /* Count the one bits in the engine argument */ 494 c8OnBits = winCountBits(dwEngine); 495 496 /* Argument should only have a single bit on */ 497 if (c8OnBits != 1) { 498 UseMsg(); 499 return 0; 500 } 501 502 screenInfoPtr->dwEnginePreferred = dwEngine; 503 504 /* Indicate that we have processed the argument */ 505 return 2; 506 } 507 508 /* 509 * Look for the '-fullscreen' argument 510 */ 511 if (IS_OPTION("-fullscreen")) { 512 if (!screenInfoPtr->fMultiMonitorOverride) 513 screenInfoPtr->fMultipleMonitors = FALSE; 514 screenInfoPtr->fFullScreen = TRUE; 515 516 /* Indicate that we have processed this argument */ 517 return 1; 518 } 519 520 /* 521 * Look for the '-lesspointer' argument 522 */ 523 if (IS_OPTION("-lesspointer")) { 524 screenInfoPtr->fLessPointer = TRUE; 525 526 /* Indicate that we have processed this argument */ 527 return 1; 528 } 529 530 /* 531 * Look for the '-nodecoration' argument 532 */ 533 if (IS_OPTION("-nodecoration")) { 534 if (!screenInfoPtr->fMultiMonitorOverride) 535 screenInfoPtr->fMultipleMonitors = FALSE; 536 screenInfoPtr->fDecoration = FALSE; 537 538 /* Indicate that we have processed this argument */ 539 return 1; 540 } 541 542 /* 543 * Look for the '-rootless' argument 544 */ 545 if (IS_OPTION("-rootless")) { 546 if (!screenInfoPtr->fMultiMonitorOverride) 547 screenInfoPtr->fMultipleMonitors = FALSE; 548 screenInfoPtr->fRootless = TRUE; 549 550 /* Indicate that we have processed this argument */ 551 return 1; 552 } 553 554 /* 555 * Look for the '-multiwindow' argument 556 */ 557 if (IS_OPTION("-multiwindow")) { 558 if (!screenInfoPtr->fMultiMonitorOverride) 559 screenInfoPtr->fMultipleMonitors = TRUE; 560 screenInfoPtr->fMultiWindow = TRUE; 561 562 /* Indicate that we have processed this argument */ 563 return 1; 564 } 565 566 /* 567 * Look for the '-compositewm' argument 568 */ 569 if (IS_OPTION("-compositewm")) { 570 screenInfoPtr->fCompositeWM = TRUE; 571 572 /* Indicate that we have processed this argument */ 573 return 1; 574 } 575 /* 576 * Look for the '-nocompositewm' argument 577 */ 578 if (IS_OPTION("-nocompositewm")) { 579 screenInfoPtr->fCompositeWM = FALSE; 580 581 /* Indicate that we have processed this argument */ 582 return 1; 583 } 584 585 /* 586 * Look for the '-compositealpha' argument 587 */ 588 if (IS_OPTION("-compositealpha")) { 589 g_fCompositeAlpha = TRUE; 590 591 /* Indicate that we have processed this argument */ 592 return 1; 593 } 594 /* 595 * Look for the '-nocompositealpha' argument 596 */ 597 if (IS_OPTION("-nocompositealpha")) { 598 g_fCompositeAlpha = FALSE; 599 600 /* Indicate that we have processed this argument */ 601 return 1; 602 } 603 604 /* 605 * Look for the '-multiplemonitors' argument 606 */ 607 if (IS_OPTION("-multiplemonitors") 608 || IS_OPTION("-multimonitors")) { 609 screenInfoPtr->fMultiMonitorOverride = TRUE; 610 screenInfoPtr->fMultipleMonitors = TRUE; 611 612 /* Indicate that we have processed this argument */ 613 return 1; 614 } 615 616 /* 617 * Look for the '-nomultiplemonitors' argument 618 */ 619 if (IS_OPTION("-nomultiplemonitors") 620 || IS_OPTION("-nomultimonitors")) { 621 screenInfoPtr->fMultiMonitorOverride = TRUE; 622 screenInfoPtr->fMultipleMonitors = FALSE; 623 624 /* Indicate that we have processed this argument */ 625 return 1; 626 } 627 628 /* 629 * Look for the '-scrollbars' argument 630 */ 631 if (IS_OPTION("-scrollbars")) { 632 633 screenInfoPtr->iResizeMode = resizeWithScrollbars; 634 635 /* Indicate that we have processed this argument */ 636 return 1; 637 } 638 639 /* 640 * Look for the '-resize' argument 641 */ 642 if (IS_OPTION("-resize") || IS_OPTION("-noresize") || 643 (strncmp(argv[i], "-resize=", strlen("-resize=")) == 0)) { 644 winResizeMode mode; 645 646 if (IS_OPTION("-resize")) 647 mode = resizeWithRandr; 648 else if (IS_OPTION("-noresize")) 649 mode = resizeNotAllowed; 650 else if (strncmp(argv[i], "-resize=", strlen("-resize=")) == 0) { 651 char *option = argv[i] + strlen("-resize="); 652 653 if (strcmp(option, "randr") == 0) 654 mode = resizeWithRandr; 655 else if (strcmp(option, "scrollbars") == 0) 656 mode = resizeWithScrollbars; 657 else if (strcmp(option, "none") == 0) 658 mode = resizeNotAllowed; 659 else { 660 ErrorF("ddxProcessArgument - resize - Invalid resize mode %s\n", 661 option); 662 return 0; 663 } 664 } 665 else { 666 ErrorF("ddxProcessArgument - resize - Invalid resize option %s\n", 667 argv[i]); 668 return 0; 669 } 670 671 screenInfoPtr->iResizeMode = mode; 672 673 /* Indicate that we have processed this argument */ 674 return 1; 675 } 676 677 /* 678 * Look for the '-clipboard' argument 679 */ 680 if (IS_OPTION("-clipboard")) { 681 /* Now the default, we still accept the arg for backwards compatibility */ 682 g_fClipboard = TRUE; 683 684 /* Indicate that we have processed this argument */ 685 return 1; 686 } 687 688 /* 689 * Look for the '-noclipboard' argument 690 */ 691 if (IS_OPTION("-noclipboard")) { 692 g_fClipboard = FALSE; 693 694 /* Indicate that we have processed this argument */ 695 return 1; 696 } 697 698 /* 699 * Look for the '-primary' argument 700 */ 701 if (IS_OPTION("-primary")) { 702 fPrimarySelection = TRUE; 703 704 /* Indicate that we have processed this argument */ 705 return 1; 706 } 707 708 /* 709 * Look for the '-noprimary' argument 710 */ 711 if (IS_OPTION("-noprimary")) { 712 fPrimarySelection = FALSE; 713 714 /* Indicate that we have processed this argument */ 715 return 1; 716 } 717 718 /* 719 * Look for the '-ignoreinput' argument 720 */ 721 if (IS_OPTION("-ignoreinput")) { 722 screenInfoPtr->fIgnoreInput = TRUE; 723 724 /* Indicate that we have processed this argument */ 725 return 1; 726 } 727 728 /* 729 * Look for the '-emulate3buttons' argument 730 */ 731 if (IS_OPTION("-emulate3buttons")) { 732 int iArgsProcessed = 1; 733 int iE3BTimeout = WIN_DEFAULT_E3B_TIME; 734 735 /* Grab the optional timeout value */ 736 if (i + 1 < argc && 1 == sscanf(argv[i + 1], "%d", &iE3BTimeout)) { 737 /* Indicate that we have processed the next argument */ 738 iArgsProcessed++; 739 } 740 else { 741 /* 742 * sscanf () won't modify iE3BTimeout if it doesn't find 743 * the specified format; however, I want to be explicit 744 * about setting the default timeout in such cases to 745 * prevent some programs (me) from getting confused. 746 */ 747 iE3BTimeout = WIN_DEFAULT_E3B_TIME; 748 } 749 750 screenInfoPtr->iE3BTimeout = iE3BTimeout; 751 752 /* Indicate that we have processed this argument */ 753 return iArgsProcessed; 754 } 755 756 /* 757 * Look for the '-noemulate3buttons' argument 758 */ 759 if (IS_OPTION("-noemulate3buttons")) { 760 screenInfoPtr->iE3BTimeout = WIN_E3B_OFF; 761 762 /* Indicate that we have processed this argument */ 763 return 1; 764 } 765 766 /* 767 * Look for the '-depth n' argument 768 */ 769 if (IS_OPTION("-depth")) { 770 DWORD dwBPP = 0; 771 772 /* Display the usage message if the argument is malformed */ 773 if (++i >= argc) { 774 UseMsg(); 775 return 0; 776 } 777 778 /* Grab the argument */ 779 dwBPP = atoi(argv[i]); 780 781 screenInfoPtr->dwBPP = dwBPP; 782 783 /* Indicate that we have processed the argument */ 784 return 2; 785 } 786 787 /* 788 * Look for the '-refresh n' argument 789 */ 790 if (IS_OPTION("-refresh")) { 791 DWORD dwRefreshRate = 0; 792 793 /* Display the usage message if the argument is malformed */ 794 if (++i >= argc) { 795 UseMsg(); 796 return 0; 797 } 798 799 /* Grab the argument */ 800 dwRefreshRate = atoi(argv[i]); 801 802 screenInfoPtr->dwRefreshRate = dwRefreshRate; 803 804 /* Indicate that we have processed the argument */ 805 return 2; 806 } 807 808 /* 809 * Look for the '-clipupdates num_boxes' argument 810 */ 811 if (IS_OPTION("-clipupdates")) { 812 DWORD dwNumBoxes = 0; 813 814 /* Display the usage message if the argument is malformed */ 815 if (++i >= argc) { 816 UseMsg(); 817 return 0; 818 } 819 820 /* Grab the argument */ 821 dwNumBoxes = atoi(argv[i]); 822 823 screenInfoPtr->dwClipUpdatesNBoxes = dwNumBoxes; 824 825 /* Indicate that we have processed the argument */ 826 return 2; 827 } 828 829#ifdef XWIN_EMULATEPSEUDO 830 /* 831 * Look for the '-emulatepseudo' argument 832 */ 833 if (IS_OPTION("-emulatepseudo")) { 834 screenInfoPtr->fEmulatePseudo = TRUE; 835 836 /* Indicate that we have processed this argument */ 837 return 1; 838 } 839#endif 840 841 /* 842 * Look for the '-nowinkill' argument 843 */ 844 if (IS_OPTION("-nowinkill")) { 845 screenInfoPtr->fUseWinKillKey = FALSE; 846 847 /* Indicate that we have processed this argument */ 848 return 1; 849 } 850 851 /* 852 * Look for the '-winkill' argument 853 */ 854 if (IS_OPTION("-winkill")) { 855 screenInfoPtr->fUseWinKillKey = TRUE; 856 857 /* Indicate that we have processed this argument */ 858 return 1; 859 } 860 861 /* 862 * Look for the '-nounixkill' argument 863 */ 864 if (IS_OPTION("-nounixkill")) { 865 screenInfoPtr->fUseUnixKillKey = FALSE; 866 867 /* Indicate that we have processed this argument */ 868 return 1; 869 } 870 871 /* 872 * Look for the '-unixkill' argument 873 */ 874 if (IS_OPTION("-unixkill")) { 875 screenInfoPtr->fUseUnixKillKey = TRUE; 876 877 /* Indicate that we have processed this argument */ 878 return 1; 879 } 880 881 /* 882 * Look for the '-notrayicon' argument 883 */ 884 if (IS_OPTION("-notrayicon")) { 885 screenInfoPtr->fNoTrayIcon = TRUE; 886 887 /* Indicate that we have processed this argument */ 888 return 1; 889 } 890 891 /* 892 * Look for the '-trayicon' argument 893 */ 894 if (IS_OPTION("-trayicon")) { 895 screenInfoPtr->fNoTrayIcon = FALSE; 896 897 /* Indicate that we have processed this argument */ 898 return 1; 899 } 900 901 /* 902 * Look for the '-fp' argument 903 */ 904 if (IS_OPTION("-fp")) { 905 CHECK_ARGS(1); 906 g_cmdline.fontPath = argv[++i]; 907 return 0; /* Let DIX parse this again */ 908 } 909 910 /* 911 * Look for the '-query' argument 912 */ 913 if (IS_OPTION("-query")) { 914 CHECK_ARGS(1); 915 g_fXdmcpEnabled = TRUE; 916 g_pszQueryHost = argv[++i]; 917 return 0; /* Let DIX parse this again */ 918 } 919 920 /* 921 * Look for the '-auth' argument 922 */ 923 if (IS_OPTION("-auth")) { 924 g_fAuthEnabled = TRUE; 925 return 0; /* Let DIX parse this again */ 926 } 927 928 /* 929 * Look for the '-indirect' or '-broadcast' arguments 930 */ 931 if (IS_OPTION("-indirect") 932 || IS_OPTION("-broadcast")) { 933 g_fXdmcpEnabled = TRUE; 934 return 0; /* Let DIX parse this again */ 935 } 936 937 /* 938 * Look for the '-config' argument 939 */ 940 if (IS_OPTION("-config") 941 || IS_OPTION("-xf86config")) { 942 CHECK_ARGS(1); 943#ifdef XWIN_XF86CONFIG 944 g_cmdline.configFile = argv[++i]; 945#else 946 winMessageBoxF("The %s option is not supported in this " 947 "release.\n" 948 "Ignoring this option and continuing.\n", 949 MB_ICONINFORMATION, argv[i]); 950#endif 951 return 2; 952 } 953 954 /* 955 * Look for the '-configdir' argument 956 */ 957 if (IS_OPTION("-configdir")) { 958 CHECK_ARGS(1); 959#ifdef XWIN_XF86CONFIG 960 g_cmdline.configDir = argv[++i]; 961#else 962 winMessageBoxF("The %s option is not supported in this " 963 "release.\n" 964 "Ignoring this option and continuing.\n", 965 MB_ICONINFORMATION, argv[i]); 966#endif 967 return 2; 968 } 969 970 /* 971 * Look for the '-keyboard' argument 972 */ 973 if (IS_OPTION("-keyboard")) { 974#ifdef XWIN_XF86CONFIG 975 CHECK_ARGS(1); 976 g_cmdline.keyboard = argv[++i]; 977#else 978 winMessageBoxF("The -keyboard option is not supported in this " 979 "release.\n" 980 "Ignoring this option and continuing.\n", 981 MB_ICONINFORMATION); 982#endif 983 return 2; 984 } 985 986 /* 987 * Look for the '-logfile' argument 988 */ 989 if (IS_OPTION("-logfile")) { 990 CHECK_ARGS(1); 991 g_pszLogFile = argv[++i]; 992#ifdef RELOCATE_PROJECTROOT 993 g_fLogFileChanged = TRUE; 994#endif 995 return 2; 996 } 997 998 /* 999 * Look for the '-logverbose' argument 1000 */ 1001 if (IS_OPTION("-logverbose")) { 1002 CHECK_ARGS(1); 1003 g_iLogVerbose = atoi(argv[++i]); 1004 return 2; 1005 } 1006 1007 if (IS_OPTION("-xkbrules")) { 1008 CHECK_ARGS(1); 1009 g_cmdline.xkbRules = argv[++i]; 1010 return 2; 1011 } 1012 if (IS_OPTION("-xkbmodel")) { 1013 CHECK_ARGS(1); 1014 g_cmdline.xkbModel = argv[++i]; 1015 return 2; 1016 } 1017 if (IS_OPTION("-xkblayout")) { 1018 CHECK_ARGS(1); 1019 g_cmdline.xkbLayout = argv[++i]; 1020 return 2; 1021 } 1022 if (IS_OPTION("-xkbvariant")) { 1023 CHECK_ARGS(1); 1024 g_cmdline.xkbVariant = argv[++i]; 1025 return 2; 1026 } 1027 if (IS_OPTION("-xkboptions")) { 1028 CHECK_ARGS(1); 1029 g_cmdline.xkbOptions = argv[++i]; 1030 return 2; 1031 } 1032 1033 if (IS_OPTION("-keyhook")) { 1034 g_fKeyboardHookLL = TRUE; 1035 return 1; 1036 } 1037 1038 if (IS_OPTION("-nokeyhook")) { 1039 g_fKeyboardHookLL = FALSE; 1040 return 1; 1041 } 1042 1043 if (IS_OPTION("-swcursor")) { 1044 g_fSoftwareCursor = TRUE; 1045 return 1; 1046 } 1047 1048 if (IS_OPTION("-wgl")) { 1049 g_fNativeGl = TRUE; 1050 return 1; 1051 } 1052 1053 if (IS_OPTION("-nowgl")) { 1054 g_fNativeGl = FALSE; 1055 return 1; 1056 } 1057 1058 if (IS_OPTION("-hostintitle")) { 1059 g_fHostInTitle = TRUE; 1060 return 1; 1061 } 1062 1063 if (IS_OPTION("-nohostintitle")) { 1064 g_fHostInTitle = FALSE; 1065 return 1; 1066 } 1067 1068 if (IS_OPTION("-icon")) { 1069 char *iconspec; 1070 CHECK_ARGS(1); 1071 iconspec = argv[++i]; 1072 screenInfoPtr->hIcon = LoadImageComma(iconspec, NULL, 1073 GetSystemMetrics(SM_CXICON), 1074 GetSystemMetrics(SM_CYICON), 1075 0); 1076 screenInfoPtr->hIconSm = LoadImageComma(iconspec, NULL, 1077 GetSystemMetrics(SM_CXSMICON), 1078 GetSystemMetrics(SM_CYSMICON), 1079 LR_DEFAULTSIZE); 1080 if ((screenInfoPtr->hIcon == NULL) || 1081 (screenInfoPtr->hIconSm == NULL)) { 1082 ErrorF("ddxProcessArgument - icon - Invalid icon specification %s\n", 1083 iconspec); 1084 exit(1); 1085 } 1086 1087 /* Indicate that we have processed the argument */ 1088 return 2; 1089 } 1090 1091 return 0; 1092} 1093 1094/* 1095 * winLogCommandLine - Write entire command line to the log file 1096 */ 1097 1098void 1099winLogCommandLine(int argc, char *argv[]) 1100{ 1101 int i; 1102 int iSize = 0; 1103 int iCurrLen = 0; 1104 1105#define CHARS_PER_LINE 60 1106 1107 /* Bail if command line has already been logged */ 1108 if (g_pszCommandLine) 1109 return; 1110 1111 /* Count how much memory is needed for concatenated command line */ 1112 for (i = 0, iCurrLen = 0; i < argc; ++i) 1113 if (argv[i]) { 1114 /* Adds two characters for lines that overflow */ 1115 if ((strlen(argv[i]) < CHARS_PER_LINE 1116 && iCurrLen + strlen(argv[i]) > CHARS_PER_LINE) 1117 || strlen(argv[i]) > CHARS_PER_LINE) { 1118 iCurrLen = 0; 1119 iSize += 2; 1120 } 1121 1122 /* Add space for item and trailing space */ 1123 iSize += strlen(argv[i]) + 1; 1124 1125 /* Update current line length */ 1126 iCurrLen += strlen(argv[i]); 1127 } 1128 1129 /* Allocate memory for concatenated command line */ 1130 g_pszCommandLine = malloc(iSize + 1); 1131 if (!g_pszCommandLine) 1132 FatalError("winLogCommandLine - Could not allocate memory for " 1133 "command line string. Exiting.\n"); 1134 1135 /* Set first character to concatenated command line to null */ 1136 g_pszCommandLine[0] = '\0'; 1137 1138 /* Loop through all args */ 1139 for (i = 0, iCurrLen = 0; i < argc; ++i) { 1140 /* Add a character for lines that overflow */ 1141 if ((strlen(argv[i]) < CHARS_PER_LINE 1142 && iCurrLen + strlen(argv[i]) > CHARS_PER_LINE) 1143 || strlen(argv[i]) > CHARS_PER_LINE) { 1144 iCurrLen = 0; 1145 1146 /* Add line break if it fits */ 1147 strncat(g_pszCommandLine, "\n ", iSize - strlen(g_pszCommandLine)); 1148 } 1149 1150 strncat(g_pszCommandLine, argv[i], iSize - strlen(g_pszCommandLine)); 1151 strncat(g_pszCommandLine, " ", iSize - strlen(g_pszCommandLine)); 1152 1153 /* Save new line length */ 1154 iCurrLen += strlen(argv[i]); 1155 } 1156 1157 ErrorF("XWin was started with the following command line:\n\n" 1158 "%s\n\n", g_pszCommandLine); 1159} 1160 1161/* 1162 * winLogVersionInfo - Log version information 1163 */ 1164 1165void 1166winLogVersionInfo(void) 1167{ 1168 static Bool s_fBeenHere = FALSE; 1169 1170 if (s_fBeenHere) 1171 return; 1172 s_fBeenHere = TRUE; 1173 1174 ErrorF("Welcome to the XWin X Server\n"); 1175 ErrorF("Vendor: %s\n", XVENDORNAME); 1176 ErrorF("Release: %d.%d.%d.%d\n", XORG_VERSION_MAJOR, 1177 XORG_VERSION_MINOR, XORG_VERSION_PATCH, XORG_VERSION_SNAP); 1178#ifdef HAVE_SYS_UTSNAME_H 1179 { 1180 struct utsname name; 1181 1182 if (uname(&name) >= 0) { 1183 ErrorF("OS: %s %s %s %s %s\n", name.sysname, name.nodename, 1184 name.release, name.version, name.machine); 1185 } 1186 } 1187#endif 1188 winOS(); 1189 if (strlen(BUILDERSTRING)) 1190 ErrorF("%s\n", BUILDERSTRING); 1191 ErrorF("Contact: %s\n", BUILDERADDR); 1192 ErrorF("\n"); 1193} 1194