X-Git-Url: http://winboard.nl/cgi-bin?a=blobdiff_plain;f=xoptions.c;h=a5aac22327659b2af0370da9758dda52566f97e4;hb=e79a7d4e07632ae3a428f4363effffbbb52c7a1d;hp=688e18518723d8b9e1e1940a48c6ec062b3e70f7;hpb=e5b86edd32897db1b482df4bbacd67ccf091ae75;p=xboard.git diff --git a/xoptions.c b/xoptions.c index 688e185..a5aac22 100644 --- a/xoptions.c +++ b/xoptions.c @@ -80,22 +80,6 @@ extern char *getenv(); # define N_(s) s #endif -extern void SendToProgram P((char *message, ChessProgramState *cps)); -FILE * XsraSelFile P((Widget w, char *prompt, char *ok, char *cancel, char *failed, - char *init_path, char *filter, char *mode, int (*show_entry)(), char **name_return)); - -extern Widget formWidget, shellWidget, boardWidget, menuBarWidget; -extern Display *xDisplay; -extern int squareSize; -extern Pixmap xMarkPixmap; -extern char *layoutName; -extern Window xBoardWindow; -extern Arg layoutArgs[2], formArgs[2]; -Pixel timerForegroundPixel, timerBackgroundPixel; -extern int searchTime; -extern Atom wm_delete_window; -extern int lineGap; - // [HGM] the following code for makng menu popups was cloned from the FileNamePopUp routines static Widget previous = NULL; @@ -119,8 +103,6 @@ void SetFocus(Widget w, XtPointer data, XEvent *event, Boolean *b) } //--------------------------- New Shuffle Game -------------------------------------------- -extern int shuffleOpenings; -extern int startedFromPositionFile; int shuffleUp; Widget shuffleShell; @@ -332,7 +314,7 @@ void TimeControlCallback(w, client_data, call_data) return; } if (strcmp(name, _(" OK ")) == 0) { - int inc, mps, ok; + int inc, mps, ok=0; XtSetArg(args[0], XtNstring, &txt); XtGetValues(tcData, args, 1); switch(tcInc) { @@ -623,7 +605,6 @@ void TimeControlProc(w, event, prms, nprms) int values[MAX_OPTIONS]; ChessProgramState *currentCps; static Option *currentOption; -extern Widget shells[]; static Boolean browserUp; void CheckCallback(Widget ww, XtPointer data, XEvent *event, Boolean *b) @@ -694,7 +675,7 @@ void ComboSelect(w, addr, index) // callback for all combo items int j = 255 & (intptr_t) addr; values[i] = j; // store in temporary, for transfer at OK - XtSetArg(args[0], XtNlabel, ((char**)currentOption[i].textValue)[j]); + XtSetArg(args[0], XtNlabel, _(((char**)currentOption[i].textValue)[j])); XtSetValues(currentOption[i].handle, args, 1); } @@ -712,6 +693,7 @@ 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) { entry = XtCreateManagedWidget(mb[i], smeBSBObjectClass, @@ -786,7 +768,6 @@ void GenericPopDown(w, event, prms, nprms) String *prms; Cardinal *nprms; { - int n; if(browserUp) return; // prevent closing dialog when it has an open file-browse daughter PopDown(prms[0][0] - '0'); } @@ -1092,7 +1073,7 @@ void SetColor(char *colorName, Widget box) } else { buttonColor = *(Pixel *) vTo.addr; } - } + } else buttonColor = (Pixel) 0; XtSetArg(args[0], XtNbackground, buttonColor);; XtSetValues(box, args, 1); } @@ -1149,7 +1130,6 @@ void AdjustColor(int i) void BoardOptionsOK(int n) { - extern int defaultLineGap, useImages, useImageSqs; if(appData.overrideLineGap >= 0) lineGap = appData.overrideLineGap; else lineGap = defaultLineGap; useImages = useImageSqs = 0; MakeColors(); CreateGCs(True); @@ -1209,7 +1189,7 @@ Option boardOptions[] = { void GenericReadout(int selected) { int i, j; - String name, val; + String val; Arg args[16]; char buf[MSG_SIZ], **dest; float x; @@ -1292,10 +1272,9 @@ void GenericCallback(w, client_data, call_data) Widget w; XtPointer client_data, call_data; { - String name, val; + String name; Arg args[16]; char buf[MSG_SIZ]; - int i, j; int data = (intptr_t) client_data; currentOption = dialogOptions[data>>16]; data &= 0xFFFF; @@ -1325,7 +1304,7 @@ int GenericPopUp(Option *option, char *title, int dlgNr) { Arg args[16]; - Widget popup, layout, dialog, edit=NULL, form, last, b_ok, b_cancel, leftMargin = NULL, textField = NULL; + Widget popup, layout, dialog=NULL, edit=NULL, form, last, b_ok, b_cancel, leftMargin = NULL, textField = NULL; Window root, child; int x, y, i, j, height=999, width=1, h, c, w; int win_x, win_y, maxWidth, maxTextWidth; @@ -1397,6 +1376,7 @@ GenericPopUp(Option *option, char *title, int dlgNr) XtSetArg(args[j], XtNright, XtChainLeft); j++; XtSetArg(args[j], XtNborderWidth, 0); j++; XtSetArg(args[j], XtNjustify, XtJustifyLeft); j++; + XtSetArg(args[j], XtNlabel, _(option[i].name)); j++; texts[h] = dialog = XtCreateManagedWidget(option[i].name, labelWidgetClass, form, args, j); } else texts[h] = dialog = NULL; @@ -1439,7 +1419,7 @@ GenericPopUp(Option *option, char *title, int dlgNr) XtSetArg(args[j], XtNleft, XtChainRight); j++; XtSetArg(args[j], XtNright, XtChainRight); j++; if(option[i].type == FileName || option[i].type == PathName) { - w = 50; msg = "browse"; + w = 50; msg = _("browse"); } else { XtSetArg(args[j], XtNheight, 10); j++; w = 20; msg = "+"; @@ -1481,6 +1461,7 @@ GenericPopUp(Option *option, char *title, int dlgNr) XtSetArg(args[j], XtNleft, XtChainLeft); j++; XtSetArg(args[j], XtNborderWidth, 0); j++; XtSetArg(args[j], XtNjustify, XtJustifyLeft); j++; + XtSetArg(args[j], XtNlabel, _(msg)); j++; last = XtCreateManagedWidget(msg, labelWidgetClass, form, args, j); if(option[i].type == CheckBox) XtAddEventHandler(last, ButtonPressMask, False, CheckCallback, (XtPointer)(intptr_t) i); @@ -1489,6 +1470,7 @@ GenericPopUp(Option *option, char *title, int dlgNr) case Button: j=0; XtSetArg(args[j], XtNfromVert, option[i].min & 1 ? lastrow : last); j++; + 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++; @@ -1515,6 +1497,7 @@ GenericPopUp(Option *option, char *title, int dlgNr) XtSetArg(args[j], XtNright, XtChainLeft); j++; XtSetArg(args[j], XtNborderWidth, 0); j++; XtSetArg(args[j], XtNjustify, XtJustifyLeft); j++; + XtSetArg(args[j], XtNlabel, _(option[i].name)); j++; texts[h] = dialog = XtCreateManagedWidget(option[i].name, labelWidgetClass, form, args, j); if(currentCps) option[i].choice = (char**) option[i].textValue; else { @@ -1529,7 +1512,7 @@ GenericPopUp(Option *option, char *title, int dlgNr) XtSetArg(args[j], XtNwidth, option[i].max && !currentCps ? option[i].max : 100); j++; 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], XtNlabel, _(((char**)option[i].textValue)[option[i].value])); j++; option[i].handle = (void*) (last = XtCreateManagedWidget(" ", menuButtonWidgetClass, form, args, j)); CreateComboPopup(last, option[i].name, i, (char **) option[i].textValue); @@ -1736,10 +1719,9 @@ void MatchOptionsProc(w, event, prms, nprms) } Option textOptions[100]; -extern char *icsTextMenuString; void PutText P((char *text, int pos)); -SendString(char *p) +void SendString(char *p) { char buf[MSG_SIZ], *q; if(q = strstr(p, "$input")) { @@ -1902,7 +1884,6 @@ void NewTagsPopup(char *text, char *msg) GenericPopUp(tagsOptions, _("Tags"), 2); } -extern char ICSInputTranslations[]; char *icsText; Option boxOptions[] = { @@ -1912,7 +1893,6 @@ Option boxOptions[] = { void PutText(char *text, int pos) { - Widget edit; Arg args[16]; char buf[MSG_SIZ], *p; @@ -2006,6 +1986,132 @@ 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; + snprintf(buf, MSG_SIZ, "\"%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 + if(engineChoice[0] == engineNr[0][0]) Load(&first, 0); else Load(&second, 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*) &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)") }, +{ 0, 0, 0, NULL, (void*) &isUCI, NULL, NULL, CheckBox, N_("UCI") }, +{ 0, 0, 0, NULL, (void*) &v1, NULL, NULL, CheckBox, N_("WB protocol v1 (do not wait for engine features)") }, +{ 0, 0, 0, NULL, (void*) &hasBook, NULL, NULL, CheckBox, N_("Must not use GUI book") }, +{ 0, 0, 0, NULL, (void*) &addToList, NULL, NULL, CheckBox, N_("Add this engine to the list") }, +{ 0, 0, 0, NULL, (void*) &storeVariant, NULL, NULL, CheckBox, N_("Force current variant with this engine") }, +{ 0, 0, 0, NULL, (void*) &engineChoice, (char*) engineNr, engineNr, ComboBox, N_("Load mentioned engine as") }, +{ 0, 1, 0, NULL, (void*) &InstallOK, "", NULL, EndMark , "" } +}; + +void LoadEngineProc(w, event, prms, nprms) + Widget w; + XEvent *event; + String *prms; + Cardinal *nprms; +{ + isUCI = addToList = storeVariant = v1 = False; hasBook = True; // defaults + engineDir = ""; + if(engineChoice) free(engineChoice); engineChoice = strdup(engineNr[0]); + if(engineLine) free(engineLine); engineLine = strdup(""); + NamesToList(firstChessProgramNames); + GenericPopUp(installOptions, _("Load engine"), 0); +} + //---------------------------- Chat Windows ---------------------------------------------- void OutputChatMessage(int partner, char *mess)