#include "win.h"
#include "winconfig.h"
#include "winprefs.h"
int g_iNumScreens = 0;
winScreenInfo g_ScreenInfo[MAXSCREENS];
int g_iLastScreen = -1;
int g_fdMessageQueue = WIN_FD_INVALID;
int g_iScreenPrivateIndex = -1;
int g_iCmapPrivateIndex = -1;
int g_iGCPrivateIndex = -1;
int g_iPixmapPrivateIndex = -1;
int g_iWindowPrivateIndex = -1;
unsigned long g_ulServerGeneration = 0;
Bool g_fInitializedDefaultScreens = FALSE;
DWORD g_dwEnginesSupported = 0;
HINSTANCE g_hInstance = 0;
HWND g_hDlgDepthChange = NULL;
HWND g_hDlgExit = NULL;
Bool g_fCalledSetLocale = FALSE;
Bool g_fCalledXInitThreads = FALSE;
int g_iLogVerbose = 4;
char * g_pszLogFile = WIN_LOG_FNAME;
Bool g_fLogInited = FALSE;
const char * g_pszQueryHost = NULL;
HMODULE g_hmodDirectDraw = NULL;
FARPROC g_fpDirectDrawCreate = NULL;
FARPROC g_fpDirectDrawCreateClipper = NULL;
HMODULE g_hmodCommonControls = NULL;
FARPROC g_fpTrackMouseEvent = (FARPROC) (void (*)())NoopDDA;
#ifdef DDXOSVERRORF
void OsVendorVErrorF (const char *pszFormat, va_list va_args);
#endif
static PixmapFormatRec g_PixmapFormats[] = {
{ 1, 1, BITMAP_SCANLINE_PAD },
{ 4, 8, BITMAP_SCANLINE_PAD },
{ 8, 8, BITMAP_SCANLINE_PAD },
{ 15, 16, BITMAP_SCANLINE_PAD },
{ 16, 16, BITMAP_SCANLINE_PAD },
{ 24, 32, BITMAP_SCANLINE_PAD },
#ifdef RENDER
{ 32, 32, BITMAP_SCANLINE_PAD }
#endif
};
const int NUMFORMATS = sizeof (g_PixmapFormats) / sizeof (g_PixmapFormats[0]);
void
winInitializeDefaultScreens (void)
{
int i;
DWORD dwWidth, dwHeight;
if (g_fInitializedDefaultScreens)
return;
ZeroMemory (g_ScreenInfo, MAXSCREENS * sizeof (winScreenInfo));
dwWidth = GetSystemMetrics (SM_CXSCREEN);
dwHeight = GetSystemMetrics (SM_CYSCREEN);
ErrorF ("winInitializeDefaultScreens - w %d h %d\n", dwWidth, dwHeight);
if (monitorResolution == 0)
monitorResolution = WIN_DEFAULT_DPI;
for (i = 0; i < MAXSCREENS; ++i)
{
g_ScreenInfo[i].dwScreen = i;
g_ScreenInfo[i].dwWidth = dwWidth;
g_ScreenInfo[i].dwHeight = dwHeight;
g_ScreenInfo[i].dwUserWidth = dwWidth;
g_ScreenInfo[i].dwUserHeight = dwHeight;
g_ScreenInfo[i].fUserGaveHeightAndWidth
= WIN_DEFAULT_USER_GAVE_HEIGHT_AND_WIDTH;
g_ScreenInfo[i].dwBPP = WIN_DEFAULT_BPP;
g_ScreenInfo[i].dwClipUpdatesNBoxes = WIN_DEFAULT_CLIP_UPDATES_NBOXES;
g_ScreenInfo[i].fEmulatePseudo = WIN_DEFAULT_EMULATE_PSEUDO;
g_ScreenInfo[i].dwRefreshRate = WIN_DEFAULT_REFRESH;
g_ScreenInfo[i].pfb = NULL;
g_ScreenInfo[i].fFullScreen = FALSE;
g_ScreenInfo[i].fDecoration = TRUE;
g_ScreenInfo[i].fRootless = FALSE;
g_ScreenInfo[i].fMultiWindow = FALSE;
g_ScreenInfo[i].fMultipleMonitors = FALSE;
g_ScreenInfo[i].fClipboard = FALSE;
g_ScreenInfo[i].fLessPointer = FALSE;
g_ScreenInfo[i].fScrollbars = FALSE;
g_ScreenInfo[i].fNoTrayIcon = FALSE;
g_ScreenInfo[i].iE3BTimeout = WIN_E3B_OFF;
g_ScreenInfo[i].dwWidth_mm = (dwWidth / WIN_DEFAULT_DPI)
* 25.4;
g_ScreenInfo[i].dwHeight_mm = (dwHeight / WIN_DEFAULT_DPI)
* 25.4;
g_ScreenInfo[i].fUseWinKillKey = WIN_DEFAULT_WIN_KILL;
g_ScreenInfo[i].fUseUnixKillKey = WIN_DEFAULT_UNIX_KILL;
g_ScreenInfo[i].fIgnoreInput = FALSE;
g_ScreenInfo[i].fExplicitScreen = FALSE;
}
g_fInitializedDefaultScreens = TRUE;
ErrorF ("winInitializeDefaultScreens - Returning\n");
}
void
ddxGiveUp()
{
#if CYGDEBUG
ErrorF ("ddxGiveUp\n");
#endif
winDeinitClipboard ();
winDeinitMultiWindowWM ();
if (g_fdMessageQueue != WIN_FD_INVALID)
{
close (g_fdMessageQueue);
g_fdMessageQueue = WIN_FD_INVALID;
}
if (!g_fLogInited) {
LogInit(g_pszLogFile, NULL);
g_fLogInited = TRUE;
}
LogClose();
if (g_hmodDirectDraw != NULL)
{
FreeLibrary (g_hmodDirectDraw);
g_hmodDirectDraw = NULL;
g_fpDirectDrawCreate = NULL;
g_fpDirectDrawCreateClipper = NULL;
}
if (g_hmodCommonControls != NULL)
{
FreeLibrary (g_hmodCommonControls);
g_hmodCommonControls = NULL;
g_fpTrackMouseEvent = (FARPROC) (void (*)())NoopDDA;
}
PostQuitMessage (0);
}
void
AbortDDX (void)
{
#if CYGDEBUG
ErrorF ("AbortDDX\n");
#endif
ddxGiveUp ();
}
void
OsVendorInit (void)
{
#ifdef DDXOSVERRORF
if (!OsVendorVErrorFProc)
OsVendorVErrorFProc = OsVendorVErrorF;
#endif
if (!g_fLogInited) {
LogInit(g_pszLogFile, NULL);
g_fLogInited = TRUE;
}
LogSetParameter(XLOG_FLUSH, 1);
LogSetParameter(XLOG_VERBOSITY, g_iLogVerbose);
if (g_iNumScreens == 0)
{
ErrorF ("OsVendorInit - Creating bogus screen 0\n");
winInitializeDefaultScreens ();
g_iNumScreens = 1;
g_iLastScreen = 0;
g_ScreenInfo[0].fExplicitScreen = TRUE;
}
}
void
ddxUseMsg (void)
{
ErrorF ("-depth bits_per_pixel\n"
"\tSpecify an optional bitdepth to use in fullscreen mode\n"
"\twith a DirectDraw engine.\n");
ErrorF ("-emulate3buttons [timeout]\n"
"\tEmulate 3 button mouse with an optional timeout in\n"
"\tmilliseconds.\n");
ErrorF ("-engine engine_type_id\n"
"\tOverride the server's automatically selected engine type:\n"
"\t\t1 - Shadow GDI\n"
"\t\t2 - Shadow DirectDraw\n"
"\t\t4 - Shadow DirectDraw4 Non-Locking\n"
"\t\t16 - Native GDI - experimental\n");
ErrorF ("-fullscreen\n"
"\tRun the server in fullscreen mode.\n");
ErrorF ("-refresh rate_in_Hz\n"
"\tSpecify an optional refresh rate to use in fullscreen mode\n"
"\twith a DirectDraw engine.\n");
ErrorF ("-screen scr_num [width height]\n"
"\tEnable screen scr_num and optionally specify a width and\n"
"\theight for that screen.\n");
ErrorF ("-lesspointer\n"
"\tHide the windows mouse pointer when it is over an inactive\n"
"\tXFree86 window. This prevents ghost cursors appearing where\n"
"\tthe Windows cursor is drawn overtop of the X cursor\n");
ErrorF ("-nodecoration\n"
"\tDo not draw a window border, title bar, etc. Windowed\n"
"\tmode only.\n");
ErrorF ("-rootless\n"
"\tEXPERIMENTAL: Run the server in pseudo-rootless mode.\n");
ErrorF ("-multiwindow\n"
"\tEXPERIMENTAL: Run the server in multi-window mode.\n");
ErrorF ("-multiplemonitors\n"
"\tEXPERIMENTAL: Use the entire virtual screen if multiple\n"
"\tmonitors are present.\n");
ErrorF ("-clipboard\n"
"\tEXPERIMENTAL: Run the clipboard integration module.\n");
ErrorF ("-scrollbars\n"
"\tIn windowed mode, allow screens bigger than the Windows desktop.\n"
"\tMoreover, if the window has decorations, one can now resize\n"
"\tit.\n");
ErrorF ("-[no]trayicon\n"
"\tDo not create a tray icon. Default is to create one\n"
"\ticon per screen. You can globally disable tray icons with\n"
"\t-notrayicon, then enable it for specific screens with\n"
"\t-trayicon for those screens.\n");
ErrorF ("-clipupdates num_boxes\n"
"\tUse a clipping region to constrain shadow update blits to\n"
"\tthe updated region when num_boxes, or more, are in the\n"
"\tupdated region. Currently supported only by `-engine 1'.\n");
ErrorF ("-emulatepseudo\n"
"\tCreate a depth 8 PseudoColor visual when running in\n"
"\tdepths 15, 16, 24, or 32, collectively known as TrueColor\n"
"\tdepths. The PseudoColor visual does not have correct colors,\n"
"\tand it may crash, but it at least allows you to run your\n"
"\tapplication in TrueColor modes.\n");
ErrorF ("-[no]unixkill\n"
"\tCtrl+Alt+Backspace exits the X Server.\n");
ErrorF ("-[no]winkill\n"
"\tAlt+F4 exits the X Server.\n");
ErrorF ("-xf86config\n"
"\tSpecify a configuration file.\n");
ErrorF ("-keyboard\n"
"\tSpecify a keyboard device from the configuration file.\n");
}
#define CHECK_ARGS(count) if (i + count >= argc) { UseMsg (); return 0; }
#define IS_OPTION(name) (strcmp (argv[i], name) == 0)
int
ddxProcessArgument (int argc, char *argv[], int i)
{
static Bool s_fBeenHere = FALSE;
if (!s_fBeenHere)
{
#ifdef DDXOSVERRORF
OsVendorVErrorFProc = OsVendorVErrorF;
#endif
s_fBeenHere = TRUE;
ErrorF ("ddxProcessArgument - Initializing default screens\n");
winInitializeDefaultScreens ();
}
#if CYGDEBUG
ErrorF ("ddxProcessArgument - arg: %s\n", argv[i]);
#endif
if (strcmp (argv[i], "-screen") == 0)
{
int iArgsProcessed = 1;
int nScreenNum;
int iWidth, iHeight;
#if CYGDEBUG
ErrorF ("ddxProcessArgument - screen - argc: %d i: %d\n",
argc, i);
#endif
if (i + 1 >= argc)
{
return 0;
}
nScreenNum = atoi (argv[i + 1]);
if (nScreenNum < 0 || nScreenNum >= MAXSCREENS)
{
ErrorF ("ddxProcessArgument - screen - Invalid screen number %d\n",
nScreenNum);
UseMsg ();
return 0;
}
if (i + 2 < argc
&& 2 == sscanf (argv[i + 2], "%dx%d",
(int *) &iWidth,
(int *) &iHeight))
{
ErrorF ("ddxProcessArgument - screen - Found ``WxD'' arg\n");
iArgsProcessed = 3;
g_ScreenInfo[nScreenNum].fUserGaveHeightAndWidth = TRUE;
g_ScreenInfo[nScreenNum].dwWidth = iWidth;
g_ScreenInfo[nScreenNum].dwHeight = iHeight;
g_ScreenInfo[nScreenNum].dwUserWidth = iWidth;
g_ScreenInfo[nScreenNum].dwUserHeight = iHeight;
}
else if (i + 3 < argc
&& 1 == sscanf (argv[i + 2], "%d",
(int *) &iWidth)
&& 1 == sscanf (argv[i + 3], "%d",
(int *) &iHeight))
{
ErrorF ("ddxProcessArgument - screen - Found ``W D'' arg\n");
iArgsProcessed = 4;
g_ScreenInfo[nScreenNum].fUserGaveHeightAndWidth = TRUE;
g_ScreenInfo[nScreenNum].dwWidth = iWidth;
g_ScreenInfo[nScreenNum].dwHeight = iHeight;
g_ScreenInfo[nScreenNum].dwUserWidth = iWidth;
g_ScreenInfo[nScreenNum].dwUserHeight = iHeight;
}
else
{
ErrorF ("ddxProcessArgument - screen - Did not find size arg. "
"dwWidth: %d dwHeight: %d\n",
g_ScreenInfo[nScreenNum].dwWidth,
g_ScreenInfo[nScreenNum].dwHeight);
iArgsProcessed = 2;
g_ScreenInfo[nScreenNum].fUserGaveHeightAndWidth = FALSE;
}
if (g_ScreenInfo[nScreenNum].fUserGaveHeightAndWidth)
{
g_ScreenInfo[nScreenNum].dwWidth_mm
= (g_ScreenInfo[nScreenNum].dwWidth
/ monitorResolution) * 25.4;
g_ScreenInfo[nScreenNum].dwHeight_mm
= (g_ScreenInfo[nScreenNum].dwHeight
/ monitorResolution) * 25.4;
}
g_ScreenInfo[nScreenNum].fExplicitScreen = TRUE;
g_iLastScreen = nScreenNum;
++g_iNumScreens;
return iArgsProcessed;
}
if (strcmp (argv[i], "-engine") == 0)
{
DWORD dwEngine = 0;
CARD8 c8OnBits = 0;
if (++i >= argc)
{
UseMsg ();
return 0;
}
dwEngine = atoi (argv[i]);
c8OnBits = winCountBits (dwEngine);
if (c8OnBits != 1)
{
UseMsg ();
return 0;
}
if (-1 == g_iLastScreen)
{
int j;
for (j = 0; j < MAXSCREENS; j++)
{
g_ScreenInfo[j].dwEnginePreferred = dwEngine;
}
}
else
{
g_ScreenInfo[g_iLastScreen].dwEnginePreferred = dwEngine;
}
return 2;
}
if (strcmp (argv[i], "-fullscreen") == 0)
{
if (-1 == g_iLastScreen)
{
int j;
for (j = 0; j < MAXSCREENS; j++)
{
g_ScreenInfo[j].fFullScreen = TRUE;
g_ScreenInfo[j].fScrollbars = FALSE;
}
}
else
{
g_ScreenInfo[g_iLastScreen].fFullScreen = TRUE;
g_ScreenInfo[g_iLastScreen].fScrollbars = FALSE;
}
return 1;
}
if (strcmp (argv[i], "-lesspointer") == 0)
{
if (-1 == g_iLastScreen)
{
int j;
for (j = 0; j < MAXSCREENS; j++)
{
g_ScreenInfo[j].fLessPointer = TRUE;
}
}
else
{
g_ScreenInfo[g_iLastScreen].fLessPointer = TRUE;
}
return 1;
}
if (strcmp (argv[i], "-nodecoration") == 0)
{
if (-1 == g_iLastScreen)
{
int j;
for (j = 0; j < MAXSCREENS; j++)
{
g_ScreenInfo[j].fDecoration = FALSE;
}
}
else
{
g_ScreenInfo[g_iLastScreen].fDecoration = FALSE;
}
return 1;
}
if (strcmp (argv[i], "-rootless") == 0)
{
if (-1 == g_iLastScreen)
{
int j;
for (j = 0; j < MAXSCREENS; j++)
{
g_ScreenInfo[j].fRootless = TRUE;
}
}
else
{
g_ScreenInfo[g_iLastScreen].fRootless = TRUE;
}
return 1;
}
if (strcmp (argv[i], "-multiwindow") == 0)
{
if (-1 == g_iLastScreen)
{
int j;
for (j = 0; j < MAXSCREENS; j++)
{
g_ScreenInfo[j].fMultiWindow = TRUE;
}
}
else
{
g_ScreenInfo[g_iLastScreen].fMultiWindow = TRUE;
}
return 1;
}
if (strcmp (argv[i], "-multiplemonitors") == 0
|| strcmp (argv[i], "-multimonitors") == 0)
{
if (-1 == g_iLastScreen)
{
int j;
for (j = 0; j < MAXSCREENS; j++)
{
g_ScreenInfo[j].fMultipleMonitors = TRUE;
}
}
else
{
g_ScreenInfo[g_iLastScreen].fMultipleMonitors = TRUE;
}
return 1;
}
if (strcmp (argv[i], "-scrollbars") == 0)
{
if (-1 == g_iLastScreen)
{
int j;
for (j = 0; j < MAXSCREENS; j++)
{
if (!g_ScreenInfo[j].fFullScreen)
g_ScreenInfo[j].fScrollbars = TRUE;
}
}
else
{
if (!g_ScreenInfo[g_iLastScreen].fFullScreen)
{
g_ScreenInfo[g_iLastScreen].fScrollbars = TRUE;
}
}
return 1;
}
if (strcmp (argv[i], "-clipboard") == 0)
{
if (-1 == g_iLastScreen)
{
int j;
for (j = 0; j < MAXSCREENS; j++)
{
g_ScreenInfo[j].fClipboard = TRUE;
}
}
else
{
g_ScreenInfo[g_iLastScreen].fClipboard = TRUE;
}
return 1;
}
if (strcmp (argv[i], "-ignoreinput") == 0)
{
if (-1 == g_iLastScreen)
{
int j;
for (j = 0; j < MAXSCREENS; j++)
{
g_ScreenInfo[j].fIgnoreInput = TRUE;
}
}
else
{
g_ScreenInfo[g_iLastScreen].fIgnoreInput = TRUE;
}
return 1;
}
if (strcmp (argv[i], "-emulate3buttons") == 0)
{
int iArgsProcessed = 1;
int iE3BTimeout = WIN_DEFAULT_E3B_TIME;
if (i + 1 < argc
&& 1 == sscanf (argv[i + 1], "%d",
&iE3BTimeout))
{
iArgsProcessed++;
}
else
{
iE3BTimeout = WIN_DEFAULT_E3B_TIME;
}
if (-1 == g_iLastScreen)
{
int j;
for (j = 0; j < MAXSCREENS; j++)
{
g_ScreenInfo[j].iE3BTimeout = iE3BTimeout;
}
}
else
{
g_ScreenInfo[g_iLastScreen].iE3BTimeout = iE3BTimeout;
}
return iArgsProcessed;
}
if (strcmp (argv[i], "-depth") == 0)
{
DWORD dwBPP = 0;
if (++i >= argc)
{
UseMsg ();
return 0;
}
dwBPP = atoi (argv[i]);
if (-1 == g_iLastScreen)
{
int j;
for (j = 0; j < MAXSCREENS; j++)
{
g_ScreenInfo[j].dwBPP = dwBPP;
}
}
else
{
g_ScreenInfo[g_iLastScreen].dwBPP = dwBPP;
}
return 2;
}
if (strcmp (argv[i], "-refresh") == 0)
{
DWORD dwRefreshRate = 0;
if (++i >= argc)
{
UseMsg ();
return 0;
}
dwRefreshRate = atoi (argv[i]);
if (-1 == g_iLastScreen)
{
int j;
for (j = 0; j < MAXSCREENS; j++)
{
g_ScreenInfo[j].dwRefreshRate = dwRefreshRate;
}
}
else
{
g_ScreenInfo[g_iLastScreen].dwRefreshRate = dwRefreshRate;
}
return 2;
}
if (strcmp (argv[i], "-clipupdates") == 0)
{
DWORD dwNumBoxes = 0;
if (++i >= argc)
{
UseMsg ();
return 0;
}
dwNumBoxes = atoi (argv[i]);
if (-1 == g_iLastScreen)
{
int j;
for (j = 0; j < MAXSCREENS; j++)
{
g_ScreenInfo[j].dwClipUpdatesNBoxes = dwNumBoxes;
}
}
else
{
g_ScreenInfo[g_iLastScreen].dwClipUpdatesNBoxes = dwNumBoxes;
}
return 2;
}
if (strcmp (argv[i], "-emulatepseudo") == 0)
{
if (-1 == g_iLastScreen)
{
int j;
for (j = 0; j < MAXSCREENS; j++)
{
g_ScreenInfo[j].fEmulatePseudo = TRUE;
}
}
else
{
g_ScreenInfo[g_iLastScreen].fEmulatePseudo = TRUE;
}
return 1;
}
if (strcmp (argv[i], "-nowinkill") == 0)
{
if (-1 == g_iLastScreen)
{
int j;
for (j = 0; j < MAXSCREENS; j++)
{
g_ScreenInfo[j].fUseWinKillKey = FALSE;
}
}
else
{
g_ScreenInfo[g_iLastScreen].fUseWinKillKey = FALSE;
}
return 1;
}
if (strcmp (argv[i], "-winkill") == 0)
{
if (-1 == g_iLastScreen)
{
int j;
for (j = 0; j < MAXSCREENS; j++)
{
g_ScreenInfo[j].fUseWinKillKey = TRUE;
}
}
else
{
g_ScreenInfo[g_iLastScreen].fUseWinKillKey = TRUE;
}
return 1;
}
if (strcmp (argv[i], "-nounixkill") == 0)
{
if (-1 == g_iLastScreen)
{
int j;
for (j = 0; j < MAXSCREENS; j++)
{
g_ScreenInfo[j].fUseUnixKillKey = FALSE;
}
}
else
{
g_ScreenInfo[g_iLastScreen].fUseUnixKillKey = FALSE;
}
return 1;
}
if (strcmp (argv[i], "-unixkill") == 0)
{
if (-1 == g_iLastScreen)
{
int j;
for (j = 0; j < MAXSCREENS; j++)
{
g_ScreenInfo[j].fUseUnixKillKey = TRUE;
}
}
else
{
g_ScreenInfo[g_iLastScreen].fUseUnixKillKey = TRUE;
}
return 1;
}
if (strcmp (argv[i], "-notrayicon") == 0)
{
if (-1 == g_iLastScreen)
{
int j;
for (j = 0; j < MAXSCREENS; j++)
{
g_ScreenInfo[j].fNoTrayIcon = TRUE;
}
}
else
{
g_ScreenInfo[g_iLastScreen].fNoTrayIcon = TRUE;
}
return 1;
}
if (strcmp (argv[i], "-trayicon") == 0)
{
if (-1 == g_iLastScreen)
{
int j;
for (j = 0; j < MAXSCREENS; j++)
{
g_ScreenInfo[j].fNoTrayIcon = FALSE;
}
}
else
{
g_ScreenInfo[g_iLastScreen].fNoTrayIcon = FALSE;
}
return 1;
}
if (IS_OPTION ("-fp"))
{
CHECK_ARGS (1);
g_cmdline.fontPath = argv[++i];
return 0;
}
if (IS_OPTION ("-co"))
{
CHECK_ARGS (1);
g_cmdline.rgbPath = argv[++i];
return 0;
}
if (IS_OPTION ("-query"))
{
CHECK_ARGS (1);
g_pszQueryHost = argv[++i];
return 0;
}
if (IS_OPTION ("-xf86config"))
{
CHECK_ARGS (1);
g_cmdline.configFile = argv[++i];
return 2;
}
if (IS_OPTION ("-keyboard"))
{
CHECK_ARGS (1);
g_cmdline.keyboard = argv[++i];
return 2;
}
if (IS_OPTION ("-logfile"))
{
CHECK_ARGS (1);
g_pszLogFile = argv[++i];
return 2;
}
if (IS_OPTION ("-logverbose"))
{
CHECK_ARGS (1);
g_iLogVerbose = atoi(argv[++i]);
return 2;
}
return 0;
}
#ifdef DDXTIME
CARD32
GetTimeInMillis (void)
{
return GetTickCount ();
}
#endif
void
InitOutput (ScreenInfo *screenInfo, int argc, char *argv[])
{
int i;
int iMaxConsecutiveScreen = 0;
#if CYGDEBUG
ErrorF ("InitOutput\n");
#endif
if (!winReadConfigfile ())
ErrorF ("InitOutput - Error reading config file\n");
screenInfo->imageByteOrder = IMAGE_BYTE_ORDER;
screenInfo->bitmapScanlinePad = BITMAP_SCANLINE_PAD;
screenInfo->bitmapScanlineUnit = BITMAP_SCANLINE_UNIT;
screenInfo->bitmapBitOrder = BITMAP_BIT_ORDER;
screenInfo->numPixmapFormats = NUMFORMATS;
for (i = 0; i < NUMFORMATS; i++)
{
screenInfo->formats[i] = g_PixmapFormats[i];
}
winGetDDProcAddresses ();
winDetectSupportedEngines ();
g_hmodCommonControls = LoadLibraryEx ("comctl32.dll", NULL, 0);
g_fpTrackMouseEvent = GetProcAddress (g_hmodCommonControls,
"_TrackMouseEvent");
if (g_fpTrackMouseEvent == NULL)
{
ErrorF ("InitOutput - Could not get pointer to function\n"
"\t_TrackMouseEvent in comctl32.dll. Try installing\n"
"\tInternet Explorer 3.0 or greater if you have not\n"
"\talready.\n");
FreeLibrary (g_hmodCommonControls);
g_hmodCommonControls = NULL;
g_fpTrackMouseEvent = (FARPROC) (void (*)())NoopDDA;
}
for (i = 0; i < MAXSCREENS; i++)
{
if (g_ScreenInfo[i].fExplicitScreen)
iMaxConsecutiveScreen = i + 1;
}
ErrorF ("InitOutput - g_iNumScreens: %d iMaxConsecutiveScreen: %d\n",
g_iNumScreens, iMaxConsecutiveScreen);
if (g_iNumScreens < iMaxConsecutiveScreen)
FatalError ("InitOutput - Malformed set of screen parameter(s). "
"Screens must be specified consecutively starting with "
"screen 0. That is, you cannot have only a screen 1, nor "
"could you have screen 0 and screen 2. You instead must have "
"screen 0, or screen 0 and screen 1, respectively. Of "
"you can specify as many screens as you want from 0 up to "
"%d.\n", MAXSCREENS - 1);
g_hInstance = GetModuleHandle (NULL);
for (i = 0; i < g_iNumScreens; i++)
{
if (-1 == AddScreen (winScreenInit, argc, argv))
{
FatalError ("InitOutput - Couldn't add screen %d", i);
}
}
LoadPreferences();
#if CYGDEBUG || YES
ErrorF ("InitOutput - Returning.\n");
#endif
}