X-Git-Url: http://winboard.nl/cgi-bin?a=blobdiff_plain;f=xoptions.c;h=5cadaf9730ae7377f76e8bfea574918e084b6462;hb=5f68e032eeca21f92f8a45648976770ea25ac559;hp=d4daff0fab9e2eeabf0102509819954b17ecb8e6;hpb=677682a381891c69d1a2cf1defa0a8f0610e52ad;p=xboard.git diff --git a/xoptions.c b/xoptions.c index d4daff0..5cadaf9 100644 --- a/xoptions.c +++ b/xoptions.c @@ -88,6 +88,7 @@ void SetFocus(Widget w, XtPointer data, XEvent *event, Boolean *b) { Arg args[2]; char *s; + int j; if(previous) { XtSetArg(args[0], XtNdisplayCaret, False); @@ -95,9 +96,10 @@ void SetFocus(Widget w, XtPointer data, XEvent *event, Boolean *b) } XtSetArg(args[0], XtNstring, &s); XtGetValues(w, args, 1); + j = 1; XtSetArg(args[0], XtNdisplayCaret, True); - XtSetArg(args[1], XtNinsertPosition, strlen(s)); - XtSetValues(w, args, 2); + if(!strchr(s, '\n')) XtSetArg(args[1], XtNinsertPosition, strlen(s)), j++; + XtSetValues(w, args, j); XtSetKeyboardFocus((Widget) data, w); previous = w; } @@ -603,6 +605,7 @@ void TimeControlProc(w, event, prms, nprms) //--------------------------- Engine-specific options menu ---------------------------------- typedef void ButtonCallback(int n); +typedef int OKCallback(int n); int values[MAX_OPTIONS]; ChessProgramState *currentCps; @@ -644,6 +647,8 @@ void SpinCallback(w, client_data, call_data) XtSetArg(args[0], XtNstring, &q); XtGetValues(currentOption[data].handle, args, 1); for(r = ""; *q; q++) if(*q == '.') r = q; else if(*q == '/') r = ""; // last dot after last slash + if(!strcmp(r, "") && !currentCps && currentOption[data].type == FileName && currentOption[data].textValue) + r = currentOption[data].textValue; browserUp = True; if(XsraSelFile(shells[0], currentOption[data].name, NULL, NULL, "", "", r, currentOption[data].type == PathName ? "p" : "f", NULL, &p)) { @@ -721,7 +726,7 @@ static int oldCores, oldPonder; int MakeColors P((void)); void CreateGCs P((int redo)); void CreateAnyPieces P((void)); -void GenericReadout P((int selected)); +int GenericReadout P((int selected)); Widget shells[10]; Widget marked[10]; Boolean shellUp[10]; @@ -776,7 +781,7 @@ void GenericPopDown(w, event, prms, nprms) } char *engineName, *engineDir, *engineChoice, *engineLine, *nickName, *params; -Boolean isUCI, hasBook, storeVariant, v1, addToList; +Boolean isUCI, hasBook, storeVariant, v1, addToList, useNick; extern Option installOptions[], matchOptions[]; char *engineNr[] = { N_("First Engine"), N_("Second Engine"), NULL }; char *engineList[100] = {" "}, *engineMnemonic[100] = {""}; @@ -794,38 +799,41 @@ void AddToTourney(int n) XawTextReplace(matchOptions[3].handle, 9999, 9999, &t); } -void MatchOK(int n) +int MatchOK(int n) { if(appData.participants && appData.participants[0]) free(appData.participants); appData.participants = strdup(engineName); + if(!CreateTourney(appData.tourneyFile)) return 0; PopDown(0); // early popdown to prevent FreezeUI called through MatchEvent from causing XtGrab warning - if(CreateTourney(appData.tourneyFile)) MatchEvent(2); // start tourney + MatchEvent(2); // start tourney + return 1; } Option matchOptions[] = { -{ 0, 0, 0, NULL, (void*) &appData.tourneyFile, "", NULL, FileName, N_("Tournament file:") }, +{ 0, 0, 0, NULL, (void*) &appData.tourneyFile, ".trn", 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.tourneyCycles, "", NULL, Spin, N_("Number of tourney cycles (or Swiss rounds):") }, { 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.saveGameFile, "", NULL, FileName, N_("Save Tourney Games on:") }, -{ 0, 0, 0, NULL, (void*) &appData.loadGameFile, "", NULL, FileName, N_("Game File with Opening Lines:") }, +{ 0, 0, 0, NULL, (void*) &appData.saveGameFile, ".pgn", NULL, FileName, N_("Save Tourney Games on:") }, +{ 0, 0, 0, NULL, (void*) &appData.loadGameFile, ".pgn", 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, 0, 0, NULL, (void*) &appData.loadPositionFile, ".fen", 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, (void*) &MatchOK, "", NULL, EndMark , "" } }; -void GeneralOptionsOK(int n) +int GeneralOptionsOK(int n) { int newPonder = appData.ponderNextMove; appData.ponderNextMove = oldPonder; PonderNextMoveEvent(newPonder); + return 1; } Option generalOptions[] = { @@ -930,7 +938,7 @@ Option variantDescriptors[] = { { 0, 2, 0, NULL, NULL, "", NULL, EndMark , "" } }; -void CommonOptionsOK(int n) +int CommonOptionsOK(int n) { int newPonder = appData.ponderNextMove; // make sure changes are sent to first engine by re-initializing it @@ -942,6 +950,7 @@ void CommonOptionsOK(int n) appData.ponderNextMove = oldPonder; PonderNextMoveEvent(newPonder); } + return 1; } Option commonEngineOptions[] = { @@ -952,7 +961,7 @@ Option commonEngineOptions[] = { { 0, 0, 0, NULL, (void*) &appData.defaultPathEGTB, "", NULL, PathName, N_("Nalimov EGTB Path:") }, { 0, 0, 1000, NULL, (void*) &appData.defaultCacheSizeEGTB, "", NULL, Spin, N_("EGTB Cache Size (MB):") }, { 0, 0, 0, NULL, (void*) &appData.usePolyglotBook, "", NULL, CheckBox, N_("Use GUI Book") }, -{ 0, 0, 0, NULL, (void*) &appData.polyglotBook, "", NULL, FileName, N_("Opening-Book Filename:") }, +{ 0, 0, 0, NULL, (void*) &appData.polyglotBook, ".bin", NULL, FileName, N_("Opening-Book Filename:") }, { 0, 0, 100, NULL, (void*) &appData.bookDepth, "", NULL, Spin, N_("Book Depth (moves):") }, { 0, 0, 100, NULL, (void*) &appData.bookStrength, "", NULL, Spin, N_("Book Variety (0) vs. Strength (100):") }, { 0, 0, 0, NULL, (void*) &appData.firstHasOwnBookUCI, "", NULL, CheckBox, N_("Engine #1 Has Own Book") }, @@ -974,9 +983,10 @@ Option adjudicationOptions[] = { { 0, 1, 0, NULL, NULL, "", NULL, EndMark , "" } }; -void IcsOptionsOK(int n) +int IcsOptionsOK(int n) { ParseIcsTextColors(); + return 1; } Option icsOptions[] = { @@ -1022,8 +1032,8 @@ Option loadOptions[] = { Option saveOptions[] = { { 0, 0, 0, NULL, (void*) &appData.autoSaveGames, "", NULL, CheckBox, N_("Auto-Save Games") }, -{ 0, 0, 0, NULL, (void*) &appData.saveGameFile, "", NULL, FileName, N_("Save Games on File:") }, -{ 0, 0, 0, NULL, (void*) &appData.savePositionFile, "", NULL, FileName, N_("Save Final Positions on File:") }, +{ 0, 0, 0, NULL, (void*) &appData.saveGameFile, ".pgn", NULL, FileName, N_("Save Games on File:") }, +{ 0, 0, 0, NULL, (void*) &appData.savePositionFile, ".fen", NULL, FileName, N_("Save Final Positions on File:") }, { 0, 0, 0, NULL, (void*) &appData.pgnEventHeader, "", NULL, TextBox, N_("PGN Event Header:") }, { 0, 0, 0, NULL, (void*) &appData.oldSaveStyle, "", NULL, CheckBox, N_("Old Save Style (as opposed to PGN)") }, { 0, 0, 0, NULL, (void*) &appData.saveExtendedInfoInPGN, "", NULL, CheckBox, N_("Save Score/Depth Info in PGN") }, @@ -1076,7 +1086,7 @@ void Test(int n) Option soundOptions[] = { { 0, 0, 0, NULL, (void*) &appData.soundProgram, "", NULL, TextBox, N_("Sound Program:") }, { 0, 0, 0, NULL, (void*) &appData.soundDirectory, "", NULL, PathName, N_("Sounds Directory:") }, -{ 0, 0, 0, NULL, (void*) (soundFiles+2) /* kludge! */, "", NULL, FileName, N_("User WAV File:") }, +{ 0, 0, 0, NULL, (void*) (soundFiles+2) /* kludge! */, ".wav", NULL, FileName, N_("User WAV File:") }, { 0, 0, 0, NULL, (void*) &trialSound, (char*) soundNames, soundFiles, ComboBox, N_("Try-Out Sound:") }, { 0, 1, 0, NULL, (void*) &Test, NULL, NULL, Button, N_("Play") }, { 0, 0, 0, NULL, (void*) &appData.soundMove, (char*) soundNames, soundFiles, ComboBox, N_("Move:") }, @@ -1166,7 +1176,7 @@ void AdjustColor(int i) RefreshColor(i-n-1, n); } -void BoardOptionsOK(int n) +int BoardOptionsOK(int n) { if(appData.overrideLineGap >= 0) lineGap = appData.overrideLineGap; else lineGap = defaultLineGap; useImages = useImageSqs = 0; @@ -1174,6 +1184,7 @@ void BoardOptionsOK(int n) CreateAnyPieces(); InitDrawingSizes(-1, 0); DrawPosition(True, NULL); + return 1; } Option boardOptions[] = { @@ -1217,16 +1228,16 @@ Option boardOptions[] = { //{ 0, 0, 0, NULL, (void*) &appData.allWhite, "", NULL, CheckBox, N_("Use Outline Pieces for Black") }, { 0, 0, 0, NULL, (void*) &appData.monoMode, "", NULL, CheckBox, N_("Mono Mode") }, { 0,-1, 5, NULL, (void*) &appData.overrideLineGap, "", NULL, Spin, N_("Line Gap ( -1 = default for board size):") }, -{ 0, 0, 0, NULL, (void*) &appData.liteBackTextureFile, "", NULL, FileName, N_("Light-Squares Texture File:") }, -{ 0, 0, 0, NULL, (void*) &appData.darkBackTextureFile, "", NULL, FileName, N_("Dark-Squares Texture File:") }, +{ 0, 0, 0, NULL, (void*) &appData.liteBackTextureFile, ".xpm", NULL, FileName, N_("Light-Squares Texture File:") }, +{ 0, 0, 0, NULL, (void*) &appData.darkBackTextureFile, ".xpm", NULL, FileName, N_("Dark-Squares Texture File:") }, { 0, 0, 0, NULL, (void*) &appData.bitmapDirectory, "", NULL, PathName, N_("Directory with Bitmap Pieces:") }, { 0, 0, 0, NULL, (void*) &appData.pixmapDirectory, "", NULL, PathName, N_("Directory with Pixmap Pieces:") }, { 0, 0, 0, NULL, (void*) &BoardOptionsOK, "", NULL, EndMark , "" } }; -void GenericReadout(int selected) +int GenericReadout(int selected) { - int i, j; + int i, j, res=1; String val; Arg args[16]; char buf[MSG_SIZ], **dest; @@ -1295,7 +1306,7 @@ void GenericReadout(int selected) break; case EndMark: if(currentOption[i].target) // callback for implementing necessary actions on OK (like redraw) - ((ButtonCallback*) currentOption[i].target)(i); + res = ((OKCallback*) currentOption[i].target)(i); break; default: printf("GenericReadout: unexpected case in switch.\n"); @@ -1307,6 +1318,7 @@ void GenericReadout(int selected) } if(currentOption[i].type == EndMark) break; } + return res; } void GenericCallback(w, client_data, call_data) @@ -1328,8 +1340,7 @@ void GenericCallback(w, client_data, call_data) return; } if (strcmp(name, _("OK")) == 0) { // save buttons imply OK - GenericReadout(-1); - PopDown(data); + if(GenericReadout(-1)) PopDown(data); return; } if(currentCps) { @@ -1515,7 +1526,7 @@ GenericPopUp(Option *option, char *title, int dlgNr) XtSetArg(args[j], XtNlabel, _(option[i].name)); j++; if(option[i].min & 1) { XtSetArg(args[j], XtNfromHoriz, last); j++; } else { XtSetArg(args[j], XtNfromHoriz, NULL); j++; lastrow = forelast; } - if(option[i].max) XtSetArg(args[j], XtNwidth, option[i].max); j++; + if(option[i].max) { XtSetArg(args[j], XtNwidth, option[i].max); j++; } if(option[i].textValue) { // special for buttons of New Variant dialog XtSetArg(args[j], XtNsensitive, appData.noChessProgram || option[i].value < 0 || strstr(first.variants, VariantName(option[i].value))); j++; @@ -1759,6 +1770,7 @@ void MatchOptionsProc(w, event, prms, nprms) { NamesToList(firstChessProgramNames, engineList, engineMnemonic); comboCallback = &AddToTourney; + matchOptions[5].min = -(appData.pairingEngine[0] != NULLCHAR); // with pairing engine, allow Swiss GenericPopUp(matchOptions, _("Match Options"), 0); } @@ -1847,9 +1859,10 @@ static int commentIndex; void ClearComment P((int n)); extern char commentTranslations[]; -void NewComCallback(int n) +int NewComCallback(int n) { ReplaceComment(commentIndex, commentText); + return 1; } void SaveChanges(int n) @@ -1893,9 +1906,10 @@ void NewCommentPopup(char *title, char *text, int index) static char *tagsText, *msgText; -void NewTagsCallback(int n) +int NewTagsCallback(int n) { ReplaceTags(tagsText, &gameInfo); + return 1; } void changeTags(int n) @@ -1903,6 +1917,7 @@ void changeTags(int n) Arg args[16]; XtSetArg(args[0], XtNstring, &tagsText); XtGetValues(currentOption[1].handle, args, 1); + if(bookUp) SaveToBook(tagsText); else ReplaceTags(tagsText, &gameInfo); } @@ -1917,15 +1932,18 @@ void NewTagsPopup(char *text, char *msg) { Widget edit; Arg args[16]; + char *title = bookUp ? _("Edit book") : _("Tags"); if(shells[2]) { // if already exists, alter title and content XtSetArg(args[0], XtNstring, text); XtSetValues(tagsOptions[1].handle, args, 1); + XtSetArg(args[0], XtNtitle, title); + XtSetValues(shells[2], args, 1); } if(tagsText) free(tagsText); tagsText = strdup(text); tagsOptions[0].textValue = msg; MarkMenu("menuView.Show Tags", 2); - GenericPopUp(tagsOptions, _("Tags"), 2); + GenericPopUp(tagsOptions, title, 2); } char *icsText; @@ -2030,16 +2048,18 @@ void SecondSettingsProc(w, event, prms, nprms) SettingsPopUp(&second); } -void InstallOK(int n) +int InstallOK(int n) { PopDown(0); // early popdown, to allow FreezeUI to instate grab if(engineChoice[0] == engineNr[0][0]) Load(&first, 0); else Load(&second, 1); + return 1; } Option installOptions[] = { { 0, 0, 0, NULL, (void*) &engineLine, (char*) engineMnemonic, engineList, ComboBox, N_("Select engine from list:") }, { 0, 0, 0, NULL, NULL, NULL, NULL, Label, N_("or specify one below:") }, { 0, 0, 0, NULL, (void*) &nickName, NULL, NULL, TextBox, N_("Nickname (optional):") }, +{ 0, 0, 0, NULL, (void*) &useNick, NULL, NULL, CheckBox, N_("Use nickname in PGN player tags of engine-engine games") }, { 0, 0, 0, NULL, (void*) &engineDir, NULL, NULL, PathName, N_("Engine Directory:") }, { 0, 0, 0, NULL, (void*) &engineName, NULL, NULL, FileName, N_("Engine Command:") }, { 0, 0, 0, NULL, NULL, NULL, NULL, Label, N_("(Directory will be derived from engine path when empty)") }, @@ -2058,7 +2078,7 @@ void LoadEngineProc(w, event, prms, nprms) String *prms; Cardinal *nprms; { - isUCI = addToList = storeVariant = v1 = False; hasBook = True; // defaults + isUCI = storeVariant = v1 = useNick = False; addToList = hasBook = True; // defaults if(engineChoice) free(engineChoice); engineChoice = strdup(engineNr[0]); if(engineLine) free(engineLine); engineLine = strdup(""); if(engineDir) free(engineDir); engineDir = strdup(""); @@ -2068,6 +2088,15 @@ void LoadEngineProc(w, event, prms, nprms) GenericPopUp(installOptions, _("Load engine"), 0); } +void EditBookProc(w, event, prms, nprms) + Widget w; + XEvent *event; + String *prms; + Cardinal *nprms; +{ + EditBookEvent(); +} + //---------------------------- Chat Windows ---------------------------------------------- void OutputChatMessage(int partner, char *mess)