int junk;
Boolean singleList;
char *homeDir;
+char *firstEngineLine;
+char *secondEngineLine;
+char *icsNick;
void EnsureOnScreen(int *x, int *y, int minX, int minY);
char StringGet(void *getClosure);
void SaveBoardSize(FILE *f, char *name, void *addr);
void PrintCommPortSettings(FILE *f, char *name);
void GetWindowCoords();
-int MySearchPath(char *installDir, char *name, char *fullname);
-int MyGetFullPathName(char *name, char *fullname);
int MainWindowUp();
void PopUpStartupDialog();
typedef char GetFunc(void *getClosure);
ArgDescriptor argDescriptors[] = {
/* positional arguments */
+ { "opt", ArgSettingsFilename, (void *) NULL, FALSE, INVALID },
+ { "loadPositionFile", ArgFilename, (void *) &appData.loadPositionFile, FALSE, INVALID },
+ { "tourneyFile", ArgFilename, (void *) &appData.tourneyFile, FALSE, INVALID },
+ { "is", ArgString, (void *) &icsNick, FALSE, INVALID },
{ "loadGameFile", ArgFilename, (void *) &appData.loadGameFile, FALSE, INVALID },
{ "", ArgNone, NULL, FALSE, INVALID },
/* keyword arguments */
{ "secondChessProgram", ArgFilename, (void *) &appData.secondChessProgram,
FALSE, (ArgIniType) SECOND_CHESS_PROGRAM },
{ "scp", ArgFilename, (void *) &appData.secondChessProgram, FALSE, INVALID },
+ { "fe", ArgString, (void *) &firstEngineLine, FALSE, "" },
+ { "se", ArgString, (void *) &secondEngineLine, FALSE, "" },
{ "firstPlaysBlack", ArgBoolean, (void *) &appData.firstPlaysBlack, FALSE, FALSE },
{ "fb", ArgTrue, (void *) &appData.firstPlaysBlack, FALSE, FALSE },
{ "xfb", ArgFalse, (void *) &appData.firstPlaysBlack, FALSE, INVALID },
{ "pixmap", ArgFilename, (void *) &appData.pixmapDirectory, FALSE, INVALID },
{ "bitmapDirectory", ArgFilename, (void *) &appData.bitmapDirectory, XBOARD, (ArgIniType) "" },
{ "bm", ArgFilename, (void *) &appData.bitmapDirectory, FALSE, INVALID },
+ { "pngDirectory", ArgFilename, (void *) &appData.pngDirectory, XBOARD, (ArgIniType) "" },
+ { "png", ArgFilename, (void *) &appData.pngDirectory, FALSE, INVALID },
{ "soundDirectory", ArgFilename, (void *) &appData.soundDirectory, XBOARD, (ArgIniType) "" },
{ "msLoginDelay", ArgInt, (void *) &appData.msLoginDelay, XBOARD, (ArgIniType) MS_LOGIN_DELAY },
{ "pasteSelection", ArgBoolean, (void *) &appData.pasteSelection, XBOARD, (ArgIniType) FALSE },
{ "td", ArgFloat, (void *) &appData.timeDelay, FALSE, INVALID },
{ "timeControl", ArgString, (void *) &appData.timeControl, TRUE, (ArgIniType) TIME_CONTROL },
{ "tc", ArgString, (void *) &appData.timeControl, FALSE, INVALID },
- { "timeIncrement", ArgFloat, (void *) &appData.timeIncrement, TRUE, INVALID },
+ { "timeIncrement", ArgFloat, (void *) &appData.timeIncrement, FALSE, INVALID },
{ "inc", ArgFloat, (void *) &appData.timeIncrement, FALSE, INVALID },
{ "internetChessServerMode", ArgBoolean, (void *) &appData.icsActive, FALSE, INVALID },
{ "ics", ArgTrue, (void *) &appData.icsActive, FALSE, (ArgIniType) FALSE },
{ "xics", ArgFalse, (void *) &appData.icsActive, FALSE, INVALID },
{ "-ics", ArgFalse, (void *) &appData.icsActive, FALSE, INVALID },
+ { "is", ArgString, (void *) &icsNick, FALSE, "" },
{ "internetChessServerHost", ArgString, (void *) &appData.icsHost, FALSE, (ArgIniType) "" },
{ "icshost", ArgString, (void *) &appData.icsHost, FALSE, INVALID },
{ "internetChessServerPort", ArgString, (void *) &appData.icsPort, FALSE, (ArgIniType) ICS_PORT },
{ "fUCI", ArgTrue, (void *) &appData.firstIsUCI, FALSE, INVALID },
{ "firstUCI", ArgTrue, (void *) &appData.firstIsUCI, FALSE, INVALID },
{ "secondIsUCI", ArgBoolean, (void *) &appData.secondIsUCI, FALSE, (ArgIniType) FALSE },
+ { "secondUCI", ArgTrue, (void *) &appData.secondIsUCI, FALSE, INVALID },
{ "sUCI", ArgTrue, (void *) &appData.secondIsUCI, FALSE, INVALID },
{ "fUCCI", ArgTwo, (void *) &appData.firstIsUCI, FALSE, INVALID },
{ "sUCCI", ArgTwo, (void *) &appData.secondIsUCI, FALSE, INVALID },
{ "fUSI", ArgTwo, (void *) &appData.firstIsUCI, FALSE, INVALID },
{ "sUSI", ArgTwo, (void *) &appData.secondIsUCI, FALSE, INVALID },
- { "secondUCI", ArgTrue, (void *) &appData.secondIsUCI, FALSE, INVALID },
{ "firstHasOwnBookUCI", ArgBoolean, (void *) &appData.firstHasOwnBookUCI, FALSE, (ArgIniType) TRUE },
{ "fNoOwnBookUCI", ArgFalse, (void *) &appData.firstHasOwnBookUCI, FALSE, INVALID },
{ "firstXBook", ArgFalse, (void *) &appData.firstHasOwnBookUCI, FALSE, INVALID },
{ "smpCores", ArgInt, (void *) &appData.smpCores, TRUE, (ArgIniType) 1 },
{ "egtFormats", ArgString, (void *) &appData.egtFormats, TRUE, (ArgIniType) "" },
{ "niceEngines", ArgInt, (void *) &appData.niceEngines, TRUE, INVALID },
- { "firstLogo", ArgFilename, (void *) &appData.firstLogo, FALSE, INVALID },
- { "secondLogo", ArgFilename, (void *) &appData.secondLogo, FALSE, INVALID },
+ { "logoSize", ArgInt, (void *) &appData.logoSize, XBOARD, INVALID },
+ { "logoDir", ArgFilename, (void *) &appData.logoDir, XBOARD, (ArgIniType) "." },
+ { "firstLogo", ArgFilename, (void *) &appData.firstLogo, FALSE, (ArgIniType) "" },
+ { "secondLogo", ArgFilename, (void *) &appData.secondLogo, FALSE, (ArgIniType) "" },
{ "autoLogo", ArgBoolean, (void *) &appData.autoLogo, TRUE, INVALID },
{ "firstOptions", ArgString, (void *) &appData.firstOptions, FALSE, (ArgIniType) "" },
{ "secondOptions", ArgString, (void *) &appData.secondOptions, FALSE, (ArgIniType) "" },
{ "findMirrorImage", ArgBoolean, (void *) &appData.findMirror, FALSE, FALSE },
{ "viewer", ArgTrue, (void *) &appData.viewer, FALSE, FALSE },
{ "viewerOptions", ArgString, (void *) &appData.viewerOptions, TRUE, (ArgIniType) "-ncp -engineOutputUp false -saveSettingsOnExit false" },
+ { "tourneyOptions", ArgString, (void *) &appData.tourneyOptions, TRUE, (ArgIniType) "-ncp -mm -saveSettingsOnExit false" },
{ "autoCopyPV", ArgBoolean, (void *) &appData.autoCopyPV, TRUE, FALSE },
+ { "topLevel", ArgBoolean, (void *) &appData.topLevel, XBOARD, (ArgIniType) TOPLEVEL },
+ { "dialogColor", ArgString, (void *) &appData.dialogColor, XBOARD, (ArgIniType) "" },
+ { "buttonColor", ArgString, (void *) &appData.buttonColor, XBOARD, (ArgIniType) "" },
#if ZIPPY
{ "zippyTalk", ArgBoolean, (void *) &appData.zippyTalk, FALSE, (ArgIniType) ZIPPY_TALK },
/* [HGM] options for broadcasting and time odds */
{ "chatBoxes", ArgString, (void *) &appData.chatBoxes, !XBOARD, (ArgIniType) NULL },
{ "serverMoves", ArgString, (void *) &appData.serverMovesName, FALSE, (ArgIniType) NULL },
+ { "serverFile", ArgString, (void *) &appData.serverFileName, FALSE, (ArgIniType) NULL },
{ "suppressLoadMoves", ArgBoolean, (void *) &appData.suppressLoadMoves, FALSE, (ArgIniType) FALSE },
{ "serverPause", ArgInt, (void *) &appData.serverPause, FALSE, (ArgIniType) 15 },
{ "firstTimeOdds", ArgInt, (void *) &appData.firstTimeOdds, FALSE, (ArgIniType) 1 },
{ "keepLineBreaksICS", ArgBoolean, (void *) &appData.noJoin, TRUE, INVALID },
{ "wrapContinuationSequence", ArgString, (void *) &appData.wrapContSeq, FALSE, INVALID },
{ "useInternalWrap", ArgTrue, (void *) &appData.useInternalWrap, FALSE, INVALID }, /* noJoin usurps this if set */
+ { "openCommand", ArgString, (void *) &appData.sysOpen, FALSE, "xdg-open" },
// [HGM] placement: put all window layouts last in ini file, but man X,Y before all others
- { "minX", ArgZ, (void *) &minX, FALSE, INVALID }, // [HGM] placement: to make suer auxialary windows can be placed
+ { "minX", ArgZ, (void *) &minX, FALSE, INVALID }, // [HGM] placement: to make sure auxiliary windows can be placed
{ "minY", ArgZ, (void *) &minY, FALSE, INVALID },
{ "winWidth", ArgInt, (void *) &wpMain.width, TRUE, INVALID }, // [HGM] placement: dummies to remember right & bottom
{ "winHeight", ArgInt, (void *) &wpMain.height, TRUE, INVALID }, // for attaching auxiliary windows to them
{ "icsY", ArgY, (void *) &wpConsole.y, TRUE, (ArgIniType) CW_USEDEFAULT },
{ "icsW", ArgInt, (void *) &wpConsole.width, TRUE, (ArgIniType) CW_USEDEFAULT },
{ "icsH", ArgInt, (void *) &wpConsole.height, TRUE, (ArgIniType) CW_USEDEFAULT },
- { "analysisX", ArgX, (void *) &junk, FALSE, INVALID }, // [HGM] placement: analysis window no longer exists
- { "analysisY", ArgY, (void *) &junk, FALSE, INVALID }, // provided for compatibility with old ini files
- { "analysisW", ArgInt, (void *) &junk, FALSE, INVALID },
- { "analysisH", ArgInt, (void *) &junk, FALSE, INVALID },
{ "commentX", ArgX, (void *) &wpComment.x, TRUE, (ArgIniType) CW_USEDEFAULT },
{ "commentY", ArgY, (void *) &wpComment.y, TRUE, (ArgIniType) CW_USEDEFAULT },
{ "commentW", ArgInt, (void *) &wpComment.width, TRUE, (ArgIniType) CW_USEDEFAULT },
char *q;
int i, octval;
char ch;
- int posarg = 0;
+ int posarg = 4; // default is game file
ch = get(cl);
for (;;) {
+ int posflag = 0;
while (ch == ' ' || ch == '\n' || ch == '\t') ch = get(cl);
if (ch == NULLCHAR) break;
if (ch == ';') {
} else {
/* Positional argument */
ad = &argDescriptors[posarg++];
+ posflag++;
strncpy(argName, ad->argName,sizeof(argName)/sizeof(argName[0]));
}
}
}
} else {
- while (ch != ' ' && ch != NULLCHAR && ch != '\t' && ch != '\n') {
+ while ((ch != ' ' || posflag) && ch != NULLCHAR && ch != '\t' && ch != '\n') { // space allowed in positional arg
*q++ = ch;
ch = get(cl);
}
}
*q = NULLCHAR;
+ if(posflag) { // positional argument: the argName was implied, and per default set as -lgf
+ int len = strlen(argValue) - 4; // start of filename extension
+ if(len < 0) len = 0;
+ if(!strcasecmp(argValue + len, ".trn")) {
+ ad = &argDescriptors[2]; // correct implied type to -tf
+ appData.tourney = TRUE; // let it parse -tourneyOptions later
+ } else if(!strcasecmp(argValue + len, ".fen") || !strcasecmp(argValue + len, ".epd")) {
+ ad = &argDescriptors[1]; // correct implied type to -lpf
+ appData.viewer = TRUE;
+ } else if(!strcasecmp(argValue + len, ".ini") || !strcasecmp(argValue + len, ".xop")) {
+ ad = &argDescriptors[0]; // correct implied type to -opt
+ } else if(GetEngineLine(argValue, 11)) {
+ ad = &argDescriptors[3]; // correct implied type to -is
+ } else { // keep default -lgf, but let it imply viewer mode as well
+ appData.viewer = TRUE;
+ }
+ strncpy(argName, ad->argName,sizeof(argName)/sizeof(argName[0]));
+ }
+
switch (ad->argType) {
case ArgInt:
*(int *) ad->argLoc = ValidateInt(argValue);
// float: casting to int is not harmless, so default cannot be contained in table
appData.timeDelay = TIME_DELAY;
- appData.timeIncrement = TIME_INCREMENT;
+ appData.timeIncrement = -314159;
// some complex, platform-dependent stuff that could not be handled from table
SetDefaultTextAttribs();
ParseArgs(StringGet, &lpCmdLine);
if(appData.viewer && appData.viewerOptions[0]) ParseArgsFromString(appData.viewerOptions);
+ if(appData.tourney && appData.tourneyOptions[0]) ParseArgsFromString(appData.tourneyOptions);
+ chessProgram |= GetEngineLine(firstEngineLine, 0) || GetEngineLine(secondEngineLine, 1);
+ appData.icsActive |= GetEngineLine(icsNick, 10);
/* [HGM] make sure board size is acceptable */
if(appData.NrFiles > BOARD_FILES ||
if (appData.icsActive || appData.noChessProgram) {
chessProgram = FALSE; /* not local chess program mode */
}
+ if(appData.timeIncrement == -314159) { // new storage mechanism of (mps,inc) in use and no -inc on command line
+ if(appData.movesPerSession <= 0) { // new encoding of incremental mode
+ appData.timeIncrement = -appData.movesPerSession/1000.;
+ } else appData.timeIncrement = -1;
+ }
+ if(appData.movesPerSession <= 0) appData.movesPerSession = MOVES_PER_SESSION; // mps <= 0 is invalid in any case
/* Open startup dialog if needed */
if ((!appData.noChessProgram && !chessProgram && !appData.icsActive) ||
FILE *f;
ArgDescriptor *ad;
char dir[MSG_SIZ], buf[MSG_SIZ];
+ int mps = appData.movesPerSession;
if (!MainWindowUp()) return;
// [HGM] in WB we have to copy sound names to appData first
ExportSounds();
+ if(appData.timeIncrement >= 0) appData.movesPerSession = -1000*appData.timeIncrement; // kludge to store mps & inc as one
+
for (ad = argDescriptors; ad->argName != NULL; ad++) {
if (!ad->save) continue;
switch (ad->argType) {
}
}
fclose(f);
+ appData.movesPerSession = mps;
}
Boolean