1*4882a593Smuzhiyun /*
2*4882a593Smuzhiyun
3*4882a593Smuzhiyun Copyright 1993 by Davor Matic
4*4882a593Smuzhiyun
5*4882a593Smuzhiyun Permission to use, copy, modify, distribute, and sell this software
6*4882a593Smuzhiyun and its documentation for any purpose is hereby granted without fee,
7*4882a593Smuzhiyun provided that the above copyright notice appear in all copies and that
8*4882a593Smuzhiyun both that copyright notice and this permission notice appear in
9*4882a593Smuzhiyun supporting documentation. Davor Matic makes no representations about
10*4882a593Smuzhiyun the suitability of this software for any purpose. It is provided "as
11*4882a593Smuzhiyun is" without express or implied warranty.
12*4882a593Smuzhiyun
13*4882a593Smuzhiyun */
14*4882a593Smuzhiyun
15*4882a593Smuzhiyun #ifdef HAVE_XNEST_CONFIG_H
16*4882a593Smuzhiyun #include <xnest-config.h>
17*4882a593Smuzhiyun #endif
18*4882a593Smuzhiyun
19*4882a593Smuzhiyun #include <X11/X.h>
20*4882a593Smuzhiyun #include <X11/Xproto.h>
21*4882a593Smuzhiyun #include "scrnintstr.h"
22*4882a593Smuzhiyun #include "dix.h"
23*4882a593Smuzhiyun #include "mi.h"
24*4882a593Smuzhiyun #include "micmap.h"
25*4882a593Smuzhiyun #include "colormapst.h"
26*4882a593Smuzhiyun #include "resource.h"
27*4882a593Smuzhiyun
28*4882a593Smuzhiyun #include "Xnest.h"
29*4882a593Smuzhiyun
30*4882a593Smuzhiyun #include "Display.h"
31*4882a593Smuzhiyun #include "Screen.h"
32*4882a593Smuzhiyun #include "XNGC.h"
33*4882a593Smuzhiyun #include "GCOps.h"
34*4882a593Smuzhiyun #include "Drawable.h"
35*4882a593Smuzhiyun #include "XNFont.h"
36*4882a593Smuzhiyun #include "Color.h"
37*4882a593Smuzhiyun #include "XNCursor.h"
38*4882a593Smuzhiyun #include "Visual.h"
39*4882a593Smuzhiyun #include "Events.h"
40*4882a593Smuzhiyun #include "Init.h"
41*4882a593Smuzhiyun #include "mipointer.h"
42*4882a593Smuzhiyun #include "Args.h"
43*4882a593Smuzhiyun #include "mipointrst.h"
44*4882a593Smuzhiyun
45*4882a593Smuzhiyun Window xnestDefaultWindows[MAXSCREENS];
46*4882a593Smuzhiyun Window xnestScreenSaverWindows[MAXSCREENS];
47*4882a593Smuzhiyun DevPrivateKeyRec xnestCursorScreenKeyRec;
48*4882a593Smuzhiyun
49*4882a593Smuzhiyun ScreenPtr
xnestScreen(Window window)50*4882a593Smuzhiyun xnestScreen(Window window)
51*4882a593Smuzhiyun {
52*4882a593Smuzhiyun int i;
53*4882a593Smuzhiyun
54*4882a593Smuzhiyun for (i = 0; i < xnestNumScreens; i++)
55*4882a593Smuzhiyun if (xnestDefaultWindows[i] == window)
56*4882a593Smuzhiyun return screenInfo.screens[i];
57*4882a593Smuzhiyun
58*4882a593Smuzhiyun return NULL;
59*4882a593Smuzhiyun }
60*4882a593Smuzhiyun
61*4882a593Smuzhiyun static int
offset(unsigned long mask)62*4882a593Smuzhiyun offset(unsigned long mask)
63*4882a593Smuzhiyun {
64*4882a593Smuzhiyun int count;
65*4882a593Smuzhiyun
66*4882a593Smuzhiyun for (count = 0; !(mask & 1) && count < 32; count++)
67*4882a593Smuzhiyun mask >>= 1;
68*4882a593Smuzhiyun
69*4882a593Smuzhiyun return count;
70*4882a593Smuzhiyun }
71*4882a593Smuzhiyun
72*4882a593Smuzhiyun static Bool
xnestSaveScreen(ScreenPtr pScreen,int what)73*4882a593Smuzhiyun xnestSaveScreen(ScreenPtr pScreen, int what)
74*4882a593Smuzhiyun {
75*4882a593Smuzhiyun if (xnestSoftwareScreenSaver)
76*4882a593Smuzhiyun return False;
77*4882a593Smuzhiyun else {
78*4882a593Smuzhiyun switch (what) {
79*4882a593Smuzhiyun case SCREEN_SAVER_ON:
80*4882a593Smuzhiyun XMapRaised(xnestDisplay, xnestScreenSaverWindows[pScreen->myNum]);
81*4882a593Smuzhiyun xnestSetScreenSaverColormapWindow(pScreen);
82*4882a593Smuzhiyun break;
83*4882a593Smuzhiyun
84*4882a593Smuzhiyun case SCREEN_SAVER_OFF:
85*4882a593Smuzhiyun XUnmapWindow(xnestDisplay, xnestScreenSaverWindows[pScreen->myNum]);
86*4882a593Smuzhiyun xnestSetInstalledColormapWindows(pScreen);
87*4882a593Smuzhiyun break;
88*4882a593Smuzhiyun
89*4882a593Smuzhiyun case SCREEN_SAVER_FORCER:
90*4882a593Smuzhiyun lastEventTime = GetTimeInMillis();
91*4882a593Smuzhiyun XUnmapWindow(xnestDisplay, xnestScreenSaverWindows[pScreen->myNum]);
92*4882a593Smuzhiyun xnestSetInstalledColormapWindows(pScreen);
93*4882a593Smuzhiyun break;
94*4882a593Smuzhiyun
95*4882a593Smuzhiyun case SCREEN_SAVER_CYCLE:
96*4882a593Smuzhiyun XUnmapWindow(xnestDisplay, xnestScreenSaverWindows[pScreen->myNum]);
97*4882a593Smuzhiyun xnestSetInstalledColormapWindows(pScreen);
98*4882a593Smuzhiyun break;
99*4882a593Smuzhiyun }
100*4882a593Smuzhiyun return True;
101*4882a593Smuzhiyun }
102*4882a593Smuzhiyun }
103*4882a593Smuzhiyun
104*4882a593Smuzhiyun static Bool
xnestCursorOffScreen(ScreenPtr * ppScreen,int * x,int * y)105*4882a593Smuzhiyun xnestCursorOffScreen(ScreenPtr *ppScreen, int *x, int *y)
106*4882a593Smuzhiyun {
107*4882a593Smuzhiyun return FALSE;
108*4882a593Smuzhiyun }
109*4882a593Smuzhiyun
110*4882a593Smuzhiyun static void
xnestCrossScreen(ScreenPtr pScreen,Bool entering)111*4882a593Smuzhiyun xnestCrossScreen(ScreenPtr pScreen, Bool entering)
112*4882a593Smuzhiyun {
113*4882a593Smuzhiyun }
114*4882a593Smuzhiyun
115*4882a593Smuzhiyun static miPointerScreenFuncRec xnestPointerCursorFuncs = {
116*4882a593Smuzhiyun xnestCursorOffScreen,
117*4882a593Smuzhiyun xnestCrossScreen,
118*4882a593Smuzhiyun miPointerWarpCursor
119*4882a593Smuzhiyun };
120*4882a593Smuzhiyun
121*4882a593Smuzhiyun static miPointerSpriteFuncRec xnestPointerSpriteFuncs = {
122*4882a593Smuzhiyun xnestRealizeCursor,
123*4882a593Smuzhiyun xnestUnrealizeCursor,
124*4882a593Smuzhiyun xnestSetCursor,
125*4882a593Smuzhiyun xnestMoveCursor,
126*4882a593Smuzhiyun xnestDeviceCursorInitialize,
127*4882a593Smuzhiyun xnestDeviceCursorCleanup
128*4882a593Smuzhiyun };
129*4882a593Smuzhiyun
130*4882a593Smuzhiyun Bool
xnestOpenScreen(ScreenPtr pScreen,int argc,char * argv[])131*4882a593Smuzhiyun xnestOpenScreen(ScreenPtr pScreen, int argc, char *argv[])
132*4882a593Smuzhiyun {
133*4882a593Smuzhiyun VisualPtr visuals;
134*4882a593Smuzhiyun DepthPtr depths;
135*4882a593Smuzhiyun int numVisuals, numDepths;
136*4882a593Smuzhiyun int i, j, depthIndex;
137*4882a593Smuzhiyun unsigned long valuemask;
138*4882a593Smuzhiyun XSetWindowAttributes attributes;
139*4882a593Smuzhiyun XWindowAttributes gattributes;
140*4882a593Smuzhiyun XSizeHints sizeHints;
141*4882a593Smuzhiyun VisualID defaultVisual;
142*4882a593Smuzhiyun int rootDepth;
143*4882a593Smuzhiyun miPointerScreenPtr PointPriv;
144*4882a593Smuzhiyun
145*4882a593Smuzhiyun if (!dixRegisterPrivateKey
146*4882a593Smuzhiyun (&xnestWindowPrivateKeyRec, PRIVATE_WINDOW, sizeof(xnestPrivWin)))
147*4882a593Smuzhiyun return FALSE;
148*4882a593Smuzhiyun if (!dixRegisterPrivateKey
149*4882a593Smuzhiyun (&xnestGCPrivateKeyRec, PRIVATE_GC, sizeof(xnestPrivGC)))
150*4882a593Smuzhiyun return FALSE;
151*4882a593Smuzhiyun if (!dixRegisterPrivateKey
152*4882a593Smuzhiyun (&xnestPixmapPrivateKeyRec, PRIVATE_PIXMAP, sizeof(xnestPrivPixmap)))
153*4882a593Smuzhiyun return FALSE;
154*4882a593Smuzhiyun if (!dixRegisterPrivateKey
155*4882a593Smuzhiyun (&xnestColormapPrivateKeyRec, PRIVATE_COLORMAP,
156*4882a593Smuzhiyun sizeof(xnestPrivColormap)))
157*4882a593Smuzhiyun return FALSE;
158*4882a593Smuzhiyun if (!dixRegisterPrivateKey(&xnestCursorScreenKeyRec, PRIVATE_SCREEN, 0))
159*4882a593Smuzhiyun return FALSE;
160*4882a593Smuzhiyun
161*4882a593Smuzhiyun visuals = xallocarray(xnestNumVisuals, sizeof(VisualRec));
162*4882a593Smuzhiyun numVisuals = 0;
163*4882a593Smuzhiyun
164*4882a593Smuzhiyun depths = (DepthPtr) malloc(MAXDEPTH * sizeof(DepthRec));
165*4882a593Smuzhiyun depths[0].depth = 1;
166*4882a593Smuzhiyun depths[0].numVids = 0;
167*4882a593Smuzhiyun depths[0].vids = (VisualID *) malloc(MAXVISUALSPERDEPTH * sizeof(VisualID));
168*4882a593Smuzhiyun numDepths = 1;
169*4882a593Smuzhiyun
170*4882a593Smuzhiyun for (i = 0; i < xnestNumVisuals; i++) {
171*4882a593Smuzhiyun visuals[numVisuals].class = xnestVisuals[i].class;
172*4882a593Smuzhiyun visuals[numVisuals].bitsPerRGBValue = xnestVisuals[i].bits_per_rgb;
173*4882a593Smuzhiyun visuals[numVisuals].ColormapEntries = xnestVisuals[i].colormap_size;
174*4882a593Smuzhiyun visuals[numVisuals].nplanes = xnestVisuals[i].depth;
175*4882a593Smuzhiyun visuals[numVisuals].redMask = xnestVisuals[i].red_mask;
176*4882a593Smuzhiyun visuals[numVisuals].greenMask = xnestVisuals[i].green_mask;
177*4882a593Smuzhiyun visuals[numVisuals].blueMask = xnestVisuals[i].blue_mask;
178*4882a593Smuzhiyun visuals[numVisuals].offsetRed = offset(xnestVisuals[i].red_mask);
179*4882a593Smuzhiyun visuals[numVisuals].offsetGreen = offset(xnestVisuals[i].green_mask);
180*4882a593Smuzhiyun visuals[numVisuals].offsetBlue = offset(xnestVisuals[i].blue_mask);
181*4882a593Smuzhiyun
182*4882a593Smuzhiyun /* Check for and remove duplicates. */
183*4882a593Smuzhiyun for (j = 0; j < numVisuals; j++) {
184*4882a593Smuzhiyun if (visuals[numVisuals].class == visuals[j].class &&
185*4882a593Smuzhiyun visuals[numVisuals].bitsPerRGBValue ==
186*4882a593Smuzhiyun visuals[j].bitsPerRGBValue &&
187*4882a593Smuzhiyun visuals[numVisuals].ColormapEntries ==
188*4882a593Smuzhiyun visuals[j].ColormapEntries &&
189*4882a593Smuzhiyun visuals[numVisuals].nplanes == visuals[j].nplanes &&
190*4882a593Smuzhiyun visuals[numVisuals].redMask == visuals[j].redMask &&
191*4882a593Smuzhiyun visuals[numVisuals].greenMask == visuals[j].greenMask &&
192*4882a593Smuzhiyun visuals[numVisuals].blueMask == visuals[j].blueMask &&
193*4882a593Smuzhiyun visuals[numVisuals].offsetRed == visuals[j].offsetRed &&
194*4882a593Smuzhiyun visuals[numVisuals].offsetGreen == visuals[j].offsetGreen &&
195*4882a593Smuzhiyun visuals[numVisuals].offsetBlue == visuals[j].offsetBlue)
196*4882a593Smuzhiyun break;
197*4882a593Smuzhiyun }
198*4882a593Smuzhiyun if (j < numVisuals)
199*4882a593Smuzhiyun break;
200*4882a593Smuzhiyun
201*4882a593Smuzhiyun visuals[numVisuals].vid = FakeClientID(0);
202*4882a593Smuzhiyun
203*4882a593Smuzhiyun depthIndex = UNDEFINED;
204*4882a593Smuzhiyun for (j = 0; j < numDepths; j++)
205*4882a593Smuzhiyun if (depths[j].depth == xnestVisuals[i].depth) {
206*4882a593Smuzhiyun depthIndex = j;
207*4882a593Smuzhiyun break;
208*4882a593Smuzhiyun }
209*4882a593Smuzhiyun
210*4882a593Smuzhiyun if (depthIndex == UNDEFINED) {
211*4882a593Smuzhiyun depthIndex = numDepths;
212*4882a593Smuzhiyun depths[depthIndex].depth = xnestVisuals[i].depth;
213*4882a593Smuzhiyun depths[depthIndex].numVids = 0;
214*4882a593Smuzhiyun depths[depthIndex].vids =
215*4882a593Smuzhiyun (VisualID *) malloc(MAXVISUALSPERDEPTH * sizeof(VisualID));
216*4882a593Smuzhiyun numDepths++;
217*4882a593Smuzhiyun }
218*4882a593Smuzhiyun if (depths[depthIndex].numVids >= MAXVISUALSPERDEPTH) {
219*4882a593Smuzhiyun FatalError("Visual table overflow");
220*4882a593Smuzhiyun }
221*4882a593Smuzhiyun depths[depthIndex].vids[depths[depthIndex].numVids] =
222*4882a593Smuzhiyun visuals[numVisuals].vid;
223*4882a593Smuzhiyun depths[depthIndex].numVids++;
224*4882a593Smuzhiyun
225*4882a593Smuzhiyun numVisuals++;
226*4882a593Smuzhiyun }
227*4882a593Smuzhiyun visuals = reallocarray(visuals, numVisuals, sizeof(VisualRec));
228*4882a593Smuzhiyun
229*4882a593Smuzhiyun defaultVisual = visuals[xnestDefaultVisualIndex].vid;
230*4882a593Smuzhiyun rootDepth = visuals[xnestDefaultVisualIndex].nplanes;
231*4882a593Smuzhiyun
232*4882a593Smuzhiyun if (xnestParentWindow != 0) {
233*4882a593Smuzhiyun XGetWindowAttributes(xnestDisplay, xnestParentWindow, &gattributes);
234*4882a593Smuzhiyun xnestWidth = gattributes.width;
235*4882a593Smuzhiyun xnestHeight = gattributes.height;
236*4882a593Smuzhiyun }
237*4882a593Smuzhiyun
238*4882a593Smuzhiyun /* myNum */
239*4882a593Smuzhiyun /* id */
240*4882a593Smuzhiyun miScreenInit(pScreen, NULL, xnestWidth, xnestHeight, 1, 1, xnestWidth, rootDepth, numDepths, depths, defaultVisual, /* root visual */
241*4882a593Smuzhiyun numVisuals, visuals);
242*4882a593Smuzhiyun
243*4882a593Smuzhiyun pScreen->defColormap = (Colormap) FakeClientID(0);
244*4882a593Smuzhiyun pScreen->minInstalledCmaps = MINCMAPS;
245*4882a593Smuzhiyun pScreen->maxInstalledCmaps = MAXCMAPS;
246*4882a593Smuzhiyun pScreen->backingStoreSupport = NotUseful;
247*4882a593Smuzhiyun pScreen->saveUnderSupport = NotUseful;
248*4882a593Smuzhiyun pScreen->whitePixel = xnestWhitePixel;
249*4882a593Smuzhiyun pScreen->blackPixel = xnestBlackPixel;
250*4882a593Smuzhiyun /* GCperDepth */
251*4882a593Smuzhiyun /* defaultStipple */
252*4882a593Smuzhiyun pScreen->devPrivate = NULL;
253*4882a593Smuzhiyun /* WindowPrivateLen */
254*4882a593Smuzhiyun /* WindowPrivateSizes */
255*4882a593Smuzhiyun /* totalWindowSize */
256*4882a593Smuzhiyun /* GCPrivateLen */
257*4882a593Smuzhiyun /* GCPrivateSizes */
258*4882a593Smuzhiyun /* totalGCSize */
259*4882a593Smuzhiyun
260*4882a593Smuzhiyun /* Random screen procedures */
261*4882a593Smuzhiyun
262*4882a593Smuzhiyun pScreen->QueryBestSize = xnestQueryBestSize;
263*4882a593Smuzhiyun pScreen->SaveScreen = xnestSaveScreen;
264*4882a593Smuzhiyun pScreen->GetImage = xnestGetImage;
265*4882a593Smuzhiyun pScreen->GetSpans = xnestGetSpans;
266*4882a593Smuzhiyun
267*4882a593Smuzhiyun /* Window Procedures */
268*4882a593Smuzhiyun
269*4882a593Smuzhiyun pScreen->CreateWindow = xnestCreateWindow;
270*4882a593Smuzhiyun pScreen->DestroyWindow = xnestDestroyWindow;
271*4882a593Smuzhiyun pScreen->PositionWindow = xnestPositionWindow;
272*4882a593Smuzhiyun pScreen->ChangeWindowAttributes = xnestChangeWindowAttributes;
273*4882a593Smuzhiyun pScreen->RealizeWindow = xnestRealizeWindow;
274*4882a593Smuzhiyun pScreen->UnrealizeWindow = xnestUnrealizeWindow;
275*4882a593Smuzhiyun pScreen->PostValidateTree = NULL;
276*4882a593Smuzhiyun pScreen->WindowExposures = xnestWindowExposures;
277*4882a593Smuzhiyun pScreen->CopyWindow = xnestCopyWindow;
278*4882a593Smuzhiyun pScreen->ClipNotify = xnestClipNotify;
279*4882a593Smuzhiyun
280*4882a593Smuzhiyun /* Pixmap procedures */
281*4882a593Smuzhiyun
282*4882a593Smuzhiyun pScreen->CreatePixmap = xnestCreatePixmap;
283*4882a593Smuzhiyun pScreen->DestroyPixmap = xnestDestroyPixmap;
284*4882a593Smuzhiyun pScreen->ModifyPixmapHeader = xnestModifyPixmapHeader;
285*4882a593Smuzhiyun
286*4882a593Smuzhiyun /* Font procedures */
287*4882a593Smuzhiyun
288*4882a593Smuzhiyun pScreen->RealizeFont = xnestRealizeFont;
289*4882a593Smuzhiyun pScreen->UnrealizeFont = xnestUnrealizeFont;
290*4882a593Smuzhiyun
291*4882a593Smuzhiyun /* GC procedures */
292*4882a593Smuzhiyun
293*4882a593Smuzhiyun pScreen->CreateGC = xnestCreateGC;
294*4882a593Smuzhiyun
295*4882a593Smuzhiyun /* Colormap procedures */
296*4882a593Smuzhiyun
297*4882a593Smuzhiyun pScreen->CreateColormap = xnestCreateColormap;
298*4882a593Smuzhiyun pScreen->DestroyColormap = xnestDestroyColormap;
299*4882a593Smuzhiyun pScreen->InstallColormap = xnestInstallColormap;
300*4882a593Smuzhiyun pScreen->UninstallColormap = xnestUninstallColormap;
301*4882a593Smuzhiyun pScreen->ListInstalledColormaps = xnestListInstalledColormaps;
302*4882a593Smuzhiyun pScreen->StoreColors = xnestStoreColors;
303*4882a593Smuzhiyun pScreen->ResolveColor = xnestResolveColor;
304*4882a593Smuzhiyun
305*4882a593Smuzhiyun pScreen->BitmapToRegion = xnestPixmapToRegion;
306*4882a593Smuzhiyun
307*4882a593Smuzhiyun /* OS layer procedures */
308*4882a593Smuzhiyun
309*4882a593Smuzhiyun pScreen->BlockHandler = (ScreenBlockHandlerProcPtr) NoopDDA;
310*4882a593Smuzhiyun pScreen->WakeupHandler = (ScreenWakeupHandlerProcPtr) NoopDDA;
311*4882a593Smuzhiyun
312*4882a593Smuzhiyun miDCInitialize(pScreen, &xnestPointerCursorFuncs); /* init SW rendering */
313*4882a593Smuzhiyun PointPriv = dixLookupPrivate(&pScreen->devPrivates, miPointerScreenKey);
314*4882a593Smuzhiyun xnestCursorFuncs.spriteFuncs = PointPriv->spriteFuncs;
315*4882a593Smuzhiyun dixSetPrivate(&pScreen->devPrivates, xnestCursorScreenKey,
316*4882a593Smuzhiyun &xnestCursorFuncs);
317*4882a593Smuzhiyun PointPriv->spriteFuncs = &xnestPointerSpriteFuncs;
318*4882a593Smuzhiyun
319*4882a593Smuzhiyun pScreen->mmWidth = xnestWidth * DisplayWidthMM(xnestDisplay,
320*4882a593Smuzhiyun DefaultScreen(xnestDisplay))
321*4882a593Smuzhiyun / DisplayWidth(xnestDisplay, DefaultScreen(xnestDisplay));
322*4882a593Smuzhiyun pScreen->mmHeight =
323*4882a593Smuzhiyun xnestHeight * DisplayHeightMM(xnestDisplay,
324*4882a593Smuzhiyun DefaultScreen(xnestDisplay)) /
325*4882a593Smuzhiyun DisplayHeight(xnestDisplay, DefaultScreen(xnestDisplay));
326*4882a593Smuzhiyun
327*4882a593Smuzhiyun /* overwrite miCloseScreen with our own */
328*4882a593Smuzhiyun pScreen->CloseScreen = xnestCloseScreen;
329*4882a593Smuzhiyun
330*4882a593Smuzhiyun if (!miScreenDevPrivateInit(pScreen, xnestWidth, NULL))
331*4882a593Smuzhiyun return FALSE;
332*4882a593Smuzhiyun
333*4882a593Smuzhiyun /* overwrite miSetShape with our own */
334*4882a593Smuzhiyun pScreen->SetShape = xnestSetShape;
335*4882a593Smuzhiyun
336*4882a593Smuzhiyun /* devPrivates */
337*4882a593Smuzhiyun
338*4882a593Smuzhiyun #define POSITION_OFFSET (pScreen->myNum * (xnestWidth + xnestHeight) / 32)
339*4882a593Smuzhiyun
340*4882a593Smuzhiyun if (xnestDoFullGeneration) {
341*4882a593Smuzhiyun
342*4882a593Smuzhiyun valuemask = CWBackPixel | CWEventMask | CWColormap;
343*4882a593Smuzhiyun attributes.background_pixel = xnestWhitePixel;
344*4882a593Smuzhiyun attributes.event_mask = xnestEventMask;
345*4882a593Smuzhiyun attributes.colormap =
346*4882a593Smuzhiyun xnestDefaultVisualColormap(xnestDefaultVisual(pScreen));
347*4882a593Smuzhiyun
348*4882a593Smuzhiyun if (xnestParentWindow != 0) {
349*4882a593Smuzhiyun xnestDefaultWindows[pScreen->myNum] = xnestParentWindow;
350*4882a593Smuzhiyun XSelectInput(xnestDisplay, xnestDefaultWindows[pScreen->myNum],
351*4882a593Smuzhiyun xnestEventMask);
352*4882a593Smuzhiyun }
353*4882a593Smuzhiyun else
354*4882a593Smuzhiyun xnestDefaultWindows[pScreen->myNum] =
355*4882a593Smuzhiyun XCreateWindow(xnestDisplay,
356*4882a593Smuzhiyun DefaultRootWindow(xnestDisplay),
357*4882a593Smuzhiyun xnestX + POSITION_OFFSET,
358*4882a593Smuzhiyun xnestY + POSITION_OFFSET,
359*4882a593Smuzhiyun xnestWidth, xnestHeight,
360*4882a593Smuzhiyun xnestBorderWidth,
361*4882a593Smuzhiyun pScreen->rootDepth,
362*4882a593Smuzhiyun InputOutput,
363*4882a593Smuzhiyun xnestDefaultVisual(pScreen),
364*4882a593Smuzhiyun valuemask, &attributes);
365*4882a593Smuzhiyun
366*4882a593Smuzhiyun if (!xnestWindowName)
367*4882a593Smuzhiyun xnestWindowName = argv[0];
368*4882a593Smuzhiyun
369*4882a593Smuzhiyun sizeHints.flags = PPosition | PSize | PMaxSize;
370*4882a593Smuzhiyun sizeHints.x = xnestX + POSITION_OFFSET;
371*4882a593Smuzhiyun sizeHints.y = xnestY + POSITION_OFFSET;
372*4882a593Smuzhiyun sizeHints.width = sizeHints.max_width = xnestWidth;
373*4882a593Smuzhiyun sizeHints.height = sizeHints.max_height = xnestHeight;
374*4882a593Smuzhiyun if (xnestUserGeometry & XValue || xnestUserGeometry & YValue)
375*4882a593Smuzhiyun sizeHints.flags |= USPosition;
376*4882a593Smuzhiyun if (xnestUserGeometry & WidthValue || xnestUserGeometry & HeightValue)
377*4882a593Smuzhiyun sizeHints.flags |= USSize;
378*4882a593Smuzhiyun XSetStandardProperties(xnestDisplay,
379*4882a593Smuzhiyun xnestDefaultWindows[pScreen->myNum],
380*4882a593Smuzhiyun xnestWindowName,
381*4882a593Smuzhiyun xnestWindowName,
382*4882a593Smuzhiyun xnestIconBitmap, argv, argc, &sizeHints);
383*4882a593Smuzhiyun
384*4882a593Smuzhiyun XMapWindow(xnestDisplay, xnestDefaultWindows[pScreen->myNum]);
385*4882a593Smuzhiyun
386*4882a593Smuzhiyun valuemask = CWBackPixmap | CWColormap;
387*4882a593Smuzhiyun attributes.background_pixmap = xnestScreenSaverPixmap;
388*4882a593Smuzhiyun attributes.colormap =
389*4882a593Smuzhiyun DefaultColormap(xnestDisplay, DefaultScreen(xnestDisplay));
390*4882a593Smuzhiyun xnestScreenSaverWindows[pScreen->myNum] =
391*4882a593Smuzhiyun XCreateWindow(xnestDisplay,
392*4882a593Smuzhiyun xnestDefaultWindows[pScreen->myNum],
393*4882a593Smuzhiyun 0, 0, xnestWidth, xnestHeight, 0,
394*4882a593Smuzhiyun DefaultDepth(xnestDisplay,
395*4882a593Smuzhiyun DefaultScreen(xnestDisplay)),
396*4882a593Smuzhiyun InputOutput, DefaultVisual(xnestDisplay,
397*4882a593Smuzhiyun DefaultScreen
398*4882a593Smuzhiyun (xnestDisplay)), valuemask,
399*4882a593Smuzhiyun &attributes);
400*4882a593Smuzhiyun }
401*4882a593Smuzhiyun
402*4882a593Smuzhiyun if (!xnestCreateDefaultColormap(pScreen))
403*4882a593Smuzhiyun return False;
404*4882a593Smuzhiyun
405*4882a593Smuzhiyun return True;
406*4882a593Smuzhiyun }
407*4882a593Smuzhiyun
408*4882a593Smuzhiyun Bool
xnestCloseScreen(ScreenPtr pScreen)409*4882a593Smuzhiyun xnestCloseScreen(ScreenPtr pScreen)
410*4882a593Smuzhiyun {
411*4882a593Smuzhiyun int i;
412*4882a593Smuzhiyun
413*4882a593Smuzhiyun for (i = 0; i < pScreen->numDepths; i++)
414*4882a593Smuzhiyun free(pScreen->allowedDepths[i].vids);
415*4882a593Smuzhiyun free(pScreen->allowedDepths);
416*4882a593Smuzhiyun free(pScreen->visuals);
417*4882a593Smuzhiyun free(pScreen->devPrivate);
418*4882a593Smuzhiyun
419*4882a593Smuzhiyun /*
420*4882a593Smuzhiyun If xnestDoFullGeneration all x resources will be destroyed upon closing
421*4882a593Smuzhiyun the display connection. There is no need to generate extra protocol.
422*4882a593Smuzhiyun */
423*4882a593Smuzhiyun
424*4882a593Smuzhiyun return True;
425*4882a593Smuzhiyun }
426