Add mode to draw PNG piece images through cairo
[xboard.git] / args.h
diff --git a/args.h b/args.h
index 0ae9f7c..147f8bb 100644 (file)
--- a/args.h
+++ b/args.h
@@ -104,6 +104,9 @@ IcsTextMenuEntry icsTextMenuEntry[ICS_TEXT_MENU_SIZE];
 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);
@@ -141,6 +144,7 @@ ArgDescriptor argDescriptors[] = {
   { "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 */
@@ -172,6 +176,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 },
@@ -209,6 +215,8 @@ ArgDescriptor argDescriptors[] = {
   { "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 },
@@ -224,12 +232,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 },
@@ -542,12 +551,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 },
@@ -733,10 +742,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 },
@@ -865,7 +870,7 @@ ParseArgs(GetFunc get, void *cl)
   char *q;
   int i, octval;
   char ch;
-  int posarg = 3; // default is game file
+  int posarg = 4; // default is game file
 
   ch = get(cl);
   for (;;) {
@@ -1041,6 +1046,8 @@ ParseArgs(GetFunc get, void *cl)
         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;
       }
@@ -1269,7 +1276,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();
@@ -1284,6 +1291,8 @@ InitAppData(char *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 ||
@@ -1335,6 +1344,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) ||
@@ -1380,6 +1395,7 @@ SaveSettings(char* name)
   FILE *f;
   ArgDescriptor *ad;
   char dir[MSG_SIZ], buf[MSG_SIZ];
+  int mps = appData.movesPerSession;
 
   if (!MainWindowUp()) return;
 
@@ -1418,6 +1434,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) {
@@ -1499,6 +1517,7 @@ SaveSettings(char* name)
     }
   }
   fclose(f);
+  appData.movesPerSession = mps;
 }
 
 Boolean