|
|
1.1 root 1: /***********************************************************
2: Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts,
3: and the Massachusetts Institute of Technology, Cambridge, Massachusetts.
4:
5: All Rights Reserved
6:
7: Permission to use, copy, modify, and distribute this software and its
8: documentation for any purpose and without fee is hereby granted,
9: provided that the above copyright notice appear in all copies and that
10: both that copyright notice and this permission notice appear in
11: supporting documentation, and that the names of Digital or MIT not be
12: used in advertising or publicity pertaining to distribution of the
13: software without specific, written prior permission.
14:
15: DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
16: ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
17: DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
18: ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
19: WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
20: ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
21: SOFTWARE.
22:
23: ******************************************************************/
24: /* $Header: main.c,v 1.124 87/09/07 18:17:41 toddb Exp $ */
25:
26: #include "X.h"
27: #include "Xproto.h"
28: #include "input.h"
29: #include "scrnintstr.h"
30: #include "misc.h"
31: #include "os.h"
32: #include "windowstr.h"
33: #include "resource.h"
34: #include "dixstruct.h"
35: #include "gcstruct.h"
36: #include "extension.h"
37: #include "colormap.h"
38: #include "cursorstr.h"
39: #include "opaque.h"
40: #include "servermd.h"
41:
42: extern long defaultScreenSaverTime;
43: extern long defaultScreenSaverInterval;
44: extern int defaultScreenSaverBlanking;
45: extern int defaultScreenSaverAllowExposures;
46:
47: extern char *display;
48: char *ConnectionInfo;
49: xConnSetupPrefix connSetupPrefix;
50:
51: extern WindowRec WindowTable[];
52: extern xColorItem screenWhite, screenBlack;
53: extern FontPtr defaultFont;
54:
55: extern void SetInputCheck();
56: extern void AbortServer();
57:
58: PaddingInfo PixmapWidthPaddingInfo[33];
59: int connBlockScreenStart;
60:
61: unsigned char *minfree;
62:
63: static int restart = 0;
64:
65: int
66: NotImplemented()
67: {
68: FatalError("Not implemented");
69: }
70:
71: /*
72: * This array encodes the answer to the question "what is the log base 2
73: * of the number of pixels that fit in a scanline pad unit?"
74: * Note that ~0 is an invalid entry (mostly for the benefit of the reader).
75: */
76: static int answer[6][3] = {
77: /* pad pad pad */
78: /* 8 16 32 */
79:
80: { 3, 4, 5 }, /* 1 bit per pixel */
81: { 1, 2, 3 }, /* 4 bits per pixel */
82: { 0, 1, 2 }, /* 8 bits per pixel */
83: { ~0, 0, 1 }, /* 16 bits per pixel */
84: { ~0, ~0, 0 }, /* 24 bits per pixel */
85: { ~0, ~0, 0 } /* 32 bits per pixel */
86: };
87:
88: /*
89: * This array gives the answer to the question "what is the first index for
90: * the answer array above given the number of bits per pixel?"
91: * Note that ~0 is an invalid entry (mostly for the benefit of the reader).
92: */
93: static int indexForBitsPerPixel[ 33 ] = {
94: ~0, 0, ~0, ~0, /* 1 bit per pixel */
95: 1, ~0, ~0, ~0, /* 4 bits per pixel */
96: 2, ~0, ~0, ~0, /* 8 bits per pixel */
97: ~0,~0, ~0, ~0,
98: 3, ~0, ~0, ~0, /* 16 bits per pixel */
99: ~0,~0, ~0, ~0,
100: 4, ~0, ~0, ~0, /* 24 bits per pixel */
101: ~0,~0, ~0, ~0,
102: 5 /* 32 bits per pixel */
103: };
104:
105: /*
106: * This array gives the answer to the question "what is the second index for
107: * the answer array above given the number of bits per scanline pad unit?"
108: * Note that ~0 is an invalid entry (mostly for the benefit of the reader).
109: */
110: static int indexForScanlinePad[ 33 ] = {
111: ~0, ~0, ~0, ~0,
112: ~0, ~0, ~0, ~0,
113: 0, ~0, ~0, ~0, /* 8 bits per scanline pad unit */
114: ~0, ~0, ~0, ~0,
115: 1, ~0, ~0, ~0, /* 16 bits per scanline pad unit */
116: ~0, ~0, ~0, ~0,
117: ~0, ~0, ~0, ~0,
118: ~0, ~0, ~0, ~0,
119: 2 /* 32 bits per scanline pad unit */
120: };
121:
122: main(argc, argv)
123: int argc;
124: char *argv[];
125: {
126: int i, j, k, looping;
127: int alwaysCheckForInput[2];
128:
129: /* Notice if we're restart. Probably this is because we jumped through
130: * uninitialized pointer */
131: minfree = (unsigned char *)sbrk(0); /* FOR DEBUG XXX */
132: if (restart)
133: FatalError("server restarted. Jumped through uninitialized pointer?\n");
134: else
135: restart = 1;
136: /* These are needed by some routines which are called from interrupt
137: * handlers, thus have no direct calling path back to main and thus
138: * can't be passed argc, argv as parameters */
139: argcGlobal = argc;
140: argvGlobal = argv;
141: display = "0";
142: ProcessCommandLine(argc, argv);
143:
144: alwaysCheckForInput[0] = 0;
145: alwaysCheckForInput[1] = 1;
146: looping = 0;
147: while(1)
148: {
149: ScreenSaverTime = defaultScreenSaverTime;
150: ScreenSaverInterval = defaultScreenSaverInterval;
151: ScreenSaverBlanking = defaultScreenSaverBlanking;
152: ScreenSaverAllowExposures = defaultScreenSaverAllowExposures;
153:
154: /* Perform any operating system dependent initializations you'd like */
155: OsInit();
156: if(!looping)
157: {
158: CreateWellKnownSockets();
159: InitProcVectors();
160: serverClient = (ClientPtr)Xalloc(sizeof(ClientRec));
161: serverClient->sequence = 0;
162: serverClient->closeDownMode = RetainPermanent;
163: serverClient->clientGone = FALSE;
164: serverClient->lastDrawable = (DrawablePtr)NULL;
165: serverClient->lastDrawableID = INVALID;
166: serverClient->lastGC = (GCPtr)NULL;
167: serverClient->lastGCID = None;
168: serverClient->numSaved = None;
169: serverClient->saveSet = (pointer *)NULL;
170: serverClient->index = 0;
171: }
172: currentMaxClients = 10;
173: clients = (ClientPtr *)Xalloc(currentMaxClients * sizeof(ClientPtr));
174: for (i=1; i<currentMaxClients; i++)
175: clients[i] = NullClient;
176: clients[0] = serverClient;
177:
178: InitClientResources(serverClient); /* for root resources */
179:
180: SetInputCheck(&alwaysCheckForInput[0], &alwaysCheckForInput[1]);
181: screenInfo.arraySize = 0;
182: screenInfo.numScreens = 0;
183: screenInfo.screen = (ScreenPtr)NULL;
184: /*
185: * Just in case the ddx doesnt supply a format for depth 1 (like qvss).
186: */
187: j = indexForBitsPerPixel[ 1 ];
188: k = indexForScanlinePad[ BITMAP_SCANLINE_PAD ];
189: PixmapWidthPaddingInfo[1].scanlinePad = BITMAP_SCANLINE_PAD-1;
190: PixmapWidthPaddingInfo[1].bitmapPadLog2 = answer[j][k];
191:
192: InitAtoms();
193: InitExtensions();
194: InitOutput(&screenInfo, argc, argv);
195: if (screenInfo.numScreens < 1)
196: FatalError("no screens found\n");
197: InitEvents();
198: InitInput(argc, argv);
199: InitAndStartDevices(argc, argv);
200:
201: SetDefaultFontPath(defaultFontPath); /* default path has no nulls */
202: if ( ! SetDefaultFont(defaultTextFont))
203: ErrorF( "main: Could not open default font '%s'\n",
204: defaultTextFont);
205: if ( ! (rootCursor = CreateRootCursor(defaultCursorFont, 0)))
206: ErrorF( "main: Could not open default cursor font '%s'\n",
207: defaultCursorFont);
208:
209: for (i=0; i<screenInfo.numScreens; i++)
210: {
211: CreateRootWindow(i);
212: }
213: DefineInitialRootWindow(&WindowTable[0]);
214: if(!looping)
215: {
216: CreateConnectionBlock();
217: }
218:
219: Dispatch();
220:
221: /* Now free up whatever must be freed */
222: CloseDownExtensions();
223: FreeAllResources();
224: for ( i = 0; i < screenInfo.numScreens; i++)
225: {
226: FreeGCperDepth(i);
227: FreeDefaultStipple(i);
228: }
229: CloseDownDevices(argc, argv);
230: for (i = 0; i < screenInfo.numScreens; i++)
231: (* screenInfo.screen[i].CloseScreen)(i, &screenInfo.screen[i]);
232: Xfree(screenInfo.screen);
233:
234: CloseFont(defaultFont);
235: defaultFont = (FontPtr)NULL;
236:
237: ResetHosts(display);
238: Xfree(clients);
239:
240: looping = 1;
241: }
242: }
243:
244: static int padlength[4] = {0, 3, 2, 1};
245:
246: CreateConnectionBlock()
247: {
248: xConnSetup setup;
249: xWindowRoot root;
250: xDepth depth;
251: xVisualType visual;
252: xPixmapFormat format;
253: int i, j, k, vid,
254: lenofblock=0,
255: sizesofar = 0;
256: char *pBuf;
257:
258:
259: /* Leave off the ridBase and ridMask, these must be sent with
260: connection */
261:
262: setup.release = VENDOR_RELEASE;
263: /*
264: * per-server image and bitmap parameters are defined in Xmd.h
265: */
266: setup.imageByteOrder = screenInfo.imageByteOrder;
267: setup.bitmapScanlineUnit = screenInfo.bitmapScanlineUnit;
268: setup.bitmapScanlinePad = screenInfo.bitmapScanlinePad;
269: setup.bitmapBitOrder = screenInfo.bitmapBitOrder;
270: setup.motionBufferSize = NumMotionEvents();
271: setup.numRoots = screenInfo.numScreens;
272: setup.nbytesVendor = strlen(VENDOR_STRING);
273: setup.numFormats = screenInfo.numPixmapFormats;
274: setup.maxRequestSize = MAX_REQUEST_SIZE;
275: QueryMinMaxKeyCodes(&setup.minKeyCode, &setup.maxKeyCode);
276:
277: lenofblock = sizeof(xConnSetup) +
278: ((setup.nbytesVendor + 3) & ~3) +
279: (setup.numFormats * sizeof(xPixmapFormat)) +
280: (setup.numRoots * sizeof(xWindowRoot));
281: ConnectionInfo = (char *) Xalloc(lenofblock);
282:
283: bcopy((char *)&setup, ConnectionInfo, sizeof(xConnSetup));
284: sizesofar = sizeof(xConnSetup);
285: pBuf = ConnectionInfo + sizeof(xConnSetup);
286:
287: bcopy(VENDOR_STRING, pBuf, setup.nbytesVendor);
288: sizesofar += setup.nbytesVendor;
289: pBuf += setup.nbytesVendor;
290: i = padlength[setup.nbytesVendor & 3];
291: if (i)
292: {
293: char pad[4];
294: bcopy(pad, pBuf, i);
295: pBuf += i;
296: sizesofar += i;
297: }
298:
299: for (i=0; i<screenInfo.numPixmapFormats; i++)
300: {
301: format.depth = screenInfo.formats[i].depth;
302: format.bitsPerPixel = screenInfo.formats[i].bitsPerPixel;
303: format.scanLinePad = screenInfo.formats[i].scanlinePad;;
304: bcopy((char *)&format, pBuf, sizeof(xPixmapFormat));
305: pBuf += sizeof(xPixmapFormat);
306: sizesofar += sizeof(xPixmapFormat);
307: }
308:
309: connBlockScreenStart = sizesofar;
310: for (i=0; i<screenInfo.numScreens; i++)
311: {
312: ScreenPtr pScreen;
313: DepthPtr pDepth;
314: VisualPtr pVisual;
315:
316: pScreen = &(screenInfo.screen[i]);
317: root.windowId = WindowTable[i].wid;
318: root.defaultColormap = pScreen->defColormap;
319: root.whitePixel = pScreen->whitePixel;
320: root.blackPixel = pScreen->blackPixel;
321: root.currentInputMask = 0; /* filled in when sent */
322: root.pixWidth = pScreen->width;
323: root.pixHeight = pScreen->height;
324: root.mmWidth = pScreen->mmWidth;
325: root.mmHeight = pScreen->mmHeight;
326: root.minInstalledMaps = pScreen->minInstalledCmaps;
327: root.maxInstalledMaps = pScreen->maxInstalledCmaps;
328: root.rootVisualID = pScreen->rootVisual;
329: root.backingStore = pScreen->backingStoreSupport;
330: root.saveUnders = pScreen->saveUnderSupport;
331: root.rootDepth = pScreen->rootDepth;
332: root.nDepths = pScreen->numDepths;
333: bcopy((char *)&root, pBuf, sizeof(xWindowRoot));
334: sizesofar += sizeof(xWindowRoot);
335: pBuf += sizeof(xWindowRoot);
336:
337: pDepth = pScreen->allowedDepths;
338: for(j = 0; j < pScreen->numDepths; j++, pDepth++)
339: {
340: lenofblock += sizeof(xDepth) +
341: (pDepth->numVids * sizeof(xVisualType));
342: ConnectionInfo = (char *)Xrealloc(ConnectionInfo, lenofblock);
343: pBuf = ConnectionInfo + sizesofar;
344: depth.depth = pDepth->depth;
345: depth.nVisuals = pDepth->numVids;
346: bcopy((char *)&depth, pBuf, sizeof(xDepth));
347: pBuf += sizeof(xDepth);
348: sizesofar += sizeof(xDepth);
349: for(k = 0; k < pDepth->numVids; k++)
350: {
351: vid = pDepth->vids[k];
352: pVisual = (VisualPtr) LookupID(vid, RT_VISUALID, RC_CORE);
353: visual.visualID = pVisual->vid;
354: visual.class = pVisual->class;
355: visual.bitsPerRGB = pVisual->bitsPerRGBValue;
356: visual.colormapEntries = pVisual->ColormapEntries;
357: visual.redMask = pVisual->redMask;
358: visual.greenMask = pVisual->greenMask;
359: visual.blueMask = pVisual->blueMask;
360: bcopy((char *)&visual, pBuf, sizeof(xVisualType));
361: pBuf += sizeof(xVisualType);
362: sizesofar += sizeof(xVisualType);
363: }
364: }
365: }
366: connSetupPrefix.success = xTrue;
367: connSetupPrefix.length = lenofblock/4;
368: connSetupPrefix.majorVersion = X_PROTOCOL;
369: connSetupPrefix.minorVersion = X_PROTOCOL_REVISION;
370: }
371:
372:
373: /* VARARGS */
374: FatalError (msg, v0, v1, v2, v3, v4, v5, v6, v7, v8)
375: char *msg;
376: int v0, v1, v2, v3, v4, v5, v6, v7, v8;
377: {
378: ErrorF("\nFatal server bug!\n");
379: ErrorF(msg, v0, v1, v2, v3, v4, v5, v6, v7, v8);
380: ErrorF("\n");
381: AbortServer();
382: }
383:
384: /*
385: grow the array of screenRecs if necessary.
386: call the device-supplied initialization procedure
387: with its screen number, a pointer to its ScreenRec, argc, and argv.
388: return the number of successfully installed screens.
389:
390: */
391:
392: AddScreen(pfnInit, argc, argv)
393: Bool (* pfnInit)();
394: int argc;
395: char **argv;
396: {
397:
398: int i = screenInfo.numScreens;
399: int scanlinepad, format, bitsPerPixel, j, k;
400: #ifdef DEBUG
401: void (**jNI) ();
402: #endif /* DEBUG */
403:
404: if (screenInfo.numScreens == screenInfo.arraySize)
405: {
406: screenInfo.arraySize += 5;
407: screenInfo.screen = (ScreenPtr)Xrealloc(
408: screenInfo.screen,
409: screenInfo.arraySize * sizeof(ScreenRec));
410: }
411:
412: #ifdef DEBUG
413: for (jNI = &screenInfo.screen[i].QueryBestSize;
414: jNI < (void (**) ()) &screenInfo.screen[i].RegionExtents;
415: jNI++)
416: *jNI = (void (*) ())NotImplemented;
417: #endif /* DEBUG */
418:
419:
420: /*
421: * This loop gets run once for every Screen that gets added,
422: * but thats ok. If the ddx layer initializes the formats
423: * one at a time calling AddScreen() after each, then each
424: * iteration will make it a little more accurate. Worst case
425: * we do this loop N * numPixmapFormats where N is # of screens.
426: * Anyway, this must be called after InitOutput and before the
427: * screen init routine is called.
428: */
429: for (format=0; format<screenInfo.numPixmapFormats; format++)
430: {
431: bitsPerPixel = screenInfo.formats[format].bitsPerPixel;
432: scanlinepad = screenInfo.formats[format].scanlinePad;
433: j = indexForBitsPerPixel[ bitsPerPixel ];
434: k = indexForScanlinePad[ scanlinepad ];
435: PixmapWidthPaddingInfo[ bitsPerPixel ].bitmapPadLog2 = answer[j][k];
436: PixmapWidthPaddingInfo[ bitsPerPixel ].scanlinePad =
437: (scanlinepad/bitsPerPixel) - 1;
438: }
439:
440: /* This is where screen specific stuff gets initialized. Load the
441: screen structure, call the hardware, whatever.
442: This is also where the default colormap should be allocated and
443: also pixel values for blackPixel, whitePixel, and the cursor
444: Note that InitScreen is NOT allowed to modify argc, argv, or
445: any of the strings pointed to by argv. They may be passed to
446: multiple screens.
447: */
448: screenInfo.screen[i].rgf = ~0; /* there are no scratch GCs yet*/
449: screenInfo.screen[i].myNum = i;
450: if ((*pfnInit)(i, &screenInfo.screen[i], argc, argv))
451: {
452: screenInfo.numScreens++;
453: CreateGCperDepthArray(i);
454: CreateDefaultStipple(i);
455: }
456: else
457: ErrorF("screen %d failed initialization\n", i);
458:
459: return screenInfo.numScreens;
460: }
461:
462:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.