X-Git-Url: http://winboard.nl/cgi-bin?a=blobdiff_plain;f=xoptions.c;h=46ca0e08e7aa0b693eb780e1162c12238811a0b6;hb=dce079bee6bd128a9ecf9e00ba480371b30878e9;hp=58c9a3b6c681710989951f9288dbecb741eb2e8f;hpb=03f3e0a23cfe79189ec3f677e7369315b72c5968;p=xboard.git diff --git a/xoptions.c b/xoptions.c index 58c9a3b..46ca0e0 100644 --- a/xoptions.c +++ b/xoptions.c @@ -83,6 +83,7 @@ extern char *getenv(); // [HGM] the following code for makng menu popups was cloned from the FileNamePopUp routines static Widget previous = NULL; +extern Pixel timerBackgroundPixel; void SetFocus (Widget w, XtPointer data, XEvent *event, Boolean *b) @@ -112,6 +113,7 @@ typedef int OKCallback(int n); int values[MAX_OPTIONS]; ChessProgramState *currentCps; +int dialogError; static Option *currentOption; static Boolean browserUp; ButtonCallback *comboCallback; @@ -130,7 +132,7 @@ SetWidgetText (Option *opt, char *buf, int n) Arg arg; XtSetArg(arg, XtNstring, buf); XtSetValues(opt->handle, &arg, 1); - SetFocus(opt->handle, shells[n], NULL, False); + if(n >= 0) SetFocus(opt->handle, shells[n], NULL, False); } void @@ -219,13 +221,13 @@ CreateComboPopup (Widget parent, Option *option, int n) int i=0, j; Widget menu, entry; Arg args[16]; + char **mb = (char **) option->textValue; + if(mb[0] == NULL) return; // avoid empty menus, as they cause crash menu = XtCreatePopupShell(option->name, simpleMenuWidgetClass, parent, NULL, 0); j = 0; XtSetArg(args[j], XtNwidth, 100); j++; -// XtSetArg(args[j], XtNright, XtChainRight); j++; - char **mb = (char **) option->textValue; while (mb[i] != NULL) { if (option->min & NO_GETTEXT) @@ -253,6 +255,7 @@ int MakeColors P((void)); void CreateGCs P((int redo)); void CreateAnyPieces P((void)); int GenericReadout P((int selected)); +void GenericUpdate P((int selected)); Widget shells[10]; Widget marked[10]; Boolean shellUp[10]; @@ -301,7 +304,7 @@ PopDown (int n) void GenericPopDown (Widget w, XEvent *event, String *prms, Cardinal *nprms) { - if(browserUp) return; // prevent closing dialog when it has an open file-browse daughter + if(browserUp || dialogError) return; // prevent closing dialog when it has an open file-browse daughter PopDown(prms[0][0] - '0'); } @@ -309,7 +312,7 @@ char *engineName, *engineDir, *engineChoice, *engineLine, *nickName, *params, *t 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] = {""}; +char *engineList[MAXENGINES] = {" "}, *engineMnemonic[MAXENGINES] = {""}; int AppendText (Option *opt, char *s) @@ -362,6 +365,21 @@ UpgradeParticipant () Substitute(strdup(engineName), False); } +void +CloneTourney () +{ + FILE *f; + char *name; + GetWidgetText(currentOption, &name); + if(name && name[0] && (f = fopen(name, "r")) ) { + char *saveSaveFile; + saveSaveFile = appData.saveGameFile; appData.saveGameFile = NULL; // this is a persistent option, protect from change + ParseArgsFromFile(f); + engineName = appData.participants; GenericUpdate(-1); + FREE(appData.saveGameFile); appData.saveGameFile = saveSaveFile; + } else DisplayError(_("First you must specify an existing tourney file to clone"), 0); +} + Option matchOptions[] = { { 0, 0, 0, NULL, (void*) &tfName, ".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") }, @@ -382,6 +400,7 @@ Option matchOptions[] = { { 0, 0, 0, NULL, (void*) &appData.defNoBook, "", NULL, CheckBox, N_("Disable own engine books by default") }, { 0, 0, 0, NULL, (void*) &ReplaceParticipant, NULL, NULL, Button, N_("Replace Engine") }, { 0, 1, 0, NULL, (void*) &UpgradeParticipant, NULL, NULL, Button, N_("Upgrade Engine") }, +{ 0, 1, 0, NULL, (void*) &CloneTourney, NULL, NULL, Button, N_("Clone Tourney") }, { 0, 1, 0, NULL, (void*) &MatchOK, "", NULL, EndMark , "" } }; @@ -623,6 +642,7 @@ Option saveOptions[] = { { 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.numberTag, "", NULL, CheckBox, N_("Include Number Tag in tourney PGN") }, { 0, 0, 0, NULL, (void*) &appData.saveExtendedInfoInPGN, "", NULL, CheckBox, N_("Save Score/Depth Info in PGN") }, { 0, 0, 0, NULL, (void*) &appData.saveOutOfBookInfo, "", NULL, CheckBox, N_("Save Out-of-Book Info in PGN ") }, { 0, 1, 0, NULL, NULL, "", NULL, EndMark , "" } @@ -710,7 +730,7 @@ SetColor (char *colorName, Option *box) } else { buttonColor = *(Pixel *) vTo.addr; } - } else buttonColor = (Pixel) 0; + } else buttonColor = timerBackgroundPixel; XtSetArg(args[0], XtNbackground, buttonColor);; XtSetValues(box->handle, args, 1); } @@ -780,9 +800,13 @@ BoardOptionsOK (int n) Option boardOptions[] = { { 0, 0, 70, NULL, (void*) &appData.whitePieceColor, "", NULL, TextBox, N_("White Piece Color:") }, { 1000, 1, 0, NULL, (void*) &DefColor, NULL, (char**) "#FFFFCC", Button, " " }, +/* TRANSLATORS: R = single letter for the color red */ { 1, 1, 0, NULL, (void*) &AdjustColor, NULL, NULL, Button, N_("R") }, +/* TRANSLATORS: G = single letter for the color green */ { 2, 1, 0, NULL, (void*) &AdjustColor, NULL, NULL, Button, N_("G") }, +/* TRANSLATORS: B = single letter for the color blue */ { 3, 1, 0, NULL, (void*) &AdjustColor, NULL, NULL, Button, N_("B") }, +/* TRANSLATORS: D = single letter to make a color darker */ { 4, 1, 0, NULL, (void*) &AdjustColor, NULL, NULL, Button, N_("D") }, { 0, 0, 70, NULL, (void*) &appData.blackPieceColor, "", NULL, TextBox, N_("Black Piece Color:") }, { 1000, 1, 0, NULL, (void*) &DefColor, NULL, (char**) "#202020", Button, " " }, @@ -826,6 +850,50 @@ Option boardOptions[] = { { 0, 0, 0, NULL, (void*) &BoardOptionsOK, "", NULL, EndMark , "" } }; +void +GenericUpdate (int selected) +{ + int i, j; + char buf[MSG_SIZ]; + float x; + for(i=0; ; i++) { + if(selected >= 0) { if(i < selected) continue; else if(i > selected) break; } + switch(currentOption[i].type) { + case TextBox: + case FileName: + case PathName: + SetWidgetText(¤tOption[i], *(char**) currentOption[i].target, -1); + break; + case Spin: + sprintf(buf, "%d", *(int*) currentOption[i].target); + SetWidgetText(¤tOption[i], buf, -1); + break; + case Fractional: + sprintf(buf, "%4.2f", *(float*) currentOption[i].target); + SetWidgetText(¤tOption[i], buf, -1); + break; + case CheckBox: + SetWidgetState(¤tOption[i], *(Boolean*) currentOption[i].target); + break; + case ComboBox: + for(j=0; currentOption[i].choice[j]; j++) + if(*(char**)currentOption[i].target && !strcmp(*(char**)currentOption[i].target, currentOption[i].choice[j])) break; + values[i] = currentOption[i].value = j + (currentOption[i].choice[j] == NULL); + // TODO: actually display this + break; + case EndMark: + return; + default: + printf("GenericUpdate: unexpected case in switch.\n"); + case Button: + case SaveButton: + case Label: + case Break: + break; + } + } +} + int GenericReadout (int selected) { @@ -1020,6 +1088,7 @@ GenericPopUp (Option *option, char *title, int dlgNr) XtSetArg(args[j], XtNfromVert, last); j++; XtSetArg(args[j], XtNleft, XtChainLeft); j++; XtSetArg(args[j], XtNright, XtChainLeft); j++; + XtSetArg(args[j], XtNheight, textHeight), j++; XtSetArg(args[j], XtNborderWidth, 0); j++; XtSetArg(args[j], XtNjustify, XtJustifyLeft); j++; XtSetArg(args[j], XtNlabel, _(option[i].name)); j++; @@ -1068,9 +1137,10 @@ GenericPopUp (Option *option, char *title, int dlgNr) msg = _("browse"); w = 0; /* automatically scale to width of text */ XtSetArg(args[j], XtNwidth, (XtArgVal) NULL ); j++; + if(textHeight) XtSetArg(args[j], XtNheight, textHeight), j++; } else { w = 20; msg = "+"; - XtSetArg(args[j], XtNheight, 10); j++; + XtSetArg(args[j], XtNheight, textHeight/2); j++; XtSetArg(args[j], XtNwidth, w); j++; } edit = XtCreateManagedWidget(msg, commandWidgetClass, form, args, j); @@ -1082,7 +1152,8 @@ GenericPopUp (Option *option, char *title, int dlgNr) j=0; XtSetArg(args[j], XtNfromVert, edit); j++; XtSetArg(args[j], XtNfromHoriz, last); j++; - XtSetArg(args[j], XtNheight, 10); j++; + XtSetArg(args[j], XtNvertDistance, -1); j++; + XtSetArg(args[j], XtNheight, textHeight/2); j++; XtSetArg(args[j], XtNwidth, 20); j++; XtSetArg(args[j], XtNleft, XtChainRight); j++; XtSetArg(args[j], XtNright, XtChainRight); j++; @@ -1093,8 +1164,9 @@ GenericPopUp (Option *option, char *title, int dlgNr) if(!currentCps) option[i].value = *(Boolean*)option[i].target; j=0; XtSetArg(args[j], XtNfromVert, last); j++; - XtSetArg(args[j], XtNwidth, 10); j++; - XtSetArg(args[j], XtNheight, 10); j++; + XtSetArg(args[j], XtNvertDistance, (textHeight+2)/4 + 3); j++; + XtSetArg(args[j], XtNwidth, textHeight/2); j++; + XtSetArg(args[j], XtNheight, textHeight/2); j++; XtSetArg(args[j], XtNleft, XtChainLeft); j++; XtSetArg(args[j], XtNright, XtChainLeft); j++; XtSetArg(args[j], XtNstate, option[i].value); j++; @@ -1107,6 +1179,7 @@ GenericPopUp (Option *option, char *title, int dlgNr) j=0; XtSetArg(args[j], XtNfromVert, last); j++; XtSetArg(args[j], XtNfromHoriz, option[i].type != Label ? dialog : NULL); j++; + if(option[i].type != Label) XtSetArg(args[j], XtNheight, textHeight), j++; XtSetArg(args[j], XtNleft, XtChainLeft); j++; XtSetArg(args[j], XtNborderWidth, 0); j++; XtSetArg(args[j], XtNjustify, XtJustifyLeft); j++; @@ -1121,11 +1194,14 @@ GenericPopUp (Option *option, char *title, int dlgNr) if(option[i].min & SAME_ROW) { XtSetArg(args[j], XtNfromVert, lastrow); j++; XtSetArg(args[j], XtNfromHoriz, last); j++; + XtSetArg(args[j], XtNleft, XtChainRight); j++; + XtSetArg(args[j], XtNright, XtChainRight); j++; } else { XtSetArg(args[j], XtNfromVert, last); j++; XtSetArg(args[j], XtNfromHoriz, NULL); j++; lastrow = forelast; } XtSetArg(args[j], XtNlabel, _(option[i].name)); j++; + XtSetArg(args[j], XtNheight, textHeight), 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 @@ -1148,6 +1224,7 @@ GenericPopUp (Option *option, char *title, int dlgNr) XtSetArg(args[j], XtNfromVert, last); j++; XtSetArg(args[j], XtNleft, XtChainLeft); j++; XtSetArg(args[j], XtNright, XtChainLeft); j++; + XtSetArg(args[j], XtNheight, textHeight), j++; XtSetArg(args[j], XtNborderWidth, 0); j++; XtSetArg(args[j], XtNjustify, XtJustifyLeft); j++; XtSetArg(args[j], XtNlabel, _(option[i].name)); j++; @@ -1166,6 +1243,7 @@ GenericPopUp (Option *option, char *title, int dlgNr) XtSetArg(args[j], XtNleft, XtChainLeft); j++; XtSetArg(args[j], XtNmenuName, XtNewString(option[i].name)); j++; XtSetArg(args[j], XtNlabel, _(((char**)option[i].textValue)[option[i].value])); j++; + XtSetArg(args[j], XtNheight, textHeight), j++; option[i].handle = (void*) (last = XtCreateManagedWidget(" ", menuButtonWidgetClass, form, args, j)); CreateComboPopup(last, option + i, i); @@ -1253,6 +1331,7 @@ GenericPopUp (Option *option, char *title, int dlgNr) XtSetArg(args[j], XtNtop, XtChainBottom); j++; XtSetArg(args[j], XtNleft, XtChainRight); j++; XtSetArg(args[j], XtNright, XtChainRight); j++; + XtSetArg(args[j], XtNheight, textHeight), j++; b_ok = XtCreateManagedWidget(_("OK"), commandWidgetClass, form, args, j); XtAddCallback(b_ok, XtNcallback, GenericCallback, (XtPointer)(intptr_t) dlgNr + (dlgNr<<16)); @@ -1351,7 +1430,7 @@ OptionsProc (Widget w, XEvent *event, String *prms, Cardinal *nprms) void MatchOptionsProc (Widget w, XEvent *event, String *prms, Cardinal *nprms) { - NamesToList(firstChessProgramNames, engineList, engineMnemonic); + NamesToList(firstChessProgramNames, engineList, engineMnemonic, "all"); comboCallback = &AddToTourney; matchOptions[5].min = -(appData.pairingEngine[0] != NULLCHAR); // with pairing engine, allow Swiss ASSIGN(tfName, appData.tourneyFile[0] ? appData.tourneyFile : MakeName(appData.defName)); @@ -1680,7 +1759,7 @@ LoadEngineProc (Widget w, XEvent *event, String *prms, Cardinal *nprms) if(engineDir) free(engineDir); engineDir = strdup(""); if(nickName) free(nickName); nickName = strdup(""); if(params) free(params); params = strdup(""); - NamesToList(firstChessProgramNames, engineList, engineMnemonic); + NamesToList(firstChessProgramNames, engineList, engineMnemonic, "all"); GenericPopUp(installOptions, _("Load engine"), 0); }