xref: /OK3568_Linux_fs/external/xserver/hw/xwin/winscrinit.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /*
2*4882a593Smuzhiyun  *Copyright (C) 1994-2000 The XFree86 Project, Inc. All Rights Reserved.
3*4882a593Smuzhiyun  *
4*4882a593Smuzhiyun  *Permission is hereby granted, free of charge, to any person obtaining
5*4882a593Smuzhiyun  * a copy of this software and associated documentation files (the
6*4882a593Smuzhiyun  *"Software"), to deal in the Software without restriction, including
7*4882a593Smuzhiyun  *without limitation the rights to use, copy, modify, merge, publish,
8*4882a593Smuzhiyun  *distribute, sublicense, and/or sell copies of the Software, and to
9*4882a593Smuzhiyun  *permit persons to whom the Software is furnished to do so, subject to
10*4882a593Smuzhiyun  *the following conditions:
11*4882a593Smuzhiyun  *
12*4882a593Smuzhiyun  *The above copyright notice and this permission notice shall be
13*4882a593Smuzhiyun  *included in all copies or substantial portions of the Software.
14*4882a593Smuzhiyun  *
15*4882a593Smuzhiyun  *THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
16*4882a593Smuzhiyun  *EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
17*4882a593Smuzhiyun  *MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
18*4882a593Smuzhiyun  *NONINFRINGEMENT. IN NO EVENT SHALL THE XFREE86 PROJECT BE LIABLE FOR
19*4882a593Smuzhiyun  *ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
20*4882a593Smuzhiyun  *CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
21*4882a593Smuzhiyun  *WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
22*4882a593Smuzhiyun  *
23*4882a593Smuzhiyun  *Except as contained in this notice, the name of the XFree86 Project
24*4882a593Smuzhiyun  *shall not be used in advertising or otherwise to promote the sale, use
25*4882a593Smuzhiyun  *or other dealings in this Software without prior written authorization
26*4882a593Smuzhiyun  *from the XFree86 Project.
27*4882a593Smuzhiyun  *
28*4882a593Smuzhiyun  * Authors:	Dakshinamurthy Karra
29*4882a593Smuzhiyun  *		Suhaib M Siddiqi
30*4882a593Smuzhiyun  *		Peter Busch
31*4882a593Smuzhiyun  *		Harold L Hunt II
32*4882a593Smuzhiyun  *		Kensuke Matsuzaki
33*4882a593Smuzhiyun  */
34*4882a593Smuzhiyun 
35*4882a593Smuzhiyun #ifdef HAVE_XWIN_CONFIG_H
36*4882a593Smuzhiyun #include <xwin-config.h>
37*4882a593Smuzhiyun #endif
38*4882a593Smuzhiyun #include "win.h"
39*4882a593Smuzhiyun #include "winmsg.h"
40*4882a593Smuzhiyun 
41*4882a593Smuzhiyun #ifdef XWIN_MULTIWINDOWEXTWM
42*4882a593Smuzhiyun static RootlessFrameProcsRec winMWExtWMProcs = {
43*4882a593Smuzhiyun     winMWExtWMCreateFrame,
44*4882a593Smuzhiyun     winMWExtWMDestroyFrame,
45*4882a593Smuzhiyun 
46*4882a593Smuzhiyun     winMWExtWMMoveFrame,
47*4882a593Smuzhiyun     winMWExtWMResizeFrame,
48*4882a593Smuzhiyun     winMWExtWMRestackFrame,
49*4882a593Smuzhiyun     winMWExtWMReshapeFrame,
50*4882a593Smuzhiyun     winMWExtWMUnmapFrame,
51*4882a593Smuzhiyun 
52*4882a593Smuzhiyun     winMWExtWMStartDrawing,
53*4882a593Smuzhiyun     winMWExtWMStopDrawing,
54*4882a593Smuzhiyun     winMWExtWMUpdateRegion,
55*4882a593Smuzhiyun     winMWExtWMDamageRects,
56*4882a593Smuzhiyun     winMWExtWMRootlessSwitchWindow,
57*4882a593Smuzhiyun     NULL,                       //winMWExtWMDoReorderWindow,
58*4882a593Smuzhiyun     NULL,                       //winMWExtWMHideWindow,
59*4882a593Smuzhiyun     NULL,                       //winMWExtWMUpdateColorMap,
60*4882a593Smuzhiyun 
61*4882a593Smuzhiyun     NULL,                       //winMWExtWMCopyBytes,
62*4882a593Smuzhiyun     winMWExtWMCopyWindow
63*4882a593Smuzhiyun };
64*4882a593Smuzhiyun #endif
65*4882a593Smuzhiyun 
66*4882a593Smuzhiyun /*
67*4882a593Smuzhiyun  * Prototypes
68*4882a593Smuzhiyun  */
69*4882a593Smuzhiyun 
70*4882a593Smuzhiyun /*
71*4882a593Smuzhiyun  * Local functions
72*4882a593Smuzhiyun  */
73*4882a593Smuzhiyun 
74*4882a593Smuzhiyun static Bool
75*4882a593Smuzhiyun  winSaveScreen(ScreenPtr pScreen, int on);
76*4882a593Smuzhiyun 
77*4882a593Smuzhiyun /*
78*4882a593Smuzhiyun  * Determine what type of screen we are initializing
79*4882a593Smuzhiyun  * and call the appropriate procedure to intiailize
80*4882a593Smuzhiyun  * that type of screen.
81*4882a593Smuzhiyun  */
82*4882a593Smuzhiyun 
83*4882a593Smuzhiyun Bool
winScreenInit(ScreenPtr pScreen,int argc,char ** argv)84*4882a593Smuzhiyun winScreenInit(ScreenPtr pScreen, int argc, char **argv)
85*4882a593Smuzhiyun {
86*4882a593Smuzhiyun     winScreenInfoPtr pScreenInfo = &g_ScreenInfo[pScreen->myNum];
87*4882a593Smuzhiyun     winPrivScreenPtr pScreenPriv;
88*4882a593Smuzhiyun     HDC hdc;
89*4882a593Smuzhiyun     DWORD dwInitialBPP;
90*4882a593Smuzhiyun 
91*4882a593Smuzhiyun #if CYGDEBUG || YES
92*4882a593Smuzhiyun     winDebug("winScreenInit - dwWidth: %u dwHeight: %u\n",
93*4882a593Smuzhiyun              (unsigned int)pScreenInfo->dwWidth, (unsigned int)pScreenInfo->dwHeight);
94*4882a593Smuzhiyun #endif
95*4882a593Smuzhiyun 
96*4882a593Smuzhiyun     /* Allocate privates for this screen */
97*4882a593Smuzhiyun     if (!winAllocatePrivates(pScreen)) {
98*4882a593Smuzhiyun         ErrorF("winScreenInit - Couldn't allocate screen privates\n");
99*4882a593Smuzhiyun         return FALSE;
100*4882a593Smuzhiyun     }
101*4882a593Smuzhiyun 
102*4882a593Smuzhiyun     /* Get a pointer to the privates structure that was allocated */
103*4882a593Smuzhiyun     pScreenPriv = winGetScreenPriv(pScreen);
104*4882a593Smuzhiyun 
105*4882a593Smuzhiyun     /* Save a pointer to this screen in the screen info structure */
106*4882a593Smuzhiyun     pScreenInfo->pScreen = pScreen;
107*4882a593Smuzhiyun 
108*4882a593Smuzhiyun     /* Save a pointer to the screen info in the screen privates structure */
109*4882a593Smuzhiyun     /* This allows us to get back to the screen info from a screen pointer */
110*4882a593Smuzhiyun     pScreenPriv->pScreenInfo = pScreenInfo;
111*4882a593Smuzhiyun 
112*4882a593Smuzhiyun     /*
113*4882a593Smuzhiyun      * Determine which engine to use.
114*4882a593Smuzhiyun      *
115*4882a593Smuzhiyun      * NOTE: This is done once per screen because each screen possibly has
116*4882a593Smuzhiyun      * a preferred engine specified on the command line.
117*4882a593Smuzhiyun      */
118*4882a593Smuzhiyun     if (!winSetEngine(pScreen)) {
119*4882a593Smuzhiyun         ErrorF("winScreenInit - winSetEngine () failed\n");
120*4882a593Smuzhiyun         return FALSE;
121*4882a593Smuzhiyun     }
122*4882a593Smuzhiyun 
123*4882a593Smuzhiyun     /* Horribly misnamed function: Allow engine to adjust BPP for screen */
124*4882a593Smuzhiyun     dwInitialBPP = pScreenInfo->dwBPP;
125*4882a593Smuzhiyun 
126*4882a593Smuzhiyun     if (!(*pScreenPriv->pwinAdjustVideoMode) (pScreen)) {
127*4882a593Smuzhiyun         ErrorF("winScreenInit - winAdjustVideoMode () failed\n");
128*4882a593Smuzhiyun         return FALSE;
129*4882a593Smuzhiyun     }
130*4882a593Smuzhiyun 
131*4882a593Smuzhiyun     if (dwInitialBPP == WIN_DEFAULT_BPP) {
132*4882a593Smuzhiyun         /* No -depth parameter was passed, let the user know the depth being used */
133*4882a593Smuzhiyun         ErrorF
134*4882a593Smuzhiyun             ("winScreenInit - Using Windows display depth of %d bits per pixel\n",
135*4882a593Smuzhiyun              (int) pScreenInfo->dwBPP);
136*4882a593Smuzhiyun     }
137*4882a593Smuzhiyun     else if (dwInitialBPP != pScreenInfo->dwBPP) {
138*4882a593Smuzhiyun         /* Warn user if engine forced a depth different to -depth parameter */
139*4882a593Smuzhiyun         ErrorF
140*4882a593Smuzhiyun             ("winScreenInit - Command line depth of %d bpp overidden by engine, using %d bpp\n",
141*4882a593Smuzhiyun              (int) dwInitialBPP, (int) pScreenInfo->dwBPP);
142*4882a593Smuzhiyun     }
143*4882a593Smuzhiyun     else {
144*4882a593Smuzhiyun         ErrorF("winScreenInit - Using command line depth of %d bpp\n",
145*4882a593Smuzhiyun                (int) pScreenInfo->dwBPP);
146*4882a593Smuzhiyun     }
147*4882a593Smuzhiyun 
148*4882a593Smuzhiyun     /* Check for supported display depth */
149*4882a593Smuzhiyun     if (!(WIN_SUPPORTED_BPPS & (1 << (pScreenInfo->dwBPP - 1)))) {
150*4882a593Smuzhiyun         ErrorF("winScreenInit - Unsupported display depth: %d\n"
151*4882a593Smuzhiyun                "Change your Windows display depth to 15, 16, 24, or 32 bits "
152*4882a593Smuzhiyun                "per pixel.\n", (int) pScreenInfo->dwBPP);
153*4882a593Smuzhiyun         ErrorF("winScreenInit - Supported depths: %08x\n", WIN_SUPPORTED_BPPS);
154*4882a593Smuzhiyun #if WIN_CHECK_DEPTH
155*4882a593Smuzhiyun         return FALSE;
156*4882a593Smuzhiyun #endif
157*4882a593Smuzhiyun     }
158*4882a593Smuzhiyun 
159*4882a593Smuzhiyun     /*
160*4882a593Smuzhiyun      * Check that all monitors have the same display depth if we are using
161*4882a593Smuzhiyun      * multiple monitors
162*4882a593Smuzhiyun      */
163*4882a593Smuzhiyun     if (pScreenInfo->fMultipleMonitors
164*4882a593Smuzhiyun         && !GetSystemMetrics(SM_SAMEDISPLAYFORMAT)) {
165*4882a593Smuzhiyun         ErrorF("winScreenInit - Monitors do not all have same pixel format / "
166*4882a593Smuzhiyun                "display depth.\n");
167*4882a593Smuzhiyun         if (pScreenInfo->dwEngine == WIN_SERVER_SHADOW_GDI) {
168*4882a593Smuzhiyun             ErrorF
169*4882a593Smuzhiyun                 ("winScreenInit - Performance may suffer off primary display.\n");
170*4882a593Smuzhiyun         }
171*4882a593Smuzhiyun         else {
172*4882a593Smuzhiyun             ErrorF("winScreenInit - Using primary display only.\n");
173*4882a593Smuzhiyun             pScreenInfo->fMultipleMonitors = FALSE;
174*4882a593Smuzhiyun         }
175*4882a593Smuzhiyun     }
176*4882a593Smuzhiyun 
177*4882a593Smuzhiyun     /* Create display window */
178*4882a593Smuzhiyun     if (!(*pScreenPriv->pwinCreateBoundingWindow) (pScreen)) {
179*4882a593Smuzhiyun         ErrorF("winScreenInit - pwinCreateBoundingWindow () " "failed\n");
180*4882a593Smuzhiyun         return FALSE;
181*4882a593Smuzhiyun     }
182*4882a593Smuzhiyun 
183*4882a593Smuzhiyun     /* Get a device context */
184*4882a593Smuzhiyun     hdc = GetDC(pScreenPriv->hwndScreen);
185*4882a593Smuzhiyun 
186*4882a593Smuzhiyun     /* Are we using multiple monitors? */
187*4882a593Smuzhiyun     if (pScreenInfo->fMultipleMonitors) {
188*4882a593Smuzhiyun         /*
189*4882a593Smuzhiyun          * In this case, some of the defaults set in
190*4882a593Smuzhiyun          * winInitializeScreenDefaults() are not correct ...
191*4882a593Smuzhiyun          */
192*4882a593Smuzhiyun         if (!pScreenInfo->fUserGaveHeightAndWidth) {
193*4882a593Smuzhiyun             pScreenInfo->dwWidth = GetSystemMetrics(SM_CXVIRTUALSCREEN);
194*4882a593Smuzhiyun             pScreenInfo->dwHeight = GetSystemMetrics(SM_CYVIRTUALSCREEN);
195*4882a593Smuzhiyun         }
196*4882a593Smuzhiyun     }
197*4882a593Smuzhiyun 
198*4882a593Smuzhiyun     /* Release the device context */
199*4882a593Smuzhiyun     ReleaseDC(pScreenPriv->hwndScreen, hdc);
200*4882a593Smuzhiyun 
201*4882a593Smuzhiyun     /* Clear the visuals list */
202*4882a593Smuzhiyun     miClearVisualTypes();
203*4882a593Smuzhiyun 
204*4882a593Smuzhiyun     /* Call the engine dependent screen initialization procedure */
205*4882a593Smuzhiyun     if (!((*pScreenPriv->pwinFinishScreenInit) (pScreen->myNum, pScreen, argc, argv))) {
206*4882a593Smuzhiyun         ErrorF("winScreenInit - winFinishScreenInit () failed\n");
207*4882a593Smuzhiyun 
208*4882a593Smuzhiyun         /* call the engine dependent screen close procedure to clean up from a failure */
209*4882a593Smuzhiyun         pScreenPriv->pwinCloseScreen(pScreen);
210*4882a593Smuzhiyun 
211*4882a593Smuzhiyun         return FALSE;
212*4882a593Smuzhiyun     }
213*4882a593Smuzhiyun 
214*4882a593Smuzhiyun     if (!g_fSoftwareCursor)
215*4882a593Smuzhiyun         winInitCursor(pScreen);
216*4882a593Smuzhiyun     else
217*4882a593Smuzhiyun         winErrorFVerb(2, "winScreenInit - Using software cursor\n");
218*4882a593Smuzhiyun 
219*4882a593Smuzhiyun     if (!noPanoramiXExtension) {
220*4882a593Smuzhiyun         /*
221*4882a593Smuzhiyun            Note the screen origin in a normalized coordinate space where (0,0) is at the top left
222*4882a593Smuzhiyun            of the native virtual desktop area
223*4882a593Smuzhiyun          */
224*4882a593Smuzhiyun         pScreen->x =
225*4882a593Smuzhiyun             pScreenInfo->dwInitialX - GetSystemMetrics(SM_XVIRTUALSCREEN);
226*4882a593Smuzhiyun         pScreen->y =
227*4882a593Smuzhiyun             pScreenInfo->dwInitialY - GetSystemMetrics(SM_YVIRTUALSCREEN);
228*4882a593Smuzhiyun 
229*4882a593Smuzhiyun         ErrorF("Screen %d added at virtual desktop coordinate (%d,%d).\n",
230*4882a593Smuzhiyun                pScreen->myNum, pScreen->x, pScreen->y);
231*4882a593Smuzhiyun     }
232*4882a593Smuzhiyun 
233*4882a593Smuzhiyun #if CYGDEBUG || YES
234*4882a593Smuzhiyun     winDebug("winScreenInit - returning\n");
235*4882a593Smuzhiyun #endif
236*4882a593Smuzhiyun 
237*4882a593Smuzhiyun     return TRUE;
238*4882a593Smuzhiyun }
239*4882a593Smuzhiyun 
240*4882a593Smuzhiyun static Bool
winCreateScreenResources(ScreenPtr pScreen)241*4882a593Smuzhiyun winCreateScreenResources(ScreenPtr pScreen)
242*4882a593Smuzhiyun {
243*4882a593Smuzhiyun     winScreenPriv(pScreen);
244*4882a593Smuzhiyun     Bool result;
245*4882a593Smuzhiyun 
246*4882a593Smuzhiyun     result = pScreenPriv->pwinCreateScreenResources(pScreen);
247*4882a593Smuzhiyun 
248*4882a593Smuzhiyun     /* Now the screen bitmap has been wrapped in a pixmap,
249*4882a593Smuzhiyun        add that to the Shadow framebuffer */
250*4882a593Smuzhiyun     if (!shadowAdd(pScreen, pScreen->devPrivate,
251*4882a593Smuzhiyun                    pScreenPriv->pwinShadowUpdate, NULL, 0, 0)) {
252*4882a593Smuzhiyun         ErrorF("winCreateScreenResources - shadowAdd () failed\n");
253*4882a593Smuzhiyun         return FALSE;
254*4882a593Smuzhiyun     }
255*4882a593Smuzhiyun 
256*4882a593Smuzhiyun     return result;
257*4882a593Smuzhiyun }
258*4882a593Smuzhiyun 
259*4882a593Smuzhiyun /* See Porting Layer Definition - p. 20 */
260*4882a593Smuzhiyun Bool
winFinishScreenInitFB(int i,ScreenPtr pScreen,int argc,char ** argv)261*4882a593Smuzhiyun winFinishScreenInitFB(int i, ScreenPtr pScreen, int argc, char **argv)
262*4882a593Smuzhiyun {
263*4882a593Smuzhiyun     winScreenPriv(pScreen);
264*4882a593Smuzhiyun     winScreenInfo *pScreenInfo = pScreenPriv->pScreenInfo;
265*4882a593Smuzhiyun     VisualPtr pVisual = NULL;
266*4882a593Smuzhiyun 
267*4882a593Smuzhiyun     int iReturn;
268*4882a593Smuzhiyun 
269*4882a593Smuzhiyun     /* Create framebuffer */
270*4882a593Smuzhiyun     if (!(*pScreenPriv->pwinInitScreen) (pScreen)) {
271*4882a593Smuzhiyun         ErrorF("winFinishScreenInitFB - Could not allocate framebuffer\n");
272*4882a593Smuzhiyun         return FALSE;
273*4882a593Smuzhiyun     }
274*4882a593Smuzhiyun 
275*4882a593Smuzhiyun     /*
276*4882a593Smuzhiyun      * Calculate the number of bits that are used to represent color in each pixel,
277*4882a593Smuzhiyun      * the color depth for the screen
278*4882a593Smuzhiyun      */
279*4882a593Smuzhiyun     if (pScreenInfo->dwBPP == 8)
280*4882a593Smuzhiyun         pScreenInfo->dwDepth = 8;
281*4882a593Smuzhiyun     else
282*4882a593Smuzhiyun         pScreenInfo->dwDepth = winCountBits(pScreenPriv->dwRedMask)
283*4882a593Smuzhiyun             + winCountBits(pScreenPriv->dwGreenMask)
284*4882a593Smuzhiyun             + winCountBits(pScreenPriv->dwBlueMask);
285*4882a593Smuzhiyun 
286*4882a593Smuzhiyun     winErrorFVerb(2, "winFinishScreenInitFB - Masks: %08x %08x %08x\n",
287*4882a593Smuzhiyun                   (unsigned int) pScreenPriv->dwRedMask,
288*4882a593Smuzhiyun                   (unsigned int) pScreenPriv->dwGreenMask,
289*4882a593Smuzhiyun                   (unsigned int) pScreenPriv->dwBlueMask);
290*4882a593Smuzhiyun 
291*4882a593Smuzhiyun     /* Init visuals */
292*4882a593Smuzhiyun     if (!(*pScreenPriv->pwinInitVisuals) (pScreen)) {
293*4882a593Smuzhiyun         ErrorF("winFinishScreenInitFB - winInitVisuals failed\n");
294*4882a593Smuzhiyun         return FALSE;
295*4882a593Smuzhiyun     }
296*4882a593Smuzhiyun 
297*4882a593Smuzhiyun     /* Apparently we need this for the render extension */
298*4882a593Smuzhiyun     miSetPixmapDepths();
299*4882a593Smuzhiyun 
300*4882a593Smuzhiyun     /* Start fb initialization */
301*4882a593Smuzhiyun     if (!fbSetupScreen(pScreen,
302*4882a593Smuzhiyun                        pScreenInfo->pfb,
303*4882a593Smuzhiyun                        pScreenInfo->dwWidth, pScreenInfo->dwHeight,
304*4882a593Smuzhiyun                        monitorResolution, monitorResolution,
305*4882a593Smuzhiyun                        pScreenInfo->dwStride, pScreenInfo->dwBPP)) {
306*4882a593Smuzhiyun         ErrorF("winFinishScreenInitFB - fbSetupScreen failed\n");
307*4882a593Smuzhiyun         return FALSE;
308*4882a593Smuzhiyun     }
309*4882a593Smuzhiyun 
310*4882a593Smuzhiyun     /* Override default colormap routines if visual class is dynamic */
311*4882a593Smuzhiyun     if (pScreenInfo->dwDepth == 8
312*4882a593Smuzhiyun         && (pScreenInfo->dwEngine == WIN_SERVER_SHADOW_GDI
313*4882a593Smuzhiyun             || (pScreenInfo->dwEngine == WIN_SERVER_SHADOW_DDNL
314*4882a593Smuzhiyun                 && pScreenInfo->fFullScreen))) {
315*4882a593Smuzhiyun         winSetColormapFunctions(pScreen);
316*4882a593Smuzhiyun 
317*4882a593Smuzhiyun         /*
318*4882a593Smuzhiyun          * NOTE: Setting whitePixel to 255 causes Magic 7.1 to allocate its
319*4882a593Smuzhiyun          * own colormap, as it cannot allocate 7 planes in the default
320*4882a593Smuzhiyun          * colormap.  Setting whitePixel to 1 allows Magic to get 7
321*4882a593Smuzhiyun          * planes in the default colormap, so it doesn't create its
322*4882a593Smuzhiyun          * own colormap.  This latter situation is highly desireable,
323*4882a593Smuzhiyun          * as it keeps the Magic window viewable when switching to
324*4882a593Smuzhiyun          * other X clients that use the default colormap.
325*4882a593Smuzhiyun          */
326*4882a593Smuzhiyun         pScreen->blackPixel = 0;
327*4882a593Smuzhiyun         pScreen->whitePixel = 1;
328*4882a593Smuzhiyun     }
329*4882a593Smuzhiyun 
330*4882a593Smuzhiyun     /* Place our save screen function */
331*4882a593Smuzhiyun     pScreen->SaveScreen = winSaveScreen;
332*4882a593Smuzhiyun 
333*4882a593Smuzhiyun     /* Finish fb initialization */
334*4882a593Smuzhiyun     if (!fbFinishScreenInit(pScreen,
335*4882a593Smuzhiyun                             pScreenInfo->pfb,
336*4882a593Smuzhiyun                             pScreenInfo->dwWidth, pScreenInfo->dwHeight,
337*4882a593Smuzhiyun                             monitorResolution, monitorResolution,
338*4882a593Smuzhiyun                             pScreenInfo->dwStride, pScreenInfo->dwBPP)) {
339*4882a593Smuzhiyun         ErrorF("winFinishScreenInitFB - fbFinishScreenInit failed\n");
340*4882a593Smuzhiyun         return FALSE;
341*4882a593Smuzhiyun     }
342*4882a593Smuzhiyun 
343*4882a593Smuzhiyun     /* Save a pointer to the root visual */
344*4882a593Smuzhiyun     for (pVisual = pScreen->visuals;
345*4882a593Smuzhiyun          pVisual->vid != pScreen->rootVisual; pVisual++);
346*4882a593Smuzhiyun     pScreenPriv->pRootVisual = pVisual;
347*4882a593Smuzhiyun 
348*4882a593Smuzhiyun     /*
349*4882a593Smuzhiyun      * Setup points to the block and wakeup handlers.  Pass a pointer
350*4882a593Smuzhiyun      * to the current screen as pWakeupdata.
351*4882a593Smuzhiyun      */
352*4882a593Smuzhiyun     pScreen->BlockHandler = winBlockHandler;
353*4882a593Smuzhiyun     pScreen->WakeupHandler = winWakeupHandler;
354*4882a593Smuzhiyun 
355*4882a593Smuzhiyun     /* Render extension initialization, calls miPictureInit */
356*4882a593Smuzhiyun     if (!fbPictureInit(pScreen, NULL, 0)) {
357*4882a593Smuzhiyun         ErrorF("winFinishScreenInitFB - fbPictureInit () failed\n");
358*4882a593Smuzhiyun         return FALSE;
359*4882a593Smuzhiyun     }
360*4882a593Smuzhiyun 
361*4882a593Smuzhiyun #ifdef RANDR
362*4882a593Smuzhiyun     /* Initialize resize and rotate support */
363*4882a593Smuzhiyun     if (!winRandRInit(pScreen)) {
364*4882a593Smuzhiyun         ErrorF("winFinishScreenInitFB - winRandRInit () failed\n");
365*4882a593Smuzhiyun         return FALSE;
366*4882a593Smuzhiyun     }
367*4882a593Smuzhiyun #endif
368*4882a593Smuzhiyun 
369*4882a593Smuzhiyun     /* Setup the cursor routines */
370*4882a593Smuzhiyun #if CYGDEBUG
371*4882a593Smuzhiyun     winDebug("winFinishScreenInitFB - Calling miDCInitialize ()\n");
372*4882a593Smuzhiyun #endif
373*4882a593Smuzhiyun     miDCInitialize(pScreen, &g_winPointerCursorFuncs);
374*4882a593Smuzhiyun 
375*4882a593Smuzhiyun     /* KDrive does winCreateDefColormap right after miDCInitialize */
376*4882a593Smuzhiyun     /* Create a default colormap */
377*4882a593Smuzhiyun #if CYGDEBUG
378*4882a593Smuzhiyun     winDebug("winFinishScreenInitFB - Calling winCreateDefColormap ()\n");
379*4882a593Smuzhiyun #endif
380*4882a593Smuzhiyun     if (!winCreateDefColormap(pScreen)) {
381*4882a593Smuzhiyun         ErrorF("winFinishScreenInitFB - Could not create colormap\n");
382*4882a593Smuzhiyun         return FALSE;
383*4882a593Smuzhiyun     }
384*4882a593Smuzhiyun 
385*4882a593Smuzhiyun     /* Initialize the shadow framebuffer layer */
386*4882a593Smuzhiyun     if ((pScreenInfo->dwEngine == WIN_SERVER_SHADOW_GDI
387*4882a593Smuzhiyun          || pScreenInfo->dwEngine == WIN_SERVER_SHADOW_DDNL)
388*4882a593Smuzhiyun #ifdef XWIN_MULTIWINDOWEXTWM
389*4882a593Smuzhiyun         && !pScreenInfo->fMWExtWM
390*4882a593Smuzhiyun #endif
391*4882a593Smuzhiyun         ) {
392*4882a593Smuzhiyun #if CYGDEBUG
393*4882a593Smuzhiyun         winDebug("winFinishScreenInitFB - Calling shadowSetup ()\n");
394*4882a593Smuzhiyun #endif
395*4882a593Smuzhiyun         if (!shadowSetup(pScreen)) {
396*4882a593Smuzhiyun             ErrorF("winFinishScreenInitFB - shadowSetup () failed\n");
397*4882a593Smuzhiyun             return FALSE;
398*4882a593Smuzhiyun         }
399*4882a593Smuzhiyun 
400*4882a593Smuzhiyun         /* Wrap CreateScreenResources so we can add the screen pixmap
401*4882a593Smuzhiyun            to the Shadow framebuffer after it's been created */
402*4882a593Smuzhiyun         pScreenPriv->pwinCreateScreenResources = pScreen->CreateScreenResources;
403*4882a593Smuzhiyun         pScreen->CreateScreenResources = winCreateScreenResources;
404*4882a593Smuzhiyun     }
405*4882a593Smuzhiyun 
406*4882a593Smuzhiyun #ifdef XWIN_MULTIWINDOWEXTWM
407*4882a593Smuzhiyun     /* Handle multi-window external window manager mode */
408*4882a593Smuzhiyun     if (pScreenInfo->fMWExtWM) {
409*4882a593Smuzhiyun         winDebug("winScreenInit - MultiWindowExtWM - Calling RootlessInit\n");
410*4882a593Smuzhiyun 
411*4882a593Smuzhiyun         RootlessInit(pScreen, &winMWExtWMProcs);
412*4882a593Smuzhiyun 
413*4882a593Smuzhiyun         winDebug("winScreenInit - MultiWindowExtWM - RootlessInit returned\n");
414*4882a593Smuzhiyun 
415*4882a593Smuzhiyun         rootless_CopyBytes_threshold = 0;
416*4882a593Smuzhiyun         /* FIXME: How many? Profiling needed? */
417*4882a593Smuzhiyun         rootless_CopyWindow_threshold = 1;
418*4882a593Smuzhiyun 
419*4882a593Smuzhiyun         winWindowsWMExtensionInit();
420*4882a593Smuzhiyun     }
421*4882a593Smuzhiyun #endif
422*4882a593Smuzhiyun 
423*4882a593Smuzhiyun     /* Handle rootless mode */
424*4882a593Smuzhiyun     if (pScreenInfo->fRootless) {
425*4882a593Smuzhiyun         /* Define the WRAP macro temporarily for local use */
426*4882a593Smuzhiyun #define WRAP(a) \
427*4882a593Smuzhiyun     if (pScreen->a) { \
428*4882a593Smuzhiyun         pScreenPriv->a = pScreen->a; \
429*4882a593Smuzhiyun     } else { \
430*4882a593Smuzhiyun         winDebug("winScreenInit - null screen fn " #a "\n"); \
431*4882a593Smuzhiyun         pScreenPriv->a = NULL; \
432*4882a593Smuzhiyun     }
433*4882a593Smuzhiyun 
434*4882a593Smuzhiyun         /* Save a pointer to each lower-level window procedure */
435*4882a593Smuzhiyun         WRAP(CreateWindow);
436*4882a593Smuzhiyun         WRAP(DestroyWindow);
437*4882a593Smuzhiyun         WRAP(RealizeWindow);
438*4882a593Smuzhiyun         WRAP(UnrealizeWindow);
439*4882a593Smuzhiyun         WRAP(PositionWindow);
440*4882a593Smuzhiyun         WRAP(ChangeWindowAttributes);
441*4882a593Smuzhiyun         WRAP(SetShape);
442*4882a593Smuzhiyun 
443*4882a593Smuzhiyun         /* Assign rootless window procedures to be top level procedures */
444*4882a593Smuzhiyun         pScreen->CreateWindow = winCreateWindowRootless;
445*4882a593Smuzhiyun         pScreen->DestroyWindow = winDestroyWindowRootless;
446*4882a593Smuzhiyun         pScreen->PositionWindow = winPositionWindowRootless;
447*4882a593Smuzhiyun         /*pScreen->ChangeWindowAttributes = winChangeWindowAttributesRootless; */
448*4882a593Smuzhiyun         pScreen->RealizeWindow = winMapWindowRootless;
449*4882a593Smuzhiyun         pScreen->UnrealizeWindow = winUnmapWindowRootless;
450*4882a593Smuzhiyun         pScreen->SetShape = winSetShapeRootless;
451*4882a593Smuzhiyun 
452*4882a593Smuzhiyun         /* Undefine the WRAP macro, as it is not needed elsewhere */
453*4882a593Smuzhiyun #undef WRAP
454*4882a593Smuzhiyun     }
455*4882a593Smuzhiyun 
456*4882a593Smuzhiyun     /* Handle multi window mode */
457*4882a593Smuzhiyun     else if (pScreenInfo->fMultiWindow) {
458*4882a593Smuzhiyun         /* Define the WRAP macro temporarily for local use */
459*4882a593Smuzhiyun #define WRAP(a) \
460*4882a593Smuzhiyun     if (pScreen->a) { \
461*4882a593Smuzhiyun         pScreenPriv->a = pScreen->a; \
462*4882a593Smuzhiyun     } else { \
463*4882a593Smuzhiyun         winDebug("null screen fn " #a "\n"); \
464*4882a593Smuzhiyun         pScreenPriv->a = NULL; \
465*4882a593Smuzhiyun     }
466*4882a593Smuzhiyun 
467*4882a593Smuzhiyun         /* Save a pointer to each lower-level window procedure */
468*4882a593Smuzhiyun         WRAP(CreateWindow);
469*4882a593Smuzhiyun         WRAP(DestroyWindow);
470*4882a593Smuzhiyun         WRAP(RealizeWindow);
471*4882a593Smuzhiyun         WRAP(UnrealizeWindow);
472*4882a593Smuzhiyun         WRAP(PositionWindow);
473*4882a593Smuzhiyun         WRAP(ChangeWindowAttributes);
474*4882a593Smuzhiyun         WRAP(ReparentWindow);
475*4882a593Smuzhiyun         WRAP(RestackWindow);
476*4882a593Smuzhiyun         WRAP(ResizeWindow);
477*4882a593Smuzhiyun         WRAP(MoveWindow);
478*4882a593Smuzhiyun         WRAP(CopyWindow);
479*4882a593Smuzhiyun         WRAP(SetShape);
480*4882a593Smuzhiyun 
481*4882a593Smuzhiyun         /* Assign multi-window window procedures to be top level procedures */
482*4882a593Smuzhiyun         pScreen->CreateWindow = winCreateWindowMultiWindow;
483*4882a593Smuzhiyun         pScreen->DestroyWindow = winDestroyWindowMultiWindow;
484*4882a593Smuzhiyun         pScreen->PositionWindow = winPositionWindowMultiWindow;
485*4882a593Smuzhiyun         /*pScreen->ChangeWindowAttributes = winChangeWindowAttributesMultiWindow; */
486*4882a593Smuzhiyun         pScreen->RealizeWindow = winMapWindowMultiWindow;
487*4882a593Smuzhiyun         pScreen->UnrealizeWindow = winUnmapWindowMultiWindow;
488*4882a593Smuzhiyun         pScreen->ReparentWindow = winReparentWindowMultiWindow;
489*4882a593Smuzhiyun         pScreen->RestackWindow = winRestackWindowMultiWindow;
490*4882a593Smuzhiyun         pScreen->ResizeWindow = winResizeWindowMultiWindow;
491*4882a593Smuzhiyun         pScreen->MoveWindow = winMoveWindowMultiWindow;
492*4882a593Smuzhiyun         pScreen->CopyWindow = winCopyWindowMultiWindow;
493*4882a593Smuzhiyun         pScreen->SetShape = winSetShapeMultiWindow;
494*4882a593Smuzhiyun 
495*4882a593Smuzhiyun         /* Undefine the WRAP macro, as it is not needed elsewhere */
496*4882a593Smuzhiyun #undef WRAP
497*4882a593Smuzhiyun     }
498*4882a593Smuzhiyun 
499*4882a593Smuzhiyun     /* Wrap either fb's or shadow's CloseScreen with our CloseScreen */
500*4882a593Smuzhiyun     pScreenPriv->CloseScreen = pScreen->CloseScreen;
501*4882a593Smuzhiyun     pScreen->CloseScreen = pScreenPriv->pwinCloseScreen;
502*4882a593Smuzhiyun 
503*4882a593Smuzhiyun     /* Create a mutex for modules in separate threads to wait for */
504*4882a593Smuzhiyun     iReturn = pthread_mutex_init(&pScreenPriv->pmServerStarted, NULL);
505*4882a593Smuzhiyun     if (iReturn != 0) {
506*4882a593Smuzhiyun         ErrorF("winFinishScreenInitFB - pthread_mutex_init () failed: %d\n",
507*4882a593Smuzhiyun                iReturn);
508*4882a593Smuzhiyun         return FALSE;
509*4882a593Smuzhiyun     }
510*4882a593Smuzhiyun 
511*4882a593Smuzhiyun     /* Own the mutex for modules in separate threads */
512*4882a593Smuzhiyun     iReturn = pthread_mutex_lock(&pScreenPriv->pmServerStarted);
513*4882a593Smuzhiyun     if (iReturn != 0) {
514*4882a593Smuzhiyun         ErrorF("winFinishScreenInitFB - pthread_mutex_lock () failed: %d\n",
515*4882a593Smuzhiyun                iReturn);
516*4882a593Smuzhiyun         return FALSE;
517*4882a593Smuzhiyun     }
518*4882a593Smuzhiyun 
519*4882a593Smuzhiyun     /* Set the ServerStarted flag to false */
520*4882a593Smuzhiyun     pScreenPriv->fServerStarted = FALSE;
521*4882a593Smuzhiyun 
522*4882a593Smuzhiyun #ifdef XWIN_MULTIWINDOWEXTWM
523*4882a593Smuzhiyun     pScreenPriv->fRestacking = FALSE;
524*4882a593Smuzhiyun #endif
525*4882a593Smuzhiyun 
526*4882a593Smuzhiyun     if (pScreenInfo->fMultiWindow) {
527*4882a593Smuzhiyun #if CYGDEBUG || YES
528*4882a593Smuzhiyun         winDebug("winFinishScreenInitFB - Calling winInitWM.\n");
529*4882a593Smuzhiyun #endif
530*4882a593Smuzhiyun 
531*4882a593Smuzhiyun         /* Initialize multi window mode */
532*4882a593Smuzhiyun         if (!winInitWM(&pScreenPriv->pWMInfo,
533*4882a593Smuzhiyun                        &pScreenPriv->ptWMProc,
534*4882a593Smuzhiyun                        &pScreenPriv->ptXMsgProc,
535*4882a593Smuzhiyun                        &pScreenPriv->pmServerStarted,
536*4882a593Smuzhiyun                        pScreenInfo->dwScreen,
537*4882a593Smuzhiyun                        (HWND) &pScreenPriv->hwndScreen)) {
538*4882a593Smuzhiyun             ErrorF("winFinishScreenInitFB - winInitWM () failed.\n");
539*4882a593Smuzhiyun             return FALSE;
540*4882a593Smuzhiyun         }
541*4882a593Smuzhiyun     }
542*4882a593Smuzhiyun 
543*4882a593Smuzhiyun     /* Tell the server that we are enabled */
544*4882a593Smuzhiyun     pScreenPriv->fEnabled = TRUE;
545*4882a593Smuzhiyun 
546*4882a593Smuzhiyun     /* Tell the server that we have a valid depth */
547*4882a593Smuzhiyun     pScreenPriv->fBadDepth = FALSE;
548*4882a593Smuzhiyun 
549*4882a593Smuzhiyun #if CYGDEBUG || YES
550*4882a593Smuzhiyun     winDebug("winFinishScreenInitFB - returning\n");
551*4882a593Smuzhiyun #endif
552*4882a593Smuzhiyun 
553*4882a593Smuzhiyun     return TRUE;
554*4882a593Smuzhiyun }
555*4882a593Smuzhiyun 
556*4882a593Smuzhiyun /* See Porting Layer Definition - p. 33 */
557*4882a593Smuzhiyun static Bool
winSaveScreen(ScreenPtr pScreen,int on)558*4882a593Smuzhiyun winSaveScreen(ScreenPtr pScreen, int on)
559*4882a593Smuzhiyun {
560*4882a593Smuzhiyun     return TRUE;
561*4882a593Smuzhiyun }
562