#ifdef HAVE_XWIN_CONFIG_H
#include <xwin-config.h>
#endif
#include "win.h"
#include "winmsg.h"
extern const GUID _IID_IDirectDraw4;
void
winDetectSupportedEngines ()
{
OSVERSIONINFO osvi;
g_dwEnginesSupported = WIN_SERVER_SHADOW_GDI;
#ifdef XWIN_NATIVEGDI
g_dwEnginesSupported |= WIN_SERVER_NATIVE_GDI;
#endif
ZeroMemory (&osvi, sizeof (osvi));
osvi.dwOSVersionInfoSize = sizeof (osvi);
GetVersionEx (&osvi);
switch (osvi.dwPlatformId)
{
case VER_PLATFORM_WIN32_NT:
winErrorFVerb (2, "winDetectSupportedEngines - Windows NT/2000/XP\n");
break;
case VER_PLATFORM_WIN32_WINDOWS:
winErrorFVerb (2, "winDetectSupportedEngines - Windows 95/98/Me\n");
break;
}
if (g_hmodDirectDraw != NULL)
{
LPDIRECTDRAW lpdd = NULL;
LPDIRECTDRAW4 lpdd4 = NULL;
HRESULT ddrval;
if (g_fpDirectDrawCreate == NULL)
{
return;
}
ddrval = (*g_fpDirectDrawCreate) (NULL,
(void**) &lpdd,
NULL);
if (FAILED (ddrval))
{
winErrorFVerb (2, "winDetectSupportedEngines - DirectDraw not installed\n");
return;
}
else
{
winErrorFVerb (2, "winDetectSupportedEngines - DirectDraw installed\n");
g_dwEnginesSupported |= WIN_SERVER_SHADOW_DD;
#ifdef XWIN_PRIMARYFB
if (osvi.dwPlatformId == VER_PLATFORM_WIN32_NT)
{
g_dwEnginesSupported |= WIN_SERVER_PRIMARY_DD;
winErrorFVerb (2, "winDetectSupportedEngines - Allowing PrimaryDD\n");
}
#endif
}
ddrval = IDirectDraw_QueryInterface (lpdd,
&IID_IDirectDraw4,
(LPVOID*) &lpdd4);
if (SUCCEEDED (ddrval))
{
winErrorFVerb (2, "winDetectSupportedEngines - DirectDraw4 installed\n");
g_dwEnginesSupported |= WIN_SERVER_SHADOW_DDNL;
}
if (lpdd4 != NULL)
IDirectDraw_Release (lpdd4);
if (lpdd != NULL)
IDirectDraw_Release (lpdd);
}
winErrorFVerb (2, "winDetectSupportedEngines - Returning, supported engines %08x\n",
(unsigned int) g_dwEnginesSupported);
}
Bool
winSetEngine (ScreenPtr pScreen)
{
winScreenPriv(pScreen);
winScreenInfo *pScreenInfo = pScreenPriv->pScreenInfo;
HDC hdc;
DWORD dwBPP;
hdc = GetDC (NULL);
if (hdc == NULL)
{
ErrorF ("winSetEngine - Couldn't get an HDC\n");
return FALSE;
}
dwBPP = GetDeviceCaps (hdc, BITSPIXEL);
ReleaseDC (NULL, hdc);
hdc = NULL;
if (dwBPP == 8 && !pScreenInfo->fFullScreen)
{
winErrorFVerb (2, "winSetEngine - Windowed && PseudoColor => ShadowGDI\n");
pScreenInfo->dwEngine = WIN_SERVER_SHADOW_GDI;
winSetEngineFunctionsShadowGDI (pScreen);
return TRUE;
}
if (
#ifdef XWIN_MULTIWINDOWEXTWM
pScreenInfo->fMWExtWM
#else
FALSE
#endif
#ifdef XWIN_MULTIWINDOW
|| pScreenInfo->fMultiWindow
#else
|| FALSE
#endif
)
{
winErrorFVerb (2, "winSetEngine - Multi Window or Rootless => ShadowGDI\n");
pScreenInfo->dwEngine = WIN_SERVER_SHADOW_GDI;
winSetEngineFunctionsShadowGDI (pScreen);
return TRUE;
}
if (g_dwEnginesSupported & pScreenInfo->dwEnginePreferred)
{
winErrorFVerb (2, "winSetEngine - Using user's preference: %d\n",
(int) pScreenInfo->dwEnginePreferred);
pScreenInfo->dwEngine = pScreenInfo->dwEnginePreferred;
switch (pScreenInfo->dwEngine)
{
case WIN_SERVER_SHADOW_GDI:
winSetEngineFunctionsShadowGDI (pScreen);
break;
case WIN_SERVER_SHADOW_DD:
winSetEngineFunctionsShadowDD (pScreen);
break;
case WIN_SERVER_SHADOW_DDNL:
winSetEngineFunctionsShadowDDNL (pScreen);
break;
#ifdef XWIN_PRIMARYFB
case WIN_SERVER_PRIMARY_DD:
winSetEngineFunctionsPrimaryDD (pScreen);
break;
#endif
#ifdef XWIN_NATIVEGDI
case WIN_SERVER_NATIVE_GDI:
winSetEngineFunctionsNativeGDI (pScreen);
break;
#endif
default:
FatalError ("winSetEngine - Invalid engine type\n");
}
return TRUE;
}
if (g_dwEnginesSupported & WIN_SERVER_SHADOW_DDNL)
{
winErrorFVerb (2, "winSetEngine - Using Shadow DirectDraw NonLocking\n");
pScreenInfo->dwEngine = WIN_SERVER_SHADOW_DDNL;
winSetEngineFunctionsShadowDDNL (pScreen);
return TRUE;
}
if (g_dwEnginesSupported & WIN_SERVER_SHADOW_DD)
{
winErrorFVerb (2, "winSetEngine - Using Shadow DirectDraw\n");
pScreenInfo->dwEngine = WIN_SERVER_SHADOW_DD;
winSetEngineFunctionsShadowDD (pScreen);
return TRUE;
}
if (g_dwEnginesSupported & WIN_SERVER_SHADOW_GDI)
{
winErrorFVerb (2, "winSetEngine - Using Shadow GDI DIB\n");
pScreenInfo->dwEngine = WIN_SERVER_SHADOW_GDI;
winSetEngineFunctionsShadowGDI (pScreen);
return TRUE;
}
return TRUE;
}
Bool
winGetDDProcAddresses ()
{
Bool fReturn = TRUE;
g_hmodDirectDraw = LoadLibraryEx ("ddraw.dll", NULL, 0);
if (g_hmodDirectDraw == NULL)
{
ErrorF ("winGetDDProcAddresses - Could not load ddraw.dll\n");
fReturn = TRUE;
goto winGetDDProcAddresses_Exit;
}
g_fpDirectDrawCreate = GetProcAddress (g_hmodDirectDraw,
"DirectDrawCreate");
if (g_fpDirectDrawCreate == NULL)
{
ErrorF ("winGetDDProcAddresses - Could not get DirectDrawCreate "
"address\n");
fReturn = TRUE;
goto winGetDDProcAddresses_Exit;
}
g_fpDirectDrawCreateClipper = GetProcAddress (g_hmodDirectDraw,
"DirectDrawCreateClipper");
if (g_fpDirectDrawCreateClipper == NULL)
{
ErrorF ("winGetDDProcAddresses - Could not get "
"DirectDrawCreateClipper address\n");
fReturn = FALSE;
goto winGetDDProcAddresses_Exit;
}
winGetDDProcAddresses_Exit:
if (!fReturn && g_hmodDirectDraw != NULL)
{
FreeLibrary (g_hmodDirectDraw);
g_hmodDirectDraw = NULL;
}
return fReturn;
}