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