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