Add partcipants at bottom in tourney dialog (WB)
[xboard.git] / xoptions.c
index a2aee19..3ea1195 100644 (file)
@@ -698,11 +698,11 @@ void CreateComboPopup(parent, name, n, mb)
                              parent, NULL, 0);
     j = 0;
     XtSetArg(args[j], XtNwidth, 100);  j++;
-    XtSetArg(args[j], XtNlabel, _(mb[i]));  j++;
 //    XtSetArg(args[j], XtNright, XtChainRight);  j++;
     while (mb[i] != NULL) {
+           XtSetArg(args[j], XtNlabel, _(mb[i]));
            entry = XtCreateManagedWidget(mb[i], smeBSBObjectClass,
-                                         menu, args, j);
+                                         menu, args, j+1);
            XtAddCallback(entry, XtNcallback,
                          (XtCallbackProc) ComboSelect,
                          (caddr_t)(intptr_t) (256*n+i));
@@ -775,15 +775,49 @@ void GenericPopDown(w, event, prms, nprms)
     PopDown(prms[0][0] - '0');
 }
 
+char *engineName, *engineDir, *engineChoice, *engineLine, *nickName, *params;
+Boolean isUCI, hasBook, storeVariant, v1, addToList;
+extern Option installOptions[], matchOptions[];
+char *engineNr[] = { N_("First Engine"), N_("Second Engine"), NULL };
+char *engineList[100] = {" "}, *engineMnemonic[100] = {""};
+
+void AddToTourney(int n)
+{
+    Arg args[2];
+    char *p, *val, buf[10000];
+    XawTextBlock t;
+
+    GenericReadout(4);  // selected engine
+    t.ptr = engineChoice; t.firstPos = 0; t.length = strlen(engineChoice); t.format = XawFmt8Bit;
+    XawTextReplace(matchOptions[3].handle, 9999, 9999, &t);
+    t.ptr = "\n"; t.length = 1;
+    XawTextReplace(matchOptions[3].handle, 9999, 9999, &t);
+}
+
+void MatchOK(int n)
+{
+    if(appData.participants && appData.participants[0]) free(appData.participants);
+    appData.participants = strdup(engineName);
+    PopDown(0); // early popdown to prevent FreezeUI called through MatchEvent from causing XtGrab warning
+    if(CreateTourney(appData.tourneyFile)) MatchEvent(2); // start tourney
+}
+
 Option matchOptions[] = {
-{ 0,  2, 1000000000, NULL, (void*) &appData.defaultMatchGames, "", NULL, Spin, N_("Default Number of Games in Match:") },
+{ 0,  0,          0, NULL, (void*) &appData.tourneyFile, "", NULL, FileName, N_("Tournament file:") },
+{ 0,  0,          0, NULL, (void*) &appData.roundSync, "", NULL, CheckBox, N_("Sync after round    (for concurrent playing of a single") },
+{ 0,  0,          0, NULL, (void*) &appData.cycleSync, "", NULL, CheckBox, N_("Sync after cycle      tourney with multiple XBoards)") },
+{ 0xD, 150,       0, NULL, (void*) &engineName, "", NULL, TextBox, "Tourney participants:" },
+{ 0,  1,          0, NULL, (void*) &engineChoice, (char*) (engineMnemonic+1), (engineMnemonic+1), ComboBox, N_("Select Engine:") },
+{ 0,  0,         10, NULL, (void*) &appData.tourneyType, "", NULL, Spin, N_("Tourney type (0 = round-robin, 1 = gauntlet):") },
+{ 0,  1, 1000000000, NULL, (void*) &appData.tourneyCycles, "", NULL, Spin, N_("Number of tourney cycles:") },
+{ 0,  1, 1000000000, NULL, (void*) &appData.defaultMatchGames, "", NULL, Spin, N_("Default Number of Games in Match (or Pairing):") },
 { 0,  0, 1000000000, NULL, (void*) &appData.matchPause, "", NULL, Spin, N_("Pause between Match Games (msec):") },
 { 0,  0,          0, NULL, (void*) &appData.loadGameFile, "", NULL, FileName, N_("Game File with Opening Lines:") },
 { 0, -2, 1000000000, NULL, (void*) &appData.loadGameIndex, "", NULL, Spin, N_("Game Number (-1 or -2 = Auto-Increment):") },
 { 0,  0,          0, NULL, (void*) &appData.loadPositionFile, "", NULL, FileName, N_("File with Start Positions:") },
 { 0, -2, 1000000000, NULL, (void*) &appData.loadPositionIndex, "", NULL, Spin, N_("Position Number (-1 or -2 = Auto-Increment):") },
 { 0,  0, 1000000000, NULL, (void*) &appData.rewindIndex, "", NULL, Spin, N_("Rewind Index after this many Games (0 = never):") },
-{ 0, 0, 0, NULL, NULL, "", NULL, EndMark , "" }
+{ 0, 0, 0, NULL, (void*) &MatchOK, "", NULL, EndMark , "" }
 };
 
 void GeneralOptionsOK(int n)
@@ -1209,7 +1243,10 @@ void GenericReadout(int selected)
                        if(currentCps) {
                            snprintf(buf, MSG_SIZ,  "option %s=%s\n", currentOption[i].name, val);
                            SendToProgram(buf, currentCps);
-                       } else *dest = currentOption[i].name + 100; // option gets to point to private storage;
+                       } else {
+                           if(*dest) free(*dest);
+                           *dest = malloc(strlen(val)+1);
+                       }
                        safeStrCpy(*dest, val, MSG_SIZ - (*dest - currentOption[i].name)); // copy text there
                    }
                    break;
@@ -1719,6 +1756,8 @@ void MatchOptionsProc(w, event, prms, nprms)
      String *prms;
      Cardinal *nprms;
 {
+   NamesToList(firstChessProgramNames, engineList, engineMnemonic);
+   comboCallback = &AddToTourney;
    GenericPopUp(matchOptions, _("Match Options"), 0);
 }
 
@@ -1821,9 +1860,9 @@ void SaveChanges(int n)
 }
 
 Option commentOptions[] = {
-{ 0xD, 200, 300, NULL, (void*) &commentText, "", NULL, TextBox, "" },
-{   0,  0,    0, NULL, (void*) &ClearComment, NULL, NULL, Button, "clear" },
-{   0,  1,    0, NULL, (void*) &SaveChanges, NULL, NULL, Button, "save changes" },
+{ 0xD, 200, 250, NULL, (void*) &commentText, "", NULL, TextBox, "" },
+{   0,  0,   50, NULL, (void*) &ClearComment, NULL, NULL, Button, "clear" },
+{   0,  1,  100, NULL, (void*) &SaveChanges, NULL, NULL, Button, "save changes" },
 {   0,  1,    0, NULL, (void*) &NewComCallback, "", NULL, EndMark , "" }
 };
 
@@ -1844,7 +1883,7 @@ void NewCommentPopup(char *title, char *text, int index)
        XtSetArg(args[0], XtNstring, text);
        XtSetValues(commentOptions[0].handle, args, 1);
     }
-    commentText = text;
+    if(commentText) free(commentText); commentText = strdup(text);
     commentIndex = index;
     MarkMenu("menuView.Show Comments", 1);
     if(GenericPopUp(commentOptions, title, 1))
@@ -1868,8 +1907,8 @@ void changeTags(int n)
 
 Option tagsOptions[] = {
 {   0,  0,    0, NULL, NULL, NULL, NULL, Label,  "" },
-{ 0xD, 200, 250, NULL, (void*) &tagsText, "", NULL, TextBox, "" },
-{   0,  0,    0, NULL, (void*) &changeTags, NULL, NULL, Button, "save changes" },
+{ 0xD, 200, 200, NULL, (void*) &tagsText, "", NULL, TextBox, "" },
+{   0,  0,  100, NULL, (void*) &changeTags, NULL, NULL, Button, "save changes" },
 {   0,  1,    0, NULL, (void*) &NewTagsCallback, "", NULL, EndMark , "" }
 };
 
@@ -1882,7 +1921,7 @@ void NewTagsPopup(char *text, char *msg)
        XtSetArg(args[0], XtNstring, text);
        XtSetValues(tagsOptions[1].handle, args, 1);
     }
-    tagsText = text;
+    if(tagsText) free(tagsText); tagsText = strdup(text);
     tagsOptions[0].textValue = msg;
     MarkMenu("menuView.Show Tags", 2);
     GenericPopUp(tagsOptions, _("Tags"), 2);
@@ -1990,98 +2029,6 @@ void SecondSettingsProc(w, event, prms, nprms)
    SettingsPopUp(&second);
 }
 
-char *engineName, *engineDir, *engineChoice, *engineLine;
-Boolean isUCI, hasBook, storeVariant, v1, addToList;
-extern Option installOptions[];
-extern char *firstChessProgramNames;
-char *engineNr[] = { N_("First Engine"), N_("Second Engine"), NULL };
-char *engineList[100] = {" "}, *engineMnemonic[100] = {""};
-
-void NamesToList(char *names)
-{
-    char buf[MSG_SIZ], *p, *q;
-    int i=1;
-    while(*names) {
-       p = names; q = buf;
-       while(*p && *p != '\n') *q++ = *p++;
-       *q = 0;
-       if(engineList[i]) free(engineList[i]);
-       engineList[i] = strdup(buf);
-       if(*p == '\n') p++;
-       TidyProgramName(engineList[i], "localhost", buf);
-       if(engineMnemonic[i]) free(engineMnemonic[i]);
-       if(q = strstr(engineList[i], " -variant ")) {
-           strcat(buf, "(");
-           sscanf(q + 10, "%s", buf + strlen(buf));
-           strcat(buf, ")");
-       }
-       engineMnemonic[i] = strdup(buf);
-       names = p; i++;
-    }
-    engineList[i] = NULL;
-}
-
-// following implemented as macro to avoid type limitations
-#define SWAP(item, temp) temp = appData.item[0]; appData.item[0] = appData.item[n]; appData.item[n] = temp;
-
-void SwapEngines(int n)
-{   // swap settings for first engine and other engine (so far only some selected options)
-    int h;
-    char *p;
-    if(n == 0) return;
-    SWAP(directory, p)
-    SWAP(chessProgram, p)
-    SWAP(isUCI, h)
-    SWAP(hasOwnBookUCI, h)
-    SWAP(protocolVersion, h)
-    SWAP(reuse, h)
-    SWAP(scoreIsAbsolute, h)
-    SWAP(timeOdds, h)
-}
-
-void Load(ChessProgramState *cps, int i)
-{
-    char *p, *q, buf[MSG_SIZ];
-    if(engineLine[0]) { // an engine was selected from the combo box
-       snprintf(buf, MSG_SIZ, "-fcp %s", engineLine);
-       SwapEngines(i); // kludge to parse -f* / -first* like it is -s* / -second*
-       ParseArgsFromString(buf);
-       SwapEngines(i);
-       ReplaceEngine(cps, i);
-       return;
-    }
-    p = engineName;
-    while(q = strchr(p, '/')) p = q+1;
-    if(*p== NULLCHAR) return;
-    appData.chessProgram[i] = strdup(p);
-    if(engineDir[0] != NULLCHAR)
-       appData.directory[i] = engineDir;
-    else if(p != engineName) { // derive directory from engine path, when not given
-       p[-1] = 0;
-       appData.directory[i] = strdup(engineName);
-       p[-1] = '/';
-    } else appData.directory[i] = ".";
-    appData.isUCI[i] = isUCI;
-    appData.protocolVersion[i] = v1 ? 1 : PROTOVER;
-    appData.hasOwnBookUCI[i] = hasBook;
-    if(addToList) {
-       int len;
-       q = firstChessProgramNames;
-       if(nickName[0]) snprintf(buf, MSG_SIZ, "\"%s\" -fcp ", nickName); else buf[0] = NULLCHAR;
-       snprintf(buf+strlen(buf), MSG_SIZ-strlen(buf), "\"%s\" -fd \"%s\"%s%s%s%s%s\n", p, appData.directory[i], 
-                       v1 ? " -firstProtocolVersion 1" : "",
-                       hasBook ? "" : " -fNoOwnBookUCI",
-                       isUCI ? " -fUCI" : "",
-                       storeVariant ? " -variant " : "",
-                       storeVariant ? VariantName(gameInfo.variant) : "");
-printf("new line: %s", buf);
-       firstChessProgramNames = malloc(len = strlen(q) + strlen(buf) + 1);
-       snprintf(firstChessProgramNames, len, "%s%s", q, buf);
-       if(q)   free(q);
-    }
-    ReplaceEngine(cps, i);
-}
-
 void InstallOK(int n)
 {
     PopDown(0); // early popdown, to allow FreezeUI to instate grab
@@ -2111,10 +2058,12 @@ void LoadEngineProc(w, event, prms, nprms)
      Cardinal *nprms;
 {
    isUCI = addToList = storeVariant = v1 = False; hasBook = True; // defaults
-   engineDir = nickName = ""; 
    if(engineChoice) free(engineChoice); engineChoice = strdup(engineNr[0]);
    if(engineLine)   free(engineLine);   engineLine = strdup("");
-   NamesToList(firstChessProgramNames);
+   if(engineDir)    free(engineDir);    engineDir = strdup("");
+   if(nickName)     free(nickName);     nickName = strdup("");
+   if(params)       free(params);       params = strdup("");
+   NamesToList(firstChessProgramNames, engineList, engineMnemonic);
    GenericPopUp(installOptions, _("Load engine"), 0);
 }