1706f2543Smrg/***********************************************************
2706f2543Smrg
3706f2543SmrgCopyright 1987, 1998  The Open Group
4706f2543Smrg
5706f2543SmrgPermission to use, copy, modify, distribute, and sell this software and its
6706f2543Smrgdocumentation for any purpose is hereby granted without fee, provided that
7706f2543Smrgthe above copyright notice appear in all copies and that both that
8706f2543Smrgcopyright notice and this permission notice appear in supporting
9706f2543Smrgdocumentation.
10706f2543Smrg
11706f2543SmrgThe above copyright notice and this permission notice shall be included in
12706f2543Smrgall copies or substantial portions of the Software.
13706f2543Smrg
14706f2543SmrgTHE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15706f2543SmrgIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16706f2543SmrgFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
17706f2543SmrgOPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
18706f2543SmrgAN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
19706f2543SmrgCONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
20706f2543Smrg
21706f2543SmrgExcept as contained in this notice, the name of The Open Group shall not be
22706f2543Smrgused in advertising or otherwise to promote the sale, use or other dealings
23706f2543Smrgin this Software without prior written authorization from The Open Group.
24706f2543Smrg
25706f2543Smrg
26706f2543SmrgCopyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts.
27706f2543Smrg
28706f2543Smrg                        All Rights Reserved
29706f2543Smrg
30706f2543SmrgPermission to use, copy, modify, and distribute this software and its
31706f2543Smrgdocumentation for any purpose and without fee is hereby granted,
32706f2543Smrgprovided that the above copyright notice appear in all copies and that
33706f2543Smrgboth that copyright notice and this permission notice appear in
34706f2543Smrgsupporting documentation, and that the name of Digital not be
35706f2543Smrgused in advertising or publicity pertaining to distribution of the
36706f2543Smrgsoftware without specific, written prior permission.
37706f2543Smrg
38706f2543SmrgDIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
39706f2543SmrgALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
40706f2543SmrgDIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
41706f2543SmrgANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
42706f2543SmrgWHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
43706f2543SmrgARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
44706f2543SmrgSOFTWARE.
45706f2543Smrg
46706f2543Smrg******************************************************************/
47706f2543Smrg
48706f2543Smrg/* The panoramix components contained the following notice */
49706f2543Smrg/*****************************************************************
50706f2543Smrg
51706f2543SmrgCopyright (c) 1991, 1997 Digital Equipment Corporation, Maynard, Massachusetts.
52706f2543Smrg
53706f2543SmrgPermission is hereby granted, free of charge, to any person obtaining a copy
54706f2543Smrgof this software and associated documentation files (the "Software"), to deal
55706f2543Smrgin the Software without restriction, including without limitation the rights
56706f2543Smrgto use, copy, modify, merge, publish, distribute, sublicense, and/or sell
57706f2543Smrgcopies of the Software.
58706f2543Smrg
59706f2543SmrgThe above copyright notice and this permission notice shall be included in
60706f2543Smrgall copies or substantial portions of the Software.
61706f2543Smrg
62706f2543SmrgTHE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
63706f2543SmrgIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
64706f2543SmrgFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
65706f2543SmrgDIGITAL EQUIPMENT CORPORATION BE LIABLE FOR ANY CLAIM, DAMAGES, INCLUDING,
66706f2543SmrgBUT NOT LIMITED TO CONSEQUENTIAL OR INCIDENTAL DAMAGES, OR OTHER LIABILITY,
67706f2543SmrgWHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
68706f2543SmrgIN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
69706f2543Smrg
70706f2543SmrgExcept as contained in this notice, the name of Digital Equipment Corporation
71706f2543Smrgshall not be used in advertising or otherwise to promote the sale, use or other
72706f2543Smrgdealings in this Software without prior written authorization from Digital
73706f2543SmrgEquipment Corporation.
74706f2543Smrg
75706f2543Smrg******************************************************************/
76706f2543Smrg
77706f2543Smrg#ifdef HAVE_DIX_CONFIG_H
78706f2543Smrg#include <dix-config.h>
79706f2543Smrg#include <version-config.h>
80706f2543Smrg#endif
81706f2543Smrg
82706f2543Smrg#include <X11/X.h>
83706f2543Smrg#include <X11/Xos.h>   /* for unistd.h  */
84706f2543Smrg#include <X11/Xproto.h>
85706f2543Smrg#include <pixman.h>
86706f2543Smrg#include "scrnintstr.h"
87706f2543Smrg#include "misc.h"
88706f2543Smrg#include "os.h"
89706f2543Smrg#include "windowstr.h"
90706f2543Smrg#include "resource.h"
91706f2543Smrg#include "dixstruct.h"
92706f2543Smrg#include "gcstruct.h"
93706f2543Smrg#include "extension.h"
94706f2543Smrg#include "colormap.h"
95706f2543Smrg#include "colormapst.h"
96706f2543Smrg#include "cursorstr.h"
97706f2543Smrg#include "selection.h"
98706f2543Smrg#include <X11/fonts/font.h>
99706f2543Smrg#include "opaque.h"
100706f2543Smrg#include "servermd.h"
101706f2543Smrg#include "hotplug.h"
102706f2543Smrg#include "site.h"
103706f2543Smrg#include "dixfont.h"
104706f2543Smrg#include "extnsionst.h"
105706f2543Smrg#include "privates.h"
106706f2543Smrg#include "registry.h"
107706f2543Smrg#ifdef PANORAMIX
108706f2543Smrg#include "panoramiXsrv.h"
109706f2543Smrg#else
110706f2543Smrg#include "dixevents.h"		/* InitEvents() */
111706f2543Smrg#endif
112706f2543Smrg
113706f2543Smrg#ifdef DPMSExtension
114706f2543Smrg#include <X11/extensions/dpmsconst.h>
115706f2543Smrg#include "dpmsproc.h"
116706f2543Smrg#endif
117706f2543Smrg
118706f2543Smrgextern void Dispatch(void);
119706f2543Smrg
120706f2543Smrg#ifdef XQUARTZ
121706f2543Smrg#include <pthread.h>
122706f2543Smrg
123706f2543SmrgBOOL serverRunning = FALSE;
124706f2543Smrgpthread_mutex_t serverRunningMutex = PTHREAD_MUTEX_INITIALIZER;
125706f2543Smrgpthread_cond_t serverRunningCond = PTHREAD_COND_INITIALIZER;
126706f2543Smrg
127706f2543Smrgint dix_main(int argc, char *argv[], char *envp[]);
128706f2543Smrg
129706f2543Smrgint dix_main(int argc, char *argv[], char *envp[])
130706f2543Smrg#else
131706f2543Smrgint main(int argc, char *argv[], char *envp[])
132706f2543Smrg#endif
133706f2543Smrg{
134706f2543Smrg    int		i;
135706f2543Smrg    HWEventQueueType	alwaysCheckForInput[2];
136706f2543Smrg
137706f2543Smrg    display = "0";
138706f2543Smrg
139706f2543Smrg    InitRegions();
140706f2543Smrg
141706f2543Smrg    pixman_disable_out_of_bounds_workaround();
142706f2543Smrg
143706f2543Smrg    CheckUserParameters(argc, argv, envp);
144706f2543Smrg
145706f2543Smrg    CheckUserAuthorization();
146706f2543Smrg
147706f2543Smrg    InitConnectionLimits();
148706f2543Smrg
149706f2543Smrg    ProcessCommandLine(argc, argv);
150706f2543Smrg
151706f2543Smrg    alwaysCheckForInput[0] = 0;
152706f2543Smrg    alwaysCheckForInput[1] = 1;
153706f2543Smrg    while(1)
154706f2543Smrg    {
155706f2543Smrg	serverGeneration++;
156706f2543Smrg	ScreenSaverTime = defaultScreenSaverTime;
157706f2543Smrg	ScreenSaverInterval = defaultScreenSaverInterval;
158706f2543Smrg	ScreenSaverBlanking = defaultScreenSaverBlanking;
159706f2543Smrg	ScreenSaverAllowExposures = defaultScreenSaverAllowExposures;
160706f2543Smrg#ifdef DPMSExtension
161706f2543Smrg	DPMSStandbyTime = DPMSSuspendTime = DPMSOffTime = ScreenSaverTime;
162706f2543Smrg	DPMSEnabled = TRUE;
163706f2543Smrg	DPMSPowerLevel = 0;
164706f2543Smrg#endif
165706f2543Smrg	InitBlockAndWakeupHandlers();
166706f2543Smrg	/* Perform any operating system dependent initializations you'd like */
167706f2543Smrg	OsInit();
168706f2543Smrg	if(serverGeneration == 1)
169706f2543Smrg	{
170706f2543Smrg	    CreateWellKnownSockets();
171706f2543Smrg	    for (i=1; i<MAXCLIENTS; i++)
172706f2543Smrg		clients[i] = NullClient;
173706f2543Smrg	    serverClient = calloc(sizeof(ClientRec), 1);
174706f2543Smrg	    if (!serverClient)
175706f2543Smrg		FatalError("couldn't create server client");
176706f2543Smrg	    InitClient(serverClient, 0, (pointer)NULL);
177706f2543Smrg	}
178706f2543Smrg	else
179706f2543Smrg	    ResetWellKnownSockets ();
180706f2543Smrg	clients[0] = serverClient;
181706f2543Smrg	currentMaxClients = 1;
182706f2543Smrg
183706f2543Smrg	/* Initialize privates before first allocation */
184706f2543Smrg	dixResetPrivates();
185706f2543Smrg
186706f2543Smrg	/* Initialize server client devPrivates, to be reallocated as
187706f2543Smrg	 * more client privates are registered
188706f2543Smrg	 */
189706f2543Smrg	if (!dixAllocatePrivates(&serverClient->devPrivates, PRIVATE_CLIENT))
190706f2543Smrg	    FatalError("failed to create server client privates");
191706f2543Smrg
192706f2543Smrg	if (!InitClientResources(serverClient))      /* for root resources */
193706f2543Smrg	    FatalError("couldn't init server resources");
194706f2543Smrg
195706f2543Smrg	SetInputCheck(&alwaysCheckForInput[0], &alwaysCheckForInput[1]);
196706f2543Smrg	screenInfo.numScreens = 0;
197706f2543Smrg
198706f2543Smrg	InitAtoms();
199706f2543Smrg	InitEvents();
200706f2543Smrg	InitSelections();
201706f2543Smrg	InitGlyphCaching();
202706f2543Smrg	dixResetRegistry();
203706f2543Smrg	ResetFontPrivateIndex();
204706f2543Smrg	InitCallbackManager();
205706f2543Smrg	InitOutput(&screenInfo, argc, argv);
206706f2543Smrg
207706f2543Smrg	if (screenInfo.numScreens < 1)
208706f2543Smrg	    FatalError("no screens found");
209706f2543Smrg	InitExtensions(argc, argv);
210706f2543Smrg
211706f2543Smrg	for (i = 0; i < screenInfo.numScreens; i++)
212706f2543Smrg	{
213706f2543Smrg	    ScreenPtr pScreen = screenInfo.screens[i];
214706f2543Smrg	    if (!CreateScratchPixmapsForScreen(i))
215706f2543Smrg		FatalError("failed to create scratch pixmaps");
216706f2543Smrg	    if (pScreen->CreateScreenResources &&
217706f2543Smrg		!(*pScreen->CreateScreenResources)(pScreen))
218706f2543Smrg		FatalError("failed to create screen resources");
219706f2543Smrg	    if (!CreateGCperDepth(i))
220706f2543Smrg		FatalError("failed to create scratch GCs");
221706f2543Smrg	    if (!CreateDefaultStipple(i))
222706f2543Smrg		FatalError("failed to create default stipple");
223706f2543Smrg	    if (!CreateRootWindow(pScreen))
224706f2543Smrg		FatalError("failed to create root window");
225706f2543Smrg	}
226706f2543Smrg
227706f2543Smrg	InitFonts();
228706f2543Smrg	if (SetDefaultFontPath(defaultFontPath) != Success) {
229706f2543Smrg	    ErrorF("[dix] failed to set default font path '%s'", defaultFontPath);
230706f2543Smrg	}
231706f2543Smrg	if (!SetDefaultFont(defaultTextFont)) {
232706f2543Smrg	    FatalError("could not open default font '%s'", defaultTextFont);
233706f2543Smrg	}
234706f2543Smrg
235706f2543Smrg	if (!(rootCursor = CreateRootCursor(NULL, 0))) {
236706f2543Smrg	    FatalError("could not open default cursor font '%s'",
237706f2543Smrg		       defaultCursorFont);
238706f2543Smrg	}
239706f2543Smrg
240706f2543Smrg#ifdef DPMSExtension
241706f2543Smrg 	/* check all screens, looking for DPMS Capabilities */
242706f2543Smrg 	DPMSCapableFlag = DPMSSupported();
243706f2543Smrg	if (!DPMSCapableFlag)
244706f2543Smrg     	    DPMSEnabled = FALSE;
245706f2543Smrg#endif
246706f2543Smrg
247706f2543Smrg#ifdef PANORAMIX
248706f2543Smrg	/*
249706f2543Smrg	 * Consolidate window and colourmap information for each screen
250706f2543Smrg	 */
251706f2543Smrg	if (!noPanoramiXExtension)
252706f2543Smrg	    PanoramiXConsolidate();
253706f2543Smrg#endif
254706f2543Smrg
255706f2543Smrg	for (i = 0; i < screenInfo.numScreens; i++)
256706f2543Smrg	    InitRootWindow(screenInfo.screens[i]->root);
257706f2543Smrg
258706f2543Smrg        InitCoreDevices();
259706f2543Smrg	InitInput(argc, argv);
260706f2543Smrg	InitAndStartDevices();
261706f2543Smrg
262706f2543Smrg	dixSaveScreens(serverClient, SCREEN_SAVER_FORCER, ScreenSaverReset);
263706f2543Smrg
264706f2543Smrg#ifdef PANORAMIX
265706f2543Smrg	if (!noPanoramiXExtension) {
266706f2543Smrg	    if (!PanoramiXCreateConnectionBlock()) {
267706f2543Smrg		FatalError("could not create connection block info");
268706f2543Smrg	    }
269706f2543Smrg	} else
270706f2543Smrg#endif
271706f2543Smrg	{
272706f2543Smrg	    if (!CreateConnectionBlock()) {
273706f2543Smrg	    	FatalError("could not create connection block info");
274706f2543Smrg	    }
275706f2543Smrg	}
276706f2543Smrg
277706f2543Smrg#ifdef XQUARTZ
278706f2543Smrg	/* Let the other threads know the server is done with its init */
279706f2543Smrg	pthread_mutex_lock(&serverRunningMutex);
280706f2543Smrg	serverRunning = TRUE;
281706f2543Smrg	pthread_cond_broadcast(&serverRunningCond);
282706f2543Smrg	pthread_mutex_unlock(&serverRunningMutex);
283706f2543Smrg#endif
284706f2543Smrg
285706f2543Smrg	NotifyParentProcess();
286706f2543Smrg
287706f2543Smrg	Dispatch();
288706f2543Smrg
289706f2543Smrg#ifdef XQUARTZ
290706f2543Smrg	/* Let the other threads know the server is no longer running */
291706f2543Smrg	pthread_mutex_lock(&serverRunningMutex);
292706f2543Smrg	serverRunning = FALSE;
293706f2543Smrg	pthread_mutex_unlock(&serverRunningMutex);
294706f2543Smrg#endif
295706f2543Smrg
296706f2543Smrg	UndisplayDevices();
297706f2543Smrg
298706f2543Smrg	/* Now free up whatever must be freed */
299706f2543Smrg	if (screenIsSaved == SCREEN_SAVER_ON)
300706f2543Smrg	    dixSaveScreens(serverClient, SCREEN_SAVER_OFF, ScreenSaverReset);
301706f2543Smrg	FreeScreenSaverTimer();
302706f2543Smrg	CloseDownExtensions();
303706f2543Smrg
304706f2543Smrg#ifdef PANORAMIX
305706f2543Smrg	{
306706f2543Smrg	    Bool remember_it = noPanoramiXExtension;
307706f2543Smrg	    noPanoramiXExtension = TRUE;
308706f2543Smrg	    FreeAllResources();
309706f2543Smrg	    noPanoramiXExtension = remember_it;
310706f2543Smrg	}
311706f2543Smrg#else
312706f2543Smrg	FreeAllResources();
313706f2543Smrg#endif
314706f2543Smrg
315706f2543Smrg        CloseInput();
316706f2543Smrg
317706f2543Smrg	for (i = 0; i < screenInfo.numScreens; i++)
318706f2543Smrg	    screenInfo.screens[i]->root = NullWindow;
319706f2543Smrg	CloseDownDevices();
320706f2543Smrg	CloseDownEvents();
321706f2543Smrg
322706f2543Smrg	for (i = screenInfo.numScreens - 1; i >= 0; i--)
323706f2543Smrg	{
324706f2543Smrg	    FreeScratchPixmapsForScreen(i);
325706f2543Smrg	    FreeGCperDepth(i);
326706f2543Smrg	    FreeDefaultStipple(i);
327706f2543Smrg	    (* screenInfo.screens[i]->CloseScreen)(i, screenInfo.screens[i]);
328706f2543Smrg	    dixFreePrivates(screenInfo.screens[i]->devPrivates, PRIVATE_SCREEN);
329706f2543Smrg	    free(screenInfo.screens[i]);
330706f2543Smrg	    screenInfo.numScreens = i;
331706f2543Smrg	}
332706f2543Smrg
333706f2543Smrg	dixFreePrivates(serverClient->devPrivates, PRIVATE_CLIENT);
334706f2543Smrg	serverClient->devPrivates = NULL;
335706f2543Smrg
336706f2543Smrg	FreeFonts();
337706f2543Smrg
338706f2543Smrg	FreeAuditTimer();
339706f2543Smrg
340706f2543Smrg	if (dispatchException & DE_TERMINATE)
341706f2543Smrg	{
342706f2543Smrg	    CloseWellKnownConnections();
343706f2543Smrg	}
344706f2543Smrg
345706f2543Smrg	OsCleanup((dispatchException & DE_TERMINATE) != 0);
346706f2543Smrg
347706f2543Smrg	if (dispatchException & DE_TERMINATE)
348706f2543Smrg	{
349706f2543Smrg	    ddxGiveUp();
350706f2543Smrg	    break;
351706f2543Smrg	}
352706f2543Smrg
353706f2543Smrg	free(ConnectionInfo);
354706f2543Smrg	ConnectionInfo = NULL;
355706f2543Smrg    }
356706f2543Smrg    return 0;
357706f2543Smrg}
358706f2543Smrg
359