Add Themes dialog (WB)
[xboard.git] / args.h
diff --git a/args.h b/args.h
index 613f0a4..acfb8f7 100644 (file)
--- a/args.h
+++ b/args.h
@@ -104,6 +104,10 @@ IcsTextMenuEntry icsTextMenuEntry[ICS_TEXT_MENU_SIZE];
 int junk;
 Boolean singleList;
 char *homeDir;
+char *firstEngineLine;
+char *secondEngineLine;
+char *icsNick;
+char *theme;
 
 void EnsureOnScreen(int *x, int *y, int minX, int minY);
 char StringGet(void *getClosure);
@@ -123,8 +127,6 @@ void SaveColor(FILE *f, ArgDescriptor *ad);
 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);
@@ -140,6 +142,10 @@ char *defaultTextAttribs[] =
 
 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 */
@@ -171,6 +177,8 @@ ArgDescriptor argDescriptors[] = {
   { "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 },
@@ -188,6 +196,7 @@ ArgDescriptor argDescriptors[] = {
   { "secondDirectory", ArgFilename, (void *) &appData.secondDirectory, FALSE, (ArgIniType) SECOND_DIRECTORY },
   { "sd", ArgFilename, (void *) &appData.secondDirectory, FALSE, INVALID },
   { "variations", ArgBoolean, (void *) &appData.variations, TRUE, (ArgIniType) FALSE },
+  { "theme", ArgString, (void *) &theme, FALSE, (ArgIniType) "" },
 
   /* some options only used by the XBoard front end, and ignored in WinBoard         */
   /* Their saving is controlled by XBOARD, which in WinBoard is defined as FALSE */
@@ -204,10 +213,9 @@ ArgDescriptor argDescriptors[] = {
   { "xtitle", ArgFalse, (void *) &appData.titleInWindow, FALSE, INVALID },
   { "flashCount", ArgInt, (void *) &appData.flashCount, XBOARD, INVALID }, // let X handle this
   { "flashRate", ArgInt, (void *) &appData.flashRate, XBOARD, (ArgIniType) FLASH_RATE },
-  { "pixmapDirectory", ArgFilename, (void *) &appData.pixmapDirectory, XBOARD, (ArgIniType) "" },
-  { "pixmap", ArgFilename, (void *) &appData.pixmapDirectory, FALSE, INVALID },
-  { "bitmapDirectory", ArgFilename, (void *) &appData.bitmapDirectory, XBOARD, (ArgIniType) "" },
-  { "bm", ArgFilename, (void *) &appData.bitmapDirectory, FALSE, INVALID },
+  { "pieceImageDirectory", ArgFilename, (void *) &appData.pieceDirectory, TRUE, (ArgIniType) "" },
+  { "pid", ArgFilename, (void *) &appData.pieceDirectory, FALSE, INVALID },
+  { "trueColors", ArgBoolean, (void *) &appData.trueColors, TRUE, (ArgIniType) FALSE },
   { "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 },
@@ -223,12 +231,13 @@ ArgDescriptor argDescriptors[] = {
   { "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 },
@@ -491,6 +500,7 @@ ArgDescriptor argDescriptors[] = {
     TRUE, (ArgIniType) FCP_NAMES },
   { "secondChessProgramNames", ArgString, (void *) &secondChessProgramNames,
     !XBOARD, (ArgIniType) SCP_NAMES },
+  { "themeNames", ArgString, (void *) &appData.themeNames, !XBOARD, (ArgIniType) "native -upf false -ub false -ubt false -pid \"\"\n" },
   { "initialMode", ArgString, (void *) &appData.initialMode, FALSE, (ArgIniType) "" },
   { "mode", ArgString, (void *) &appData.initialMode, FALSE, INVALID },
   { "variant", ArgString, (void *) &appData.variant, FALSE, (ArgIniType) "normal" },
@@ -506,16 +516,24 @@ ArgDescriptor argDescriptors[] = {
   { "secondScoreAbs", ArgBoolean, (void *) &appData.secondScoreIsAbsolute, FALSE, (ArgIniType) FALSE },
   { "pgnExtendedInfo", ArgBoolean, (void *) &appData.saveExtendedInfoInPGN, TRUE, (ArgIniType) FALSE },
   { "hideThinkingFromHuman", ArgBoolean, (void *) &appData.hideThinkingFromHuman, TRUE, (ArgIniType) FALSE },
-  { "liteBackTextureFile", ArgString, (void *) &appData.liteBackTextureFile, TRUE, (ArgIniType) "" },
-  { "darkBackTextureFile", ArgString, (void *) &appData.darkBackTextureFile, TRUE, (ArgIniType) "" },
+  { "liteBackTextureFile", ArgFilename, (void *) &appData.liteBackTextureFile, TRUE, (ArgIniType) "" },
+  { "lbtf", ArgFilename, (void *) &appData.liteBackTextureFile, FALSE, INVALID },
+  { "darkBackTextureFile", ArgFilename, (void *) &appData.darkBackTextureFile, TRUE, (ArgIniType) "" },
+  { "dbtf", ArgFilename, (void *) &appData.darkBackTextureFile, FALSE, INVALID },
   { "liteBackTextureMode", ArgInt, (void *) &appData.liteBackTextureMode, TRUE, (ArgIniType) BACK_TEXTURE_MODE_PLAIN },
+  { "lbtm", ArgInt, (void *) &appData.liteBackTextureMode, FALSE, INVALID },
   { "darkBackTextureMode", ArgInt, (void *) &appData.darkBackTextureMode, TRUE, (ArgIniType) BACK_TEXTURE_MODE_PLAIN },
+  { "dbtm", ArgInt, (void *) &appData.darkBackTextureMode, FALSE, INVALID },
   { "renderPiecesWithFont", ArgString, (void *) &appData.renderPiecesWithFont, TRUE, (ArgIniType) "" },
+  { "pf", ArgString, (void *) &appData.renderPiecesWithFont, FALSE, INVALID },
   { "fontPieceToCharTable", ArgString, (void *) &appData.fontToPieceTable, TRUE, (ArgIniType) "" },
+  { "fptc", ArgString, (void *) &appData.fontToPieceTable, FALSE, INVALID },
   { "fontPieceBackColorWhite", ArgColor, (void *) 8, TRUE, (ArgIniType) WHITE_PIECE_COLOR },
   { "fontPieceForeColorWhite", ArgColor, (void *) 9, TRUE, (ArgIniType) WHITE_PIECE_COLOR },
   { "fontPieceBackColorBlack", ArgColor, (void *) 10, TRUE, (ArgIniType) BLACK_PIECE_COLOR },
   { "fontPieceForeColorBlack", ArgColor, (void *) 11, TRUE, (ArgIniType) BLACK_PIECE_COLOR },
+  { "fpfcw", ArgColor, (void *) 9, FALSE, INVALID },
+  { "fpbcb", ArgColor, (void *) 10, FALSE, INVALID },
   { "fontPieceSize", ArgInt, (void *) &appData.fontPieceSize, TRUE, (ArgIniType) 80 },
   { "overrideLineGap", ArgInt, (void *) &appData.overrideLineGap, TRUE, (ArgIniType) 1 },
   { "adjudicateLossThreshold", ArgInt, (void *) &appData.adjudicateLossThreshold, TRUE, (ArgIniType) 0 },
@@ -541,12 +559,12 @@ ArgDescriptor argDescriptors[] = {
   { "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 },
@@ -567,7 +585,12 @@ ArgDescriptor argDescriptors[] = {
   { "language", ArgFilename, (void *) &appData.language, TRUE, (ArgIniType) "" },
   { "userFileDirectory", ArgFilename, (void *) &homeDir, FALSE, (ArgIniType) installDir },
   { "usePieceFont", ArgBoolean, (void *) &appData.useFont, TRUE, (ArgIniType) FALSE },
+  { "upf", ArgBoolean, (void *) &appData.useFont, FALSE, INVALID },
   { "useBoardTexture", ArgBoolean, (void *) &appData.useBitmaps, TRUE, (ArgIniType) FALSE },
+  { "ubt", ArgBoolean, (void *) &appData.useBitmaps, FALSE, INVALID },
+  { "useBorder", ArgBoolean, (void *) &appData.useBorder, TRUE, (ArgIniType) FALSE },
+  { "ub", ArgBoolean, (void *) &appData.useBorder, FALSE, INVALID },
+  { "border", ArgFilename, (void *) &appData.border, TRUE, (ArgIniType) "" },
 
   // [HGM] tournament options
   { "tourneyFile", ArgFilename, (void *) &appData.tourneyFile, FALSE, (ArgIniType) "" },
@@ -616,8 +639,10 @@ ArgDescriptor argDescriptors[] = {
   { "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) "" },
@@ -651,7 +676,11 @@ ArgDescriptor argDescriptors[] = {
   { "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 },
@@ -713,9 +742,10 @@ ArgDescriptor argDescriptors[] = {
   { "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
@@ -725,10 +755,6 @@ ArgDescriptor argDescriptors[] = {
   { "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 },
@@ -857,10 +883,11 @@ ParseArgs(GetFunc get, void *cl)
   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 == ';') {
@@ -891,6 +918,7 @@ ParseArgs(GetFunc get, void *cl)
     } else {
       /* Positional argument */
       ad = &argDescriptors[posarg++];
+      posflag++;
       strncpy(argName, ad->argName,sizeof(argName)/sizeof(argName[0]));
     }
 
@@ -1013,13 +1041,32 @@ ParseArgs(GetFunc get, void *cl)
        }
       }
     } 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);
@@ -1242,7 +1289,7 @@ InitAppData(char *lpCmdLine)
 
   // 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();
@@ -1256,6 +1303,9 @@ InitAppData(char *lpCmdLine)
   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 ||
@@ -1307,6 +1357,12 @@ InitAppData(char *lpCmdLine)
   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) ||
@@ -1352,6 +1408,7 @@ SaveSettings(char* name)
   FILE *f;
   ArgDescriptor *ad;
   char dir[MSG_SIZ], buf[MSG_SIZ];
+  int mps = appData.movesPerSession;
 
   if (!MainWindowUp()) return;
 
@@ -1390,6 +1447,8 @@ SaveSettings(char* name)
   // [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) {
@@ -1471,6 +1530,7 @@ SaveSettings(char* name)
     }
   }
   fclose(f);
+  appData.movesPerSession = mps;
 }
 
 Boolean