1706f2543Smrg/* 2706f2543Smrg *Copyright (C) 1994-2000 The XFree86 Project, Inc. All Rights Reserved. 3706f2543Smrg * 4706f2543Smrg *Permission is hereby granted, free of charge, to any person obtaining 5706f2543Smrg * a copy of this software and associated documentation files (the 6706f2543Smrg *"Software"), to deal in the Software without restriction, including 7706f2543Smrg *without limitation the rights to use, copy, modify, merge, publish, 8706f2543Smrg *distribute, sublicense, and/or sell copies of the Software, and to 9706f2543Smrg *permit persons to whom the Software is furnished to do so, subject to 10706f2543Smrg *the following conditions: 11706f2543Smrg * 12706f2543Smrg *The above copyright notice and this permission notice shall be 13706f2543Smrg *included in all copies or substantial portions of the Software. 14706f2543Smrg * 15706f2543Smrg *THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 16706f2543Smrg *EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 17706f2543Smrg *MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 18706f2543Smrg *NONINFRINGEMENT. IN NO EVENT SHALL THE XFREE86 PROJECT BE LIABLE FOR 19706f2543Smrg *ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF 20706f2543Smrg *CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 21706f2543Smrg *WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 22706f2543Smrg * 23706f2543Smrg *Except as contained in this notice, the name of the XFree86 Project 24706f2543Smrg *shall not be used in advertising or otherwise to promote the sale, use 25706f2543Smrg *or other dealings in this Software without prior written authorization 26706f2543Smrg *from the XFree86 Project. 27706f2543Smrg * 28706f2543Smrg * Authors: Dakshinamurthy Karra 29706f2543Smrg * Suhaib M Siddiqi 30706f2543Smrg * Peter Busch 31706f2543Smrg * Harold L Hunt II 32706f2543Smrg */ 33706f2543Smrg 34706f2543Smrg#ifdef HAVE_XWIN_CONFIG_H 35706f2543Smrg#include <xwin-config.h> 36706f2543Smrg#endif 37706f2543Smrg#include "win.h" 38706f2543Smrg 39706f2543Smrg 40706f2543Smrg/* 41706f2543Smrg * FIXME: Headers are broken, DEFINE_GUID doesn't work correctly, 42706f2543Smrg * so we have to redefine it here. 43706f2543Smrg */ 44706f2543Smrg#ifdef DEFINE_GUID 45706f2543Smrg#undef DEFINE_GUID 46706f2543Smrg#define DEFINE_GUID(n,l,w1,w2,b1,b2,b3,b4,b5,b6,b7,b8) const GUID n GUID_SECT = {l,w1,w2,{b1,b2,b3,b4,b5,b6,b7,b8}} 47706f2543Smrg#endif /* DEFINE_GUID */ 48706f2543Smrg 49706f2543Smrg 50706f2543Smrg/* 51706f2543Smrg * FIXME: Headers are broken, IID_IDirectDraw2 has to be defined 52706f2543Smrg * here manually. Should be handled by ddraw.h 53706f2543Smrg */ 54706f2543Smrg#ifndef IID_IDirectDraw2 55706f2543SmrgDEFINE_GUID( IID_IDirectDraw2,0xB3A6F3E0,0x2B43,0x11CF,0xA2,0xDE,0x00,0xAA,0x00,0xB9,0x33,0x56 ); 56706f2543Smrg#endif /* IID_IDirectDraw2 */ 57706f2543Smrg 58706f2543Smrg 59706f2543Smrg/* 60706f2543Smrg * Local prototypes 61706f2543Smrg */ 62706f2543Smrg 63706f2543Smrgstatic Bool 64706f2543SmrgwinAllocateFBShadowDD (ScreenPtr pScreen); 65706f2543Smrg 66706f2543Smrgstatic void 67706f2543SmrgwinShadowUpdateDD (ScreenPtr pScreen, 68706f2543Smrg shadowBufPtr pBuf); 69706f2543Smrg 70706f2543Smrgstatic Bool 71706f2543SmrgwinCloseScreenShadowDD (int nIndex, ScreenPtr pScreen); 72706f2543Smrg 73706f2543Smrgstatic Bool 74706f2543SmrgwinInitVisualsShadowDD (ScreenPtr pScreen); 75706f2543Smrg 76706f2543Smrgstatic Bool 77706f2543SmrgwinAdjustVideoModeShadowDD (ScreenPtr pScreen); 78706f2543Smrg 79706f2543Smrgstatic Bool 80706f2543SmrgwinBltExposedRegionsShadowDD (ScreenPtr pScreen); 81706f2543Smrg 82706f2543Smrgstatic Bool 83706f2543SmrgwinActivateAppShadowDD (ScreenPtr pScreen); 84706f2543Smrg 85706f2543Smrgstatic Bool 86706f2543SmrgwinRedrawScreenShadowDD (ScreenPtr pScreen); 87706f2543Smrg 88706f2543Smrgstatic Bool 89706f2543SmrgwinRealizeInstalledPaletteShadowDD (ScreenPtr pScreen); 90706f2543Smrg 91706f2543Smrgstatic Bool 92706f2543SmrgwinInstallColormapShadowDD (ColormapPtr pColormap); 93706f2543Smrg 94706f2543Smrgstatic Bool 95706f2543SmrgwinStoreColorsShadowDD (ColormapPtr pmap, 96706f2543Smrg int ndef, 97706f2543Smrg xColorItem *pdefs); 98706f2543Smrg 99706f2543Smrgstatic Bool 100706f2543SmrgwinCreateColormapShadowDD (ColormapPtr pColormap); 101706f2543Smrg 102706f2543Smrgstatic Bool 103706f2543SmrgwinDestroyColormapShadowDD (ColormapPtr pColormap); 104706f2543Smrg 105706f2543Smrgstatic Bool 106706f2543SmrgwinCreatePrimarySurfaceShadowDD (ScreenPtr pScreen); 107706f2543Smrg 108706f2543Smrgstatic Bool 109706f2543SmrgwinReleasePrimarySurfaceShadowDD (ScreenPtr pScreen); 110706f2543Smrg 111706f2543Smrg 112706f2543Smrg/* 113706f2543Smrg * Create the primary surface and attach the clipper. 114706f2543Smrg * Used for both the initial surface creation and during 115706f2543Smrg * WM_DISPLAYCHANGE messages. 116706f2543Smrg */ 117706f2543Smrg 118706f2543Smrgstatic Bool 119706f2543SmrgwinCreatePrimarySurfaceShadowDD (ScreenPtr pScreen) 120706f2543Smrg{ 121706f2543Smrg winScreenPriv(pScreen); 122706f2543Smrg HRESULT ddrval = DD_OK; 123706f2543Smrg DDSURFACEDESC ddsd; 124706f2543Smrg 125706f2543Smrg /* Describe the primary surface */ 126706f2543Smrg ZeroMemory (&ddsd, sizeof (ddsd)); 127706f2543Smrg ddsd.dwSize = sizeof (ddsd); 128706f2543Smrg ddsd.dwFlags = DDSD_CAPS; 129706f2543Smrg ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE; 130706f2543Smrg 131706f2543Smrg /* Create the primary surface */ 132706f2543Smrg ddrval = IDirectDraw2_CreateSurface (pScreenPriv->pdd2, 133706f2543Smrg &ddsd, 134706f2543Smrg &pScreenPriv->pddsPrimary, 135706f2543Smrg NULL); 136706f2543Smrg if (FAILED (ddrval)) 137706f2543Smrg { 138706f2543Smrg ErrorF ("winCreatePrimarySurfaceShadowDD - Could not create primary " 139706f2543Smrg "surface: %08x\n", (unsigned int) ddrval); 140706f2543Smrg return FALSE; 141706f2543Smrg } 142706f2543Smrg 143706f2543Smrg#if CYGDEBUG 144706f2543Smrg winDebug ("winCreatePrimarySurfaceShadowDD - Created primary surface\n"); 145706f2543Smrg#endif 146706f2543Smrg 147706f2543Smrg /* 148706f2543Smrg * Attach a clipper to the primary surface that will clip our blits to our 149706f2543Smrg * display window. 150706f2543Smrg */ 151706f2543Smrg ddrval = IDirectDrawSurface2_SetClipper (pScreenPriv->pddsPrimary, 152706f2543Smrg pScreenPriv->pddcPrimary); 153706f2543Smrg if (FAILED (ddrval)) 154706f2543Smrg { 155706f2543Smrg ErrorF ("winCreatePrimarySurfaceShadowDD - Primary attach clipper " 156706f2543Smrg "failed: %08x\n", 157706f2543Smrg (unsigned int) ddrval); 158706f2543Smrg return FALSE; 159706f2543Smrg } 160706f2543Smrg 161706f2543Smrg#if CYGDEBUG 162706f2543Smrg winDebug ("winCreatePrimarySurfaceShadowDD - Attached clipper to " 163706f2543Smrg "primary surface\n"); 164706f2543Smrg#endif 165706f2543Smrg 166706f2543Smrg /* Everything was correct */ 167706f2543Smrg return TRUE; 168706f2543Smrg} 169706f2543Smrg 170706f2543Smrg 171706f2543Smrg/* 172706f2543Smrg * Detach the clipper and release the primary surface. 173706f2543Smrg * Called from WM_DISPLAYCHANGE. 174706f2543Smrg */ 175706f2543Smrg 176706f2543Smrgstatic Bool 177706f2543SmrgwinReleasePrimarySurfaceShadowDD (ScreenPtr pScreen) 178706f2543Smrg{ 179706f2543Smrg winScreenPriv(pScreen); 180706f2543Smrg 181706f2543Smrg ErrorF ("winReleasePrimarySurfaceShadowDD - Hello\n"); 182706f2543Smrg 183706f2543Smrg /* Release the primary surface and clipper, if they exist */ 184706f2543Smrg if (pScreenPriv->pddsPrimary) 185706f2543Smrg { 186706f2543Smrg /* 187706f2543Smrg * Detach the clipper from the primary surface. 188706f2543Smrg * NOTE: We do this explicity for clarity. The Clipper is not released. 189706f2543Smrg */ 190706f2543Smrg IDirectDrawSurface2_SetClipper (pScreenPriv->pddsPrimary, 191706f2543Smrg NULL); 192706f2543Smrg 193706f2543Smrg ErrorF ("winReleasePrimarySurfaceShadowDD - Detached clipper\n"); 194706f2543Smrg 195706f2543Smrg /* Release the primary surface */ 196706f2543Smrg IDirectDrawSurface2_Release (pScreenPriv->pddsPrimary); 197706f2543Smrg pScreenPriv->pddsPrimary = NULL; 198706f2543Smrg } 199706f2543Smrg 200706f2543Smrg ErrorF ("winReleasePrimarySurfaceShadowDD - Released primary surface\n"); 201706f2543Smrg 202706f2543Smrg return TRUE; 203706f2543Smrg} 204706f2543Smrg 205706f2543Smrg 206706f2543Smrg/* 207706f2543Smrg * Create a DirectDraw surface for the shadow framebuffer; also create 208706f2543Smrg * a primary surface object so we can blit to the display. 209706f2543Smrg * 210706f2543Smrg * Install a DirectDraw clipper on our primary surface object 211706f2543Smrg * that clips our blits to the unobscured client area of our display window. 212706f2543Smrg */ 213706f2543Smrg 214706f2543Smrgstatic Bool 215706f2543SmrgwinAllocateFBShadowDD (ScreenPtr pScreen) 216706f2543Smrg{ 217706f2543Smrg winScreenPriv(pScreen); 218706f2543Smrg winScreenInfo *pScreenInfo = pScreenPriv->pScreenInfo; 219706f2543Smrg HRESULT ddrval = DD_OK; 220706f2543Smrg DDSURFACEDESC ddsd; 221706f2543Smrg DDSURFACEDESC *pddsdShadow = NULL; 222706f2543Smrg 223706f2543Smrg#if CYGDEBUG 224706f2543Smrg winDebug ("winAllocateFBShadowDD\n"); 225706f2543Smrg#endif 226706f2543Smrg 227706f2543Smrg /* Create a clipper */ 228706f2543Smrg ddrval = (*g_fpDirectDrawCreateClipper) (0, 229706f2543Smrg &pScreenPriv->pddcPrimary, 230706f2543Smrg NULL); 231706f2543Smrg if (FAILED (ddrval)) 232706f2543Smrg { 233706f2543Smrg ErrorF ("winAllocateFBShadowDD - Could not create clipper: %08x\n", 234706f2543Smrg (unsigned int) ddrval); 235706f2543Smrg return FALSE; 236706f2543Smrg } 237706f2543Smrg 238706f2543Smrg#if CYGDEBUG 239706f2543Smrg winDebug ("winAllocateFBShadowDD - Created a clipper\n"); 240706f2543Smrg#endif 241706f2543Smrg 242706f2543Smrg /* Attach the clipper to our display window */ 243706f2543Smrg ddrval = IDirectDrawClipper_SetHWnd (pScreenPriv->pddcPrimary, 244706f2543Smrg 0, 245706f2543Smrg pScreenPriv->hwndScreen); 246706f2543Smrg if (FAILED (ddrval)) 247706f2543Smrg { 248706f2543Smrg ErrorF ("winAllocateFBShadowDD - Clipper not attached to " 249706f2543Smrg "window: %08x\n", 250706f2543Smrg (unsigned int) ddrval); 251706f2543Smrg return FALSE; 252706f2543Smrg } 253706f2543Smrg 254706f2543Smrg#if CYGDEBUG 255706f2543Smrg winDebug ("winAllocateFBShadowDD - Attached clipper to window\n"); 256706f2543Smrg#endif 257706f2543Smrg 258706f2543Smrg /* Create a DirectDraw object, store the address at lpdd */ 259706f2543Smrg ddrval = (*g_fpDirectDrawCreate) (NULL, &pScreenPriv->pdd, NULL); 260706f2543Smrg if (FAILED (ddrval)) 261706f2543Smrg { 262706f2543Smrg ErrorF ("winAllocateFBShadowDD - Could not start DirectDraw: %08x\n", 263706f2543Smrg (unsigned int) ddrval); 264706f2543Smrg return FALSE; 265706f2543Smrg } 266706f2543Smrg 267706f2543Smrg#if CYGDEBUG 268706f2543Smrg winDebug ("winAllocateFBShadowDD () - Created and initialized DD\n"); 269706f2543Smrg#endif 270706f2543Smrg 271706f2543Smrg /* Get a DirectDraw2 interface pointer */ 272706f2543Smrg ddrval = IDirectDraw_QueryInterface (pScreenPriv->pdd, 273706f2543Smrg &IID_IDirectDraw2, 274706f2543Smrg (LPVOID*) &pScreenPriv->pdd2); 275706f2543Smrg if (FAILED (ddrval)) 276706f2543Smrg { 277706f2543Smrg ErrorF ("winAllocateFBShadowDD - Failed DD2 query: %08x\n", 278706f2543Smrg (unsigned int) ddrval); 279706f2543Smrg return FALSE; 280706f2543Smrg } 281706f2543Smrg 282706f2543Smrg /* Are we full screen? */ 283706f2543Smrg if (pScreenInfo->fFullScreen) 284706f2543Smrg { 285706f2543Smrg DDSURFACEDESC ddsdCurrent; 286706f2543Smrg DWORD dwRefreshRateCurrent = 0; 287706f2543Smrg HDC hdc = NULL; 288706f2543Smrg 289706f2543Smrg /* Set the cooperative level to full screen */ 290706f2543Smrg ddrval = IDirectDraw2_SetCooperativeLevel (pScreenPriv->pdd2, 291706f2543Smrg pScreenPriv->hwndScreen, 292706f2543Smrg DDSCL_EXCLUSIVE 293706f2543Smrg | DDSCL_FULLSCREEN); 294706f2543Smrg if (FAILED (ddrval)) 295706f2543Smrg { 296706f2543Smrg ErrorF ("winAllocateFBShadowDD - Could not set " 297706f2543Smrg "cooperative level: %08x\n", 298706f2543Smrg (unsigned int) ddrval); 299706f2543Smrg return FALSE; 300706f2543Smrg } 301706f2543Smrg 302706f2543Smrg /* 303706f2543Smrg * We only need to get the current refresh rate for comparison 304706f2543Smrg * if a refresh rate has been passed on the command line. 305706f2543Smrg */ 306706f2543Smrg if (pScreenInfo->dwRefreshRate != 0) 307706f2543Smrg { 308706f2543Smrg ZeroMemory (&ddsdCurrent, sizeof (ddsdCurrent)); 309706f2543Smrg ddsdCurrent.dwSize = sizeof (ddsdCurrent); 310706f2543Smrg 311706f2543Smrg /* Get information about current display settings */ 312706f2543Smrg ddrval = IDirectDraw2_GetDisplayMode (pScreenPriv->pdd2, 313706f2543Smrg &ddsdCurrent); 314706f2543Smrg if (FAILED (ddrval)) 315706f2543Smrg { 316706f2543Smrg ErrorF ("winAllocateFBShadowDD - Could not get current " 317706f2543Smrg "refresh rate: %08x. Continuing.\n", 318706f2543Smrg (unsigned int) ddrval); 319706f2543Smrg dwRefreshRateCurrent = 0; 320706f2543Smrg } 321706f2543Smrg else 322706f2543Smrg { 323706f2543Smrg /* Grab the current refresh rate */ 324706f2543Smrg dwRefreshRateCurrent = ddsdCurrent.u2.dwRefreshRate; 325706f2543Smrg } 326706f2543Smrg } 327706f2543Smrg 328706f2543Smrg /* Clean up the refresh rate */ 329706f2543Smrg if (dwRefreshRateCurrent == pScreenInfo->dwRefreshRate) 330706f2543Smrg { 331706f2543Smrg /* 332706f2543Smrg * Refresh rate is non-specified or equal to current. 333706f2543Smrg */ 334706f2543Smrg pScreenInfo->dwRefreshRate = 0; 335706f2543Smrg } 336706f2543Smrg 337706f2543Smrg /* Grab a device context for the screen */ 338706f2543Smrg hdc = GetDC (NULL); 339706f2543Smrg if (hdc == NULL) 340706f2543Smrg { 341706f2543Smrg ErrorF ("winAllocateFBShadowDD - GetDC () failed\n"); 342706f2543Smrg return FALSE; 343706f2543Smrg } 344706f2543Smrg 345706f2543Smrg /* Only change the video mode when different than current mode */ 346706f2543Smrg if (!pScreenInfo->fMultipleMonitors 347706f2543Smrg && (pScreenInfo->dwWidth != GetSystemMetrics (SM_CXSCREEN) 348706f2543Smrg || pScreenInfo->dwHeight != GetSystemMetrics (SM_CYSCREEN) 349706f2543Smrg || pScreenInfo->dwBPP != GetDeviceCaps (hdc, BITSPIXEL) 350706f2543Smrg || pScreenInfo->dwRefreshRate != 0)) 351706f2543Smrg { 352706f2543Smrg ErrorF ("winAllocateFBShadowDD - Changing video mode\n"); 353706f2543Smrg 354706f2543Smrg /* Change the video mode to the mode requested, and use the driver default refresh rate on failure */ 355706f2543Smrg ddrval = IDirectDraw2_SetDisplayMode (pScreenPriv->pdd2, 356706f2543Smrg pScreenInfo->dwWidth, 357706f2543Smrg pScreenInfo->dwHeight, 358706f2543Smrg pScreenInfo->dwBPP, 359706f2543Smrg pScreenInfo->dwRefreshRate, 360706f2543Smrg 0); 361706f2543Smrg if (FAILED (ddrval)) 362706f2543Smrg { 363706f2543Smrg ErrorF ("winAllocateFBShadowDD - Could not set "\ 364706f2543Smrg "full screen display mode: %08x\n", 365706f2543Smrg (unsigned int) ddrval); 366706f2543Smrg ErrorF ("winAllocateFBShadowDD - Using default driver refresh rate\n"); 367706f2543Smrg ddrval = IDirectDraw2_SetDisplayMode (pScreenPriv->pdd2, 368706f2543Smrg pScreenInfo->dwWidth, 369706f2543Smrg pScreenInfo->dwHeight, 370706f2543Smrg pScreenInfo->dwBPP, 371706f2543Smrg 0, 372706f2543Smrg 0); 373706f2543Smrg if (FAILED(ddrval)) 374706f2543Smrg { 375706f2543Smrg ErrorF ("winAllocateFBShadowDD - Could not set default refresh rate " 376706f2543Smrg "full screen display mode: %08x\n", 377706f2543Smrg (unsigned int) ddrval); 378706f2543Smrg return FALSE; 379706f2543Smrg } 380706f2543Smrg } 381706f2543Smrg } 382706f2543Smrg else 383706f2543Smrg { 384706f2543Smrg ErrorF ("winAllocateFBShadowDD - Not changing video mode\n"); 385706f2543Smrg } 386706f2543Smrg 387706f2543Smrg /* Release our DC */ 388706f2543Smrg ReleaseDC (NULL, hdc); 389706f2543Smrg hdc = NULL; 390706f2543Smrg } 391706f2543Smrg else 392706f2543Smrg { 393706f2543Smrg /* Set the cooperative level for windowed mode */ 394706f2543Smrg ddrval = IDirectDraw2_SetCooperativeLevel (pScreenPriv->pdd2, 395706f2543Smrg pScreenPriv->hwndScreen, 396706f2543Smrg DDSCL_NORMAL); 397706f2543Smrg if (FAILED (ddrval)) 398706f2543Smrg { 399706f2543Smrg ErrorF ("winAllocateFBShadowDD - Could not set "\ 400706f2543Smrg "cooperative level: %08x\n", 401706f2543Smrg (unsigned int) ddrval); 402706f2543Smrg return FALSE; 403706f2543Smrg } 404706f2543Smrg } 405706f2543Smrg 406706f2543Smrg /* Create the primary surface */ 407706f2543Smrg if (!winCreatePrimarySurfaceShadowDD (pScreen)) 408706f2543Smrg { 409706f2543Smrg ErrorF ("winAllocateFBShadowDD - winCreatePrimarySurfaceShadowDD " 410706f2543Smrg "failed\n"); 411706f2543Smrg return FALSE; 412706f2543Smrg } 413706f2543Smrg 414706f2543Smrg /* Describe the shadow surface to be created */ 415706f2543Smrg /* NOTE: Do not use a DDSCAPS_VIDEOMEMORY surface, 416706f2543Smrg * as drawing, locking, and unlocking take forever 417706f2543Smrg * with video memory surfaces. In addition, 418706f2543Smrg * video memory is a somewhat scarce resource, 419706f2543Smrg * so you shouldn't be allocating video memory when 420706f2543Smrg * you have the option of using system memory instead. 421706f2543Smrg */ 422706f2543Smrg ZeroMemory (&ddsd, sizeof (ddsd)); 423706f2543Smrg ddsd.dwSize = sizeof (ddsd); 424706f2543Smrg ddsd.dwFlags = DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH; 425706f2543Smrg ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN | DDSCAPS_SYSTEMMEMORY; 426706f2543Smrg ddsd.dwHeight = pScreenInfo->dwHeight; 427706f2543Smrg ddsd.dwWidth = pScreenInfo->dwWidth; 428706f2543Smrg 429706f2543Smrg /* Create the shadow surface */ 430706f2543Smrg ddrval = IDirectDraw2_CreateSurface (pScreenPriv->pdd2, 431706f2543Smrg &ddsd, 432706f2543Smrg &pScreenPriv->pddsShadow, 433706f2543Smrg NULL); 434706f2543Smrg if (FAILED (ddrval)) 435706f2543Smrg { 436706f2543Smrg ErrorF ("winAllocateFBShadowDD - Could not create shadow "\ 437706f2543Smrg "surface: %08x\n", (unsigned int) ddrval); 438706f2543Smrg return FALSE; 439706f2543Smrg } 440706f2543Smrg 441706f2543Smrg#if CYGDEBUG 442706f2543Smrg winDebug ("winAllocateFBShadowDD - Created shadow\n"); 443706f2543Smrg#endif 444706f2543Smrg 445706f2543Smrg /* Allocate a DD surface description for our screen privates */ 446706f2543Smrg pddsdShadow = pScreenPriv->pddsdShadow = malloc (sizeof (DDSURFACEDESC)); 447706f2543Smrg if (pddsdShadow == NULL) 448706f2543Smrg { 449706f2543Smrg ErrorF ("winAllocateFBShadowDD - Could not allocate surface "\ 450706f2543Smrg "description memory\n"); 451706f2543Smrg return FALSE; 452706f2543Smrg } 453706f2543Smrg ZeroMemory (pddsdShadow, sizeof (*pddsdShadow)); 454706f2543Smrg pddsdShadow->dwSize = sizeof (*pddsdShadow); 455706f2543Smrg 456706f2543Smrg#if CYGDEBUG 457706f2543Smrg winDebug ("winAllocateFBShadowDD - Locking shadow\n"); 458706f2543Smrg#endif 459706f2543Smrg 460706f2543Smrg /* Lock the shadow surface */ 461706f2543Smrg ddrval = IDirectDrawSurface2_Lock (pScreenPriv->pddsShadow, 462706f2543Smrg NULL, 463706f2543Smrg pddsdShadow, 464706f2543Smrg DDLOCK_WAIT, 465706f2543Smrg NULL); 466706f2543Smrg if (FAILED (ddrval) || pddsdShadow->lpSurface == NULL) 467706f2543Smrg { 468706f2543Smrg ErrorF ("winAllocateFBShadowDD - Could not lock shadow "\ 469706f2543Smrg "surface: %08x\n", (unsigned int) ddrval); 470706f2543Smrg return FALSE; 471706f2543Smrg } 472706f2543Smrg 473706f2543Smrg#if CYGDEBUG 474706f2543Smrg winDebug ("winAllocateFBShadowDD - Locked shadow\n"); 475706f2543Smrg#endif 476706f2543Smrg 477706f2543Smrg /* We don't know how to deal with anything other than RGB */ 478706f2543Smrg if (!(pddsdShadow->ddpfPixelFormat.dwFlags & DDPF_RGB)) 479706f2543Smrg { 480706f2543Smrg ErrorF ("winAllocateFBShadowDD - Color format other than RGB\n"); 481706f2543Smrg return FALSE; 482706f2543Smrg } 483706f2543Smrg 484706f2543Smrg /* Grab the pitch from the surface desc */ 485706f2543Smrg pScreenInfo->dwStride = (pddsdShadow->u1.lPitch * 8) 486706f2543Smrg / pScreenInfo->dwBPP; 487706f2543Smrg 488706f2543Smrg /* Save the pointer to our surface memory */ 489706f2543Smrg pScreenInfo->pfb = pddsdShadow->lpSurface; 490706f2543Smrg 491706f2543Smrg /* Grab the color depth and masks from the surface description */ 492706f2543Smrg pScreenPriv->dwRedMask = pddsdShadow->ddpfPixelFormat.u2.dwRBitMask; 493706f2543Smrg pScreenPriv->dwGreenMask = pddsdShadow->ddpfPixelFormat.u3.dwGBitMask; 494706f2543Smrg pScreenPriv->dwBlueMask = pddsdShadow->ddpfPixelFormat.u4.dwBBitMask; 495706f2543Smrg 496706f2543Smrg#if CYGDEBUG 497706f2543Smrg winDebug ("winAllocateFBShadowDD - Returning\n"); 498706f2543Smrg#endif 499706f2543Smrg 500706f2543Smrg return TRUE; 501706f2543Smrg} 502706f2543Smrg 503706f2543Smrgstatic void 504706f2543SmrgwinFreeFBShadowDD (ScreenPtr pScreen) 505706f2543Smrg{ 506706f2543Smrg winScreenPriv(pScreen); 507706f2543Smrg winScreenInfo *pScreenInfo = pScreenPriv->pScreenInfo; 508706f2543Smrg 509706f2543Smrg /* Free the shadow surface, if there is one */ 510706f2543Smrg if (pScreenPriv->pddsShadow) 511706f2543Smrg { 512706f2543Smrg IDirectDrawSurface2_Unlock (pScreenPriv->pddsShadow, NULL); 513706f2543Smrg IDirectDrawSurface2_Release (pScreenPriv->pddsShadow); 514706f2543Smrg pScreenPriv->pddsShadow = NULL; 515706f2543Smrg } 516706f2543Smrg 517706f2543Smrg /* Detach the clipper from the primary surface and release the primary surface, if there is one */ 518706f2543Smrg winReleasePrimarySurfaceShadowDD(pScreen); 519706f2543Smrg 520706f2543Smrg /* Release the clipper object */ 521706f2543Smrg if (pScreenPriv->pddcPrimary) 522706f2543Smrg { 523706f2543Smrg IDirectDrawClipper_Release (pScreenPriv->pddcPrimary); 524706f2543Smrg pScreenPriv->pddcPrimary = NULL; 525706f2543Smrg } 526706f2543Smrg 527706f2543Smrg /* Free the DirectDraw2 object, if there is one */ 528706f2543Smrg if (pScreenPriv->pdd2) 529706f2543Smrg { 530706f2543Smrg IDirectDraw2_RestoreDisplayMode (pScreenPriv->pdd2); 531706f2543Smrg IDirectDraw2_Release (pScreenPriv->pdd2); 532706f2543Smrg pScreenPriv->pdd2 = NULL; 533706f2543Smrg } 534706f2543Smrg 535706f2543Smrg /* Free the DirectDraw object, if there is one */ 536706f2543Smrg if (pScreenPriv->pdd) 537706f2543Smrg { 538706f2543Smrg IDirectDraw_Release (pScreenPriv->pdd); 539706f2543Smrg pScreenPriv->pdd = NULL; 540706f2543Smrg } 541706f2543Smrg 542706f2543Smrg /* Invalidate the ScreenInfo's fb pointer */ 543706f2543Smrg pScreenInfo->pfb = NULL; 544706f2543Smrg} 545706f2543Smrg 546706f2543Smrg/* 547706f2543Smrg * Transfer the damaged regions of the shadow framebuffer to the display. 548706f2543Smrg */ 549706f2543Smrg 550706f2543Smrgstatic void 551706f2543SmrgwinShadowUpdateDD (ScreenPtr pScreen, 552706f2543Smrg shadowBufPtr pBuf) 553706f2543Smrg{ 554706f2543Smrg winScreenPriv(pScreen); 555706f2543Smrg winScreenInfo *pScreenInfo = pScreenPriv->pScreenInfo; 556706f2543Smrg RegionPtr damage = shadowDamage(pBuf); 557706f2543Smrg HRESULT ddrval = DD_OK; 558706f2543Smrg RECT rcDest, rcSrc; 559706f2543Smrg POINT ptOrigin; 560706f2543Smrg DWORD dwBox = RegionNumRects (damage); 561706f2543Smrg BoxPtr pBox = RegionRects (damage); 562706f2543Smrg HRGN hrgnTemp = NULL, hrgnCombined = NULL; 563706f2543Smrg 564706f2543Smrg /* 565706f2543Smrg * Return immediately if the app is not active 566706f2543Smrg * and we are fullscreen, or if we have a bad display depth 567706f2543Smrg */ 568706f2543Smrg if ((!pScreenPriv->fActive && pScreenInfo->fFullScreen) 569706f2543Smrg || pScreenPriv->fBadDepth) return; 570706f2543Smrg 571706f2543Smrg /* Return immediately if we didn't get needed surfaces */ 572706f2543Smrg if (!pScreenPriv->pddsPrimary || !pScreenPriv->pddsShadow) 573706f2543Smrg return; 574706f2543Smrg 575706f2543Smrg /* Get the origin of the window in the screen coords */ 576706f2543Smrg ptOrigin.x = pScreenInfo->dwXOffset; 577706f2543Smrg ptOrigin.y = pScreenInfo->dwYOffset; 578706f2543Smrg MapWindowPoints (pScreenPriv->hwndScreen, 579706f2543Smrg HWND_DESKTOP, 580706f2543Smrg (LPPOINT)&ptOrigin, 1); 581706f2543Smrg 582706f2543Smrg /* Unlock the shadow surface, so we can blit */ 583706f2543Smrg ddrval = IDirectDrawSurface2_Unlock (pScreenPriv->pddsShadow, NULL); 584706f2543Smrg if (FAILED (ddrval)) 585706f2543Smrg { 586706f2543Smrg ErrorF ("winShadowUpdateDD - Unlock failed\n"); 587706f2543Smrg return; 588706f2543Smrg } 589706f2543Smrg 590706f2543Smrg /* 591706f2543Smrg * Handle small regions with multiple blits, 592706f2543Smrg * handle large regions by creating a clipping region and 593706f2543Smrg * doing a single blit constrained to that clipping region. 594706f2543Smrg */ 595706f2543Smrg if (pScreenInfo->dwClipUpdatesNBoxes == 0 596706f2543Smrg || dwBox < pScreenInfo->dwClipUpdatesNBoxes) 597706f2543Smrg { 598706f2543Smrg /* Loop through all boxes in the damaged region */ 599706f2543Smrg while (dwBox--) 600706f2543Smrg { 601706f2543Smrg /* Assign damage box to source rectangle */ 602706f2543Smrg rcSrc.left = pBox->x1; 603706f2543Smrg rcSrc.top = pBox->y1; 604706f2543Smrg rcSrc.right = pBox->x2; 605706f2543Smrg rcSrc.bottom = pBox->y2; 606706f2543Smrg 607706f2543Smrg /* Calculate destination rectange */ 608706f2543Smrg rcDest.left = ptOrigin.x + rcSrc.left; 609706f2543Smrg rcDest.top = ptOrigin.y + rcSrc.top; 610706f2543Smrg rcDest.right = ptOrigin.x + rcSrc.right; 611706f2543Smrg rcDest.bottom = ptOrigin.y + rcSrc.bottom; 612706f2543Smrg 613706f2543Smrg /* Blit the damaged areas */ 614706f2543Smrg ddrval = IDirectDrawSurface2_Blt (pScreenPriv->pddsPrimary, 615706f2543Smrg &rcDest, 616706f2543Smrg pScreenPriv->pddsShadow, 617706f2543Smrg &rcSrc, 618706f2543Smrg DDBLT_WAIT, 619706f2543Smrg NULL); 620706f2543Smrg 621706f2543Smrg /* Get a pointer to the next box */ 622706f2543Smrg ++pBox; 623706f2543Smrg } 624706f2543Smrg } 625706f2543Smrg else 626706f2543Smrg { 627706f2543Smrg BoxPtr pBoxExtents = RegionExtents(damage); 628706f2543Smrg 629706f2543Smrg /* Compute a GDI region from the damaged region */ 630706f2543Smrg hrgnCombined = CreateRectRgn (pBox->x1, pBox->y1, pBox->x2, pBox->y2); 631706f2543Smrg dwBox--; 632706f2543Smrg pBox++; 633706f2543Smrg while (dwBox--) 634706f2543Smrg { 635706f2543Smrg hrgnTemp = CreateRectRgn (pBox->x1, pBox->y1, pBox->x2, pBox->y2); 636706f2543Smrg CombineRgn (hrgnCombined, hrgnCombined, hrgnTemp, RGN_OR); 637706f2543Smrg DeleteObject (hrgnTemp); 638706f2543Smrg pBox++; 639706f2543Smrg } 640706f2543Smrg 641706f2543Smrg /* Install the GDI region as a clipping region */ 642706f2543Smrg SelectClipRgn (pScreenPriv->hdcScreen, hrgnCombined); 643706f2543Smrg DeleteObject (hrgnCombined); 644706f2543Smrg hrgnCombined = NULL; 645706f2543Smrg 646706f2543Smrg /* Calculating a bounding box for the source is easy */ 647706f2543Smrg rcSrc.left = pBoxExtents->x1; 648706f2543Smrg rcSrc.top = pBoxExtents->y1; 649706f2543Smrg rcSrc.right = pBoxExtents->x2; 650706f2543Smrg rcSrc.bottom = pBoxExtents->y2; 651706f2543Smrg 652706f2543Smrg /* Calculating a bounding box for the destination is trickier */ 653706f2543Smrg rcDest.left = ptOrigin.x + rcSrc.left; 654706f2543Smrg rcDest.top = ptOrigin.y + rcSrc.top; 655706f2543Smrg rcDest.right = ptOrigin.x + rcSrc.right; 656706f2543Smrg rcDest.bottom = ptOrigin.y + rcSrc.bottom; 657706f2543Smrg 658706f2543Smrg /* Our Blt should be clipped to the invalidated region */ 659706f2543Smrg ddrval = IDirectDrawSurface2_Blt (pScreenPriv->pddsPrimary, 660706f2543Smrg &rcDest, 661706f2543Smrg pScreenPriv->pddsShadow, 662706f2543Smrg &rcSrc, 663706f2543Smrg DDBLT_WAIT, 664706f2543Smrg NULL); 665706f2543Smrg 666706f2543Smrg /* Reset the clip region */ 667706f2543Smrg SelectClipRgn (pScreenPriv->hdcScreen, NULL); 668706f2543Smrg } 669706f2543Smrg 670706f2543Smrg /* Relock the shadow surface */ 671706f2543Smrg ddrval = IDirectDrawSurface2_Lock (pScreenPriv->pddsShadow, 672706f2543Smrg NULL, 673706f2543Smrg pScreenPriv->pddsdShadow, 674706f2543Smrg DDLOCK_WAIT, 675706f2543Smrg NULL); 676706f2543Smrg if (FAILED (ddrval)) 677706f2543Smrg { 678706f2543Smrg ErrorF ("winShadowUpdateDD - Lock failed\n"); 679706f2543Smrg return; 680706f2543Smrg } 681706f2543Smrg 682706f2543Smrg /* Has our memory pointer changed? */ 683706f2543Smrg if (pScreenInfo->pfb != pScreenPriv->pddsdShadow->lpSurface) 684706f2543Smrg { 685706f2543Smrg ErrorF ("winShadowUpdateDD - Memory location of the shadow " 686706f2543Smrg "surface has changed, trying to update the root window " 687706f2543Smrg "pixmap header to point to the new address. If you get " 688706f2543Smrg "this message and "PROJECT_NAME" freezes or crashes " 689706f2543Smrg "after this message then send a problem report and your " 690706f2543Smrg "%s file to " BUILDERADDR "\n", g_pszLogFile); 691706f2543Smrg 692706f2543Smrg /* Location of shadow framebuffer has changed */ 693706f2543Smrg winUpdateFBPointer(pScreen, pScreenPriv->pddsdShadow->lpSurface); 694706f2543Smrg } 695706f2543Smrg} 696706f2543Smrg 697706f2543Smrgstatic Bool 698706f2543SmrgwinInitScreenShadowDD (ScreenPtr pScreen) 699706f2543Smrg{ 700706f2543Smrg winScreenPriv(pScreen); 701706f2543Smrg 702706f2543Smrg /* Get a device context for the screen */ 703706f2543Smrg pScreenPriv->hdcScreen = GetDC (pScreenPriv->hwndScreen); 704706f2543Smrg 705706f2543Smrg return winAllocateFBShadowDD(pScreen); 706706f2543Smrg} 707706f2543Smrg 708706f2543Smrg/* 709706f2543Smrg * Call the wrapped CloseScreen function. 710706f2543Smrg * 711706f2543Smrg * Free our resources and private structures. 712706f2543Smrg */ 713706f2543Smrg 714706f2543Smrgstatic Bool 715706f2543SmrgwinCloseScreenShadowDD (int nIndex, ScreenPtr pScreen) 716706f2543Smrg{ 717706f2543Smrg winScreenPriv(pScreen); 718706f2543Smrg winScreenInfo *pScreenInfo = pScreenPriv->pScreenInfo; 719706f2543Smrg Bool fReturn; 720706f2543Smrg 721706f2543Smrg#if CYGDEBUG 722706f2543Smrg winDebug ("winCloseScreenShadowDD - Freeing screen resources\n"); 723706f2543Smrg#endif 724706f2543Smrg 725706f2543Smrg /* Flag that the screen is closed */ 726706f2543Smrg pScreenPriv->fClosed = TRUE; 727706f2543Smrg pScreenPriv->fActive = FALSE; 728706f2543Smrg 729706f2543Smrg /* Call the wrapped CloseScreen procedure */ 730706f2543Smrg WIN_UNWRAP(CloseScreen); 731706f2543Smrg fReturn = (*pScreen->CloseScreen) (nIndex, pScreen); 732706f2543Smrg 733706f2543Smrg winFreeFBShadowDD(pScreen); 734706f2543Smrg 735706f2543Smrg /* Free the screen DC */ 736706f2543Smrg ReleaseDC (pScreenPriv->hwndScreen, pScreenPriv->hdcScreen); 737706f2543Smrg 738706f2543Smrg /* Delete the window property */ 739706f2543Smrg RemoveProp (pScreenPriv->hwndScreen, WIN_SCR_PROP); 740706f2543Smrg 741706f2543Smrg /* Delete tray icon, if we have one */ 742706f2543Smrg if (!pScreenInfo->fNoTrayIcon) 743706f2543Smrg winDeleteNotifyIcon (pScreenPriv); 744706f2543Smrg 745706f2543Smrg /* Free the exit confirmation dialog box, if it exists */ 746706f2543Smrg if (g_hDlgExit != NULL) 747706f2543Smrg { 748706f2543Smrg DestroyWindow (g_hDlgExit); 749706f2543Smrg g_hDlgExit = NULL; 750706f2543Smrg } 751706f2543Smrg 752706f2543Smrg /* Kill our window */ 753706f2543Smrg if (pScreenPriv->hwndScreen) 754706f2543Smrg { 755706f2543Smrg DestroyWindow (pScreenPriv->hwndScreen); 756706f2543Smrg pScreenPriv->hwndScreen = NULL; 757706f2543Smrg } 758706f2543Smrg 759706f2543Smrg#if defined(XWIN_CLIPBOARD) || defined(XWIN_MULTIWINDOW) 760706f2543Smrg /* Destroy the thread startup mutex */ 761706f2543Smrg pthread_mutex_destroy (&pScreenPriv->pmServerStarted); 762706f2543Smrg#endif 763706f2543Smrg 764706f2543Smrg /* Kill our screeninfo's pointer to the screen */ 765706f2543Smrg pScreenInfo->pScreen = NULL; 766706f2543Smrg 767706f2543Smrg /* Free the screen privates for this screen */ 768706f2543Smrg free ((pointer) pScreenPriv); 769706f2543Smrg 770706f2543Smrg return fReturn; 771706f2543Smrg} 772706f2543Smrg 773706f2543Smrg 774706f2543Smrg/* 775706f2543Smrg * Tell mi what sort of visuals we need. 776706f2543Smrg * 777706f2543Smrg * Generally we only need one visual, as our screen can only 778706f2543Smrg * handle one format at a time, I believe. You may want 779706f2543Smrg * to verify that last sentence. 780706f2543Smrg */ 781706f2543Smrg 782706f2543Smrgstatic Bool 783706f2543SmrgwinInitVisualsShadowDD (ScreenPtr pScreen) 784706f2543Smrg{ 785706f2543Smrg winScreenPriv(pScreen); 786706f2543Smrg winScreenInfo *pScreenInfo = pScreenPriv->pScreenInfo; 787706f2543Smrg DWORD dwRedBits, dwGreenBits, dwBlueBits; 788706f2543Smrg 789706f2543Smrg /* Count the number of ones in each color mask */ 790706f2543Smrg dwRedBits = winCountBits (pScreenPriv->dwRedMask); 791706f2543Smrg dwGreenBits = winCountBits (pScreenPriv->dwGreenMask); 792706f2543Smrg dwBlueBits = winCountBits (pScreenPriv->dwBlueMask); 793706f2543Smrg 794706f2543Smrg /* Store the maximum number of ones in a color mask as the bitsPerRGB */ 795706f2543Smrg if (dwRedBits == 0 || dwGreenBits == 0 || dwBlueBits == 0) 796706f2543Smrg pScreenPriv->dwBitsPerRGB = 8; 797706f2543Smrg else if (dwRedBits > dwGreenBits && dwRedBits > dwBlueBits) 798706f2543Smrg pScreenPriv->dwBitsPerRGB = dwRedBits; 799706f2543Smrg else if (dwGreenBits > dwRedBits && dwGreenBits > dwBlueBits) 800706f2543Smrg pScreenPriv->dwBitsPerRGB = dwGreenBits; 801706f2543Smrg else 802706f2543Smrg pScreenPriv->dwBitsPerRGB = dwBlueBits; 803706f2543Smrg 804706f2543Smrg ErrorF ("winInitVisualsShadowDD - Masks %08x %08x %08x BPRGB %d d %d " 805706f2543Smrg "bpp %d\n", 806706f2543Smrg (unsigned int) pScreenPriv->dwRedMask, 807706f2543Smrg (unsigned int) pScreenPriv->dwGreenMask, 808706f2543Smrg (unsigned int) pScreenPriv->dwBlueMask, 809706f2543Smrg (int) pScreenPriv->dwBitsPerRGB, 810706f2543Smrg (int) pScreenInfo->dwDepth, 811706f2543Smrg (int) pScreenInfo->dwBPP); 812706f2543Smrg 813706f2543Smrg /* Create a single visual according to the Windows screen depth */ 814706f2543Smrg switch (pScreenInfo->dwDepth) 815706f2543Smrg { 816706f2543Smrg case 24: 817706f2543Smrg case 16: 818706f2543Smrg case 15: 819706f2543Smrg /* Create the real visual */ 820706f2543Smrg if (!miSetVisualTypesAndMasks (pScreenInfo->dwDepth, 821706f2543Smrg TrueColorMask, 822706f2543Smrg pScreenPriv->dwBitsPerRGB, 823706f2543Smrg TrueColor, 824706f2543Smrg pScreenPriv->dwRedMask, 825706f2543Smrg pScreenPriv->dwGreenMask, 826706f2543Smrg pScreenPriv->dwBlueMask)) 827706f2543Smrg { 828706f2543Smrg ErrorF ("winInitVisualsShadowDD - miSetVisualTypesAndMasks " 829706f2543Smrg "failed for TrueColor\n"); 830706f2543Smrg return FALSE; 831706f2543Smrg } 832706f2543Smrg 833706f2543Smrg#ifdef XWIN_EMULATEPSEUDO 834706f2543Smrg if (!pScreenInfo->fEmulatePseudo) 835706f2543Smrg break; 836706f2543Smrg 837706f2543Smrg /* Setup a pseudocolor visual */ 838706f2543Smrg if (!miSetVisualTypesAndMasks (8, 839706f2543Smrg PseudoColorMask, 840706f2543Smrg 8, 841706f2543Smrg -1, 842706f2543Smrg 0, 843706f2543Smrg 0, 844706f2543Smrg 0)) 845706f2543Smrg { 846706f2543Smrg ErrorF ("winInitVisualsShadowDD - miSetVisualTypesAndMasks " 847706f2543Smrg "failed for PseudoColor\n"); 848706f2543Smrg return FALSE; 849706f2543Smrg } 850706f2543Smrg#endif 851706f2543Smrg break; 852706f2543Smrg 853706f2543Smrg case 8: 854706f2543Smrg if (!miSetVisualTypesAndMasks (pScreenInfo->dwDepth, 855706f2543Smrg pScreenInfo->fFullScreen 856706f2543Smrg ? PseudoColorMask : StaticColorMask, 857706f2543Smrg pScreenPriv->dwBitsPerRGB, 858706f2543Smrg pScreenInfo->fFullScreen 859706f2543Smrg ? PseudoColor : StaticColor, 860706f2543Smrg pScreenPriv->dwRedMask, 861706f2543Smrg pScreenPriv->dwGreenMask, 862706f2543Smrg pScreenPriv->dwBlueMask)) 863706f2543Smrg { 864706f2543Smrg ErrorF ("winInitVisualsShadowDD - miSetVisualTypesAndMasks " 865706f2543Smrg "failed\n"); 866706f2543Smrg return FALSE; 867706f2543Smrg } 868706f2543Smrg break; 869706f2543Smrg 870706f2543Smrg default: 871706f2543Smrg ErrorF ("winInitVisualsShadowDD - Unknown screen depth\n"); 872706f2543Smrg return FALSE; 873706f2543Smrg } 874706f2543Smrg 875706f2543Smrg#if CYGDEBUG 876706f2543Smrg winDebug ("winInitVisualsShadowDD - Returning\n"); 877706f2543Smrg#endif 878706f2543Smrg 879706f2543Smrg return TRUE; 880706f2543Smrg} 881706f2543Smrg 882706f2543Smrg 883706f2543Smrg/* 884706f2543Smrg * Adjust the user proposed video mode 885706f2543Smrg */ 886706f2543Smrg 887706f2543Smrgstatic Bool 888706f2543SmrgwinAdjustVideoModeShadowDD (ScreenPtr pScreen) 889706f2543Smrg{ 890706f2543Smrg winScreenPriv(pScreen); 891706f2543Smrg winScreenInfo *pScreenInfo = pScreenPriv->pScreenInfo; 892706f2543Smrg HDC hdc = NULL; 893706f2543Smrg DWORD dwBPP; 894706f2543Smrg 895706f2543Smrg /* We're in serious trouble if we can't get a DC */ 896706f2543Smrg hdc = GetDC (NULL); 897706f2543Smrg if (hdc == NULL) 898706f2543Smrg { 899706f2543Smrg ErrorF ("winAdjustVideoModeShadowDD - GetDC () failed\n"); 900706f2543Smrg return FALSE; 901706f2543Smrg } 902706f2543Smrg 903706f2543Smrg /* Query GDI for current display depth */ 904706f2543Smrg dwBPP = GetDeviceCaps (hdc, BITSPIXEL); 905706f2543Smrg 906706f2543Smrg /* DirectDraw can only change the depth in fullscreen mode */ 907706f2543Smrg if (!(pScreenInfo->fFullScreen && 908706f2543Smrg (pScreenInfo->dwBPP != WIN_DEFAULT_BPP))) 909706f2543Smrg { 910706f2543Smrg /* Otherwise, We'll use GDI's depth */ 911706f2543Smrg pScreenInfo->dwBPP = dwBPP; 912706f2543Smrg } 913706f2543Smrg 914706f2543Smrg /* Release our DC */ 915706f2543Smrg ReleaseDC (NULL, hdc); 916706f2543Smrg return TRUE; 917706f2543Smrg} 918706f2543Smrg 919706f2543Smrg 920706f2543Smrg/* 921706f2543Smrg * Blt exposed regions to the screen 922706f2543Smrg */ 923706f2543Smrg 924706f2543Smrgstatic Bool 925706f2543SmrgwinBltExposedRegionsShadowDD (ScreenPtr pScreen) 926706f2543Smrg{ 927706f2543Smrg winScreenPriv(pScreen); 928706f2543Smrg winScreenInfo *pScreenInfo = pScreenPriv->pScreenInfo; 929706f2543Smrg RECT rcSrc, rcDest; 930706f2543Smrg POINT ptOrigin; 931706f2543Smrg HDC hdcUpdate = NULL; 932706f2543Smrg PAINTSTRUCT ps; 933706f2543Smrg HRESULT ddrval = DD_OK; 934706f2543Smrg Bool fReturn = TRUE; 935706f2543Smrg Bool fLocked = TRUE; 936706f2543Smrg int i; 937706f2543Smrg 938706f2543Smrg /* BeginPaint gives us an hdc that clips to the invalidated region */ 939706f2543Smrg hdcUpdate = BeginPaint (pScreenPriv->hwndScreen, &ps); 940706f2543Smrg if (hdcUpdate == NULL) 941706f2543Smrg { 942706f2543Smrg ErrorF ("winBltExposedRegionsShadowDD - BeginPaint () returned " 943706f2543Smrg "a NULL device context handle. Aborting blit attempt.\n"); 944706f2543Smrg return FALSE; 945706f2543Smrg } 946706f2543Smrg 947706f2543Smrg /* Unlock the shadow surface, so we can blit */ 948706f2543Smrg ddrval = IDirectDrawSurface2_Unlock (pScreenPriv->pddsShadow, NULL); 949706f2543Smrg if (FAILED (ddrval)) 950706f2543Smrg { 951706f2543Smrg fReturn = FALSE; 952706f2543Smrg goto winBltExposedRegionsShadowDD_Exit; 953706f2543Smrg } 954706f2543Smrg else 955706f2543Smrg { 956706f2543Smrg /* Flag that we have unlocked the shadow surface */ 957706f2543Smrg fLocked = FALSE; 958706f2543Smrg } 959706f2543Smrg 960706f2543Smrg /* Get the origin of the window in the screen coords */ 961706f2543Smrg ptOrigin.x = pScreenInfo->dwXOffset; 962706f2543Smrg ptOrigin.y = pScreenInfo->dwYOffset; 963706f2543Smrg 964706f2543Smrg MapWindowPoints (pScreenPriv->hwndScreen, 965706f2543Smrg HWND_DESKTOP, 966706f2543Smrg (LPPOINT)&ptOrigin, 1); 967706f2543Smrg rcDest.left = ptOrigin.x; 968706f2543Smrg rcDest.right = ptOrigin.x + pScreenInfo->dwWidth; 969706f2543Smrg rcDest.top = ptOrigin.y; 970706f2543Smrg rcDest.bottom = ptOrigin.y + pScreenInfo->dwHeight; 971706f2543Smrg 972706f2543Smrg /* Source can be enter shadow surface, as Blt should clip */ 973706f2543Smrg rcSrc.left = 0; 974706f2543Smrg rcSrc.top = 0; 975706f2543Smrg rcSrc.right = pScreenInfo->dwWidth; 976706f2543Smrg rcSrc.bottom = pScreenInfo->dwHeight; 977706f2543Smrg 978706f2543Smrg /* Try to regain the primary surface and blit again if we've lost it */ 979706f2543Smrg for (i = 0; i <= WIN_REGAIN_SURFACE_RETRIES; ++i) 980706f2543Smrg { 981706f2543Smrg /* Our Blt should be clipped to the invalidated region */ 982706f2543Smrg ddrval = IDirectDrawSurface2_Blt (pScreenPriv->pddsPrimary, 983706f2543Smrg &rcDest, 984706f2543Smrg pScreenPriv->pddsShadow, 985706f2543Smrg &rcSrc, 986706f2543Smrg DDBLT_WAIT, 987706f2543Smrg NULL); 988706f2543Smrg if (ddrval == DDERR_SURFACELOST) 989706f2543Smrg { 990706f2543Smrg /* Surface was lost */ 991706f2543Smrg ErrorF ("winBltExposedRegionsShadowDD - IDirectDrawSurface2_Blt " 992706f2543Smrg "reported that the primary surface was lost, " 993706f2543Smrg "trying to restore, retry: %d\n", i + 1); 994706f2543Smrg 995706f2543Smrg /* Try to restore the surface, once */ 996706f2543Smrg ddrval = IDirectDrawSurface2_Restore (pScreenPriv->pddsPrimary); 997706f2543Smrg ErrorF ("winBltExposedRegionsShadowDD - " 998706f2543Smrg "IDirectDrawSurface2_Restore returned: "); 999706f2543Smrg if (ddrval == DD_OK) 1000706f2543Smrg ErrorF ("DD_OK\n"); 1001706f2543Smrg else if (ddrval == DDERR_WRONGMODE) 1002706f2543Smrg ErrorF ("DDERR_WRONGMODE\n"); 1003706f2543Smrg else if (ddrval == DDERR_INCOMPATIBLEPRIMARY) 1004706f2543Smrg ErrorF ("DDERR_INCOMPATIBLEPRIMARY\n"); 1005706f2543Smrg else if (ddrval == DDERR_UNSUPPORTED) 1006706f2543Smrg ErrorF ("DDERR_UNSUPPORTED\n"); 1007706f2543Smrg else if (ddrval == DDERR_INVALIDPARAMS) 1008706f2543Smrg ErrorF ("DDERR_INVALIDPARAMS\n"); 1009706f2543Smrg else if (ddrval == DDERR_INVALIDOBJECT) 1010706f2543Smrg ErrorF ("DDERR_INVALIDOBJECT\n"); 1011706f2543Smrg else 1012706f2543Smrg ErrorF ("unknown error: %08x\n", (unsigned int) ddrval); 1013706f2543Smrg 1014706f2543Smrg /* Loop around to try the blit one more time */ 1015706f2543Smrg continue; 1016706f2543Smrg } 1017706f2543Smrg else if (FAILED (ddrval)) 1018706f2543Smrg { 1019706f2543Smrg fReturn = FALSE; 1020706f2543Smrg ErrorF ("winBltExposedRegionsShadowDD - IDirectDrawSurface2_Blt " 1021706f2543Smrg "failed, but surface not lost: %08x %d\n", 1022706f2543Smrg (unsigned int) ddrval, (int) ddrval); 1023706f2543Smrg goto winBltExposedRegionsShadowDD_Exit; 1024706f2543Smrg } 1025706f2543Smrg else 1026706f2543Smrg { 1027706f2543Smrg /* Success, stop looping */ 1028706f2543Smrg break; 1029706f2543Smrg } 1030706f2543Smrg } 1031706f2543Smrg 1032706f2543Smrg /* Relock the shadow surface */ 1033706f2543Smrg ddrval = IDirectDrawSurface2_Lock (pScreenPriv->pddsShadow, 1034706f2543Smrg NULL, 1035706f2543Smrg pScreenPriv->pddsdShadow, 1036706f2543Smrg DDLOCK_WAIT, 1037706f2543Smrg NULL); 1038706f2543Smrg if (FAILED (ddrval)) 1039706f2543Smrg { 1040706f2543Smrg fReturn = FALSE; 1041706f2543Smrg ErrorF ("winBltExposedRegionsShadowDD - IDirectDrawSurface2_Lock " 1042706f2543Smrg "failed\n"); 1043706f2543Smrg goto winBltExposedRegionsShadowDD_Exit; 1044706f2543Smrg } 1045706f2543Smrg else 1046706f2543Smrg { 1047706f2543Smrg /* Indicate that we have relocked the shadow surface */ 1048706f2543Smrg fLocked = TRUE; 1049706f2543Smrg } 1050706f2543Smrg 1051706f2543Smrg /* Has our memory pointer changed? */ 1052706f2543Smrg if (pScreenInfo->pfb != pScreenPriv->pddsdShadow->lpSurface) 1053706f2543Smrg winUpdateFBPointer (pScreen, 1054706f2543Smrg pScreenPriv->pddsdShadow->lpSurface); 1055706f2543Smrg 1056706f2543Smrg winBltExposedRegionsShadowDD_Exit: 1057706f2543Smrg /* EndPaint frees the DC */ 1058706f2543Smrg if (hdcUpdate != NULL) 1059706f2543Smrg EndPaint (pScreenPriv->hwndScreen, &ps); 1060706f2543Smrg 1061706f2543Smrg /* 1062706f2543Smrg * Relock the surface if it is not locked. We don't care if locking fails, 1063706f2543Smrg * as it will cause the server to shutdown within a few more operations. 1064706f2543Smrg */ 1065706f2543Smrg if (!fLocked) 1066706f2543Smrg { 1067706f2543Smrg IDirectDrawSurface2_Lock (pScreenPriv->pddsShadow, 1068706f2543Smrg NULL, 1069706f2543Smrg pScreenPriv->pddsdShadow, 1070706f2543Smrg DDLOCK_WAIT, 1071706f2543Smrg NULL); 1072706f2543Smrg 1073706f2543Smrg /* Has our memory pointer changed? */ 1074706f2543Smrg if (pScreenInfo->pfb != pScreenPriv->pddsdShadow->lpSurface) 1075706f2543Smrg winUpdateFBPointer (pScreen, 1076706f2543Smrg pScreenPriv->pddsdShadow->lpSurface); 1077706f2543Smrg 1078706f2543Smrg fLocked = TRUE; 1079706f2543Smrg } 1080706f2543Smrg return fReturn; 1081706f2543Smrg} 1082706f2543Smrg 1083706f2543Smrg 1084706f2543Smrg/* 1085706f2543Smrg * Do any engine-specific appliation-activation processing 1086706f2543Smrg */ 1087706f2543Smrg 1088706f2543Smrgstatic Bool 1089706f2543SmrgwinActivateAppShadowDD (ScreenPtr pScreen) 1090706f2543Smrg{ 1091706f2543Smrg winScreenPriv(pScreen); 1092706f2543Smrg 1093706f2543Smrg /* 1094706f2543Smrg * Do we have a surface? 1095706f2543Smrg * Are we active? 1096706f2543Smrg * Are we fullscreen? 1097706f2543Smrg */ 1098706f2543Smrg if (pScreenPriv != NULL 1099706f2543Smrg && pScreenPriv->pddsPrimary != NULL 1100706f2543Smrg && pScreenPriv->fActive) 1101706f2543Smrg { 1102706f2543Smrg /* Primary surface was lost, restore it */ 1103706f2543Smrg IDirectDrawSurface2_Restore (pScreenPriv->pddsPrimary); 1104706f2543Smrg } 1105706f2543Smrg 1106706f2543Smrg return TRUE; 1107706f2543Smrg} 1108706f2543Smrg 1109706f2543Smrg 1110706f2543Smrg/* 1111706f2543Smrg * Reblit the shadow framebuffer to the screen. 1112706f2543Smrg */ 1113706f2543Smrg 1114706f2543Smrgstatic Bool 1115706f2543SmrgwinRedrawScreenShadowDD (ScreenPtr pScreen) 1116706f2543Smrg{ 1117706f2543Smrg winScreenPriv(pScreen); 1118706f2543Smrg winScreenInfo *pScreenInfo = pScreenPriv->pScreenInfo; 1119706f2543Smrg HRESULT ddrval = DD_OK; 1120706f2543Smrg RECT rcSrc, rcDest; 1121706f2543Smrg POINT ptOrigin; 1122706f2543Smrg 1123706f2543Smrg /* Get the origin of the window in the screen coords */ 1124706f2543Smrg ptOrigin.x = pScreenInfo->dwXOffset; 1125706f2543Smrg ptOrigin.y = pScreenInfo->dwYOffset; 1126706f2543Smrg MapWindowPoints (pScreenPriv->hwndScreen, 1127706f2543Smrg HWND_DESKTOP, 1128706f2543Smrg (LPPOINT)&ptOrigin, 1); 1129706f2543Smrg rcDest.left = ptOrigin.x; 1130706f2543Smrg rcDest.right = ptOrigin.x + pScreenInfo->dwWidth; 1131706f2543Smrg rcDest.top = ptOrigin.y; 1132706f2543Smrg rcDest.bottom = ptOrigin.y + pScreenInfo->dwHeight; 1133706f2543Smrg 1134706f2543Smrg /* Source can be entire shadow surface, as Blt should clip for us */ 1135706f2543Smrg rcSrc.left = 0; 1136706f2543Smrg rcSrc.top = 0; 1137706f2543Smrg rcSrc.right = pScreenInfo->dwWidth; 1138706f2543Smrg rcSrc.bottom = pScreenInfo->dwHeight; 1139706f2543Smrg 1140706f2543Smrg /* Redraw the whole window, to take account for the new colors */ 1141706f2543Smrg ddrval = IDirectDrawSurface2_Blt (pScreenPriv->pddsPrimary, 1142706f2543Smrg &rcDest, 1143706f2543Smrg pScreenPriv->pddsShadow, 1144706f2543Smrg &rcSrc, 1145706f2543Smrg DDBLT_WAIT, 1146706f2543Smrg NULL); 1147706f2543Smrg if (FAILED (ddrval)) 1148706f2543Smrg { 1149706f2543Smrg ErrorF ("winRedrawScreenShadowDD - IDirectDrawSurface_Blt () " 1150706f2543Smrg "failed: %08x\n", 1151706f2543Smrg (unsigned int) ddrval); 1152706f2543Smrg } 1153706f2543Smrg 1154706f2543Smrg return TRUE; 1155706f2543Smrg} 1156706f2543Smrg 1157706f2543Smrg 1158706f2543Smrg/* 1159706f2543Smrg * Realize the currently installed colormap 1160706f2543Smrg */ 1161706f2543Smrg 1162706f2543Smrgstatic Bool 1163706f2543SmrgwinRealizeInstalledPaletteShadowDD (ScreenPtr pScreen) 1164706f2543Smrg{ 1165706f2543Smrg return TRUE; 1166706f2543Smrg} 1167706f2543Smrg 1168706f2543Smrg 1169706f2543Smrg/* 1170706f2543Smrg * Install the specified colormap 1171706f2543Smrg */ 1172706f2543Smrg 1173706f2543Smrgstatic Bool 1174706f2543SmrgwinInstallColormapShadowDD (ColormapPtr pColormap) 1175706f2543Smrg{ 1176706f2543Smrg ScreenPtr pScreen = pColormap->pScreen; 1177706f2543Smrg winScreenPriv(pScreen); 1178706f2543Smrg winCmapPriv(pColormap); 1179706f2543Smrg HRESULT ddrval = DD_OK; 1180706f2543Smrg 1181706f2543Smrg /* Install the DirectDraw palette on the primary surface */ 1182706f2543Smrg ddrval = IDirectDrawSurface2_SetPalette (pScreenPriv->pddsPrimary, 1183706f2543Smrg pCmapPriv->lpDDPalette); 1184706f2543Smrg if (FAILED (ddrval)) 1185706f2543Smrg { 1186706f2543Smrg ErrorF ("winInstallColormapShadowDD - Failed installing the " 1187706f2543Smrg "DirectDraw palette.\n"); 1188706f2543Smrg return FALSE; 1189706f2543Smrg } 1190706f2543Smrg 1191706f2543Smrg /* Save a pointer to the newly installed colormap */ 1192706f2543Smrg pScreenPriv->pcmapInstalled = pColormap; 1193706f2543Smrg 1194706f2543Smrg return TRUE; 1195706f2543Smrg} 1196706f2543Smrg 1197706f2543Smrg 1198706f2543Smrg/* 1199706f2543Smrg * Store the specified colors in the specified colormap 1200706f2543Smrg */ 1201706f2543Smrg 1202706f2543Smrgstatic Bool 1203706f2543SmrgwinStoreColorsShadowDD (ColormapPtr pColormap, 1204706f2543Smrg int ndef, 1205706f2543Smrg xColorItem *pdefs) 1206706f2543Smrg{ 1207706f2543Smrg ScreenPtr pScreen = pColormap->pScreen; 1208706f2543Smrg winScreenPriv(pScreen); 1209706f2543Smrg winCmapPriv(pColormap); 1210706f2543Smrg ColormapPtr curpmap = pScreenPriv->pcmapInstalled; 1211706f2543Smrg HRESULT ddrval = DD_OK; 1212706f2543Smrg 1213706f2543Smrg /* Put the X colormap entries into the Windows logical palette */ 1214706f2543Smrg ddrval = IDirectDrawPalette_SetEntries (pCmapPriv->lpDDPalette, 1215706f2543Smrg 0, 1216706f2543Smrg pdefs[0].pixel, 1217706f2543Smrg ndef, 1218706f2543Smrg pCmapPriv->peColors 1219706f2543Smrg + pdefs[0].pixel); 1220706f2543Smrg if (FAILED (ddrval)) 1221706f2543Smrg { 1222706f2543Smrg ErrorF ("winStoreColorsShadowDD - SetEntries () failed\n"); 1223706f2543Smrg return FALSE; 1224706f2543Smrg } 1225706f2543Smrg 1226706f2543Smrg /* Don't install the DirectDraw palette if the colormap is not installed */ 1227706f2543Smrg if (pColormap != curpmap) 1228706f2543Smrg { 1229706f2543Smrg return TRUE; 1230706f2543Smrg } 1231706f2543Smrg 1232706f2543Smrg if (!winInstallColormapShadowDD (pColormap)) 1233706f2543Smrg { 1234706f2543Smrg ErrorF ("winStoreColorsShadowDD - Failed installing colormap\n"); 1235706f2543Smrg return FALSE; 1236706f2543Smrg } 1237706f2543Smrg 1238706f2543Smrg return TRUE; 1239706f2543Smrg} 1240706f2543Smrg 1241706f2543Smrg 1242706f2543Smrg/* 1243706f2543Smrg * Colormap initialization procedure 1244706f2543Smrg */ 1245706f2543Smrg 1246706f2543Smrgstatic Bool 1247706f2543SmrgwinCreateColormapShadowDD (ColormapPtr pColormap) 1248706f2543Smrg{ 1249706f2543Smrg HRESULT ddrval = DD_OK; 1250706f2543Smrg ScreenPtr pScreen = pColormap->pScreen; 1251706f2543Smrg winScreenPriv(pScreen); 1252706f2543Smrg winCmapPriv(pColormap); 1253706f2543Smrg 1254706f2543Smrg /* Create a DirectDraw palette */ 1255706f2543Smrg ddrval = IDirectDraw2_CreatePalette (pScreenPriv->pdd, 1256706f2543Smrg DDPCAPS_8BIT | DDPCAPS_ALLOW256, 1257706f2543Smrg pCmapPriv->peColors, 1258706f2543Smrg &pCmapPriv->lpDDPalette, 1259706f2543Smrg NULL); 1260706f2543Smrg if (FAILED (ddrval)) 1261706f2543Smrg { 1262706f2543Smrg ErrorF ("winCreateColormapShadowDD - CreatePalette failed\n"); 1263706f2543Smrg return FALSE; 1264706f2543Smrg } 1265706f2543Smrg 1266706f2543Smrg return TRUE; 1267706f2543Smrg} 1268706f2543Smrg 1269706f2543Smrg 1270706f2543Smrg/* 1271706f2543Smrg * Colormap destruction procedure 1272706f2543Smrg */ 1273706f2543Smrg 1274706f2543Smrgstatic Bool 1275706f2543SmrgwinDestroyColormapShadowDD (ColormapPtr pColormap) 1276706f2543Smrg{ 1277706f2543Smrg winScreenPriv(pColormap->pScreen); 1278706f2543Smrg winCmapPriv(pColormap); 1279706f2543Smrg HRESULT ddrval = DD_OK; 1280706f2543Smrg 1281706f2543Smrg /* 1282706f2543Smrg * Is colormap to be destroyed the default? 1283706f2543Smrg * 1284706f2543Smrg * Non-default colormaps should have had winUninstallColormap 1285706f2543Smrg * called on them before we get here. The default colormap 1286706f2543Smrg * will not have had winUninstallColormap called on it. Thus, 1287706f2543Smrg * we need to handle the default colormap in a special way. 1288706f2543Smrg */ 1289706f2543Smrg if (pColormap->flags & IsDefault) 1290706f2543Smrg { 1291706f2543Smrg#if CYGDEBUG 1292706f2543Smrg winDebug ("winDestroyColormapShadowDD - Destroying default " 1293706f2543Smrg "colormap\n"); 1294706f2543Smrg#endif 1295706f2543Smrg 1296706f2543Smrg /* 1297706f2543Smrg * FIXME: Walk the list of all screens, popping the default 1298706f2543Smrg * palette out of each screen device context. 1299706f2543Smrg */ 1300706f2543Smrg 1301706f2543Smrg /* Pop the palette out of the primary surface */ 1302706f2543Smrg ddrval = IDirectDrawSurface2_SetPalette (pScreenPriv->pddsPrimary, 1303706f2543Smrg NULL); 1304706f2543Smrg if (FAILED (ddrval)) 1305706f2543Smrg { 1306706f2543Smrg ErrorF ("winDestroyColormapShadowDD - Failed freeing the " 1307706f2543Smrg "default colormap DirectDraw palette.\n"); 1308706f2543Smrg return FALSE; 1309706f2543Smrg } 1310706f2543Smrg 1311706f2543Smrg /* Clear our private installed colormap pointer */ 1312706f2543Smrg pScreenPriv->pcmapInstalled = NULL; 1313706f2543Smrg } 1314706f2543Smrg 1315706f2543Smrg /* Release the palette */ 1316706f2543Smrg IDirectDrawPalette_Release (pCmapPriv->lpDDPalette); 1317706f2543Smrg 1318706f2543Smrg /* Invalidate the colormap privates */ 1319706f2543Smrg pCmapPriv->lpDDPalette = NULL; 1320706f2543Smrg 1321706f2543Smrg return TRUE; 1322706f2543Smrg} 1323706f2543Smrg 1324706f2543Smrg 1325706f2543Smrg/* 1326706f2543Smrg * Set engine specific functions 1327706f2543Smrg */ 1328706f2543Smrg 1329706f2543SmrgBool 1330706f2543SmrgwinSetEngineFunctionsShadowDD (ScreenPtr pScreen) 1331706f2543Smrg{ 1332706f2543Smrg winScreenPriv(pScreen); 1333706f2543Smrg winScreenInfo *pScreenInfo = pScreenPriv->pScreenInfo; 1334706f2543Smrg 1335706f2543Smrg /* Set our pointers */ 1336706f2543Smrg pScreenPriv->pwinAllocateFB = winAllocateFBShadowDD; 1337706f2543Smrg pScreenPriv->pwinFreeFB = winFreeFBShadowDD; 1338706f2543Smrg pScreenPriv->pwinShadowUpdate = winShadowUpdateDD; 1339706f2543Smrg pScreenPriv->pwinInitScreen = winInitScreenShadowDD; 1340706f2543Smrg pScreenPriv->pwinCloseScreen = winCloseScreenShadowDD; 1341706f2543Smrg pScreenPriv->pwinInitVisuals = winInitVisualsShadowDD; 1342706f2543Smrg pScreenPriv->pwinAdjustVideoMode = winAdjustVideoModeShadowDD; 1343706f2543Smrg if (pScreenInfo->fFullScreen) 1344706f2543Smrg pScreenPriv->pwinCreateBoundingWindow = winCreateBoundingWindowFullScreen; 1345706f2543Smrg else 1346706f2543Smrg pScreenPriv->pwinCreateBoundingWindow = winCreateBoundingWindowWindowed; 1347706f2543Smrg pScreenPriv->pwinFinishScreenInit = winFinishScreenInitFB; 1348706f2543Smrg pScreenPriv->pwinBltExposedRegions = winBltExposedRegionsShadowDD; 1349706f2543Smrg pScreenPriv->pwinActivateApp = winActivateAppShadowDD; 1350706f2543Smrg pScreenPriv->pwinRedrawScreen = winRedrawScreenShadowDD; 1351706f2543Smrg pScreenPriv->pwinRealizeInstalledPalette 1352706f2543Smrg = winRealizeInstalledPaletteShadowDD; 1353706f2543Smrg pScreenPriv->pwinInstallColormap = winInstallColormapShadowDD; 1354706f2543Smrg pScreenPriv->pwinStoreColors = winStoreColorsShadowDD; 1355706f2543Smrg pScreenPriv->pwinCreateColormap = winCreateColormapShadowDD; 1356706f2543Smrg pScreenPriv->pwinDestroyColormap = winDestroyColormapShadowDD; 1357706f2543Smrg pScreenPriv->pwinHotKeyAltTab = (winHotKeyAltTabProcPtr) (void (*)(void))NoopDDA; 1358706f2543Smrg pScreenPriv->pwinCreatePrimarySurface = winCreatePrimarySurfaceShadowDD; 1359706f2543Smrg pScreenPriv->pwinReleasePrimarySurface = winReleasePrimarySurfaceShadowDD; 1360706f2543Smrg#ifdef XWIN_MULTIWINDOW 1361706f2543Smrg pScreenPriv->pwinFinishCreateWindowsWindow = 1362706f2543Smrg (winFinishCreateWindowsWindowProcPtr) (void (*)(void))NoopDDA; 1363706f2543Smrg#endif 1364706f2543Smrg 1365706f2543Smrg return TRUE; 1366706f2543Smrg} 1367