xref: /OK3568_Linux_fs/external/xserver/hw/xnest/Screen.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
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