X-Git-Url: http://winboard.nl/cgi-bin?a=blobdiff_plain;f=xoptions.c;h=3ea11955a0503f9eb3c5068adbf26f887e4151dd;hb=4099d0667f611390759e74b42cadf4325ee1f2cd;hp=a2aee199338fbf644540850851acc549990eb38d;hpb=280e86e18fe7672e3aec7cd6175534ee15e7ed7f;p=xboard.git diff --git a/xoptions.c b/xoptions.c index a2aee19..3ea1195 100644 --- a/xoptions.c +++ b/xoptions.c @@ -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); }