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