# 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;
}
//--------------------------- New Shuffle Game --------------------------------------------
-extern int shuffleOpenings;
-extern int startedFromPositionFile;
int shuffleUp;
Widget shuffleShell;
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) {
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)
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);
}
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,
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');
}
} else {
buttonColor = *(Pixel *) vTo.addr;
}
- }
+ } else buttonColor = (Pixel) 0;
XtSetArg(args[0], XtNbackground, buttonColor);;
XtSetValues(box, args, 1);
}
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);
void GenericReadout(int selected)
{
int i, j;
- String name, val;
+ String val;
Arg args[16];
char buf[MSG_SIZ], **dest;
float x;
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;
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;
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;
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 = "+";
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);
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++;
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 {
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);
}
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")) {
GenericPopUp(tagsOptions, _("Tags"), 2);
}
-extern char ICSInputTranslations[];
char *icsText;
Option boxOptions[] = {
void PutText(char *text, int pos)
{
- Widget edit;
Arg args[16];
char buf[MSG_SIZ], *p;
String *prms;
Cardinal *nprms;
{
- if(WaitForSecond(SettingsMenuIfReady)) return;
+ if(WaitForEngine(&second, SettingsMenuIfReady)) return;
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)