xserver

xserver with xephyr scale patch
git clone https://git.neptards.moe/u3shit/xserver.git
Log | Files | Refs | README | LICENSE

winprocarg.c (35797B)


      1 /*
      2 
      3 Copyright 1993, 1998  The Open Group
      4 Copyright (C) Colin Harrison 2005-2008
      5 
      6 Permission to use, copy, modify, distribute, and sell this software and its
      7 documentation for any purpose is hereby granted without fee, provided that
      8 the above copyright notice appear in all copies and that both that
      9 copyright notice and this permission notice appear in supporting
     10 documentation.
     11 
     12 The above copyright notice and this permission notice shall be included
     13 in all copies or substantial portions of the Software.
     14 
     15 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
     16 OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
     17 MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
     18 IN NO EVENT SHALL THE OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR
     19 OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
     20 ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
     21 OTHER DEALINGS IN THE SOFTWARE.
     22 
     23 Except as contained in this notice, the name of The Open Group shall
     24 not be used in advertising or otherwise to promote the sale, use or
     25 other dealings in this Software without prior written authorization
     26 from 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 
     51 void
     52  winLogCommandLine(int argc, char *argv[]);
     53 
     54 void
     55  winLogVersionInfo(void);
     56 
     57 /*
     58  * Process arguments on the command line
     59  */
     60 
     61 static int iLastScreen = -1;
     62 static winScreenInfo defaultScreenInfo;
     63 
     64 static void
     65 winInitializeScreenDefaults(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 
    155 static void
    156 winInitializeScreen(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 
    170 void
    171 winInitializeScreens(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 
    216 int
    217 ddxProcessArgument(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 
   1098 void
   1099 winLogCommandLine(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 
   1165 void
   1166 winLogVersionInfo(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 }