#ifdef HAVE_XWIN_CONFIG_H
#include <xwin-config.h>
#endif
#ifdef XVENDORNAME
#define VENDOR_STRING XVENDORNAME
#define VERSION_STRING XORG_RELEASE
#define VENDOR_CONTACT BUILDERADDR
#endif
#include "win.h"
#include "winconfig.h"
#include "winprefs.h"
#include "winmsg.h"
extern int g_iNumScreens;
extern winScreenInfo g_ScreenInfo[];
extern int g_iLastScreen;
extern Bool g_fInitializedDefaultScreens;
#ifdef XWIN_CLIPBOARD
extern Bool g_fUnicodeClipboard;
extern Bool g_fClipboard;
#endif
extern int g_iLogVerbose;
extern char * g_pszLogFile;
#ifdef RELOCATE_PROJECTROOT
extern Bool g_fLogFileChanged;
#endif
extern Bool g_fXdmcpEnabled;
extern char * g_pszCommandLine;
extern Bool g_fKeyboardHookLL;
extern Bool g_fNoHelpMessageBox;
extern Bool g_fSoftwareCursor;
extern Bool g_fSilentDupError;
struct GetMonitorInfoData {
int requestedMonitor;
int monitorNum;
Bool bUserSpecifiedMonitor;
Bool bMonitorSpecifiedExists;
int monitorOffsetX;
int monitorOffsetY;
int monitorHeight;
int monitorWidth;
};
typedef wBOOL (*ENUMDISPLAYMONITORSPROC)(HDC,LPCRECT,MONITORENUMPROC,LPARAM);
ENUMDISPLAYMONITORSPROC _EnumDisplayMonitors;
wBOOL CALLBACK getMonitorInfo(HMONITOR hMonitor, HDC hdc, LPRECT rect, LPARAM _data);
static Bool QueryMonitor(int index, struct GetMonitorInfoData *data)
{
HMODULE user32;
FARPROC func;
user32 = LoadLibrary("user32.dll");
if (user32 == NULL)
{
winW32Error(2, "Could not open user32.dll");
return FALSE;
}
func = GetProcAddress(user32, "EnumDisplayMonitors");
if (func == NULL)
{
winW32Error(2, "Could not resolve EnumDisplayMonitors: ");
return FALSE;
}
_EnumDisplayMonitors = (ENUMDISPLAYMONITORSPROC)func;
if (data == NULL)
return FALSE;
memset(data, 0, sizeof(*data));
data->requestedMonitor = index;
_EnumDisplayMonitors(NULL, NULL, getMonitorInfo, (LPARAM) data);
FreeLibrary(user32);
return TRUE;
}
void
winLogCommandLine (int argc, char *argv[]);
void
winLogVersionInfo (void);
#ifdef DDXOSVERRORF
void OsVendorVErrorF (const char *pszFormat, va_list va_args);
#endif
void
winInitializeDefaultScreens (void);
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);
winErrorFVerb (2, "winInitializeDefaultScreens - w %d h %d\n",
(int) dwWidth, (int) 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].fUserGavePosition = FALSE;
g_ScreenInfo[i].dwBPP = WIN_DEFAULT_BPP;
g_ScreenInfo[i].dwClipUpdatesNBoxes = WIN_DEFAULT_CLIP_UPDATES_NBOXES;
#ifdef XWIN_EMULATEPSEUDO
g_ScreenInfo[i].fEmulatePseudo = WIN_DEFAULT_EMULATE_PSEUDO;
#endif
g_ScreenInfo[i].dwRefreshRate = WIN_DEFAULT_REFRESH;
g_ScreenInfo[i].pfb = NULL;
g_ScreenInfo[i].fFullScreen = FALSE;
g_ScreenInfo[i].fDecoration = TRUE;
#ifdef XWIN_MULTIWINDOWEXTWM
g_ScreenInfo[i].fMWExtWM = FALSE;
g_ScreenInfo[i].fInternalWM = FALSE;
#endif
g_ScreenInfo[i].fRootless = FALSE;
#ifdef XWIN_MULTIWINDOW
g_ScreenInfo[i].fMultiWindow = FALSE;
#endif
#if defined(XWIN_MULTIWINDOW) || defined(XWIN_MULTIWINDOWEXTWM)
g_ScreenInfo[i].fMultiMonitorOverride = FALSE;
#endif
g_ScreenInfo[i].fMultipleMonitors = 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;
winErrorFVerb (2, "winInitializeDefaultScreens - Returning\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;
if (!IS_OPTION("-help") && !IS_OPTION("-h") && !IS_OPTION("--help") &&
!IS_OPTION("-version") && !IS_OPTION("--version"))
{
winLogVersionInfo ();
winLogCommandLine (argc, argv);
winErrorFVerb (2, "ddxProcessArgument - Initializing default "
"screens\n");
winInitializeDefaultScreens ();
}
}
#if CYGDEBUG
winDebug ("ddxProcessArgument - arg: %s\n", argv[i]);
#endif
if (IS_OPTION ("-help") || IS_OPTION("-h") || IS_OPTION("--help"))
{
g_pszLogFile = NULL;
g_fNoHelpMessageBox = TRUE;
UseMsg();
exit (0);
return 1;
}
if (IS_OPTION ("-version") || IS_OPTION("--version"))
{
g_pszLogFile = NULL;
winLogVersionInfo ();
exit (0);
return 1;
}
if (IS_OPTION ("-screen"))
{
int iArgsProcessed = 1;
int nScreenNum;
int iWidth, iHeight, iX, iY;
int iMonitor;
#if CYGDEBUG
winDebug ("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
&& 1 == sscanf(argv[i + 2], "@%d", (int *) &iMonitor))
{
struct GetMonitorInfoData data;
if (!QueryMonitor(iMonitor, &data))
{
ErrorF ("ddxProcessArgument - screen - "
"Querying monitors is not supported on NT4 and Win95\n");
} else if (data.bMonitorSpecifiedExists == TRUE)
{
winErrorFVerb(2, "ddxProcessArgument - screen - Found Valid ``@Monitor'' = %d arg\n", iMonitor);
iArgsProcessed = 3;
g_ScreenInfo[nScreenNum].fUserGaveHeightAndWidth = FALSE;
g_ScreenInfo[nScreenNum].fUserGavePosition = TRUE;
g_ScreenInfo[nScreenNum].dwWidth = data.monitorWidth;
g_ScreenInfo[nScreenNum].dwHeight = data.monitorHeight;
g_ScreenInfo[nScreenNum].dwUserWidth = data.monitorWidth;
g_ScreenInfo[nScreenNum].dwUserHeight = data.monitorHeight;
g_ScreenInfo[nScreenNum].dwInitialX = data.monitorOffsetX;
g_ScreenInfo[nScreenNum].dwInitialY = data.monitorOffsetY;
}
else
{
ErrorF ("ddxProcessArgument - screen - Invalid monitor number %d\n",
iMonitor);
UseMsg ();
exit (0);
return 0;
}
}
else if (i + 2 < argc
&& 2 == sscanf (argv[i + 2], "%dx%d",
(int *) &iWidth,
(int *) &iHeight))
{
winErrorFVerb (2, "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;
if (2 == sscanf (argv[i + 2], "%*dx%*d+%d+%d",
(int *) &iX,
(int *) &iY))
{
winErrorFVerb (2, "ddxProcessArgument - screen - Found ``X+Y'' arg\n");
g_ScreenInfo[nScreenNum].fUserGavePosition = TRUE;
g_ScreenInfo[nScreenNum].dwInitialX = iX;
g_ScreenInfo[nScreenNum].dwInitialY = iY;
if (1 == sscanf (argv[i + 2], "%*dx%*d+%*d+%*d@%d",
(int *) &iMonitor))
{
struct GetMonitorInfoData data;
if (!QueryMonitor(iMonitor, &data))
{
ErrorF ("ddxProcessArgument - screen - "
"Querying monitors is not supported on NT4 and Win95\n");
} else if (data.bMonitorSpecifiedExists == TRUE)
{
g_ScreenInfo[nScreenNum].dwInitialX += data.monitorOffsetX;
g_ScreenInfo[nScreenNum].dwInitialY += data.monitorOffsetY;
}
else
{
ErrorF ("ddxProcessArgument - screen - Invalid monitor number %d\n",
iMonitor);
UseMsg ();
exit (0);
return 0;
}
}
}
else if (1 == sscanf(argv[i + 2], "%*dx%*d@%d",
(int *) &iMonitor))
{
struct GetMonitorInfoData data;
if (!QueryMonitor(iMonitor, &data))
{
ErrorF ("ddxProcessArgument - screen - "
"Querying monitors is not supported on NT4 and Win95\n");
} else if (data.bMonitorSpecifiedExists == TRUE)
{
winErrorFVerb (2, "ddxProcessArgument - screen - Found Valid ``@Monitor'' = %d arg\n", iMonitor);
g_ScreenInfo[nScreenNum].fUserGavePosition = TRUE;
g_ScreenInfo[nScreenNum].dwInitialX = data.monitorOffsetX;
g_ScreenInfo[nScreenNum].dwInitialY = data.monitorOffsetY;
}
else
{
ErrorF ("ddxProcessArgument - screen - Invalid monitor number %d\n",
iMonitor);
UseMsg ();
exit (0);
return 0;
}
}
}
else if (i + 3 < argc
&& 1 == sscanf (argv[i + 2], "%d",
(int *) &iWidth)
&& 1 == sscanf (argv[i + 3], "%d",
(int *) &iHeight))
{
winErrorFVerb (2, "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;
if (i + 5 < argc
&& 1 == sscanf (argv[i + 4], "%d",
(int *) &iX)
&& 1 == sscanf (argv[i + 5], "%d",
(int *) &iY))
{
winErrorFVerb (2, "ddxProcessArgument - screen - Found ``X Y'' arg\n");
iArgsProcessed = 6;
g_ScreenInfo[nScreenNum].fUserGavePosition = TRUE;
g_ScreenInfo[nScreenNum].dwInitialX = iX;
g_ScreenInfo[nScreenNum].dwInitialY = iY;
}
}
else
{
winErrorFVerb (2, "ddxProcessArgument - screen - Did not find size arg. "
"dwWidth: %d dwHeight: %d\n",
(int) g_ScreenInfo[nScreenNum].dwWidth,
(int) 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 (IS_OPTION ("-engine"))
{
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 (IS_OPTION ("-fullscreen"))
{
if (-1 == g_iLastScreen)
{
int j;
for (j = 0; j < MAXSCREENS; j++)
{
#if defined(XWIN_MULTIWINDOW) || defined(XWIN_MULTIWINDOWEXTWM)
if (!g_ScreenInfo[j].fMultiMonitorOverride)
g_ScreenInfo[j].fMultipleMonitors = FALSE;
#endif
g_ScreenInfo[j].fFullScreen = TRUE;
}
}
else
{
#if defined(XWIN_MULTIWINDOW) || defined(XWIN_MULTIWINDOWEXTWM)
if (!g_ScreenInfo[g_iLastScreen].fMultiMonitorOverride)
g_ScreenInfo[g_iLastScreen].fMultipleMonitors = FALSE;
#endif
g_ScreenInfo[g_iLastScreen].fFullScreen = TRUE;
}
return 1;
}
if (IS_OPTION ("-lesspointer"))
{
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 (IS_OPTION ("-nodecoration"))
{
if (-1 == g_iLastScreen)
{
int j;
for (j = 0; j < MAXSCREENS; j++)
{
#if defined(XWIN_MULTIWINDOW) || defined(XWIN_MULTIWINDOWEXTWM)
if (!g_ScreenInfo[j].fMultiMonitorOverride)
g_ScreenInfo[j].fMultipleMonitors = FALSE;
#endif
g_ScreenInfo[j].fDecoration = FALSE;
}
}
else
{
#if defined(XWIN_MULTIWINDOW) || defined(XWIN_MULTIWINDOWEXTWM)
if (!g_ScreenInfo[g_iLastScreen].fMultiMonitorOverride)
g_ScreenInfo[g_iLastScreen].fMultipleMonitors = FALSE;
#endif
g_ScreenInfo[g_iLastScreen].fDecoration = FALSE;
}
return 1;
}
#ifdef XWIN_MULTIWINDOWEXTWM
if (IS_OPTION ("-mwextwm"))
{
if (-1 == g_iLastScreen)
{
int j;
for (j = 0; j < MAXSCREENS; j++)
{
if (!g_ScreenInfo[j].fMultiMonitorOverride)
g_ScreenInfo[j].fMultipleMonitors = TRUE;
g_ScreenInfo[j].fMWExtWM = TRUE;
}
}
else
{
if (!g_ScreenInfo[g_iLastScreen].fMultiMonitorOverride)
g_ScreenInfo[g_iLastScreen].fMultipleMonitors = TRUE;
g_ScreenInfo[g_iLastScreen].fMWExtWM = TRUE;
}
return 1;
}
if (IS_OPTION ("-internalwm"))
{
if (-1 == g_iLastScreen)
{
int j;
for (j = 0; j < MAXSCREENS; j++)
{
if (!g_ScreenInfo[j].fMultiMonitorOverride)
g_ScreenInfo[j].fMultipleMonitors = TRUE;
g_ScreenInfo[j].fMWExtWM = TRUE;
g_ScreenInfo[j].fInternalWM = TRUE;
}
}
else
{
if (!g_ScreenInfo[g_iLastScreen].fMultiMonitorOverride)
g_ScreenInfo[g_iLastScreen].fMultipleMonitors = TRUE;
g_ScreenInfo[g_iLastScreen].fMWExtWM = TRUE;
g_ScreenInfo[g_iLastScreen].fInternalWM = TRUE;
}
return 1;
}
#endif
if (IS_OPTION ("-rootless"))
{
if (-1 == g_iLastScreen)
{
int j;
for (j = 0; j < MAXSCREENS; j++)
{
#if defined(XWIN_MULTIWINDOW) || defined(XWIN_MULTIWINDOWEXTWM)
if (!g_ScreenInfo[j].fMultiMonitorOverride)
g_ScreenInfo[j].fMultipleMonitors = FALSE;
#endif
g_ScreenInfo[j].fRootless = TRUE;
}
}
else
{
#if defined(XWIN_MULTIWINDOW) || defined(XWIN_MULTIWINDOWEXTWM)
if (!g_ScreenInfo[g_iLastScreen].fMultiMonitorOverride)
g_ScreenInfo[g_iLastScreen].fMultipleMonitors = FALSE;
#endif
g_ScreenInfo[g_iLastScreen].fRootless = TRUE;
}
return 1;
}
#ifdef XWIN_MULTIWINDOW
if (IS_OPTION ("-multiwindow"))
{
if (-1 == g_iLastScreen)
{
int j;
for (j = 0; j < MAXSCREENS; j++)
{
#if defined(XWIN_MULTIWINDOW) || defined(XWIN_MULTIWINDOWEXTWM)
if (!g_ScreenInfo[j].fMultiMonitorOverride)
g_ScreenInfo[j].fMultipleMonitors = TRUE;
#endif
g_ScreenInfo[j].fMultiWindow = TRUE;
}
}
else
{
#if defined(XWIN_MULTIWINDOW) || defined(XWIN_MULTIWINDOWEXTWM)
if (!g_ScreenInfo[g_iLastScreen].fMultiMonitorOverride)
g_ScreenInfo[g_iLastScreen].fMultipleMonitors = TRUE;
#endif
g_ScreenInfo[g_iLastScreen].fMultiWindow = TRUE;
}
return 1;
}
#endif
if (IS_OPTION ("-multiplemonitors")
|| IS_OPTION ("-multimonitors"))
{
if (-1 == g_iLastScreen)
{
int j;
for (j = 0; j < MAXSCREENS; j++)
{
#if defined(XWIN_MULTIWINDOW) || defined(XWIN_MULTIWINDOWEXTWM)
g_ScreenInfo[j].fMultiMonitorOverride = TRUE;
#endif
g_ScreenInfo[j].fMultipleMonitors = TRUE;
}
}
else
{
#if defined(XWIN_MULTIWINDOW) || defined(XWIN_MULTIWINDOWEXTWM)
g_ScreenInfo[g_iLastScreen].fMultiMonitorOverride = TRUE;
#endif
g_ScreenInfo[g_iLastScreen].fMultipleMonitors = TRUE;
}
return 1;
}
if (IS_OPTION ("-nomultiplemonitors")
|| IS_OPTION ("-nomultimonitors"))
{
if (-1 == g_iLastScreen)
{
int j;
for (j = 0; j < MAXSCREENS; j++)
{
#if defined(XWIN_MULTIWINDOW) || defined(XWIN_MULTIWINDOWEXTWM)
g_ScreenInfo[j].fMultiMonitorOverride = TRUE;
#endif
g_ScreenInfo[j].fMultipleMonitors = FALSE;
}
}
else
{
#if defined(XWIN_MULTIWINDOW) || defined(XWIN_MULTIWINDOWEXTWM)
g_ScreenInfo[g_iLastScreen].fMultiMonitorOverride = TRUE;
#endif
g_ScreenInfo[g_iLastScreen].fMultipleMonitors = FALSE;
}
return 1;
}
if (IS_OPTION ("-scrollbars"))
{
if (-1 == g_iLastScreen)
{
int j;
for (j = 0; j < MAXSCREENS; j++)
{
g_ScreenInfo[j].fScrollbars = TRUE;
}
}
else
{
g_ScreenInfo[g_iLastScreen].fScrollbars = TRUE;
}
return 1;
}
#ifdef XWIN_CLIPBOARD
if (IS_OPTION ("-clipboard"))
{
g_fClipboard = TRUE;
return 1;
}
#endif
if (IS_OPTION ("-ignoreinput"))
{
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 (IS_OPTION ("-emulate3buttons"))
{
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 (IS_OPTION ("-depth"))
{
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 (IS_OPTION ("-refresh"))
{
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 (IS_OPTION ("-clipupdates"))
{
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;
}
#ifdef XWIN_EMULATEPSEUDO
if (IS_OPTION ("-emulatepseudo"))
{
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;
}
#endif
if (IS_OPTION ("-nowinkill"))
{
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 (IS_OPTION ("-winkill"))
{
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 (IS_OPTION ("-nounixkill"))
{
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 (IS_OPTION ("-unixkill"))
{
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 (IS_OPTION ("-notrayicon"))
{
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 (IS_OPTION ("-trayicon"))
{
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_fXdmcpEnabled = TRUE;
g_pszQueryHost = argv[++i];
return 0;
}
if (IS_OPTION ("-indirect")
|| IS_OPTION ("-broadcast"))
{
g_fXdmcpEnabled = TRUE;
return 0;
}
if (IS_OPTION ("-config")
|| IS_OPTION ("-xf86config"))
{
CHECK_ARGS (1);
#ifdef XWIN_XF86CONFIG
g_cmdline.configFile = argv[++i];
#else
winMessageBoxF ("The %s option is not supported in this "
"release.\n"
"Ignoring this option and continuing.\n",
MB_ICONINFORMATION,
argv[i]);
#endif
return 2;
}
if (IS_OPTION ("-keyboard"))
{
#ifdef XWIN_XF86CONFIG
CHECK_ARGS (1);
g_cmdline.keyboard = argv[++i];
#else
winMessageBoxF ("The -keyboard option is not supported in this "
"release.\n"
"Ignoring this option and continuing.\n",
MB_ICONINFORMATION);
#endif
return 2;
}
if (IS_OPTION ("-logfile"))
{
CHECK_ARGS (1);
g_pszLogFile = argv[++i];
#ifdef RELOCATE_PROJECTROOT
g_fLogFileChanged = TRUE;
#endif
return 2;
}
if (IS_OPTION ("-logverbose"))
{
CHECK_ARGS (1);
g_iLogVerbose = atoi(argv[++i]);
return 2;
}
#ifdef XWIN_CLIPBOARD
if (IS_OPTION ("-nounicodeclipboard"))
{
g_fUnicodeClipboard = FALSE;
return 1;
}
#endif
#ifdef XKB
if (IS_OPTION ("-kb"))
{
g_cmdline.noXkbExtension = TRUE;
return 0;
}
if (IS_OPTION ("-xkbrules"))
{
CHECK_ARGS (1);
g_cmdline.xkbRules = argv[++i];
return 2;
}
if (IS_OPTION ("-xkbmodel"))
{
CHECK_ARGS (1);
g_cmdline.xkbModel = argv[++i];
return 2;
}
if (IS_OPTION ("-xkblayout"))
{
CHECK_ARGS (1);
g_cmdline.xkbLayout = argv[++i];
return 2;
}
if (IS_OPTION ("-xkbvariant"))
{
CHECK_ARGS (1);
g_cmdline.xkbVariant = argv[++i];
return 2;
}
if (IS_OPTION ("-xkboptions"))
{
CHECK_ARGS (1);
g_cmdline.xkbOptions = argv[++i];
return 2;
}
#endif
if (IS_OPTION ("-keyhook"))
{
g_fKeyboardHookLL = TRUE;
return 1;
}
if (IS_OPTION ("-nokeyhook"))
{
g_fKeyboardHookLL = FALSE;
return 1;
}
if (IS_OPTION ("-swcursor"))
{
g_fSoftwareCursor = TRUE;
return 1;
}
if (IS_OPTION ("-silent-dup-error"))
{
g_fSilentDupError = TRUE;
return 1;
}
return 0;
}
void
winLogCommandLine (int argc, char *argv[])
{
int i;
int iSize = 0;
int iCurrLen = 0;
#define CHARS_PER_LINE 60
if (g_pszCommandLine)
return;
for (i = 0, iCurrLen = 0; i < argc; ++i)
if (argv[i])
{
if ((strlen (argv[i]) < CHARS_PER_LINE
&& iCurrLen + strlen (argv[i]) > CHARS_PER_LINE)
|| strlen (argv[i]) > CHARS_PER_LINE)
{
iCurrLen = 0;
++iSize;
}
iSize += strlen (argv[i]) + 1;
iCurrLen += strlen (argv[i]);
}
g_pszCommandLine = malloc (iSize + 1);
if (!g_pszCommandLine)
FatalError ("winLogCommandLine - Could not allocate memory for "
"command line string. Exiting.\n");
g_pszCommandLine[0] = '\0';
for (i = 0, iCurrLen = 0; i < argc; ++i)
{
if ((strlen (argv[i]) < CHARS_PER_LINE
&& iCurrLen + strlen (argv[i]) > CHARS_PER_LINE)
|| strlen (argv[i]) > CHARS_PER_LINE)
{
iCurrLen = 0;
strncat (g_pszCommandLine, "\n", iSize - strlen (g_pszCommandLine));
}
strncat (g_pszCommandLine, argv[i], iSize - strlen (g_pszCommandLine));
strncat (g_pszCommandLine, " ", iSize - strlen (g_pszCommandLine));
iCurrLen += strlen (argv[i]);
}
ErrorF ("XWin was started with the following command line:\n\n"
"%s\n\n", g_pszCommandLine);
}
void
winLogVersionInfo (void)
{
static Bool s_fBeenHere = FALSE;
if (s_fBeenHere)
return;
s_fBeenHere = TRUE;
ErrorF ("Welcome to the XWin X Server\n");
ErrorF ("Vendor: %s\n", VENDOR_STRING);
ErrorF ("Release: %s\n\n", VERSION_STRING);
ErrorF ("Contact: %s\n\n", VENDOR_CONTACT);
}
wBOOL CALLBACK getMonitorInfo(HMONITOR hMonitor, HDC hdc, LPRECT rect, LPARAM _data)
{
struct GetMonitorInfoData* data = (struct GetMonitorInfoData*)_data;
data->monitorNum++;
if (data->monitorNum == data->requestedMonitor)
{
data->bMonitorSpecifiedExists = TRUE;
data->monitorOffsetX = rect->left;
data->monitorOffsetY = rect->top;
data->monitorHeight = rect->bottom - rect->top;
data->monitorWidth = rect->right - rect->left;
return FALSE;
}
return TRUE;
}