795 lines
		
	
	
		
			23 KiB
		
	
	
	
		
			C
		
	
	
	
			
		
		
	
	
			795 lines
		
	
	
		
			23 KiB
		
	
	
	
		
			C
		
	
	
	
| /*
 | |
|  *Copyright (C) 1994-2000 The XFree86 Project, Inc. All Rights Reserved.
 | |
|  *
 | |
|  *Permission is hereby granted, free of charge, to any person obtaining
 | |
|  * a copy of this software and associated documentation files (the
 | |
|  *"Software"), to deal in the Software without restriction, including
 | |
|  *without limitation the rights to use, copy, modify, merge, publish,
 | |
|  *distribute, sublicense, and/or sell copies of the Software, and to
 | |
|  *permit persons to whom the Software is furnished to do so, subject to
 | |
|  *the following conditions:
 | |
|  *
 | |
|  *The above copyright notice and this permission notice shall be
 | |
|  *included in all copies or substantial portions of the Software.
 | |
|  *
 | |
|  *THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
 | |
|  *EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
 | |
|  *MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
 | |
|  *NONINFRINGEMENT. IN NO EVENT SHALL THE XFREE86 PROJECT BE LIABLE FOR
 | |
|  *ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
 | |
|  *CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
 | |
|  *WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 | |
|  *
 | |
|  *Except as contained in this notice, the name of the XFree86 Project
 | |
|  *shall not be used in advertising or otherwise to promote the sale, use
 | |
|  *or other dealings in this Software without prior written authorization
 | |
|  *from the XFree86 Project.
 | |
|  *
 | |
|  * Authors:	Dakshinamurthy Karra
 | |
|  *		Suhaib M Siddiqi
 | |
|  *		Peter Busch
 | |
|  *		Harold L Hunt II
 | |
|  *		Kensuke Matsuzaki
 | |
|  */
 | |
| /* $XFree86: xc/programs/Xserver/hw/xwin/winscrinit.c,v 1.27 2003/07/29 21:25:18 dawes Exp $ */
 | |
| 
 | |
| #ifdef HAVE_XWIN_CONFIG_H
 | |
| #include <xwin-config.h>
 | |
| #endif
 | |
| #include "win.h"
 | |
| #include "winmsg.h"
 | |
| #include "safeAlpha.h"	
 | |
| 
 | |
| 
 | |
| #ifdef XWIN_MULTIWINDOWEXTWM
 | |
| static RootlessFrameProcsRec
 | |
| winMWExtWMProcs = {	
 | |
|   winMWExtWMCreateFrame,
 | |
|   winMWExtWMDestroyFrame,
 | |
|   
 | |
|   winMWExtWMMoveFrame,
 | |
|   winMWExtWMResizeFrame,
 | |
|   winMWExtWMRestackFrame,
 | |
|   winMWExtWMReshapeFrame,
 | |
|   winMWExtWMUnmapFrame,
 | |
|   
 | |
|   winMWExtWMStartDrawing,
 | |
|   winMWExtWMStopDrawing,
 | |
|   winMWExtWMUpdateRegion,
 | |
| #ifndef ROOTLESS_TRACK_DAMAGE
 | |
|   winMWExtWMDamageRects,
 | |
| #endif
 | |
|   winMWExtWMRootlessSwitchWindow,
 | |
|   NULL,//winWMExtWMDoReorderWindow,
 | |
|   
 | |
|   NULL,//winMWExtWMCopyBytes,
 | |
|   NULL,//winMWExtWMFillBytes,
 | |
|   NULL,//winMWExtWMCompositePixels,
 | |
|   winMWExtWMCopyWindow
 | |
| };
 | |
| #endif
 | |
| 
 | |
| 
 | |
| /*
 | |
|  * References to external symbols
 | |
|  */
 | |
| 
 | |
| extern winScreenInfo		g_ScreenInfo[];
 | |
| extern miPointerScreenFuncRec	g_winPointerCursorFuncs;
 | |
| extern int			g_iScreenPrivateIndex;
 | |
| extern Bool                     g_fSoftwareCursor;
 | |
| 
 | |
| 
 | |
| /*
 | |
|  * Prototypes
 | |
|  */
 | |
| 
 | |
| Bool
 | |
| winRandRInit (ScreenPtr pScreen);
 | |
| 
 | |
| 
 | |
| /*
 | |
|  * Local functions
 | |
|  */
 | |
| 
 | |
| static Bool
 | |
| winSaveScreen (ScreenPtr pScreen, int on);
 | |
| 
 | |
| 
 | |
| /*
 | |
|  * Determine what type of screen we are initializing
 | |
|  * and call the appropriate procedure to intiailize
 | |
|  * that type of screen.
 | |
|  */
 | |
| 
 | |
| Bool
 | |
| winScreenInit (int index,
 | |
| 	       ScreenPtr pScreen,
 | |
| 	       int argc, char **argv)
 | |
| {
 | |
|   winScreenInfoPtr      pScreenInfo = &g_ScreenInfo[index];
 | |
|   winPrivScreenPtr	pScreenPriv;
 | |
|   HDC			hdc;
 | |
| 
 | |
| #if CYGDEBUG || YES
 | |
|   winDebug ("winScreenInit - dwWidth: %ld dwHeight: %ld\n",
 | |
| 	  pScreenInfo->dwWidth, pScreenInfo->dwHeight);
 | |
| #endif
 | |
| 
 | |
|   /* Allocate privates for this screen */
 | |
|   if (!winAllocatePrivates (pScreen))
 | |
|     {
 | |
|       ErrorF ("winScreenInit - Couldn't allocate screen privates\n");
 | |
|       return FALSE;
 | |
|     }
 | |
| 
 | |
|   /* Get a pointer to the privates structure that was allocated */
 | |
|   pScreenPriv = winGetScreenPriv (pScreen);
 | |
| 
 | |
|   /* Save a pointer to this screen in the screen info structure */
 | |
|   pScreenInfo->pScreen = pScreen;
 | |
| 
 | |
|   /* Save a pointer to the screen info in the screen privates structure */
 | |
|   /* This allows us to get back to the screen info from a screen pointer */
 | |
|   pScreenPriv->pScreenInfo = pScreenInfo;
 | |
| 
 | |
|   /*
 | |
|    * Determine which engine to use.
 | |
|    *
 | |
|    * NOTE: This is done once per screen because each screen possibly has
 | |
|    * a preferred engine specified on the command line.
 | |
|    */
 | |
|   if (!winSetEngine (pScreen))
 | |
|     {
 | |
|       ErrorF ("winScreenInit - winSetEngine () failed\n");
 | |
|       return FALSE;
 | |
|     }
 | |
| 
 | |
|   /* Adjust the video mode for our engine type */
 | |
|   if (!(*pScreenPriv->pwinAdjustVideoMode) (pScreen))
 | |
|     {
 | |
|       ErrorF ("winScreenInit - winAdjustVideoMode () failed\n");
 | |
|       return FALSE;
 | |
|     }
 | |
| 
 | |
|   /* Check for supported display depth */
 | |
|   if (!(WIN_SUPPORTED_BPPS & (1 << (pScreenInfo->dwBPP - 1))))
 | |
|     {
 | |
|       ErrorF ("winScreenInit - Unsupported display depth: %d\n" \
 | |
| 	      "Change your Windows display depth to 15, 16, 24, or 32 bits "
 | |
| 	      "per pixel.\n",
 | |
| 	      (int) pScreenInfo->dwBPP);
 | |
|       ErrorF ("winScreenInit - Supported depths: %08x\n",
 | |
| 	      WIN_SUPPORTED_BPPS);
 | |
| #if WIN_CHECK_DEPTH
 | |
|       return FALSE;
 | |
| #endif
 | |
|     }
 | |
| 
 | |
|   /*
 | |
|    * Check that all monitors have the same display depth if we are using
 | |
|    * multiple monitors
 | |
|    */
 | |
|   if (pScreenInfo->fMultipleMonitors 
 | |
|       && !GetSystemMetrics (SM_SAMEDISPLAYFORMAT))
 | |
|     {
 | |
|       ErrorF ("winScreenInit - Monitors do not all have same pixel format / "
 | |
| 	      "display depth.\n"
 | |
| 	      "Using primary display only.\n");
 | |
|       pScreenInfo->fMultipleMonitors = FALSE;
 | |
|     }
 | |
| 
 | |
|   /* Create display window */
 | |
|   if (!(*pScreenPriv->pwinCreateBoundingWindow) (pScreen))
 | |
|     {
 | |
|       ErrorF ("winScreenInit - pwinCreateBoundingWindow () "
 | |
| 	      "failed\n");
 | |
|       return FALSE;
 | |
|     }
 | |
| 
 | |
|   /* Get a device context */
 | |
|   hdc = GetDC (pScreenPriv->hwndScreen);
 | |
| 
 | |
|   /* Store the initial height, width, and depth of the display */
 | |
|   /* Are we using multiple monitors? */
 | |
|   if (pScreenInfo->fMultipleMonitors)
 | |
|     {
 | |
|       pScreenPriv->dwLastWindowsWidth = GetSystemMetrics (SM_CXVIRTUALSCREEN);
 | |
|       pScreenPriv->dwLastWindowsHeight = GetSystemMetrics (SM_CYVIRTUALSCREEN);
 | |
| 
 | |
|       /* 
 | |
|        * In this case, some of the defaults set in
 | |
|        * winInitializeDefaultScreens () are not correct ...
 | |
|        */
 | |
|       if (!pScreenInfo->fUserGaveHeightAndWidth)
 | |
| 	{
 | |
| 	  pScreenInfo->dwWidth = GetSystemMetrics (SM_CXVIRTUALSCREEN);
 | |
| 	  pScreenInfo->dwHeight = GetSystemMetrics (SM_CYVIRTUALSCREEN);
 | |
| 	  pScreenInfo->dwWidth_mm = (pScreenInfo->dwWidth /
 | |
| 				     WIN_DEFAULT_DPI) * 25.4;
 | |
| 	  pScreenInfo->dwHeight_mm = (pScreenInfo->dwHeight /
 | |
| 				      WIN_DEFAULT_DPI) * 25.4;
 | |
| 	}
 | |
|     }
 | |
|   else
 | |
|     {
 | |
|       pScreenPriv->dwLastWindowsWidth = GetSystemMetrics (SM_CXSCREEN);
 | |
|       pScreenPriv->dwLastWindowsHeight = GetSystemMetrics (SM_CYSCREEN);
 | |
|     }
 | |
| 
 | |
|   /* Save the original bits per pixel */
 | |
|   pScreenPriv->dwLastWindowsBitsPixel = GetDeviceCaps (hdc, BITSPIXEL);
 | |
| 
 | |
|   /* Release the device context */
 | |
|   ReleaseDC (pScreenPriv->hwndScreen, hdc);
 | |
|     
 | |
|   /* Clear the visuals list */
 | |
|   miClearVisualTypes ();
 | |
|   
 | |
|   /* Set the padded screen width */
 | |
|   pScreenInfo->dwPaddedWidth = PixmapBytePad (pScreenInfo->dwWidth,
 | |
| 					      pScreenInfo->dwBPP);
 | |
| 
 | |
|   /* Call the engine dependent screen initialization procedure */
 | |
|   if (!((*pScreenPriv->pwinFinishScreenInit) (index, pScreen, argc, argv)))
 | |
|     {
 | |
|       ErrorF ("winScreenInit - winFinishScreenInit () failed\n");
 | |
|       return FALSE;
 | |
|     }
 | |
| 
 | |
|   if (!g_fSoftwareCursor)
 | |
|     winInitCursor(pScreen);
 | |
|   else
 | |
|     winErrorFVerb(2, "winScreenInit - Using software cursor\n");  
 | |
| 
 | |
| #if CYGDEBUG || YES
 | |
|   winDebug ("winScreenInit - returning\n");
 | |
| #endif
 | |
| 
 | |
|   return TRUE;
 | |
| }
 | |
| 
 | |
| 
 | |
| /* See Porting Layer Definition - p. 20 */
 | |
| Bool
 | |
| winFinishScreenInitFB (int index,
 | |
| 		       ScreenPtr pScreen,
 | |
| 		       int argc, char **argv)
 | |
| {
 | |
|   winScreenPriv(pScreen);
 | |
|   winScreenInfo		*pScreenInfo = pScreenPriv->pScreenInfo;
 | |
|   VisualPtr		pVisual = NULL;
 | |
|   char			*pbits = NULL;
 | |
| #if defined(XWIN_CLIPBOARD) || defined(XWIN_MULTIWINDOW)
 | |
|   int			iReturn;
 | |
| #endif
 | |
| 
 | |
|   /* Create framebuffer */
 | |
|   if (!(*pScreenPriv->pwinAllocateFB) (pScreen))
 | |
|     {
 | |
|       ErrorF ("winFinishScreenInitFB - Could not allocate framebuffer\n");
 | |
|       return FALSE;
 | |
|     }
 | |
| 
 | |
|   /*
 | |
|    * Grab the number of bits that are used to represent color in each pixel.
 | |
|    */
 | |
|   if (pScreenInfo->dwBPP == 8)
 | |
|     pScreenInfo->dwDepth = 8;
 | |
|   else
 | |
|     pScreenInfo->dwDepth = winCountBits (pScreenPriv->dwRedMask)
 | |
|       + winCountBits (pScreenPriv->dwGreenMask)
 | |
|       + winCountBits (pScreenPriv->dwBlueMask);
 | |
|   
 | |
|   winErrorFVerb (2, "winFinishScreenInitFB - Masks: %08x %08x %08x\n",
 | |
| 	  (unsigned int) pScreenPriv->dwRedMask,
 | |
| 	  (unsigned int) pScreenPriv->dwGreenMask,
 | |
| 	  (unsigned int) pScreenPriv->dwBlueMask);
 | |
| 
 | |
|   /* Init visuals */
 | |
|   if (!(*pScreenPriv->pwinInitVisuals) (pScreen))
 | |
|     {
 | |
|       ErrorF ("winFinishScreenInitFB - winInitVisuals failed\n");
 | |
|       return FALSE;
 | |
|     }
 | |
| 
 | |
|   /* Setup a local variable to point to the framebuffer */
 | |
|   pbits = pScreenInfo->pfb;
 | |
|   
 | |
|   /* Apparently we need this for the render extension */
 | |
|   miSetPixmapDepths ();
 | |
| 
 | |
|   /* Start fb initialization */
 | |
|   if (!fbSetupScreen (pScreen,
 | |
| 		      pScreenInfo->pfb,
 | |
| 		      pScreenInfo->dwWidth, pScreenInfo->dwHeight,
 | |
| 		      monitorResolution, monitorResolution,
 | |
| 		      pScreenInfo->dwStride,
 | |
| 		      pScreenInfo->dwBPP))
 | |
|     {
 | |
|       ErrorF ("winFinishScreenInitFB - fbSetupScreen failed\n");
 | |
|       return FALSE;
 | |
|     }
 | |
| 
 | |
|   /* Override default colormap routines if visual class is dynamic */
 | |
|   if (pScreenInfo->dwDepth == 8
 | |
|       && (pScreenInfo->dwEngine == WIN_SERVER_SHADOW_GDI
 | |
| 	  || (pScreenInfo->dwEngine == WIN_SERVER_SHADOW_DDNL
 | |
| 	      && pScreenInfo->fFullScreen)
 | |
| 	  || (pScreenInfo->dwEngine == WIN_SERVER_SHADOW_DD
 | |
| 	      && pScreenInfo->fFullScreen)))
 | |
|     {
 | |
|       winSetColormapFunctions (pScreen);
 | |
| 
 | |
|       /*
 | |
|        * NOTE: Setting whitePixel to 255 causes Magic 7.1 to allocate its
 | |
|        * own colormap, as it cannot allocate 7 planes in the default
 | |
|        * colormap.  Setting whitePixel to 1 allows Magic to get 7
 | |
|        * planes in the default colormap, so it doesn't create its
 | |
|        * own colormap.  This latter situation is highly desireable,
 | |
|        * as it keeps the Magic window viewable when switching to
 | |
|        * other X clients that use the default colormap.
 | |
|        */
 | |
|       pScreen->blackPixel = 0;
 | |
|       pScreen->whitePixel = 1;
 | |
|     }
 | |
| 
 | |
|   /* Place our save screen function */
 | |
|   pScreen->SaveScreen = winSaveScreen;
 | |
| 
 | |
|   /* Backing store functions */
 | |
|   /*
 | |
|    * FIXME: Backing store support still doesn't seem to be working.
 | |
|    */
 | |
|   pScreen->BackingStoreFuncs.SaveAreas = fbSaveAreas;
 | |
|   pScreen->BackingStoreFuncs.RestoreAreas = fbRestoreAreas;
 | |
| 
 | |
|   /* Finish fb initialization */
 | |
|   if (!fbFinishScreenInit (pScreen,
 | |
| 			   pScreenInfo->pfb,
 | |
| 			   pScreenInfo->dwWidth, pScreenInfo->dwHeight,
 | |
| 			   monitorResolution, monitorResolution,
 | |
| 			   pScreenInfo->dwStride,
 | |
| 			   pScreenInfo->dwBPP))
 | |
|     {
 | |
|       ErrorF ("winFinishScreenInitFB - fbFinishScreenInit failed\n");
 | |
|       return FALSE;
 | |
|     }
 | |
| 
 | |
|   /* Save a pointer to the root visual */
 | |
|   for (pVisual = pScreen->visuals;
 | |
|        pVisual->vid != pScreen->rootVisual;
 | |
|        pVisual++);
 | |
|   pScreenPriv->pRootVisual = pVisual;
 | |
| 
 | |
|   /* 
 | |
|    * Setup points to the block and wakeup handlers.  Pass a pointer
 | |
|    * to the current screen as pWakeupdata.
 | |
|    */
 | |
|   pScreen->BlockHandler = winBlockHandler;
 | |
|   pScreen->WakeupHandler = winWakeupHandler;
 | |
|   pScreen->blockData = pScreen;
 | |
|   pScreen->wakeupData = pScreen;
 | |
| 
 | |
| #ifdef XWIN_MULTIWINDOWEXTWM
 | |
|   /*
 | |
|    * Setup acceleration for multi-window external window manager mode.
 | |
|    * To be compatible with the Damage extension, this must be done
 | |
|    * before calling miDCInitialize, which calls DamageSetup.
 | |
|    */
 | |
|   if (pScreenInfo->fMWExtWM)
 | |
|     {
 | |
|       if (!RootlessAccelInit (pScreen))
 | |
|         {
 | |
|           ErrorF ("winFinishScreenInitFB - RootlessAccelInit () failed\n");
 | |
|           return FALSE;
 | |
|         }
 | |
|     }
 | |
| #endif
 | |
| 
 | |
| #ifdef RENDER
 | |
|   /* Render extension initialization, calls miPictureInit */
 | |
|   if (!fbPictureInit (pScreen, NULL, 0))
 | |
|     {
 | |
|       ErrorF ("winFinishScreenInitFB - fbPictureInit () failed\n");
 | |
|       return FALSE;
 | |
|     }
 | |
| #endif
 | |
| 
 | |
| #ifdef RANDR
 | |
|   /* Initialize resize and rotate support */
 | |
|   if (!winRandRInit (pScreen))
 | |
|     {
 | |
|       ErrorF ("winFinishScreenInitFB - winRandRInit () failed\n");
 | |
|       return FALSE;
 | |
|     }
 | |
| #endif
 | |
| 
 | |
|   /*
 | |
|    * Backing store support should reduce network traffic and increase
 | |
|    * performance.
 | |
|    */
 | |
|   miInitializeBackingStore (pScreen);
 | |
| 
 | |
|   /* KDrive does miDCInitialize right after miInitializeBackingStore */
 | |
|   /* Setup the cursor routines */
 | |
| #if CYGDEBUG
 | |
|   winDebug ("winFinishScreenInitFB - Calling miDCInitialize ()\n");
 | |
| #endif
 | |
|   miDCInitialize (pScreen, &g_winPointerCursorFuncs);
 | |
| 
 | |
|   /* KDrive does winCreateDefColormap right after miDCInitialize */
 | |
|   /* Create a default colormap */
 | |
| #if CYGDEBUG
 | |
|   winDebug ("winFinishScreenInitFB - Calling winCreateDefColormap ()\n");
 | |
| #endif
 | |
|   if (!winCreateDefColormap (pScreen))
 | |
|     {
 | |
|       ErrorF ("winFinishScreenInitFB - Could not create colormap\n");
 | |
|       return FALSE;
 | |
|     }
 | |
| 
 | |
|   /* Initialize the shadow framebuffer layer */
 | |
|   if ((pScreenInfo->dwEngine == WIN_SERVER_SHADOW_GDI
 | |
|        || pScreenInfo->dwEngine == WIN_SERVER_SHADOW_DD
 | |
|        || pScreenInfo->dwEngine == WIN_SERVER_SHADOW_DDNL)
 | |
| #ifdef XWIN_MULTIWINDOWEXTWM
 | |
|       && !pScreenInfo->fMWExtWM
 | |
| #endif
 | |
|       )
 | |
|     {
 | |
| #if CYGDEBUG
 | |
|       winDebug ("winFinishScreenInitFB - Calling shadowInit ()\n");
 | |
| #endif
 | |
|       if (!shadowInit (pScreen,
 | |
| 		       pScreenPriv->pwinShadowUpdate,
 | |
| 		       NULL))
 | |
| 	{
 | |
| 	  ErrorF ("winFinishScreenInitFB - shadowInit () failed\n");
 | |
| 	  return FALSE;
 | |
| 	}
 | |
|     }
 | |
| 
 | |
| #ifdef XWIN_MULTIWINDOWEXTWM
 | |
|   /* Handle multi-window external window manager mode */
 | |
|   if (pScreenInfo->fMWExtWM)
 | |
|     {
 | |
|       winDebug ("winScreenInit - MultiWindowExtWM - Calling RootlessInit\n");
 | |
|       
 | |
|       RootlessInit(pScreen, &winMWExtWMProcs);
 | |
|       
 | |
|       winDebug ("winScreenInit - MultiWindowExtWM - RootlessInit returned\n");
 | |
|       
 | |
|       rootless_CopyBytes_threshold = 0;
 | |
|       rootless_FillBytes_threshold = 0;
 | |
|       rootless_CompositePixels_threshold = 0;
 | |
|       /* FIXME: How many? Profiling needed? */
 | |
|       rootless_CopyWindow_threshold = 1;
 | |
| 
 | |
|       winWindowsWMExtensionInit ();
 | |
|     }
 | |
| #endif
 | |
| 
 | |
|   /* Handle rootless mode */
 | |
|   if (pScreenInfo->fRootless)
 | |
|     {
 | |
|       /* Define the WRAP macro temporarily for local use */
 | |
| #define WRAP(a) \
 | |
|     if (pScreen->a) { \
 | |
|         pScreenPriv->a = pScreen->a; \
 | |
|     } else { \
 | |
|         ErrorF("null screen fn " #a "\n"); \
 | |
|         pScreenPriv->a = NULL; \
 | |
|     }
 | |
| 
 | |
|       /* Save a pointer to each lower-level window procedure */
 | |
|       WRAP(CreateWindow);
 | |
|       WRAP(DestroyWindow);
 | |
|       WRAP(RealizeWindow);
 | |
|       WRAP(UnrealizeWindow);
 | |
|       WRAP(PositionWindow);
 | |
|       WRAP(ChangeWindowAttributes);
 | |
| #ifdef SHAPE
 | |
|       WRAP(SetShape);
 | |
| #endif
 | |
| 
 | |
|       /* Assign rootless window procedures to be top level procedures */
 | |
|       pScreen->CreateWindow = winCreateWindowRootless;
 | |
|       pScreen->DestroyWindow = winDestroyWindowRootless;
 | |
|       pScreen->PositionWindow = winPositionWindowRootless;
 | |
|       /*pScreen->ChangeWindowAttributes = winChangeWindowAttributesRootless;*/
 | |
|       pScreen->RealizeWindow = winMapWindowRootless;
 | |
|       pScreen->UnrealizeWindow = winUnmapWindowRootless;
 | |
| #ifdef SHAPE
 | |
|       pScreen->SetShape = winSetShapeRootless;
 | |
| #endif
 | |
| 
 | |
|       /* Undefine the WRAP macro, as it is not needed elsewhere */
 | |
| #undef WRAP
 | |
|     }
 | |
| 
 | |
| 
 | |
| #ifdef XWIN_MULTIWINDOW
 | |
|   /* Handle multi window mode */
 | |
|   else if (pScreenInfo->fMultiWindow)
 | |
|     {
 | |
|       /* Define the WRAP macro temporarily for local use */
 | |
| #define WRAP(a) \
 | |
|     if (pScreen->a) { \
 | |
|         pScreenPriv->a = pScreen->a; \
 | |
|     } else { \
 | |
|         ErrorF("null screen fn " #a "\n"); \
 | |
|         pScreenPriv->a = NULL; \
 | |
|     }
 | |
| 
 | |
|       /* Save a pointer to each lower-level window procedure */
 | |
|       WRAP(CreateWindow);
 | |
|       WRAP(DestroyWindow);
 | |
|       WRAP(RealizeWindow);
 | |
|       WRAP(UnrealizeWindow);
 | |
|       WRAP(PositionWindow);
 | |
|       WRAP(ChangeWindowAttributes);
 | |
|       WRAP(ReparentWindow);
 | |
|       WRAP(RestackWindow);
 | |
|       WRAP(ResizeWindow);
 | |
|       WRAP(MoveWindow);
 | |
|       WRAP(CopyWindow);
 | |
| #ifdef SHAPE
 | |
|       WRAP(SetShape);
 | |
| #endif
 | |
| 
 | |
|       /* Assign multi-window window procedures to be top level procedures */
 | |
|       pScreen->CreateWindow = winCreateWindowMultiWindow;
 | |
|       pScreen->DestroyWindow = winDestroyWindowMultiWindow;
 | |
|       pScreen->PositionWindow = winPositionWindowMultiWindow;
 | |
|       /*pScreen->ChangeWindowAttributes = winChangeWindowAttributesMultiWindow;*/
 | |
|       pScreen->RealizeWindow = winMapWindowMultiWindow;
 | |
|       pScreen->UnrealizeWindow = winUnmapWindowMultiWindow;
 | |
|       pScreen->ReparentWindow = winReparentWindowMultiWindow;
 | |
|       pScreen->RestackWindow = winRestackWindowMultiWindow;
 | |
|       pScreen->ResizeWindow = winResizeWindowMultiWindow;
 | |
|       pScreen->MoveWindow = winMoveWindowMultiWindow;
 | |
|       pScreen->CopyWindow = winCopyWindowMultiWindow;
 | |
| #ifdef SHAPE
 | |
|       pScreen->SetShape = winSetShapeMultiWindow;
 | |
| #endif
 | |
| 
 | |
|       /* Undefine the WRAP macro, as it is not needed elsewhere */
 | |
| #undef WRAP
 | |
|     }
 | |
| #endif
 | |
| 
 | |
|   /* Wrap either fb's or shadow's CloseScreen with our CloseScreen */
 | |
|   pScreenPriv->CloseScreen = pScreen->CloseScreen;
 | |
|   pScreen->CloseScreen = pScreenPriv->pwinCloseScreen;
 | |
| 
 | |
| #if defined(XWIN_CLIPBOARD) || defined(XWIN_MULTIWINDOW)
 | |
|   /* Create a mutex for modules in separate threads to wait for */
 | |
|   iReturn = pthread_mutex_init (&pScreenPriv->pmServerStarted, NULL);
 | |
|   if (iReturn != 0)
 | |
|     {
 | |
|       ErrorF ("winFinishScreenInitFB - pthread_mutex_init () failed: %d\n",
 | |
| 	      iReturn);
 | |
|       return FALSE;
 | |
|     }
 | |
| 
 | |
|   /* Own the mutex for modules in separate threads */
 | |
|   iReturn = pthread_mutex_lock (&pScreenPriv->pmServerStarted);
 | |
|   if (iReturn != 0)
 | |
|     {
 | |
|       ErrorF ("winFinishScreenInitFB - pthread_mutex_lock () failed: %d\n",
 | |
| 	      iReturn);
 | |
|       return FALSE;
 | |
|     }
 | |
| 
 | |
|   /* Set the ServerStarted flag to false */
 | |
|   pScreenPriv->fServerStarted = FALSE;
 | |
| #endif
 | |
| 
 | |
| #ifdef XWIN_MULTIWINDOWEXTWM
 | |
|   pScreenPriv->fRestacking = FALSE;
 | |
| #endif
 | |
| 
 | |
| #if defined(XWIN_MULTIWINDOW) || defined(XWIN_MULTIWINDOWEXTWM)
 | |
|   if (FALSE
 | |
| #ifdef XWIN_MULTIWINDOW
 | |
|       || pScreenInfo->fMultiWindow
 | |
| #endif
 | |
| #ifdef XWIN_MULTIWINDOWEXTWM
 | |
|       || pScreenInfo->fInternalWM
 | |
| #endif
 | |
|       )
 | |
|     { 
 | |
| #if CYGDEBUG || YES
 | |
|       winDebug ("winFinishScreenInitFB - Calling winInitWM.\n");
 | |
| #endif
 | |
| 
 | |
|       /* Initialize multi window mode */
 | |
|       if (!winInitWM (&pScreenPriv->pWMInfo,
 | |
| 		      &pScreenPriv->ptWMProc,
 | |
| 		      &pScreenPriv->ptXMsgProc,
 | |
| 		      &pScreenPriv->pmServerStarted,
 | |
| 		      pScreenInfo->dwScreen,
 | |
| 		      (HWND)&pScreenPriv->hwndScreen,
 | |
| #ifdef XWIN_MULTIWINDOWEXTWM
 | |
| 		      pScreenInfo->fInternalWM ||
 | |
| #endif
 | |
| 		      FALSE))
 | |
|         {
 | |
|           ErrorF ("winFinishScreenInitFB - winInitWM () failed.\n");
 | |
|           return FALSE;
 | |
|         }
 | |
|     }      
 | |
| #endif
 | |
| 
 | |
|   /* Tell the server that we are enabled */
 | |
|   pScreenPriv->fEnabled = TRUE;
 | |
| 
 | |
|   /* Tell the server that we have a valid depth */
 | |
|   pScreenPriv->fBadDepth = FALSE;
 | |
| 
 | |
| #if CYGDEBUG || YES
 | |
|   winDebug ("winFinishScreenInitFB - returning\n");
 | |
| #endif
 | |
| 
 | |
|   return TRUE;
 | |
| }
 | |
| 
 | |
| #ifdef XWIN_NATIVEGDI
 | |
| /* See Porting Layer Definition - p. 20 */
 | |
| 
 | |
| Bool
 | |
| winFinishScreenInitNativeGDI (int index,
 | |
| 			      ScreenPtr pScreen,
 | |
| 			      int argc, char **argv)
 | |
| {
 | |
|   winScreenPriv(pScreen);
 | |
|   winScreenInfoPtr      pScreenInfo = &g_ScreenInfo[index];
 | |
|   VisualPtr		pVisuals = NULL;
 | |
|   DepthPtr		pDepths = NULL;
 | |
|   VisualID		rootVisual = 0;
 | |
|   int			nVisuals = 0, nDepths = 0, nRootDepth = 0;
 | |
| 
 | |
|   /* Ignore user input (mouse, keyboard) */
 | |
|   pScreenInfo->fIgnoreInput = FALSE;
 | |
| 
 | |
|   /* Get device contexts for the screen and shadow bitmap */
 | |
|   pScreenPriv->hdcScreen = GetDC (pScreenPriv->hwndScreen);
 | |
|   if (pScreenPriv->hdcScreen == NULL)
 | |
|     FatalError ("winFinishScreenInitNativeGDI - Couldn't get a DC\n");
 | |
| 
 | |
|   /* Init visuals */
 | |
|   if (!(*pScreenPriv->pwinInitVisuals) (pScreen))
 | |
|     {
 | |
|       ErrorF ("winFinishScreenInitNativeGDI - pwinInitVisuals failed\n");
 | |
|       return FALSE;
 | |
|     }
 | |
| 
 | |
|   /* Initialize the mi visuals */
 | |
|   if (!miInitVisuals (&pVisuals, &pDepths, &nVisuals, &nDepths, &nRootDepth,
 | |
| 		      &rootVisual,
 | |
| 		      ((unsigned long)1 << (pScreenInfo->dwDepth - 1)), 8,
 | |
| 		      TrueColor))
 | |
|     {
 | |
|       ErrorF ("winFinishScreenInitNativeGDI - miInitVisuals () failed\n");
 | |
|       return FALSE;
 | |
|     }
 | |
| 
 | |
|   /* Initialize the CloseScreen procedure pointer */
 | |
|   pScreen->CloseScreen = NULL;
 | |
| 
 | |
|   /* Initialize the mi code */
 | |
|   if (!miScreenInit (pScreen,
 | |
| 		     NULL, /* No framebuffer */
 | |
| 		     pScreenInfo->dwWidth, pScreenInfo->dwHeight,
 | |
| 		     monitorResolution, monitorResolution,
 | |
| 		     pScreenInfo->dwStride,
 | |
| 		     nRootDepth, nDepths, pDepths, rootVisual,
 | |
| 		     nVisuals, pVisuals))
 | |
|     {
 | |
|       ErrorF ("winFinishScreenInitNativeGDI - miScreenInit failed\n");
 | |
|       return FALSE;
 | |
|     }
 | |
| 
 | |
|   pScreen->defColormap = FakeClientID(0);
 | |
| 
 | |
|   /*
 | |
|    * Register our block and wakeup handlers; these procedures
 | |
|    * process messages in our Windows message queue; specifically,
 | |
|    * they process mouse and keyboard input.
 | |
|    */
 | |
|   pScreen->BlockHandler = winBlockHandler;
 | |
|   pScreen->WakeupHandler = winWakeupHandler;
 | |
|   pScreen->blockData = pScreen;
 | |
|   pScreen->wakeupData = pScreen;
 | |
| 
 | |
|   /* Place our save screen function */
 | |
|   pScreen->SaveScreen = winSaveScreen;
 | |
| 
 | |
|   /* Pixmaps */
 | |
|   pScreen->CreatePixmap = winCreatePixmapNativeGDI;
 | |
|   pScreen->DestroyPixmap = winDestroyPixmapNativeGDI;
 | |
| 
 | |
|   /* Other Screen Routines */
 | |
|   pScreen->QueryBestSize = winQueryBestSizeNativeGDI;
 | |
|   pScreen->SaveScreen = winSaveScreen;  
 | |
|   pScreen->GetImage = miGetImage;
 | |
|   pScreen->GetSpans = winGetSpansNativeGDI;
 | |
| 
 | |
|   /* Window Procedures */
 | |
|   pScreen->CreateWindow = winCreateWindowNativeGDI;
 | |
|   pScreen->DestroyWindow = winDestroyWindowNativeGDI;
 | |
|   pScreen->PositionWindow = winPositionWindowNativeGDI;
 | |
|   /*pScreen->ChangeWindowAttributes = winChangeWindowAttributesNativeGDI;*/
 | |
|   pScreen->RealizeWindow = winMapWindowNativeGDI;
 | |
|   pScreen->UnrealizeWindow = winUnmapWindowNativeGDI;
 | |
| 
 | |
|   /* Paint window */
 | |
|   pScreen->PaintWindowBackground = miPaintWindow;
 | |
|   pScreen->PaintWindowBorder = miPaintWindow;
 | |
|   pScreen->CopyWindow = winCopyWindowNativeGDI;
 | |
| 
 | |
|   /* Fonts */
 | |
|   pScreen->RealizeFont = winRealizeFontNativeGDI;
 | |
|   pScreen->UnrealizeFont = winUnrealizeFontNativeGDI;
 | |
| 
 | |
|   /* GC */
 | |
|   pScreen->CreateGC = winCreateGCNativeGDI;
 | |
| 
 | |
|   /* Colormap Routines */
 | |
|   pScreen->CreateColormap = miInitializeColormap;
 | |
|   pScreen->DestroyColormap = (DestroyColormapProcPtr) (void (*)(void)) NoopDDA;
 | |
|   pScreen->InstallColormap = miInstallColormap;
 | |
|   pScreen->UninstallColormap = miUninstallColormap;
 | |
|   pScreen->ListInstalledColormaps = miListInstalledColormaps;
 | |
|   pScreen->StoreColors = (StoreColorsProcPtr) (void (*)(void)) NoopDDA;
 | |
|   pScreen->ResolveColor = miResolveColor;
 | |
| 
 | |
|   /* Bitmap */
 | |
|   pScreen->BitmapToRegion = winPixmapToRegionNativeGDI;
 | |
| 
 | |
|   ErrorF ("winFinishScreenInitNativeGDI - calling miDCInitialize\n");
 | |
| 
 | |
|   /* Set the default white and black pixel positions */
 | |
|   pScreen->whitePixel = pScreen->blackPixel = (Pixel) 0;
 | |
| 
 | |
|   /* Initialize the cursor */
 | |
|   if (!miDCInitialize (pScreen, &g_winPointerCursorFuncs))
 | |
|     {
 | |
|       ErrorF ("winFinishScreenInitNativeGDI - miDCInitialize failed\n");
 | |
|       return FALSE;
 | |
|     }
 | |
|   
 | |
|   /* Create a default colormap */
 | |
|   if (!miCreateDefColormap (pScreen))
 | |
|     {
 | |
|         ErrorF ("winFinishScreenInitNativeGDI - miCreateDefColormap () "
 | |
| 		"failed\n");
 | |
| 	return FALSE;
 | |
|     }
 | |
| 
 | |
|   ErrorF ("winFinishScreenInitNativeGDI - miCreateDefColormap () "
 | |
| 	  "returned\n");
 | |
|   
 | |
|   /* mi doesn't use a CloseScreen procedure, so no need to wrap */
 | |
|   pScreen->CloseScreen = pScreenPriv->pwinCloseScreen;
 | |
| 
 | |
|   /* Tell the server that we are enabled */
 | |
|   pScreenPriv->fEnabled = TRUE;
 | |
| 
 | |
|   ErrorF ("winFinishScreenInitNativeGDI - Successful addition of "
 | |
| 	  "screen %08x\n",
 | |
| 	  (unsigned int) pScreen);
 | |
| 
 | |
|   return TRUE;
 | |
| }
 | |
| #endif
 | |
| 
 | |
| 
 | |
| /* See Porting Layer Definition - p. 33 */
 | |
| static Bool
 | |
| winSaveScreen (ScreenPtr pScreen, int on)
 | |
| {
 | |
|   return TRUE;
 | |
| }
 |