2 *Copyright (C) 1994-2000 The XFree86 Project, Inc. All Rights Reserved.
4 *Permission is hereby granted, free of charge, to any person obtaining
5 * a copy of this software and associated documentation files (the
6 *"Software"), to deal in the Software without restriction, including
7 *without limitation the rights to use, copy, modify, merge, publish,
8 *distribute, sublicense, and/or sell copies of the Software, and to
9 *permit persons to whom the Software is furnished to do so, subject to
10 *the following conditions:
12 *The above copyright notice and this permission notice shall be
13 *included in all copies or substantial portions of the Software.
15 *THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
16 *EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
17 *MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
18 *NONINFRINGEMENT. IN NO EVENT SHALL THE XFREE86 PROJECT BE LIABLE FOR
19 *ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
20 *CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
21 *WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
23 *Except as contained in this notice, the name of the XFree86 Project
24 *shall not be used in advertising or otherwise to promote the sale, use
25 *or other dealings in this Software without prior written authorization
26 *from the XFree86 Project.
28 * Authors: Dakshinamurthy Karra
34 #ifdef HAVE_XWIN_CONFIG_H
35 #include <xwin-config.h>
40 * Local function prototypes
44 winAllocateFBPrimaryDD(ScreenPtr pScreen
);
47 winCloseScreenPrimaryDD(ScreenPtr pScreen
);
50 winInitVisualsPrimaryDD(ScreenPtr pScreen
);
53 winAdjustVideoModePrimaryDD(ScreenPtr pScreen
);
56 winActivateAppPrimaryDD(ScreenPtr pScreen
);
59 winHotKeyAltTabPrimaryDD(ScreenPtr pScreen
);
62 * Create a DirectDraw primary surface
66 winAllocateFBPrimaryDD(ScreenPtr pScreen
)
68 winScreenPriv(pScreen
);
69 winScreenInfo
*pScreenInfo
= pScreenPriv
->pScreenInfo
;
70 HRESULT ddrval
= DD_OK
;
72 DDSURFACEDESC
*pddsdPrimary
= NULL
;
73 DDSURFACEDESC
*pddsdOffscreen
= NULL
;
76 ErrorF("winAllocateFBPrimaryDD\n");
78 /* Get client area location in screen coords */
79 GetClientRect(pScreenPriv
->hwndScreen
, &rcClient
);
80 MapWindowPoints(pScreenPriv
->hwndScreen
,
81 HWND_DESKTOP
, (LPPOINT
) &rcClient
, 2);
83 /* Create a DirectDraw object, store the address at lpdd */
84 ddrval
= (*g_fpDirectDrawCreate
) (NULL
, &pScreenPriv
->pdd
, NULL
);
86 FatalError("winAllocateFBPrimaryDD - Could not start DirectDraw\n");
88 /* Get a DirectDraw2 interface pointer */
89 ddrval
= IDirectDraw_QueryInterface(pScreenPriv
->pdd
,
91 (LPVOID
*) &pScreenPriv
->pdd2
);
93 ErrorF("winAllocateFBShadowDD - Failed DD2 query: %08x\n",
94 (unsigned int) ddrval
);
98 ErrorF("winAllocateFBPrimaryDD - Created and initialized DD\n");
100 /* Are we windowed or fullscreen? */
101 if (pScreenInfo
->fFullScreen
) {
102 /* Full screen mode */
103 ddrval
= IDirectDraw2_SetCooperativeLevel(pScreenPriv
->pdd2
,
104 pScreenPriv
->hwndScreen
,
108 FatalError("winAllocateFBPrimaryDD - Could not set "
109 "cooperative level\n");
111 /* Change the video mode to the mode requested */
112 ddrval
= IDirectDraw2_SetDisplayMode(pScreenPriv
->pdd2
,
113 pScreenInfo
->dwWidth
,
114 pScreenInfo
->dwHeight
,
116 pScreenInfo
->dwRefreshRate
, 0);
118 FatalError("winAllocateFBPrimaryDD - Could not set "
119 "full screen display mode\n");
123 ddrval
= IDirectDraw2_SetCooperativeLevel(pScreenPriv
->pdd2
,
124 pScreenPriv
->hwndScreen
,
127 FatalError("winAllocateFBPrimaryDD - Could not set "
128 "cooperative level\n");
131 /* Describe the primary surface */
132 ZeroMemory(&ddsd
, sizeof(ddsd
));
133 ddsd
.dwSize
= sizeof(ddsd
);
134 ddsd
.dwFlags
= DDSD_CAPS
;
135 ddsd
.ddsCaps
.dwCaps
= DDSCAPS_PRIMARYSURFACE
;
137 /* Create the primary surface */
138 ddrval
= IDirectDraw2_CreateSurface(pScreenPriv
->pdd2
,
139 &ddsd
, &pScreenPriv
->pddsPrimary
, NULL
);
141 FatalError("winAllocateFBPrimaryDD - Could not create primary "
142 "surface %08x\n", (unsigned int) ddrval
);
144 ErrorF("winAllocateFBPrimaryDD - Created primary\n");
146 /* Allocate a DD surface description for our screen privates */
147 pddsdPrimary
= pScreenPriv
->pddsdPrimary
= malloc(sizeof(DDSURFACEDESC
));
148 if (pddsdPrimary
== NULL
)
149 FatalError("winAllocateFBPrimaryDD - Could not allocate surface "
150 "description memory\n");
151 ZeroMemory(pddsdPrimary
, sizeof(*pddsdPrimary
));
152 pddsdPrimary
->dwSize
= sizeof(*pddsdPrimary
);
154 /* Describe the offscreen surface to be created */
156 * NOTE: Do not use a DDSCAPS_VIDEOMEMORY surface,
157 * as drawing, locking, and unlocking take forever
158 * with video memory surfaces. In addition,
159 * video memory is a somewhat scarce resource,
160 * so you shouldn't be allocating video memory when
161 * you have the option of using system memory instead.
163 ZeroMemory(&ddsd
, sizeof(ddsd
));
164 ddsd
.dwSize
= sizeof(ddsd
);
165 ddsd
.dwFlags
= DDSD_CAPS
| DDSD_HEIGHT
| DDSD_WIDTH
;
166 ddsd
.ddsCaps
.dwCaps
= DDSCAPS_OFFSCREENPLAIN
| DDSCAPS_SYSTEMMEMORY
;
167 ddsd
.dwHeight
= pScreenInfo
->dwHeight
;
168 ddsd
.dwWidth
= pScreenInfo
->dwWidth
;
170 /* Create the shadow surface */
171 ddrval
= IDirectDraw2_CreateSurface(pScreenPriv
->pdd2
,
173 &pScreenPriv
->pddsOffscreen
, NULL
);
175 FatalError("winAllocateFBPrimaryDD - Could not create shadow "
178 ErrorF("winAllocateFBPrimaryDD - Created offscreen\n");
180 /* Allocate a DD surface description for our screen privates */
181 pddsdOffscreen
= pScreenPriv
->pddsdOffscreen
182 = malloc(sizeof(DDSURFACEDESC
));
183 if (pddsdOffscreen
== NULL
)
184 FatalError("winAllocateFBPrimaryDD - Could not allocate surface "
185 "description memory\n");
186 ZeroMemory(pddsdOffscreen
, sizeof(*pddsdOffscreen
));
187 pddsdOffscreen
->dwSize
= sizeof(*pddsdOffscreen
);
189 ErrorF("winAllocateFBPrimaryDD - Locking primary\n");
191 /* Lock the primary surface */
192 ddrval
= IDirectDrawSurface2_Lock(pScreenPriv
->pddsPrimary
,
194 fFullScreen
? NULL
: &rcClient
,
195 pddsdPrimary
, DDLOCK_WAIT
, NULL
);
196 if (ddrval
!= DD_OK
|| pddsdPrimary
->lpSurface
== NULL
)
197 FatalError("winAllocateFBPrimaryDD - Could not lock "
198 "primary surface\n");
200 ErrorF("winAllocateFBPrimaryDD - Locked primary\n");
202 /* We don't know how to deal with anything other than RGB */
203 if (!(pddsdPrimary
->ddpfPixelFormat
.dwFlags
& DDPF_RGB
))
204 FatalError("winAllocateFBPrimaryDD - Color format other than RGB\n");
206 /* Grab the pitch from the surface desc */
207 pScreenInfo
->dwStride
= (pddsdPrimary
->u1
.lPitch
* 8)
208 / pScreenInfo
->dwBPP
;
210 /* Save the pointer to our surface memory */
211 pScreenInfo
->pfb
= pddsdPrimary
->lpSurface
;
213 /* Grab the color depth and masks from the surface description */
214 pScreenPriv
->dwRedMask
= pddsdPrimary
->ddpfPixelFormat
.u2
.dwRBitMask
;
215 pScreenPriv
->dwGreenMask
= pddsdPrimary
->ddpfPixelFormat
.u3
.dwGBitMask
;
216 pScreenPriv
->dwBlueMask
= pddsdPrimary
->ddpfPixelFormat
.u4
.dwBBitMask
;
218 ErrorF("winAllocateFBPrimaryDD - Returning\n");
224 winFreeFBPrimaryDD(ScreenPtr pScreen
)
226 winScreenPriv(pScreen
);
227 winScreenInfo
*pScreenInfo
= pScreenPriv
->pScreenInfo
;
229 /* Free the offscreen surface, if there is one */
230 if (pScreenPriv
->pddsOffscreen
) {
231 IDirectDrawSurface2_Unlock(pScreenPriv
->pddsOffscreen
, NULL
);
232 IDirectDrawSurface2_Release(pScreenPriv
->pddsOffscreen
);
233 pScreenPriv
->pddsOffscreen
= NULL
;
236 /* Release the primary surface, if there is one */
237 if (pScreenPriv
->pddsPrimary
) {
238 IDirectDrawSurface2_Unlock(pScreenPriv
->pddsPrimary
, NULL
);
239 IDirectDrawSurface2_Release(pScreenPriv
->pddsPrimary
);
240 pScreenPriv
->pddsPrimary
= NULL
;
243 /* Free the DirectDraw object, if there is one */
244 if (pScreenPriv
->pdd
) {
245 IDirectDraw2_RestoreDisplayMode(pScreenPriv
->pdd
);
246 IDirectDraw2_Release(pScreenPriv
->pdd
);
247 pScreenPriv
->pdd
= NULL
;
250 /* Invalidate the ScreenInfo's fb pointer */
251 pScreenInfo
->pfb
= NULL
;
255 winInitScreenPrimaryDD(ScreenPtr pScreen
)
257 return winAllocateFBPrimaryDD(pScreen
);
261 * Call the wrapped CloseScreen function.
263 * Free our resources and private structures.
267 winCloseScreenPrimaryDD(ScreenPtr pScreen
)
269 winScreenPriv(pScreen
);
270 winScreenInfo
*pScreenInfo
= pScreenPriv
->pScreenInfo
;
273 ErrorF("winCloseScreenPrimaryDD - Freeing screen resources\n");
275 /* Flag that the screen is closed */
276 pScreenPriv
->fClosed
= TRUE
;
277 pScreenPriv
->fActive
= FALSE
;
279 /* Call the wrapped CloseScreen procedure */
280 WIN_UNWRAP(CloseScreen
);
281 if (pScreen
->CloseScreen
)
282 fReturn
= (*pScreen
->CloseScreen
) (pScreen
);
284 /* Delete the window property */
285 RemoveProp(pScreenPriv
->hwndScreen
, WIN_SCR_PROP
);
287 winFreeFBPrimaryDD(pScreen
);
289 /* Delete tray icon, if we have one */
290 if (!pScreenInfo
->fNoTrayIcon
)
291 winDeleteNotifyIcon(pScreenPriv
);
293 /* Free the exit confirmation dialog box, if it exists */
294 if (g_hDlgExit
!= NULL
) {
295 DestroyWindow(g_hDlgExit
);
299 /* Kill our window */
300 if (pScreenPriv
->hwndScreen
) {
301 DestroyWindow(pScreenPriv
->hwndScreen
);
302 pScreenPriv
->hwndScreen
= NULL
;
305 /* Kill our screeninfo's pointer to the screen */
306 pScreenInfo
->pScreen
= NULL
;
308 /* Free the screen privates for this screen */
309 free((pointer
) pScreenPriv
);
315 * Tell mi what sort of visuals we need.
317 * Generally we only need one visual, as our screen can only
318 * handle one format at a time, I believe. You may want
319 * to verify that last sentence.
323 winInitVisualsPrimaryDD(ScreenPtr pScreen
)
325 winScreenPriv(pScreen
);
326 winScreenInfo
*pScreenInfo
= pScreenPriv
->pScreenInfo
;
327 DWORD dwRedBits
, dwGreenBits
, dwBlueBits
;
329 /* Count the number of ones in each color mask */
330 dwRedBits
= winCountBits(pScreenPriv
->dwRedMask
);
331 dwGreenBits
= winCountBits(pScreenPriv
->dwGreenMask
);
332 dwBlueBits
= winCountBits(pScreenPriv
->dwBlueMask
);
334 /* Store the maximum number of ones in a color mask as the bitsPerRGB */
335 if (dwRedBits
> dwGreenBits
&& dwRedBits
> dwBlueBits
)
336 pScreenPriv
->dwBitsPerRGB
= dwRedBits
;
337 else if (dwGreenBits
> dwRedBits
&& dwGreenBits
> dwBlueBits
)
338 pScreenPriv
->dwBitsPerRGB
= dwGreenBits
;
340 pScreenPriv
->dwBitsPerRGB
= dwBlueBits
;
342 ErrorF("winInitVisualsPrimaryDD - Masks: %08x %08x %08x bpRGB: %d\n",
343 (unsigned int) pScreenPriv
->dwRedMask
,
344 (unsigned int) pScreenPriv
->dwGreenMask
,
345 (unsigned int) pScreenPriv
->dwBlueMask
,
346 (int) pScreenPriv
->dwBitsPerRGB
);
348 /* Create a single visual according to the Windows screen depth */
349 switch (pScreenInfo
->dwDepth
) {
353 if (!miSetVisualTypesAndMasks(pScreenInfo
->dwDepth
,
355 pScreenPriv
->dwBitsPerRGB
,
357 pScreenPriv
->dwRedMask
,
358 pScreenPriv
->dwGreenMask
,
359 pScreenPriv
->dwBlueMask
)) {
360 ErrorF("winInitVisualsPrimaryDD - "
361 "miSetVisualTypesAndMasks failed\n");
368 winDebug("winInitVisuals - Calling miSetVisualTypesAndMasks\n");
369 #endif /* CYGDEBUG */
370 if (!miSetVisualTypesAndMasks(pScreenInfo
->dwDepth
,
372 pScreenPriv
->dwBitsPerRGB
,
374 pScreenPriv
->dwRedMask
,
375 pScreenPriv
->dwGreenMask
,
376 pScreenPriv
->dwBlueMask
)) {
377 ErrorF("winInitVisualsPrimaryDD - "
378 "miSetVisualTypesAndMasks failed\n");
382 winDebug("winInitVisualsPrimaryDD - Returned from "
383 "miSetVisualTypesAndMasks\n");
384 #endif /* CYGDEBUG */
388 ErrorF("winInitVisualsPrimaryDD - Unknown screen depth\n");
392 ErrorF("winInitVisualsPrimaryDD - Returning\n");
398 winAdjustVideoModePrimaryDD(ScreenPtr pScreen
)
400 winScreenPriv(pScreen
);
401 winScreenInfo
*pScreenInfo
= pScreenPriv
->pScreenInfo
;
405 /* We're in serious trouble if we can't get a DC */
408 ErrorF("winAdjustVideoModePrimaryDD - GetDC failed\n");
412 /* Query GDI for current display depth */
413 dwBPP
= GetDeviceCaps(hdc
, BITSPIXEL
);
415 /* DirectDraw can only change the depth in fullscreen mode */
416 if (!(pScreenInfo
->fFullScreen
&& (pScreenInfo
->dwBPP
!= WIN_DEFAULT_BPP
))) {
417 /* Otherwise, We'll use GDI's depth */
418 pScreenInfo
->dwBPP
= dwBPP
;
422 ReleaseDC(NULL
, hdc
);
428 * We need to blit our offscreen fb to
429 * the screen when we are activated, and we need to point
430 * the fb code back to the primary surface memory.
434 winActivateAppPrimaryDD(ScreenPtr pScreen
)
436 winScreenPriv(pScreen
);
437 RECT rcSrc
, rcClient
;
438 HRESULT ddrval
= DD_OK
;
440 /* Check for errors */
441 if (pScreenPriv
== NULL
442 || pScreenPriv
->pScreenInfo
== NULL
443 || pScreenPriv
->pddsPrimary
== NULL
444 || pScreenPriv
->pddsOffscreen
== NULL
)
447 /* Check for do-nothing */
448 if (!pScreenPriv
->fActive
)
451 /* We are activating */
452 ddrval
= IDirectDrawSurface2_IsLost(pScreenPriv
->pddsOffscreen
);
453 if (ddrval
== DD_OK
) {
454 IDirectDrawSurface2_Unlock(pScreenPriv
->pddsOffscreen
, NULL
);
456 * We don't check for an error from Unlock, because it
457 * doesn't matter if the Unlock failed.
461 /* Restore both surfaces, just cause I like it that way */
462 IDirectDrawSurface2_Restore(pScreenPriv
->pddsOffscreen
);
463 IDirectDrawSurface2_Restore(pScreenPriv
->pddsPrimary
);
465 /* Get client area in screen coords */
466 GetClientRect(pScreenPriv
->hwndScreen
, &rcClient
);
467 MapWindowPoints(pScreenPriv
->hwndScreen
,
468 HWND_DESKTOP
, (LPPOINT
) &rcClient
, 2);
470 /* Setup a source rectangle */
473 rcSrc
.right
= pScreenPriv
->pScreenInfo
->dwWidth
;
474 rcSrc
.bottom
= pScreenPriv
->pScreenInfo
->dwHeight
;
476 ddrval
= IDirectDrawSurface2_Blt(pScreenPriv
->pddsPrimary
,
478 pScreenPriv
->pddsOffscreen
,
479 &rcSrc
, DDBLT_WAIT
, NULL
);
481 FatalError("winActivateAppPrimaryDD () - Failed blitting offscreen "
482 "surface to primary surface %08x\n", (unsigned int) ddrval
);
484 /* Lock the primary surface */
485 ddrval
= IDirectDrawSurface2_Lock(pScreenPriv
->pddsPrimary
,
487 pScreenPriv
->pddsdPrimary
,
489 if (ddrval
!= DD_OK
|| pScreenPriv
->pddsdPrimary
->lpSurface
== NULL
)
490 FatalError("winActivateAppPrimaryDD () - Could not lock "
491 "primary surface\n");
493 /* Notify FB of the new memory pointer */
494 winUpdateFBPointer(pScreen
, pScreenPriv
->pddsdPrimary
->lpSurface
);
497 * Register the Alt-Tab combo as a hotkey so we can copy
498 * the primary framebuffer before the display mode changes
500 RegisterHotKey(pScreenPriv
->hwndScreen
, 1, MOD_ALT
, 9);
506 * Handle the Alt+Tab hotkey.
508 * We need to save the primary fb to an offscreen fb when
509 * we get deactivated, and point the fb code at the offscreen
510 * fb for the duration of the deactivation.
514 winHotKeyAltTabPrimaryDD(ScreenPtr pScreen
)
516 winScreenPriv(pScreen
);
517 HRESULT ddrval
= DD_OK
;
519 ErrorF("\nwinHotKeyAltTabPrimaryDD\n\n");
521 /* Alt+Tab was pressed, we will lose focus very soon */
522 pScreenPriv
->fActive
= FALSE
;
524 /* Check for error conditions */
525 if (pScreenPriv
->pddsPrimary
== NULL
|| pScreenPriv
->pddsOffscreen
== NULL
)
528 /* Did we loose the primary surface? */
529 ddrval
= IDirectDrawSurface2_IsLost(pScreenPriv
->pddsPrimary
);
530 if (ddrval
== DD_OK
) {
531 ddrval
= IDirectDrawSurface2_Unlock(pScreenPriv
->pddsPrimary
, NULL
);
533 FatalError("winHotKeyAltTabPrimaryDD - Failed unlocking primary "
537 /* Blit the primary surface to the offscreen surface */
538 ddrval
= IDirectDrawSurface2_Blt(pScreenPriv
->pddsOffscreen
, NULL
, /* should be rcDest */
539 pScreenPriv
->pddsPrimary
,
540 NULL
, DDBLT_WAIT
, NULL
);
541 if (ddrval
== DDERR_SURFACELOST
) {
542 IDirectDrawSurface2_Restore(pScreenPriv
->pddsOffscreen
);
543 IDirectDrawSurface2_Restore(pScreenPriv
->pddsPrimary
);
545 /* Blit the primary surface to the offscreen surface */
546 ddrval
= IDirectDrawSurface2_Blt(pScreenPriv
->pddsOffscreen
,
548 pScreenPriv
->pddsPrimary
,
549 NULL
, DDBLT_WAIT
, NULL
);
551 FatalError("winHotKeyAltTabPrimaryDD - Failed blitting primary "
552 "surface to offscreen surface: %08x\n",
553 (unsigned int) ddrval
);
556 FatalError("winHotKeyAltTabPrimaryDD - Unknown error from "
557 "Blt: %08dx\n", (unsigned int) ddrval
);
560 /* Lock the offscreen surface */
561 ddrval
= IDirectDrawSurface2_Lock(pScreenPriv
->pddsOffscreen
,
563 pScreenPriv
->pddsdOffscreen
,
565 if (ddrval
!= DD_OK
|| pScreenPriv
->pddsdPrimary
->lpSurface
== NULL
)
566 FatalError("winHotKeyAltTabPrimaryDD - Could not lock "
567 "offscreen surface\n");
569 /* Notify FB of the new memory pointer */
570 winUpdateFBPointer(pScreen
, pScreenPriv
->pddsdOffscreen
->lpSurface
);
572 /* Unregister our hotkey */
573 UnregisterHotKey(pScreenPriv
->hwndScreen
, 1);
578 /* Set engine specific functions */
580 winSetEngineFunctionsPrimaryDD(ScreenPtr pScreen
)
582 winScreenPriv(pScreen
);
583 winScreenInfo
*pScreenInfo
= pScreenPriv
->pScreenInfo
;
585 /* Set our pointers */
586 pScreenPriv
->pwinAllocateFB
= winAllocateFBPrimaryDD
;
587 pScreenPriv
->pwinFreeFB
= winFreeFBPrimaryDD
;
588 pScreenPriv
->pwinShadowUpdate
=
589 (winShadowUpdateProcPtr
) (void (*)(void)) NoopDDA
;
590 pScreenPriv
->pwinInitScreen
= winInitScreenPrimaryDD
;
591 pScreenPriv
->pwinCloseScreen
= winCloseScreenPrimaryDD
;
592 pScreenPriv
->pwinInitVisuals
= winInitVisualsPrimaryDD
;
593 pScreenPriv
->pwinAdjustVideoMode
= winAdjustVideoModePrimaryDD
;
594 if (pScreenInfo
->fFullScreen
)
595 pScreenPriv
->pwinCreateBoundingWindow
=
596 winCreateBoundingWindowFullScreen
;
598 pScreenPriv
->pwinCreateBoundingWindow
= winCreateBoundingWindowWindowed
;
599 pScreenPriv
->pwinFinishScreenInit
= winFinishScreenInitFB
;
600 pScreenPriv
->pwinBltExposedRegions
=
601 (winBltExposedRegionsProcPtr
) (void (*)(void)) NoopDDA
;
602 pScreenPriv
->pwinActivateApp
= winActivateAppPrimaryDD
;
603 pScreenPriv
->pwinRedrawScreen
= NULL
;
604 pScreenPriv
->pwinRealizeInstalledPalette
= NULL
;
605 pScreenPriv
->pwinInstallColormap
= NULL
;
606 pScreenPriv
->pwinStoreColors
= NULL
;
607 pScreenPriv
->pwinCreateColormap
= NULL
;
608 pScreenPriv
->pwinDestroyColormap
= NULL
;
609 pScreenPriv
->pwinHotKeyAltTab
= winHotKeyAltTabPrimaryDD
;
610 pScreenPriv
->pwinCreatePrimarySurface
=
611 (winCreatePrimarySurfaceProcPtr
) (void (*)(void)) NoopDDA
;
612 pScreenPriv
->pwinReleasePrimarySurface
=
613 (winReleasePrimarySurfaceProcPtr
) (void (*)(void)) NoopDDA
;
614 #ifdef XWIN_MULTIWINDOW
615 pScreenPriv
->pwinFinishCreateWindowsWindow
=
616 (winFinishCreateWindowsWindowProcPtr
) (void (*)(void)) NoopDDA
;