X-Git-Url: http://winboard.nl/cgi-bin?a=blobdiff_plain;f=xoptions.c;h=bfc487c585b686def414ac3fc6c3572682a5d35e;hb=8bd006fe9af8f3d1469357d5efa7ff46a78773e0;hp=5e4fac87d0742c79a9cf16063583069846bb251a;hpb=74025874f2010f84fd4f7f2e120e84b56ee9781b;p=xboard.git diff --git a/xoptions.c b/xoptions.c index 5e4fac8..bfc487c 100644 --- a/xoptions.c +++ b/xoptions.c @@ -1,28 +1,24 @@ /* * xoptions.c -- Move list window, part of X front end for XBoard * - * Copyright 2000 Free Software Foundation, Inc. - * - * The following terms apply to the enhanced version of XBoard distributed - * by the Free Software Foundation: + * Copyright 2000, 2009, 2010, 2011 Free Software Foundation, Inc. * ------------------------------------------------------------------------ - * This program is free software; you can redistribute it and/or modify + * + * GNU XBoard is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. + * the Free Software Foundation, either version 3 of the License, or (at + * your option) any later version. * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. + * GNU XBoard is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * ------------------------------------------------------------------------ + * along with this program. If not, see http://www.gnu.org/licenses/. * * - * See the file ChangeLog for a revision history. - */ + *------------------------------------------------------------------------ + ** See the file ChangeLog for a revision history. */ // [HGM] this file is the counterpart of woptions.c, containing xboard popup menus // similar to those of WinBoard, to set the most common options interactively. @@ -49,6 +45,7 @@ extern char *getenv(); #if HAVE_UNISTD_H # include #endif +#include #include #include @@ -72,6 +69,19 @@ extern char *getenv(); #include "common.h" #include "backend.h" #include "xboard.h" +#include "gettext.h" + +#ifdef ENABLE_NLS +# define _(s) gettext (s) +# define N_(s) gettext_noop (s) +#else +# define _(s) (s) +# 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 *mode, int (*show_entry)(), char **name_return)); extern Widget formWidget, shellWidget, boardWidget, menuBarWidget; extern Display *xDisplay; @@ -81,6 +91,8 @@ extern char *layoutName; extern Window xBoardWindow; extern Arg layoutArgs[2], formArgs[2]; Pixel timerForegroundPixel, timerBackgroundPixel; +extern int searchTime; +extern int lineGap; // [HGM] the following code for makng menu popups was cloned from the FileNamePopUp routines @@ -88,14 +100,18 @@ static Widget previous = NULL; void SetFocus(Widget w, XtPointer data, XEvent *event, Boolean *b) { - Arg args; + Arg args[2]; + char *s; if(previous) { - XtSetArg(args, XtNdisplayCaret, False); - XtSetValues(previous, &args, 1); + XtSetArg(args[0], XtNdisplayCaret, False); + XtSetValues(previous, args, 1); } - XtSetArg(args, XtNdisplayCaret, True); - XtSetValues(w, &args, 1); + XtSetArg(args[0], XtNstring, &s); + XtGetValues(w, args, 1); + XtSetArg(args[0], XtNdisplayCaret, True); + XtSetArg(args[1], XtNinsertPosition, strlen(s)); + XtSetValues(w, args, 2); XtSetKeyboardFocus((Widget) data, w); previous = w; } @@ -122,33 +138,32 @@ void ShuffleCallback(w, client_data, call_data) String name; Widget w2; Arg args[16]; - char buf[80]; - + char buf[MSG_SIZ]; + XtSetArg(args[0], XtNlabel, &name); XtGetValues(w, args, 1); - - if (strcmp(name, "cancel") == 0) { + + if (strcmp(name, _("cancel")) == 0) { ShufflePopDown(); return; } - if (strcmp(name, "off") == 0) { + if (strcmp(name, _("off")) == 0) { ShufflePopDown(); shuffleOpenings = False; // [HGM] should be moved to New Variant menu, once we have it! ResetGameEvent(); - AnalysisPopDown(); return; } - if (strcmp(name, "random") == 0) { - sprintf(buf, "%d", rand()); + if (strcmp(name, _("random")) == 0) { + snprintf(buf, MSG_SIZ, "%d", rand()); XtSetArg(args[0],XtNvalue, buf); // erase bad (non-numeric) value XtSetValues(XtParent(w), args, 1); return; } - if (strcmp(name, "ok") == 0) { + if (strcmp(name, _("ok")) == 0) { int nr; String name; name = XawDialogGetValueString(w2 = XtParent(w)); if(sscanf(name ,"%d",&nr) != 1) { - sprintf(buf, "%d", appData.defaultFrcPosition); + snprintf(buf, MSG_SIZ, "%d", appData.defaultFrcPosition); XtSetArg(args[0],XtNvalue, buf); // erase bad (non-numeric) value XtSetValues(w2, args, 1); return; @@ -157,7 +172,6 @@ void ShuffleCallback(w, client_data, call_data) shuffleOpenings = True; ShufflePopDown(); ResetGameEvent(); - AnalysisPopDown(); return; } } @@ -170,49 +184,49 @@ void ShufflePopUp() int x, y, i; int win_x, win_y; unsigned int mask; - char def[80]; - + char def[MSG_SIZ]; + i = 0; XtSetArg(args[i], XtNresizable, True); i++; XtSetArg(args[i], XtNwidth, DIALOG_SIZE); i++; shuffleShell = popup = - XtCreatePopupShell("New Shuffle Game", transientShellWidgetClass, + XtCreatePopupShell(_("New Shuffle Game"), transientShellWidgetClass, shellWidget, args, i); - + layout = XtCreateManagedWidget(layoutName, formWidgetClass, popup, layoutArgs, XtNumber(layoutArgs)); - - sprintf(def, "%d\n", appData.defaultFrcPosition); + + snprintf(def, MSG_SIZ, "%d\n", appData.defaultFrcPosition); i = 0; - XtSetArg(args[i], XtNlabel, "Start-position number:"); i++; + XtSetArg(args[i], XtNlabel, _("Start-position number:")); i++; XtSetArg(args[i], XtNvalue, def); i++; XtSetArg(args[i], XtNborderWidth, 0); i++; - dialog = XtCreateManagedWidget("Shuffle", dialogWidgetClass, + dialog = XtCreateManagedWidget(_("Shuffle"), dialogWidgetClass, layout, args, i); - + // XtSetArg(args[0], XtNeditType, XawtextEdit); // [HGM] can't get edit to work decently // XtSetArg(args[1], XtNuseStringInPlace, False); // XtSetValues(dialog, args, 2); - XawDialogAddButton(dialog, "ok", ShuffleCallback, (XtPointer) dialog); - XawDialogAddButton(dialog, "cancel", ShuffleCallback, (XtPointer) dialog); - XawDialogAddButton(dialog, "random", ShuffleCallback, (XtPointer) dialog); - XawDialogAddButton(dialog, "off", ShuffleCallback, (XtPointer) dialog); - + XawDialogAddButton(dialog, _("ok"), ShuffleCallback, (XtPointer) dialog); + XawDialogAddButton(dialog, _("cancel"), ShuffleCallback, (XtPointer) dialog); + XawDialogAddButton(dialog, _("random"), ShuffleCallback, (XtPointer) dialog); + XawDialogAddButton(dialog, _("off"), ShuffleCallback, (XtPointer) dialog); + XtRealizeWidget(popup); CatchDeleteWindow(popup, "ShufflePopDown"); - + XQueryPointer(xDisplay, xBoardWindow, &root, &child, &x, &y, &win_x, &win_y, &mask); - + XtSetArg(args[0], XtNx, x - 10); XtSetArg(args[1], XtNy, y - 30); XtSetValues(popup, args, 2); - + XtPopup(popup, XtGrabExclusive); shuffleUp = True; - + edit = XtNameToWidget(dialog, "*value"); XtSetKeyboardFocus(popup, edit); @@ -240,6 +254,7 @@ int tcIncrement, tcMoves; void TimeControlPopDown() { if (!TimeControlUp) return; + previous = NULL; XtPopdown(TimeControlShell); XtDestroyWidget(TimeControlShell); TimeControlUp = False; @@ -251,63 +266,85 @@ void TimeControlCallback(w, client_data, call_data) XtPointer client_data, call_data; { String name, txt; - Widget w2; Arg args[16]; - char buf[80]; + char buf[MSG_SIZ]; int j; XtSetArg(args[0], XtNlabel, &name); XtGetValues(w, args, 1); - - if (strcmp(name, "classical") == 0) { - if(!tcInc) return; + + if (strcmp(name, _("classical")) == 0) { + if(tcInc == 0) return; j=0; - XtSetArg(args[j], XtNlabel, "minutes for each"); j++; + XtSetArg(args[j], XtNlabel, _("minutes for each")); j++; XtSetValues(tcMess1, args, j); j=0; - XtSetArg(args[j], XtNlabel, "moves"); j++; + XtSetArg(args[j], XtNlabel, _("moves")); j++; XtSetValues(tcMess2, args, j); - j=0; - XtSetArg(args[j], XtNstring, &name); j++; - XtGetValues(tcData, args, j); - tcIncrement = 0; sscanf(name, "%d", &tcIncrement); - sprintf(buf, "%d", tcMoves); + if(tcInc == 1) { + j=0; + XtSetArg(args[j], XtNstring, &name); j++; + XtGetValues(tcData, args, j); + tcIncrement = 0; sscanf(name, "%d", &tcIncrement); + } + snprintf(buf, MSG_SIZ, "%d", tcMoves); j=0; XtSetArg(args[j], XtNstring, buf); j++; XtSetValues(tcData, args, j); - tcInc = False; + tcInc = 0; return; } - if (strcmp(name, "incremental") == 0) { - if(tcInc) return; + if (strcmp(name, _("incremental")) == 0) { + if(tcInc == 1) return; j=0; - XtSetArg(args[j], XtNlabel, "minutes, plus"); j++; + XtSetArg(args[j], XtNlabel, _("minutes, plus")); j++; XtSetValues(tcMess1, args, j); j=0; - XtSetArg(args[j], XtNlabel, "sec/move"); j++; + XtSetArg(args[j], XtNlabel, _("sec/move")); j++; XtSetValues(tcMess2, args, j); - j=0; - XtSetArg(args[j], XtNstring, &name); j++; - XtGetValues(tcData, args, j); - tcMoves = appData.movesPerSession; sscanf(name, "%d", &tcMoves); - sprintf(buf, "%d", tcIncrement); + if(tcInc == 0) { + j=0; + XtSetArg(args[j], XtNstring, &name); j++; + XtGetValues(tcData, args, j); + tcMoves = appData.movesPerSession; sscanf(name, "%d", &tcMoves); + } + snprintf(buf, MSG_SIZ, "%d", tcIncrement); j=0; XtSetArg(args[j], XtNstring, buf); j++; XtSetValues(tcData, args, j); - tcInc = True; + tcInc = 1; return; } - if (strcmp(name, " OK ") == 0) { - int inc, mps, tc, ok; + if (strcmp(name, _("fixed time")) == 0) { + if(tcInc == 2) return; + j=0; + XtSetArg(args[j], XtNlabel, _("sec/move (max)")); j++; + XtSetValues(tcMess1, args, j); + j=0; + XtSetArg(args[j], XtNlabel, _("")); j++; + XtSetValues(tcMess2, args, j); + j=0; + XtSetArg(args[j], XtNstring, ""); j++; + XtSetValues(tcData, args, j); + tcInc = 2; + return; + } + if (strcmp(name, _(" OK ")) == 0) { + int inc, mps, ok; XtSetArg(args[0], XtNstring, &txt); XtGetValues(tcData, args, 1); - if(tcInc) { + switch(tcInc) { + case 1: ok = sscanf(txt, "%d", &inc); mps = 0; if(!ok && txt[0] == 0) { inc = 0; ok = 1; } // accept empty string as zero ok &= (inc >= 0); - } else { + break; + case 0: ok = sscanf(txt, "%d", &mps); inc = -1; ok &= (mps > 0); + break; + case 2: + ok = 1; inc = -1; mps = 40; } if(ok != 1) { XtSetArg(args[0], XtNstring, ""); // erase any offending input @@ -316,21 +353,32 @@ void TimeControlCallback(w, client_data, call_data) } XtSetArg(args[0], XtNstring, &txt); XtGetValues(tcTime, args, 1); - if(!ParseTimeControl(txt, inc, mps)) { - XtSetArg(args[0], XtNstring, ""); // erase any offending input - XtSetValues(tcTime, args, 1); - DisplayError("Bad Time-Control String", 0); - return; + if(tcInc == 2) { + if(sscanf(txt, "%d", &inc) != 1) { + XtSetArg(args[0], XtNstring, ""); // erase any offending input + XtSetValues(tcTime, args, 1); + DisplayError(_("Bad Time-Control String"), 0); + return; + } + searchTime = inc; + } else { + if(!ParseTimeControl(txt, inc, mps)) { + XtSetArg(args[0], XtNstring, ""); // erase any offending input + XtSetValues(tcTime, args, 1); + DisplayError(_("Bad Time-Control String"), 0); + return; + } + searchTime = 0; + appData.movesPerSession = mps; + appData.timeIncrement = inc; + appData.timeControl = strdup(txt); } - appData.movesPerSession = mps; - appData.timeIncrement = inc; - appData.timeControl = strdup(txt); XtSetArg(args[0], XtNstring, &txt); XtGetValues(tcOdds1, args, 1); - appData.firstTimeOdds = first.timeOdds + appData.firstTimeOdds = first.timeOdds = (sscanf(txt, "%d", &j) == 1 && j > 0) ? j : 1; XtGetValues(tcOdds2, args, 1); - appData.secondTimeOdds = second.timeOdds + appData.secondTimeOdds = second.timeOdds = (sscanf(txt, "%d", &j) == 1 && j > 0) ? j : 1; Reset(True, True); @@ -342,33 +390,33 @@ void TimeControlCallback(w, client_data, call_data) void TimeControlPopUp() { Arg args[16]; - Widget popup, layout, form, edit, b_ok, b_cancel, b_clas, b_inc, mess; + Widget popup, layout, form, b_ok, b_cancel, b_clas, b_inc, mess; Window root, child; int x, y, i, j; int win_x, win_y; unsigned int mask; - char def[80]; - - tcInc = (appData.timeIncrement >= 0); + char def[MSG_SIZ]; + + tcInc = searchTime > 0 ? 2 : (appData.timeIncrement >= 0); tcMoves = appData.movesPerSession; tcIncrement = appData.timeIncrement; if(!tcInc) tcIncrement = 0; - sprintf(def, "%d", tcInc ? tcIncrement : tcMoves); + snprintf(def, MSG_SIZ, "%d", tcInc ? tcIncrement : tcMoves); i = 0; XtSetArg(args[i], XtNresizable, True); i++; // XtSetArg(args[i], XtNwidth, DIALOG_SIZE); i++; TimeControlShell = popup = - XtCreatePopupShell("TimeControl Menu", transientShellWidgetClass, + XtCreatePopupShell(_("TimeControl Menu"), transientShellWidgetClass, shellWidget, args, i); - + layout = XtCreateManagedWidget(layoutName, formWidgetClass, popup, layoutArgs, XtNumber(layoutArgs)); - + form = XtCreateManagedWidget(layoutName, formWidgetClass, layout, formArgs, XtNumber(formArgs)); - + j = 0; // XtSetArg(args[j], XtNwidth, (XtArgVal) 300); j++; // XtSetArg(args[j], XtNheight, (XtArgVal) 85); j++; @@ -386,12 +434,12 @@ void TimeControlPopUp() XtSetArg(args[j], XtNright, XtChainRight); j++; XtSetArg(args[j], XtNresizable, True); j++; XtSetArg(args[j], XtNwidth, 85); j++; -// XtSetArg(args[j], XtNheight, 20); j++; + XtSetArg(args[j], XtNinsertPosition, 9999); j++; tcTime = XtCreateManagedWidget("TC", asciiTextWidgetClass, form, args, j); XtAddEventHandler(tcTime, ButtonPressMask, False, SetFocus, (XtPointer) popup); j= 0; - XtSetArg(args[j], XtNlabel, tcInc ? " minutes, plus " : "minutes for each"); j++; + XtSetArg(args[j], XtNlabel, tcInc ? tcInc == 2 ? _("sec/move (max) ") : _(" minutes, plus ") : _("minutes for each")); j++; XtSetArg(args[j], XtNborderWidth, 0); j++; XtSetArg(args[j], XtNfromHoriz, tcTime); j++; XtSetArg(args[j], XtNtop, XtChainTop); j++; @@ -420,7 +468,7 @@ void TimeControlPopUp() XtAddEventHandler(tcData, ButtonPressMask, False, SetFocus, (XtPointer) popup); j= 0; - XtSetArg(args[j], XtNlabel, tcInc ? "sec/move" : "moves "); j++; + XtSetArg(args[j], XtNlabel, tcInc ? tcInc == 2 ? _(" ") : _("sec/move") : _("moves ")); j++; XtSetArg(args[j], XtNjustify, XtJustifyLeft); j++; XtSetArg(args[j], XtNborderWidth, 0); j++; XtSetArg(args[j], XtNfromHoriz, tcData); j++; @@ -469,7 +517,7 @@ void TimeControlPopUp() XtAddEventHandler(tcOdds2, ButtonPressMask, False, SetFocus, (XtPointer) popup); j= 0; - XtSetArg(args[j], XtNlabel, "Engine #1 and #2 Time-Odds Factors"); j++; + XtSetArg(args[j], XtNlabel, _("Engine #1 and #2 Time-Odds Factors")); j++; XtSetArg(args[j], XtNjustify, XtJustifyLeft); j++; XtSetArg(args[j], XtNborderWidth, 0); j++; XtSetArg(args[j], XtNfromVert, tcTime); j++; @@ -488,19 +536,35 @@ void TimeControlPopUp() XtSetArg(args[j], XtNtop, XtChainBottom); j++; XtSetArg(args[j], XtNleft, XtChainLeft); j++; XtSetArg(args[j], XtNright, XtChainLeft); j++; - b_clas= XtCreateManagedWidget("classical", commandWidgetClass, - form, args, j); + XtSetArg(args[j], XtNstate, tcInc==0); j++; + b_clas= XtCreateManagedWidget(_("classical"), toggleWidgetClass, + form, args, j); XtAddCallback(b_clas, XtNcallback, TimeControlCallback, (XtPointer) 0); j=0; + XtSetArg(args[j], XtNradioGroup, b_clas); j++; XtSetArg(args[j], XtNfromVert, tcOdds1); j++; XtSetArg(args[j], XtNfromHoriz, b_clas); j++; XtSetArg(args[j], XtNbottom, XtChainBottom); j++; XtSetArg(args[j], XtNtop, XtChainBottom); j++; XtSetArg(args[j], XtNleft, XtChainLeft); j++; XtSetArg(args[j], XtNright, XtChainLeft); j++; - b_inc = XtCreateManagedWidget("incremental", commandWidgetClass, - form, args, j); + XtSetArg(args[j], XtNstate, tcInc==1); j++; + b_inc = XtCreateManagedWidget(_("incremental"), toggleWidgetClass, + form, args, j); + XtAddCallback(b_inc, XtNcallback, TimeControlCallback, (XtPointer) 0); + + j=0; + XtSetArg(args[j], XtNradioGroup, b_inc); j++; + XtSetArg(args[j], XtNfromVert, tcOdds1); j++; + XtSetArg(args[j], XtNfromHoriz, b_inc); j++; + XtSetArg(args[j], XtNbottom, XtChainBottom); j++; + XtSetArg(args[j], XtNtop, XtChainBottom); j++; + XtSetArg(args[j], XtNleft, XtChainLeft); j++; + XtSetArg(args[j], XtNright, XtChainLeft); j++; + XtSetArg(args[j], XtNstate, tcInc==2); j++; + b_inc = XtCreateManagedWidget(_("fixed time"), toggleWidgetClass, + form, args, j); XtAddCallback(b_inc, XtNcallback, TimeControlCallback, (XtPointer) 0); j=0; @@ -510,8 +574,8 @@ void TimeControlPopUp() XtSetArg(args[j], XtNtop, XtChainBottom); j++; XtSetArg(args[j], XtNleft, XtChainRight); j++; XtSetArg(args[j], XtNright, XtChainRight); j++; - b_ok= XtCreateManagedWidget(" OK ", commandWidgetClass, - form, args, j); + b_ok= XtCreateManagedWidget(_(" OK "), commandWidgetClass, + form, args, j); XtAddCallback(b_ok, XtNcallback, TimeControlCallback, (XtPointer) 0); j=0; @@ -521,23 +585,23 @@ void TimeControlPopUp() XtSetArg(args[j], XtNtop, XtChainBottom); j++; XtSetArg(args[j], XtNleft, XtChainRight); j++; XtSetArg(args[j], XtNright, XtChainRight); j++; - b_cancel= XtCreateManagedWidget("cancel", commandWidgetClass, - form, args, j); + b_cancel= XtCreateManagedWidget(_("cancel"), commandWidgetClass, + form, args, j); XtAddCallback(b_cancel, XtNcallback, TimeControlPopDown, (XtPointer) 0); XtRealizeWidget(popup); CatchDeleteWindow(popup, "TimeControlPopDown"); - + XQueryPointer(xDisplay, xBoardWindow, &root, &child, &x, &y, &win_x, &win_y, &mask); - + XtSetArg(args[0], XtNx, x - 10); XtSetArg(args[1], XtNy, y - 30); XtSetValues(popup, args, 2); - + XtPopup(popup, XtGrabExclusive); TimeControlUp = True; - + previous = NULL; SetFocus(tcTime, popup, (XEvent*) NULL, False); // XtSetKeyboardFocus(popup, tcTime); @@ -562,6 +626,7 @@ Widget engDrawMoves, engThreshold, engRule, engRepeat; void EnginePopDown() { if (!EngineUp) return; + previous = NULL; XtPopdown(EngineShell); XtDestroyWidget(EngineShell); EngineUp = False; @@ -585,26 +650,24 @@ void EngineCallback(w, client_data, call_data) XtPointer client_data, call_data; { String name; - Widget s2; Arg args[16]; - char buf[80]; int j; - + XtSetArg(args[0], XtNlabel, &name); XtGetValues(w, args, 1); - - if (strcmp(name, "OK") == 0) { + + if (strcmp(name, _("OK")) == 0) { // read all switches appData.periodicUpdates = ReadToggle(w1); // appData.hideThinkingFromHuman = ReadToggle(w2); - appData.firstScoreIsAbsolute = ReadToggle(w3); - appData.secondScoreIsAbsolute = ReadToggle(w4); + first.scoreIsAbsolute = appData.firstScoreIsAbsolute = ReadToggle(w3); + second.scoreIsAbsolute = appData.secondScoreIsAbsolute = ReadToggle(w4); appData.testClaims = ReadToggle(w5); appData.checkMates = ReadToggle(w6); appData.materialDraws = ReadToggle(w7); appData.trivialDraws = ReadToggle(w8); - // adjust setting in other menu for duplicates + // adjust setting in other menu for duplicates // (perhaps duplicates should be removed from general Option Menu?) // XtSetArg(args[0], XtNleftBitmap, appData.showThinking ? xMarkPixmap : None); // XtSetValues(XtNameToWidget(menuBarWidget, @@ -615,7 +678,7 @@ void EngineCallback(w, client_data, call_data) XtGetValues(engDrawMoves, args, 1); if(sscanf(name, "%d", &j) == 1) appData.adjudicateDrawMoves = j; XtGetValues(engThreshold, args, 1); - if(sscanf(name, "%d", &j) == 1) + if(sscanf(name, "%d", &j) == 1) adjudicateLossThreshold = appData.adjudicateLossThreshold = -j; // inverted! XtGetValues(engRule, args, 1); if(sscanf(name, "%d", &j) == 1) appData.ruleMoves = j; @@ -631,33 +694,33 @@ void EngineCallback(w, client_data, call_data) void EnginePopUp() { Arg args[16]; - Widget popup, layout, form, edit, b_ok, b_cancel, b_clas, b_inc, s1; + Widget popup, layout, form, b_ok, b_cancel, s1; Window root, child; int x, y, i, j, width; int win_x, win_y; unsigned int mask; - char def[80]; - + char def[MSG_SIZ]; + tcInc = (appData.timeIncrement >= 0); tcMoves = appData.movesPerSession; tcIncrement = appData.timeIncrement; if(!tcInc) tcIncrement = 0; - sprintf(def, "%d", tcInc ? tcIncrement : tcMoves); + snprintf(def, MSG_SIZ, "%d", tcInc ? tcIncrement : tcMoves); i = 0; XtSetArg(args[i], XtNresizable, True); i++; // XtSetArg(args[i], XtNwidth, DIALOG_SIZE); i++; EngineShell = popup = - XtCreatePopupShell("Adjudications", transientShellWidgetClass, + XtCreatePopupShell(_("Adjudications"), transientShellWidgetClass, shellWidget, args, i); - + layout = XtCreateManagedWidget(layoutName, formWidgetClass, popup, layoutArgs, XtNumber(layoutArgs)); - + form = XtCreateManagedWidget(layoutName, formWidgetClass, layout, formArgs, XtNumber(formArgs)); - + j = 0; // XtSetArg(args[j], XtNwidth, (XtArgVal) 250); j++; // XtSetArg(args[j], XtNheight, (XtArgVal) 400); j++; @@ -670,47 +733,47 @@ void EnginePopUp() XtSetArg(args[j], XtNright, (XtArgVal) XtChainRight); j++; XtSetArg(args[j], XtNstate, appData.periodicUpdates); j++; // XtSetArg(args[j], XtNjustify, (XtArgVal) XtJustifyLeft); j++; - w1 = XtCreateManagedWidget("Periodic Updates (Analysis Mode)", toggleWidgetClass, form, args, j); + w1 = XtCreateManagedWidget(_("Periodic Updates (Analysis Mode)"), toggleWidgetClass, form, args, j); XtSetArg(args[j], XtNwidth, (XtArgVal) &width); XtGetValues(w1, &args[j], 1); // XtSetArg(args[j-1], XtNfromVert, (XtArgVal) w1); // XtSetArg(args[j-3], XtNstate, appData.hideThinkingFromHuman); -// w2 = XtCreateManagedWidget("Hide Thinking from Human", toggleWidgetClass, form, args, j); +// w2 = XtCreateManagedWidget(_("Hide Thinking from Human"), toggleWidgetClass, form, args, j); XtSetArg(args[j], XtNwidth, (XtArgVal) width); j++; XtSetArg(args[j-2], XtNstate, appData.firstScoreIsAbsolute); XtSetArg(args[j], XtNfromVert, (XtArgVal) w1); j++; - w3 = XtCreateManagedWidget("Engine #1 Score is Absolute", toggleWidgetClass, form, args, j); + w3 = XtCreateManagedWidget(_("Engine #1 Score is Absolute"), toggleWidgetClass, form, args, j); XtSetArg(args[j-1], XtNfromVert, (XtArgVal) w3); XtSetArg(args[j-3], XtNstate, appData.secondScoreIsAbsolute); - w4 = XtCreateManagedWidget("Engine #2 Score is Absolute", toggleWidgetClass, form, args, j); + w4 = XtCreateManagedWidget(_("Engine #2 Score is Absolute"), toggleWidgetClass, form, args, j); - s1 = XtCreateManagedWidget("\nEngine-Engine Adjudications:", labelWidgetClass, form, args, 3); + s1 = XtCreateManagedWidget(_("\nAdjudications in non-ICS games:"), labelWidgetClass, form, args, 3); XtSetArg(args[j-1], XtNfromVert, (XtArgVal) s1); XtSetArg(args[j-3], XtNstate, appData.testClaims); - w5 = XtCreateManagedWidget("Verify Engine Result Claims", toggleWidgetClass, form, args, j); + w5 = XtCreateManagedWidget(_("Verify Engine Result Claims"), toggleWidgetClass, form, args, j); XtSetArg(args[j-1], XtNfromVert, (XtArgVal) w5); XtSetArg(args[j-3], XtNstate, appData.checkMates); - w6 = XtCreateManagedWidget("Detect All Mates", toggleWidgetClass, form, args, j); + w6 = XtCreateManagedWidget(_("Detect All Mates"), toggleWidgetClass, form, args, j); XtSetArg(args[j-1], XtNfromVert, (XtArgVal) w6); XtSetArg(args[j-3], XtNstate, appData.materialDraws); - w7 = XtCreateManagedWidget("Draw when Insuff. Mating Material", toggleWidgetClass, form, args, j); + w7 = XtCreateManagedWidget(_("Draw when Insuff. Mating Material"), toggleWidgetClass, form, args, j); XtSetArg(args[j-1], XtNfromVert, (XtArgVal) w7); XtSetArg(args[j-3], XtNstate, appData.trivialDraws); - w8 = XtCreateManagedWidget("Adjudicate Trivial Draws", toggleWidgetClass, form, args, j); + w8 = XtCreateManagedWidget(_("Adjudicate Trivial Draws"), toggleWidgetClass, form, args, j); XtSetArg(args[0], XtNfromVert, (XtArgVal) w4); XtSetArg(args[1], XtNborderWidth, (XtArgVal) 0); XtSetValues(s1, args, 2); - sprintf(def, "%d", appData.adjudicateDrawMoves); + snprintf(def, MSG_SIZ, "%d", appData.adjudicateDrawMoves); j= 0; XtSetArg(args[j], XtNborderWidth, 1); j++; XtSetArg(args[j], XtNfromVert, w8); j++; @@ -729,7 +792,7 @@ void EnginePopUp() XtAddEventHandler(engDrawMoves, ButtonPressMask, False, SetFocus, (XtPointer) popup); j= 0; - XtSetArg(args[j], XtNlabel, " moves maximum, then draw"); j++; + XtSetArg(args[j], XtNlabel, _(" moves maximum, then draw")); j++; XtSetArg(args[j], XtNjustify, (XtArgVal) XtJustifyLeft); j++; XtSetArg(args[j], XtNborderWidth, 0); j++; XtSetArg(args[j], XtNfromVert, w8); j++; @@ -742,7 +805,7 @@ void EnginePopUp() // XtSetArg(args[j], XtNheight, 20); j++; tcMess1 = XtCreateManagedWidget("TCtext", labelWidgetClass, form, args, j); - sprintf(def, "%d", -appData.adjudicateLossThreshold); // inverted! + snprintf(def, MSG_SIZ, "%d", -appData.adjudicateLossThreshold); // inverted! j= 0; XtSetArg(args[j], XtNborderWidth, 1); j++; XtSetArg(args[j], XtNfromVert, engDrawMoves); j++; @@ -756,12 +819,12 @@ void EnginePopUp() XtSetArg(args[j], XtNright, XtChainLeft); j++; XtSetArg(args[j], XtNresizable, True); j++; XtSetArg(args[j], XtNwidth, 60); j++; -// XtSetArg(args[j], XtNheight, 20); j++; + XtSetArg(args[j], XtNinsertPosition, 9999); j++; engThreshold = XtCreateManagedWidget("Threshold", asciiTextWidgetClass, form, args, j); XtAddEventHandler(engThreshold, ButtonPressMask, False, SetFocus, (XtPointer) popup); j= 0; - XtSetArg(args[j], XtNlabel, "-centiPawn lead is win"); j++; + XtSetArg(args[j], XtNlabel, _("-centiPawn lead is win")); j++; XtSetArg(args[j], XtNjustify, XtJustifyLeft); j++; XtSetArg(args[j], XtNborderWidth, 0); j++; XtSetArg(args[j], XtNfromVert, engDrawMoves); j++; @@ -774,7 +837,7 @@ void EnginePopUp() // XtSetArg(args[j], XtNheight, 20); j++; tcMess2 = XtCreateManagedWidget("MPStext", labelWidgetClass, form, args, j); - sprintf(def, "%d", appData.ruleMoves); + snprintf(def, MSG_SIZ, "%d", appData.ruleMoves); j= 0; XtSetArg(args[j], XtNborderWidth, 1); j++; XtSetArg(args[j], XtNfromVert, engThreshold); j++; @@ -793,7 +856,7 @@ void EnginePopUp() XtAddEventHandler(engRule, ButtonPressMask, False, SetFocus, (XtPointer) popup); j= 0; - XtSetArg(args[j], XtNlabel, "-move rule applied"); j++; + XtSetArg(args[j], XtNlabel, _("-move rule applied")); j++; XtSetArg(args[j], XtNjustify, (XtArgVal) XtJustifyLeft); j++; XtSetArg(args[j], XtNborderWidth, 0); j++; XtSetArg(args[j], XtNfromVert, engThreshold); j++; @@ -806,7 +869,7 @@ void EnginePopUp() // XtSetArg(args[j], XtNheight, 20); j++; tcMess1 = XtCreateManagedWidget("TCtext", labelWidgetClass, form, args, j); - sprintf(def, "%d", appData.drawRepeats); + snprintf(def, MSG_SIZ, "%d", appData.drawRepeats); j= 0; XtSetArg(args[j], XtNborderWidth, 1); j++; XtSetArg(args[j], XtNfromVert, engRule); j++; @@ -825,7 +888,7 @@ void EnginePopUp() XtAddEventHandler(engRepeat, ButtonPressMask, False, SetFocus, (XtPointer) popup); j= 0; - XtSetArg(args[j], XtNlabel, "-fold repeat is draw"); j++; + XtSetArg(args[j], XtNlabel, _("-fold repeat is draw")); j++; XtSetArg(args[j], XtNjustify, XtJustifyLeft); j++; XtSetArg(args[j], XtNborderWidth, 0); j++; XtSetArg(args[j], XtNfromVert, engRule); j++; @@ -845,7 +908,7 @@ void EnginePopUp() XtSetArg(args[j], XtNtop, XtChainBottom); j++; XtSetArg(args[j], XtNleft, XtChainRight); j++; XtSetArg(args[j], XtNright, XtChainRight); j++; - b_ok= XtCreateManagedWidget("OK", commandWidgetClass, form, args, j); + b_ok= XtCreateManagedWidget(_("OK"), commandWidgetClass, form, args, j); XtAddCallback(b_ok, XtNcallback, EngineCallback, (XtPointer) 0); j=0; @@ -855,23 +918,23 @@ void EnginePopUp() XtSetArg(args[j], XtNtop, XtChainBottom); j++; XtSetArg(args[j], XtNleft, XtChainRight); j++; XtSetArg(args[j], XtNright, XtChainRight); j++; - b_cancel= XtCreateManagedWidget("cancel", commandWidgetClass, - form, args, j); + b_cancel= XtCreateManagedWidget(_("cancel"), commandWidgetClass, + form, args, j); XtAddCallback(b_cancel, XtNcallback, EnginePopDown, (XtPointer) 0); XtRealizeWidget(popup); CatchDeleteWindow(popup, "EnginePopDown"); - + XQueryPointer(xDisplay, xBoardWindow, &root, &child, &x, &y, &win_x, &win_y, &mask); - + XtSetArg(args[0], XtNx, x - 10); XtSetArg(args[1], XtNy, y - 30); XtSetValues(popup, args, 2); - + XtPopup(popup, XtGrabExclusive); EngineUp = True; - + previous = NULL; SetFocus(engThreshold, popup, (XEvent*) NULL, False); } @@ -894,36 +957,39 @@ struct NewVarButton { }; struct NewVarButton buttonDesc[] = { - {"normal", "#FFFFFF", 0, VariantNormal}, - {"FRC", "#FFFFFF", 0, VariantFischeRandom}, - {"wild castle", "#FFFFFF", 0, VariantWildCastle}, - {"no castle", "#FFFFFF", 0, VariantNoCastle}, - {"knightmate", "#FFFFFF", 0, VariantKnightmate}, - {"berolina", "#FFFFFF", 0, VariantBerolina}, - {"cylinder", "#FFFFFF", 0, VariantCylinder}, - {"shatranj", "#FFFFFF", 0, VariantShatranj}, - {"atomic", "#FFFFFF", 0, VariantAtomic}, - {"two kings", "#FFFFFF", 0, VariantTwoKings}, - {"3-checks", "#FFFFFF", 0, Variant3Check}, - {"suicide", "#FFFFBF", 0, VariantSuicide}, - {"give-away", "#FFFFBF", 0, VariantGiveaway}, - {"losers", "#FFFFBF", 0, VariantLosers}, - {"fairy", "#BFBFBF", 0, VariantFairy}, - {"Superchess", "#FFBFBF", 0, VariantSuper}, - {"crazyhouse", "#FFBFBF", 0, VariantCrazyhouse}, - {"bughouse", "#FFBFBF", 0, VariantBughouse}, - {"shogi (9x9)", "#BFFFFF", 0, VariantShogi}, - {"xiangqi (9x10)", "#BFFFFF", 0, VariantXiangqi}, - {"courier (12x8)", "#BFFFBF", 0, VariantCourier}, - {"janus (10x8)", "#BFBFFF", 0, VariantJanus}, - {"Capablanca (10x8)", "#BFBFFF", 0, VariantCapablanca}, - {"CRC (10x8)", "#BFBFFF", 0, VariantCapaRandom}, + {N_("normal"), "#FFFFFF", 0, VariantNormal}, + {N_("FRC"), "#FFFFFF", 0, VariantFischeRandom}, + {N_("wild castle"), "#FFFFFF", 0, VariantWildCastle}, + {N_("no castle"), "#FFFFFF", 0, VariantNoCastle}, + {N_("knightmate"), "#FFFFFF", 0, VariantKnightmate}, + {N_("berolina"), "#FFFFFF", 0, VariantBerolina}, + {N_("cylinder"), "#FFFFFF", 0, VariantCylinder}, + {N_("shatranj"), "#FFFFFF", 0, VariantShatranj}, + {N_("makruk"), "#FFFFFF", 0, VariantMakruk}, + {N_("atomic"), "#FFFFFF", 0, VariantAtomic}, + {N_("two kings"), "#FFFFFF", 0, VariantTwoKings}, + {N_("3-checks"), "#FFFFFF", 0, Variant3Check}, + {N_("suicide"), "#FFFFBF", 0, VariantSuicide}, + {N_("give-away"), "#FFFFBF", 0, VariantGiveaway}, + {N_("losers"), "#FFFFBF", 0, VariantLosers}, + {N_("fairy"), "#BFBFBF", 0, VariantFairy}, + {N_("Seirawan"), "#FFBFBF", 0, VariantSChess}, + {N_("Superchess"), "#FFBFBF", 0, VariantSuper}, + {N_("crazyhouse"), "#FFBFBF", 0, VariantCrazyhouse}, + {N_("bughouse"), "#FFBFBF", 0, VariantBughouse}, + {N_("shogi (9x9)"), "#BFFFFF", 0, VariantShogi}, + {N_("xiangqi (9x10)"), "#BFFFFF", 0, VariantXiangqi}, + {N_("courier (12x8)"), "#BFFFBF", 0, VariantCourier}, + {N_("Capablanca (10x8)"), "#BFBFFF", 0, VariantCapablanca}, #ifdef GOTHIC - {"Gothic (10x8)", "#BFBFFF", 0, VariantGothic}, + {N_("Gothic (10x8)"), "#BFBFFF", 0, VariantGothic}, #endif + {N_("janus (10x8)"), "#BFBFFF", 0, VariantJanus}, + {N_("CRC (10x8)"), "#BFBFFF", 0, VariantCapaRandom}, #ifdef FALCON - {"Falcon (10x8)", "#BFBFFF", 0, VariantFalcon}, + {N_("Falcon (10x8)"), "#BFBFFF", 0, VariantFalcon}, #endif + {N_("Spartan"), "#FF0000", 0, VariantSpartan}, {NULL, 0, 0, (VariantClass) 0} }; @@ -944,29 +1010,27 @@ void NewVariantCallback(w, client_data, call_data) XtPointer client_data, call_data; { String name; - Widget w2; Arg args[16]; - char buf[80]; VariantClass v; - + XtSetArg(args[0], XtNlabel, &name); XtGetValues(w, args, 1); - - if (strcmp(name, " OK ") == 0) { - int nr = (int) XawToggleGetCurrent(buttonDesc[0].handle) - 1; + + if (strcmp(name, _(" OK ")) == 0) { + int nr = (intptr_t) XawToggleGetCurrent(buttonDesc[0].handle) - 1; if(nr < 0) return; v = buttonDesc[nr].variant; - if(!appData.noChessProgram) { + if(!appData.noChessProgram) { char *name = VariantName(v), buf[MSG_SIZ]; if (first.protocolVersion > 1 && StrStr(first.variants, name) == NULL) { /* [HGM] in protocol 2 we check if variant is suported by engine */ - sprintf(buf, "Variant %s not supported by %s", name, first.tidy); + snprintf(buf, MSG_SIZ, _("Variant %s not supported by %s"), name, first.tidy); DisplayError(buf, 0); // NewVariantPopDown(); return; /* ignore OK if first engine does not support it */ } else if (second.initDone && second.protocolVersion > 1 && StrStr(second.variants, name) == NULL) { - sprintf(buf, "Warning: second engine (%s) does not support this!", second.tidy); + snprintf(buf, MSG_SIZ, _("Warning: second engine (%s) does not support this!"), second.tidy); DisplayError(buf, 0); /* use of second engine is optional; only warn user */ } } @@ -986,12 +1050,11 @@ void NewVariantCallback(w, client_data, call_data) void NewVariantPopUp() { Arg args[16]; - Widget popup, layout, dialog, edit, form, last = NULL, b_ok, b_cancel; + Widget popup, layout, form, last = NULL, b_ok, b_cancel; Window root, child; int x, y, i, j; int win_x, win_y; unsigned int mask; - char def[80]; XrmValue vFrom, vTo; i = 0; @@ -999,17 +1062,17 @@ void NewVariantPopUp() // XtSetArg(args[i], XtNwidth, 250); i++; // XtSetArg(args[i], XtNheight, 300); i++; NewVariantShell = popup = - XtCreatePopupShell("NewVariant Menu", transientShellWidgetClass, + XtCreatePopupShell(_("NewVariant Menu"), transientShellWidgetClass, shellWidget, args, i); - + layout = XtCreateManagedWidget(layoutName, formWidgetClass, popup, layoutArgs, XtNumber(layoutArgs)); - + form = XtCreateManagedWidget("form", formWidgetClass, layout, formArgs, XtNumber(formArgs)); - + for(i = 0; buttonDesc[i].name != NULL; i++) { Pixel buttonColor; if (!appData.monoMode) { @@ -1022,7 +1085,7 @@ void NewVariantPopUp() buttonColor = *(Pixel *) vTo.addr; } } - + j = 0; XtSetArg(args[j], XtNradioGroup, last); j++; XtSetArg(args[j], XtNwidth, 125); j++; @@ -1032,6 +1095,7 @@ void NewVariantPopUp() XtSetArg(args[j], XtNradioData, i+1); j++; XtSetArg(args[j], XtNbackground, buttonColor); j++; XtSetArg(args[j], XtNstate, gameInfo.variant == buttonDesc[i].variant); j++; + XtSetArg(args[j], XtNsensitive, appData.noChessProgram || strstr(first.variants, VariantName(buttonDesc[i].variant))); j++; buttonDesc[i].handle = last = XtCreateManagedWidget(buttonDesc[i].name, toggleWidgetClass, form, args, j); } @@ -1045,7 +1109,7 @@ void NewVariantPopUp() XtSetArg(args[j], XtNtop, XtChainBottom); j++; XtSetArg(args[j], XtNleft, XtChainRight); j++; XtSetArg(args[j], XtNright, XtChainRight); j++; - b_cancel= XtCreateManagedWidget("CANCEL", commandWidgetClass, form, args, j); + b_cancel= XtCreateManagedWidget(_("CANCEL"), commandWidgetClass, form, args, j); XtAddCallback(b_cancel, XtNcallback, NewVariantPopDown, (XtPointer) 0); j=0; @@ -1057,19 +1121,33 @@ void NewVariantPopUp() XtSetArg(args[j], XtNtop, XtChainBottom); j++; XtSetArg(args[j], XtNleft, XtChainRight); j++; XtSetArg(args[j], XtNright, XtChainRight); j++; - b_ok= XtCreateManagedWidget(" OK ", commandWidgetClass, form, args, j); + b_ok= XtCreateManagedWidget(_(" OK "), commandWidgetClass, form, args, j); XtAddCallback(b_ok, XtNcallback, NewVariantCallback, (XtPointer) 0); - XtRealizeWidget(popup); + j=0; + XtSetArg(args[j], XtNfromVert, buttonDesc[14].handle); j++; +// XtSetArg(args[j], XtNheight, 70); j++; + XtSetArg(args[j], XtNbottom, XtChainBottom); j++; + XtSetArg(args[j], XtNtop, XtChainBottom); j++; + XtSetArg(args[j], XtNleft, XtChainLeft); j++; + XtSetArg(args[j], XtNright, XtChainRight); j++; + XtSetArg(args[j], XtNlabel, _("WARNING: variants with un-orthodox\n" + "pieces only have built-in bitmaps\n" + "for -boardSize middling, bulky and\n" + "petite, and substitute king or amazon\n" + "for missing bitmaps. (See manual.)")); j++; + XtCreateManagedWidget("warning", labelWidgetClass, form, args, j); + + XtRealizeWidget(popup); CatchDeleteWindow(popup, "NewVariantPopDown"); - + XQueryPointer(xDisplay, xBoardWindow, &root, &child, &x, &y, &win_x, &win_y, &mask); - + XtSetArg(args[0], XtNx, x - 10); XtSetArg(args[1], XtNy, y - 30); XtSetValues(popup, args, 2); - + XtPopup(popup, XtGrabExclusive); NewVariantUp = True; } @@ -1094,18 +1172,19 @@ struct UciControl { }; struct UciControl controlDesc[] = { - {"maximum nr of CPUs:", 0, &appData.smpCores}, - {"Polyglot Directory:", 0, &appData.polyglotDir}, - {"Hash Size (MB):", 0, &appData.defaultHashSize}, - {"EGTB Path:", 0, &appData.defaultPathEGTB}, - {"EGTB Cache (MB):", 0, &appData.defaultCacheSizeEGTB}, - {"Polyglot Book:", 0, &appData.polyglotBook}, + {N_("maximum nr of CPUs:"), 0, &appData.smpCores}, + {N_("Polyglot Directory:"), 0, &appData.polyglotDir}, + {N_("Hash Size (MB):"), 0, &appData.defaultHashSize}, + {N_("EGTB Path:"), 0, &appData.defaultPathEGTB}, + {N_("EGTB Cache (MB):"), 0, &appData.defaultCacheSizeEGTB}, + {N_("Polyglot Book:"), 0, &appData.polyglotBook}, {NULL, 0, NULL}, }; void UciPopDown() { if (!UciUp) return; + previous = NULL; XtPopdown(UciShell); XtDestroyWidget(UciShell); UciUp = False; @@ -1118,14 +1197,13 @@ void UciCallback(w, client_data, call_data) { String name; Arg args[16]; - char buf[80]; int oldCores = appData.smpCores, ponder = 0; - + XtSetArg(args[0], XtNlabel, &name); XtGetValues(w, args, 1); - - if (strcmp(name, "OK") == 0) { - int nr, i, j; String name; + + if (strcmp(name, _("OK")) == 0) { + int i, j; String name; for(i=0; i<6; i++) { XtSetArg(args[0], XtNstring, &name); XtGetValues(controlDesc[i].handle, args, 1); @@ -1133,7 +1211,7 @@ void UciCallback(w, client_data, call_data) if(name) *(char**) controlDesc[i].ptr = strdup(name); } else { - if(sscanf(name, "%d", &j) == 1) + if(sscanf(name, "%d", &j) == 1) *(int*) controlDesc[i].ptr = j; } } @@ -1146,7 +1224,7 @@ void UciCallback(w, client_data, call_data) XtSetArg(args[0], XtNstate, &ponder); XtGetValues(w4, args, 1); - // adjust setting in other menu for duplicates + // adjust setting in other menu for duplicates // (perhaps duplicates should be removed from general Option Menu?) XtSetArg(args[0], XtNleftBitmap, ponder ? xMarkPixmap : None); XtSetValues(XtNameToWidget(menuBarWidget, @@ -1158,7 +1236,7 @@ void UciCallback(w, client_data, call_data) // Some changed setting need immediate sending always. PonderNextMoveEvent(ponder); if(oldCores != appData.smpCores) - NewSettingEvent(False, "cores", appData.smpCores); + NewSettingEvent(False, &(first.maxCores), "cores", appData.smpCores); } UciPopDown(); return; @@ -1168,29 +1246,29 @@ void UciCallback(w, client_data, call_data) void UciPopUp() { Arg args[16]; - Widget popup, layout, dialog, edit, form, b_ok, b_cancel, last = NULL, new, upperLeft; + Widget popup, layout, form, b_ok, b_cancel, last = NULL, new, upperLeft; Window root, child; int x, y, i, j; int win_x, win_y; unsigned int mask; - char def[80]; - + char def[MSG_SIZ]; + i = 0; XtSetArg(args[i], XtNresizable, True); i++; // XtSetArg(args[i], XtNwidth, 300); i++; UciShell = popup = - XtCreatePopupShell("Engine Settings", transientShellWidgetClass, + XtCreatePopupShell(_("Engine Settings"), transientShellWidgetClass, shellWidget, args, i); - + layout = XtCreateManagedWidget(layoutName, formWidgetClass, popup, layoutArgs, XtNumber(layoutArgs)); - - + + form = XtCreateManagedWidget("form", formWidgetClass, layout, formArgs, XtNumber(formArgs)); - + j = 0; XtSetArg(args[j], XtNtop, XtChainTop); j++; XtSetArg(args[j], XtNbottom, XtChainTop); j++; @@ -1214,11 +1292,12 @@ void UciPopUp() XtSetArg(args[j], XtNright, XtChainRight); j++; XtSetArg(args[j], XtNresizable, True); j++; XtSetArg(args[j], XtNwidth, i&1 ? 245 : 50); j++; + XtSetArg(args[j], XtNinsertPosition, 9999); j++; if(i&1) { - XtSetArg(args[j], XtNstring, * (char**) controlDesc[i].ptr ? + XtSetArg(args[j], XtNstring, * (char**) controlDesc[i].ptr ? * (char**) controlDesc[i].ptr : ""); j++; } else { - sprintf(def, "%d", * (int*) controlDesc[i].ptr); + snprintf(def, MSG_SIZ, "%d", * (int*) controlDesc[i].ptr); XtSetArg(args[j], XtNstring, def); j++; } XtSetArg(args[j], XtNfromHoriz, upperLeft); j++; @@ -1234,7 +1313,7 @@ void UciPopUp() XtSetArg(args[j], XtNleft, XtChainRight); j++; XtSetArg(args[j], XtNright, XtChainRight); j++; XtSetArg(args[j], XtNstate, appData.ponderNextMove); j++; - w4 = XtCreateManagedWidget("Ponder", toggleWidgetClass, form, args, j); + w4 = XtCreateManagedWidget(_("Ponder"), toggleWidgetClass, form, args, j); j=0; XtSetArg(args[j], XtNfromVert, last); j++; @@ -1242,41 +1321,41 @@ void UciPopUp() XtSetArg(args[j], XtNtop, XtChainBottom); j++; XtSetArg(args[j], XtNleft, XtChainLeft); j++; XtSetArg(args[j], XtNright, XtChainLeft); j++; - b_ok = XtCreateManagedWidget("OK", commandWidgetClass, form, args, j); + b_ok = XtCreateManagedWidget(_("OK"), commandWidgetClass, form, args, j); XtAddCallback(b_ok, XtNcallback, UciCallback, (XtPointer) 0); XtSetArg(args[j], XtNfromHoriz, b_ok); j++; - b_cancel = XtCreateManagedWidget("cancel", commandWidgetClass, form, args, j); + b_cancel = XtCreateManagedWidget(_("cancel"), commandWidgetClass, form, args, j); XtAddCallback(b_cancel, XtNcallback, UciPopDown, (XtPointer) 0); j = 5; XtSetArg(args[j], XtNfromHoriz, upperLeft); j++; XtSetArg(args[j], XtNstate, appData.usePolyglotBook); j++; - w1 = XtCreateManagedWidget(" use book ", toggleWidgetClass, form, args, j); + w1 = XtCreateManagedWidget(_(" use book "), toggleWidgetClass, form, args, j); // XtAddCallback(w1, XtNcallback, UciCallback, (XtPointer) 0); j = 5; XtSetArg(args[j], XtNfromHoriz, w1); j++; XtSetArg(args[j], XtNstate, appData.firstHasOwnBookUCI); j++; - w2 = XtCreateManagedWidget("own book 1", toggleWidgetClass, form, args, j); + w2 = XtCreateManagedWidget(_("own book 1"), toggleWidgetClass, form, args, j); // XtAddCallback(w2, XtNcallback, UciCallback, (XtPointer) 0); j = 5; XtSetArg(args[j], XtNfromHoriz, w2); j++; XtSetArg(args[j], XtNstate, appData.secondHasOwnBookUCI); j++; - w3 = XtCreateManagedWidget("own book 2", toggleWidgetClass, form, args, j); + w3 = XtCreateManagedWidget(_("own book 2"), toggleWidgetClass, form, args, j); // XtAddCallback(w3, XtNcallback, UciCallback, (XtPointer) 0); XtRealizeWidget(popup); CatchDeleteWindow(popup, "UciPopDown"); - + XQueryPointer(xDisplay, xBoardWindow, &root, &child, &x, &y, &win_x, &win_y, &mask); - + XtSetArg(args[0], XtNx, x - 10); XtSetArg(args[1], XtNy, y - 30); XtSetValues(popup, args, 2); - + XtPopup(popup, XtGrabExclusive); UciUp = True; @@ -1304,6 +1383,7 @@ ChessProgramState *currentCps; void SettingsPopDown() { if (!SettingsUp) return; + previous = NULL; XtPopdown(SettingsShell); XtDestroyWidget(SettingsShell); SettingsUp = False; @@ -1315,27 +1395,38 @@ void SpinCallback(w, client_data, call_data) XtPointer client_data, call_data; { String name, val; - Widget w2; Arg args[16]; - char buf[MSG_SIZ]; - int i, j; - + char buf[MSG_SIZ], *p; + int j; + int data = (intptr_t) client_data; + XtSetArg(args[0], XtNlabel, &name); XtGetValues(w, args, 1); - + j = 0; XtSetArg(args[0], XtNstring, &val); - XtGetValues(currentCps->option[(int)client_data].handle, args, 1); + XtGetValues(currentCps->option[data].handle, args, 1); sscanf(val, "%d", &j); + if (strcmp(name, "browse") == 0) { + if(XsraSelFile(SettingsShell, currentCps->option[data].name, NULL, NULL, "", "", + currentCps->option[data].type == PathName ? "p" : "f", NULL, &p)) { + int len = strlen(p); + if(len && p[len-1] == '/') p[len-1] = NULLCHAR; + XtSetArg(args[0], XtNstring, p); + XtSetValues(currentCps->option[data].handle, args, 1); + } + SetFocus(currentCps->option[data].handle, SettingsShell, (XEvent*) NULL, False); + return; + } else if (strcmp(name, "+") == 0) { - if(++j > currentCps->option[(int)client_data].max) return; + if(++j > currentCps->option[data].max) return; } else if (strcmp(name, "-") == 0) { - if(--j < currentCps->option[(int)client_data].min) return; + if(--j < currentCps->option[data].min) return; } else return; - sprintf(buf, "%d", j); + snprintf(buf, MSG_SIZ, "%d", j); XtSetArg(args[0], XtNstring, buf); - XtSetValues(currentCps->option[(int)client_data].handle, args, 1); + XtSetValues(currentCps->option[data].handle, args, 1); } void SettingsCallback(w, client_data, call_data) @@ -1343,30 +1434,28 @@ void SettingsCallback(w, client_data, call_data) XtPointer client_data, call_data; { String name, val; - Widget w2; Arg args[16]; char buf[MSG_SIZ]; int i, j; - + int data = (intptr_t) client_data; + XtSetArg(args[0], XtNlabel, &name); XtGetValues(w, args, 1); - - if (strcmp(name, "cancel") == 0) { + + if (strcmp(name, _("cancel")) == 0) { SettingsPopDown(); return; } - if (strcmp(name, "OK") == 0 || (int)client_data) { // save buttons imply OK - int nr; - + if (strcmp(name, _("OK")) == 0 || data) { // save buttons imply OK for(i=0; inrOptions; i++) { // send all options that had to be OK-ed to engine switch(currentCps->option[i].type) { case TextBox: XtSetArg(args[0], XtNstring, &val); XtGetValues(currentCps->option[i].handle, args, 1); if(strcmp(currentCps->option[i].textValue, val)) { - strcpy(currentCps->option[i].textValue, val); - sprintf(buf, "option %s %s\n", currentCps->option[i].name, val); - SendToProgram(buf, currentCps); + safeStrCpy(currentCps->option[i].textValue, val, MSG_SIZ - (currentCps->option[i].textValue - currentCps->option[i].name) ); + snprintf(buf, MSG_SIZ, "option %s=%s\n", currentCps->option[i].name, val); + SendToProgram(buf, currentCps); } break; case Spin: @@ -1377,7 +1466,7 @@ void SettingsCallback(w, client_data, call_data) if(j < currentCps->option[i].min) j = currentCps->option[i].min; if(currentCps->option[i].value != j) { currentCps->option[i].value = j; - sprintf(buf, "option %s %d\n", currentCps->option[i].name, j); + snprintf(buf, MSG_SIZ, "option %s=%d\n", currentCps->option[i].name, j); SendToProgram(buf, currentCps); } break; @@ -1387,141 +1476,163 @@ void SettingsCallback(w, client_data, call_data) XtGetValues(currentCps->option[i].handle, args, 1); if(currentCps->option[i].value != j) { currentCps->option[i].value = j; - sprintf(buf, "option %s %d\n", currentCps->option[i].name, j); + snprintf(buf, MSG_SIZ, "option %s=%d\n", currentCps->option[i].name, j); SendToProgram(buf, currentCps); } break; case ComboBox: if(currentCps->option[i].value != values[i]) { currentCps->option[i].value = values[i]; - sprintf(buf, "option %s %s\n", currentCps->option[i].name, + snprintf(buf, MSG_SIZ, "option %s=%s\n", currentCps->option[i].name, ((char**)currentCps->option[i].textValue)[values[i]]); SendToProgram(buf, currentCps); } break; + default: + if( appData.debugMode ) + fprintf(debugFP, "SettingsPopUp: unexpected case in switch.\n"); + break; } } - if((int)client_data) { // send save-button command to engine - sprintf(buf, "option %s\n", name); - SendToProgram(buf, currentCps); + if(data) { // send save-button command to engine + snprintf(buf, MSG_SIZ, "option %s\n", name); + SendToProgram(buf, currentCps); } SettingsPopDown(); return; } - sprintf(buf, "option %s\n", name); + snprintf(buf, MSG_SIZ, "option %s\n", name); SendToProgram(buf, currentCps); } void ComboSelect(w, addr, index) // callback for all combo items - Widget w; - caddr_t addr; - caddr_t index; + Widget w; + caddr_t addr; + caddr_t index; { Arg args[16]; - int i = ((int)addr)>>8; - int j = 255 & (int) addr; + int i = ((intptr_t)addr)>>8; + int j = 255 & (intptr_t) addr; values[i] = j; // store in temporary, for transfer at OK XtSetArg(args[0], XtNlabel, ((char**)currentCps->option[i].textValue)[j]); - XtSetValues(currentCps->option[i].handle, args, 1); + XtSetValues(currentCps->option[i].handle, args, 1); } -void CreateComboPopup(parent, name, n, mb) +void CreateComboPopup(parent, name, n, mb) Widget parent; String name; - int n; - char *mb[]; -{ - int i=0, j; - Widget menu, entry; - Arg args[16]; - - menu = XtCreatePopupShell(name, simpleMenuWidgetClass, - parent, NULL, 0); - j = 0; + int n; + char *mb[]; +{ + int i=0, j; + Widget menu, entry; + Arg args[16]; + + menu = XtCreatePopupShell(name, simpleMenuWidgetClass, + parent, NULL, 0); + j = 0; XtSetArg(args[j], XtNwidth, 100); j++; // XtSetArg(args[j], XtNright, XtChainRight); j++; while (mb[i] != NULL) { - entry = XtCreateManagedWidget(mb[i], smeBSBObjectClass, - menu, args, j); - XtAddCallback(entry, XtNcallback, - (XtCallbackProc) ComboSelect, - (caddr_t) (256*n+i)); - i++; - } -} - -void SettingsPopUp(ChessProgramState *cps) + entry = XtCreateManagedWidget(mb[i], smeBSBObjectClass, + menu, args, j); + XtAddCallback(entry, XtNcallback, + (XtCallbackProc) ComboSelect, + (caddr_t)(intptr_t) (256*n+i)); + i++; + } +} + +void +SettingsPopUp(ChessProgramState *cps) { Arg args[16]; - Widget popup, layout, dialog, edit, form, oldform, last, b_ok, b_cancel; + Widget popup, layout, dialog, edit=NULL, form, last, b_ok, b_cancel, leftMargin = NULL, textField = NULL; Window root, child; - int x, y, i, j; - int win_x, win_y; + int x, y, i, j, height, width, h, c; + int win_x, win_y, maxWidth, maxTextWidth; unsigned int mask; - char def[80], *p, *q; + char def[MSG_SIZ]; + static char pane[6] = "paneX"; + Widget texts[100], forelast = NULL, anchor, widest; // to do: start up second engine if needed if(!cps->initDone || !cps->nrOptions) return; // nothing to be done currentCps = cps; - i = 0; + if(cps->nrOptions > 50) width = 4; else if(cps->nrOptions>24) width = 2; else width = 1; + height = cps->nrOptions / width + 1; + i = 0; XtSetArg(args[i], XtNresizable, True); i++; SettingsShell = popup = - XtCreatePopupShell("Settings Menu", transientShellWidgetClass, + XtCreatePopupShell(_("Settings Menu"), transientShellWidgetClass, shellWidget, args, i); - + layout = XtCreateManagedWidget(layoutName, formWidgetClass, popup, layoutArgs, XtNumber(layoutArgs)); - + for(c=0; cnrOptions; i++) { - Widget box; + j=0; + XtSetArg(args[j], XtNfromHoriz, leftMargin); j++; + XtSetValues(form, args, j); + leftMargin = form; + + last = widest = NULL; anchor = forelast; + for(h=0; h= cps->nrOptions) break; switch(cps->option[i].type) { case Spin: - sprintf(def, "%d", cps->option[i].value); + snprintf(def, MSG_SIZ, "%d", cps->option[i].value); case TextBox: j=0; XtSetArg(args[j], XtNfromVert, last); j++; XtSetArg(args[j], XtNborderWidth, 0); j++; XtSetArg(args[j], XtNjustify, XtJustifyLeft); j++; - dialog = XtCreateManagedWidget(cps->option[i].name, labelWidgetClass, form, args, j); + texts[h] = + dialog = XtCreateManagedWidget(cps->option[i].name, labelWidgetClass, form, args, j); j=0; XtSetArg(args[j], XtNfromVert, last); j++; XtSetArg(args[j], XtNfromHoriz, dialog); j++; XtSetArg(args[j], XtNborderWidth, 1); j++; - XtSetArg(args[j], XtNwidth, cps->option[i].type == Spin ? 40 : 100); j++; + XtSetArg(args[j], XtNwidth, cps->option[i].type == Spin ? 40 : 175); j++; XtSetArg(args[j], XtNeditType, XawtextEdit); j++; XtSetArg(args[j], XtNuseStringInPlace, False); j++; XtSetArg(args[j], XtNdisplayCaret, False); j++; XtSetArg(args[j], XtNright, XtChainRight); j++; XtSetArg(args[j], XtNresizable, True); j++; XtSetArg(args[j], XtNstring, cps->option[i].type==Spin ? def : cps->option[i].textValue); j++; + XtSetArg(args[j], XtNinsertPosition, 9999); j++; edit = last; cps->option[i].handle = (void*) - (last = XtCreateManagedWidget("text", asciiTextWidgetClass, form, args, j)); - XtAddEventHandler(box, ButtonPressMask, False, SetFocus, (XtPointer) popup); + (textField = last = XtCreateManagedWidget("text", asciiTextWidgetClass, form, args, j)); + XtAddEventHandler(last, ButtonPressMask, False, SetFocus, (XtPointer) popup); if(cps->option[i].type == TextBox) break; + // add increment and decrement controls for spin j=0; XtSetArg(args[j], XtNfromVert, edit); j++; - XtSetArg(args[j], XtNfromHoriz, box); j++; + XtSetArg(args[j], XtNfromHoriz, last); j++; XtSetArg(args[j], XtNheight, 10); j++; XtSetArg(args[j], XtNwidth, 20); j++; edit = XtCreateManagedWidget("+", commandWidgetClass, form, args, j); - XtAddCallback(edit, XtNcallback, SpinCallback, (XtPointer) i); + XtAddCallback(edit, XtNcallback, SpinCallback, + (XtPointer)(intptr_t) i); + j=0; XtSetArg(args[j], XtNfromVert, edit); j++; XtSetArg(args[j], XtNfromHoriz, last); j++; XtSetArg(args[j], XtNheight, 10); j++; XtSetArg(args[j], XtNwidth, 20); j++; last = XtCreateManagedWidget("-", commandWidgetClass, form, args, j); - XtAddCallback(last, XtNcallback, SpinCallback, (XtPointer) i); + XtAddCallback(last, XtNcallback, SpinCallback, + (XtPointer)(intptr_t) i); break; case CheckBox: j=0; @@ -1529,8 +1640,8 @@ void SettingsPopUp(ChessProgramState *cps) XtSetArg(args[j], XtNwidth, 10); j++; XtSetArg(args[j], XtNheight, 10); j++; XtSetArg(args[j], XtNstate, cps->option[i].value); j++; - cps->option[i].handle = (void*) - (dialog = XtCreateManagedWidget(" ", toggleWidgetClass, form, args, j)); + cps->option[i].handle = (void*) + (dialog = XtCreateManagedWidget(" ", toggleWidgetClass, form, args, j)); j=0; XtSetArg(args[j], XtNfromVert, last); j++; XtSetArg(args[j], XtNfromHoriz, dialog); j++; @@ -1543,9 +1654,10 @@ void SettingsPopUp(ChessProgramState *cps) j=0; XtSetArg(args[j], XtNfromVert, last); j++; XtSetArg(args[j], XtNstate, cps->option[i].value); j++; - cps->option[i].handle = (void*) - (last = XtCreateManagedWidget(cps->option[i].name, commandWidgetClass, form, args, j)); - XtAddCallback(last, XtNcallback, SettingsCallback, (XtPointer) (cps->option[i].type == SaveButton)); + cps->option[i].handle = (void*) + (dialog = last = XtCreateManagedWidget(cps->option[i].name, commandWidgetClass, form, args, j)); + XtAddCallback(last, XtNcallback, SettingsCallback, + (XtPointer)(intptr_t) (cps->option[i].type == SaveButton)); break; case ComboBox: j=0; @@ -1560,42 +1672,83 @@ void SettingsPopUp(ChessProgramState *cps) XtSetArg(args[j], XtNwidth, 100); j++; XtSetArg(args[j], XtNmenuName, XtNewString(cps->option[i].name)); j++; XtSetArg(args[j], XtNlabel, ((char**)cps->option[i].textValue)[cps->option[i].value]); j++; - cps->option[i].handle = (void*) - (last = XtCreateManagedWidget(" ", menuButtonWidgetClass, form, args, j)); + cps->option[i].handle = (void*) + (last = XtCreateManagedWidget(" ", menuButtonWidgetClass, form, args, j)); CreateComboPopup(last, cps->option[i].name, i, (char **) cps->option[i].textValue); values[i] = cps->option[i].value; break; + default: + if( appData.debugMode ) + fprintf(debugFP, "SettingsPopUp: unexpected case in switch.\n"); + break; } } + // make an attempt to align all spins and textbox controls + maxWidth = maxTextWidth = 0; + for(h=0; h= cps->nrOptions) break; + if(cps->option[i].type == Spin || cps->option[i].type == TextBox) { + Dimension w; + j=0; + XtSetArg(args[j], XtNwidth, &w); j++; + XtGetValues(texts[h], args, j); + if(cps->option[i].type == Spin) { + if(w > maxWidth) maxWidth = w; + widest = texts[h]; + } else { + if(w > maxTextWidth) maxTextWidth = w; + if(!widest) widest = texts[h]; + } + } + } + if(maxTextWidth + 110 < maxWidth) + maxTextWidth = maxWidth - 110; + else maxWidth = maxTextWidth + 110; + for(h=0; h= cps->nrOptions) break; + j=0; + if(cps->option[i].type == Spin) { + XtSetArg(args[j], XtNwidth, maxWidth); j++; + XtSetValues(texts[h], args, j); + } else + if(cps->option[i].type == TextBox) { + XtSetArg(args[j], XtNwidth, maxTextWidth); j++; + XtSetValues(texts[h], args, j); + } + } + } j=0; - XtSetArg(args[j], XtNfromVert, last); j++; + XtSetArg(args[j], XtNfromVert, anchor ? anchor : last); j++; XtSetArg(args[j], XtNbottom, XtChainBottom); j++; XtSetArg(args[j], XtNtop, XtChainBottom); j++; - XtSetArg(args[j], XtNleft, XtChainLeft); j++; - XtSetArg(args[j], XtNright, XtChainLeft); j++; - b_ok = XtCreateManagedWidget("OK", commandWidgetClass, form, args, j); + XtSetArg(args[j], XtNleft, XtChainRight); j++; + XtSetArg(args[j], XtNright, XtChainRight); j++; + XtSetArg(args[j], XtNfromHoriz, widest ? widest : dialog); j++; + b_ok = XtCreateManagedWidget(_("OK"), commandWidgetClass, form, args, j); XtAddCallback(b_ok, XtNcallback, SettingsCallback, (XtPointer) 0); - XtSetArg(args[j], XtNfromHoriz, b_ok); j++; - b_cancel = XtCreateManagedWidget("cancel", commandWidgetClass, form, args, j); + XtSetArg(args[j-1], XtNfromHoriz, b_ok); + b_cancel = XtCreateManagedWidget(_("cancel"), commandWidgetClass, form, args, j); XtAddCallback(b_cancel, XtNcallback, SettingsPopDown, (XtPointer) 0); XtRealizeWidget(popup); CatchDeleteWindow(popup, "SettingsPopDown"); - + XQueryPointer(xDisplay, xBoardWindow, &root, &child, &x, &y, &win_x, &win_y, &mask); - + XtSetArg(args[0], XtNx, x - 10); XtSetArg(args[1], XtNy, y - 30); XtSetValues(popup, args, 2); - + XtPopup(popup, XtGrabExclusive); SettingsUp = True; previous = NULL; - SetFocus(edit, popup, (XEvent*) NULL, False); + if(textField)SetFocus(textField, popup, (XEvent*) NULL, False); } void FirstSettingsProc(w, event, prms, nprms) @@ -1613,111 +1766,579 @@ void SecondSettingsProc(w, event, prms, nprms) String *prms; Cardinal *nprms; { + if(WaitForSecond(SettingsMenuIfReady)) return; SettingsPopUp(&second); } -//--------------------------- General Popup for Cloning ---------------------------------- -#if 0 -int XXXUp; -Widget XXXShell; +//----------------------------Generic dialog -------------------------------------------- + +// cloned from Engine Settings dialog -void XXXPopDown() +typedef void ButtonCallback(int n); + +static Option *currentOption; +int MakeColors P((void)); +void CreateGCs P((int redo)); +void CreateXPMBoard P((char *s, int kind)); +void CreateXPMPieces P((void)); +void GenericReadout(); + +void IcsOptionsOK(int n) { - if (!XXXUp) return; - XtPopdown(XXXShell); - XtDestroyWidget(XXXShell); - XXXUp = False; - ModeHighlight(); + ParseIcsTextColors(); +} + +Option icsOptions[] = { +{ 0, 0, 0, NULL, (void*) &appData.autoKibitz, "", NULL, CheckBox, _("Auto-Kibitz") }, +{ 0, 0, 0, NULL, (void*) &appData.autoComment, "", NULL, CheckBox, _("Auto-Comment") }, +{ 0, 0, 0, NULL, (void*) &appData.autoObserve, "", NULL, CheckBox, _("Auto-Observe") }, +{ 0, 0, 0, NULL, (void*) &appData.autoRaiseBoard, "", NULL, CheckBox, _("Auto-Raise Board") }, +{ 0, 0, 0, NULL, (void*) &appData.bgObserve, "", NULL, CheckBox, _("Background Observe while Playing") }, +{ 0, 0, 0, NULL, (void*) &appData.dualBoard, "", NULL, CheckBox, _("Dual Board for Background-Observed Game") }, +{ 0, 0, 0, NULL, (void*) &appData.getMoveList, "", NULL, CheckBox, _("Get Move List") }, +{ 0, 0, 0, NULL, (void*) &appData.quietPlay, "", NULL, CheckBox, _("Quiet Play") }, +{ 0, 0, 0, NULL, (void*) &appData.seekGraph, "", NULL, CheckBox, _("Seek Graph") }, +{ 0, 0, 0, NULL, (void*) &appData.autoRefresh, "", NULL, CheckBox, _("Auto-Refresh Seek Graph") }, +{ 0, 0, 0, NULL, (void*) &appData.premove, "", NULL, CheckBox, _("Premove") }, +{ 0, 0, 0, NULL, (void*) &appData.premoveWhite, "", NULL, CheckBox, _("Premove for White") }, +{ 0, 0, 0, NULL, (void*) &appData.premoveWhiteText, "", NULL, TextBox, _("First White Move:") }, +{ 0, 0, 0, NULL, (void*) &appData.premoveBlack, "", NULL, CheckBox, _("Premove for Black") }, +{ 0, 0, 0, NULL, (void*) &appData.premoveBlackText, "", NULL, TextBox, _("First Black Move:") }, +{ 0, 0, 0, NULL, NULL, NULL, NULL, Break, "" }, +{ 0, 0, 0, NULL, (void*) &appData.icsAlarm, "", NULL, CheckBox, _("Alarm") }, +{ 0, 0, 100000000, NULL, (void*) &appData.icsAlarmTime, "", NULL, Spin, _("Alarm Time (msec):") }, +//{ 0, 0, 0, NULL, (void*) &appData.chatBoxes, "", NULL, TextBox, _("Startup Chat Boxes:") }, +{ 0, 0, 0, NULL, (void*) &appData.colorize, "", NULL, CheckBox, _("Colorize Messages") }, +{ 0, 0, 0, NULL, (void*) &appData.colorShout, "", NULL, TextBox, _("Shout Text Colors:") }, +{ 0, 0, 0, NULL, (void*) &appData.colorSShout, "", NULL, TextBox, _("S-Shout Text Colors:") }, +{ 0, 0, 0, NULL, (void*) &appData.colorChannel1, "", NULL, TextBox, _("Channel #1 Text Colors:") }, +{ 0, 0, 0, NULL, (void*) &appData.colorChannel, "", NULL, TextBox, _("Other Channel Text Colors:") }, +{ 0, 0, 0, NULL, (void*) &appData.colorKibitz, "", NULL, TextBox, _("Kibitz Text Colors:") }, +{ 0, 0, 0, NULL, (void*) &appData.colorTell, "", NULL, TextBox, _("Tell Text Colors:") }, +{ 0, 0, 0, NULL, (void*) &appData.colorChallenge, "", NULL, TextBox, _("Challenge Text Colors:") }, +{ 0, 0, 0, NULL, (void*) &appData.colorRequest, "", NULL, TextBox, _("Request Text Colors:") }, +{ 0, 0, 0, NULL, (void*) &appData.colorSeek, "", NULL, TextBox, _("Seek Text Colors:") }, +{ 0, 0, 0, NULL, (void*) &IcsOptionsOK, "", NULL, EndMark , "" } +}; + +Option loadOptions[] = { +{ 0, 0, 0, NULL, (void*) &appData.autoDisplayTags, "", NULL, CheckBox, _("Auto-Display Tags") }, +{ 0, 0, 0, NULL, (void*) &appData.autoDisplayComment, "", NULL, CheckBox, _("Auto-Display Comment") }, +{ 0, 0, 0, NULL, NULL, NULL, NULL, Label, _("Auto-Play speed of loaded games\n(0 = instant, -1 = off):") }, +{ 0, -1, 10000000, NULL, (void*) &appData.timeDelay, "", NULL, Fractional, _("Seconds per Move:") }, +{ 0, 0, 0, NULL, NULL, "", NULL, EndMark , "" } +}; + +Option saveOptions[] = { +{ 0, 0, 0, NULL, (void*) &appData.autoSaveGames, "", NULL, CheckBox, _("Auto-Save Games") }, +{ 0, 0, 0, NULL, (void*) &appData.saveGameFile, "", NULL, FileName, _("Save Games on File:") }, +{ 0, 0, 0, NULL, (void*) &appData.savePositionFile, "", NULL, FileName, _("Save Final Positions on File:") }, +{ 0, 0, 0, NULL, (void*) &appData.pgnEventHeader, "", NULL, TextBox, _("PGN Event Header:") }, +{ 0, 0, 0, NULL, (void*) &appData.oldSaveStyle, "", NULL, CheckBox, _("Old Save Style (as opposed to PGN)") }, +{ 0, 0, 0, NULL, (void*) &appData.saveExtendedInfoInPGN, "", NULL, CheckBox, _("Save Score/Depth Info in PGN") }, +{ 0, 0, 0, NULL, (void*) &appData.saveOutOfBookInfo, "", NULL, CheckBox, _("Save Out-of-Book Info in PGN ") }, +{ 0, 1, 0, NULL, NULL, "", NULL, EndMark , "" } +}; + +void SetColor(char *colorName, Widget box) +{ + Arg args[5]; + Pixel buttonColor; + XrmValue vFrom, vTo; + if (!appData.monoMode) { + vFrom.addr = (caddr_t) colorName; + vFrom.size = strlen(colorName); + XtConvert(shellWidget, XtRString, &vFrom, XtRPixel, &vTo); + if (vTo.addr == NULL) { + buttonColor = (Pixel) -1; + } else { + buttonColor = *(Pixel *) vTo.addr; + } + } + XtSetArg(args[0], XtNbackground, buttonColor);; + XtSetValues(box, args, 1); } -void XXXCallback(w, client_data, call_data) +void AdjustColor(int i) +{ + int n = currentOption[i].value, col, j, r, g, b, step = 10; + char *s, buf[MSG_SIZ]; // color string + Arg args[5]; + XtSetArg(args[0], XtNstring, &s); + XtGetValues(currentOption[i-n-1].handle, args, 1); + if(sscanf(s, "#%x", &col) != 1) return; // malformed + b = col & 0xFF; g = col & 0xFF00; r = col & 0xFF0000; + switch(n) { + case 1: g -= 0x100*step; b -= step; break; + case 2: r -= 0x10000*step; b -= step; break; + case 3: g -= 0x100*step; r -= 0x10000*step; break; + case 4: r += 0x10000*step; g += 0x100*step; b += step; break; + } + if(r < 0) r = 0; if(g < 0) g = 0; if(b < 0) b = 0; + if(r > 0xFF0000) r = 0xFF0000; if(g > 0xFF00) g = 0xFF00; if(b > 0xFF) b = 0xFF; + col = r | g | b; + snprintf(buf, MSG_SIZ, "#%06x", col); + for(j=1; j<7; j++) if(buf[j] >= 'a') buf[j] -= 32; // capitalize + SetColor(buf, currentOption[i-n].handle); + XtSetArg(args[0], XtNstring, buf); + XtSetValues(currentOption[i-n-1].handle, args, 1); +} + +void BoardOptionsOK(int n) +{ + if(appData.overrideLineGap >= 0) lineGap = appData.overrideLineGap; + MakeColors(); CreateGCs(True); + CreateXPMPieces(); + CreateXPMBoard(appData.liteBackTextureFile, 1); + CreateXPMBoard(appData.darkBackTextureFile, 0); + InitDrawingSizes(-1, 0); + DrawPosition(True, NULL); +} + +Option boardOptions[] = { +{ 0, 0, 70, NULL, (void*) &appData.whitePieceColor, "", NULL, TextBox, _("White Piece Color:") }, +{ 1000, 1, 0, NULL, NULL, NULL, NULL, Button, " " }, +{ 1, 1, 0, NULL, (void*) &AdjustColor, NULL, NULL, Button, "R" }, +{ 2, 1, 0, NULL, (void*) &AdjustColor, NULL, NULL, Button, "G" }, +{ 3, 1, 0, NULL, (void*) &AdjustColor, NULL, NULL, Button, "B" }, +{ 4, 1, 0, NULL, (void*) &AdjustColor, NULL, NULL, Button, "W" }, +{ 0, 0, 70, NULL, (void*) &appData.blackPieceColor, "", NULL, TextBox, _("Black Piece Color:") }, +{ 1000, 1, 0, NULL, NULL, NULL, NULL, Button, " " }, +{ 1, 1, 0, NULL, (void*) &AdjustColor, NULL, NULL, Button, "R" }, +{ 2, 1, 0, NULL, (void*) &AdjustColor, NULL, NULL, Button, "G" }, +{ 3, 1, 0, NULL, (void*) &AdjustColor, NULL, NULL, Button, "B" }, +{ 4, 1, 0, NULL, (void*) &AdjustColor, NULL, NULL, Button, "W" }, +{ 0, 0, 70, NULL, (void*) &appData.lightSquareColor, "", NULL, TextBox, _("Light Square Color:") }, +{ 1000, 1, 0, NULL, NULL, NULL, NULL, Button, " " }, +{ 1, 1, 0, NULL, (void*) &AdjustColor, NULL, NULL, Button, "R" }, +{ 2, 1, 0, NULL, (void*) &AdjustColor, NULL, NULL, Button, "G" }, +{ 3, 1, 0, NULL, (void*) &AdjustColor, NULL, NULL, Button, "B" }, +{ 4, 1, 0, NULL, (void*) &AdjustColor, NULL, NULL, Button, "W" }, +{ 0, 0, 70, NULL, (void*) &appData.darkSquareColor, "", NULL, TextBox, _("Dark Square Color:") }, +{ 1000, 1, 0, NULL, NULL, NULL, NULL, Button, " " }, +{ 1, 1, 0, NULL, (void*) &AdjustColor, NULL, NULL, Button, "R" }, +{ 2, 1, 0, NULL, (void*) &AdjustColor, NULL, NULL, Button, "G" }, +{ 3, 1, 0, NULL, (void*) &AdjustColor, NULL, NULL, Button, "B" }, +{ 4, 1, 0, NULL, (void*) &AdjustColor, NULL, NULL, Button, "W" }, +{ 0, 0, 70, NULL, (void*) &appData.highlightSquareColor, "", NULL, TextBox, _("Highlight Color:") }, +{ 1000, 1, 0, NULL, NULL, NULL, NULL, Button, " " }, +{ 1, 1, 0, NULL, (void*) &AdjustColor, NULL, NULL, Button, "R" }, +{ 2, 1, 0, NULL, (void*) &AdjustColor, NULL, NULL, Button, "G" }, +{ 3, 1, 0, NULL, (void*) &AdjustColor, NULL, NULL, Button, "B" }, +{ 4, 1, 0, NULL, (void*) &AdjustColor, NULL, NULL, Button, "W" }, +{ 0, 0, 70, NULL, (void*) &appData.premoveHighlightColor, "", NULL, TextBox, _("Premove Highlight Color:") }, +{ 1000, 1, 0, NULL, NULL, NULL, NULL, Button, " " }, +{ 1, 1, 0, NULL, (void*) &AdjustColor, NULL, NULL, Button, "R" }, +{ 2, 1, 0, NULL, (void*) &AdjustColor, NULL, NULL, Button, "G" }, +{ 3, 1, 0, NULL, (void*) &AdjustColor, NULL, NULL, Button, "B" }, +{ 4, 1, 0, NULL, (void*) &AdjustColor, NULL, NULL, Button, "W" }, +{ 0, 0, 0, NULL, (void*) &appData.upsideDown, "", NULL, CheckBox, _("Flip Pieces Shogi Style") }, +{ 0, 0, 0, NULL, (void*) &appData.allWhite, "", NULL, CheckBox, _("Use Outline Pieces for Black") }, +{ 0, 0, 0, NULL, (void*) &appData.monoMode, "", NULL, CheckBox, _("Mono Mode") }, +{ 0,-1, 5, NULL, (void*) &appData.overrideLineGap, "", NULL, Spin, _("Line Gap ( -1 = default for board size):") }, +{ 0, 0, 0, NULL, (void*) &appData.liteBackTextureFile, "", NULL, FileName, _("Light-Squares Texture File:") }, +{ 0, 0, 0, NULL, (void*) &appData.darkBackTextureFile, "", NULL, FileName, _("Dark-Squares Texture File:") }, +{ 0, 0, 0, NULL, (void*) &appData.bitmapDirectory, "", NULL, PathName, _("Directory with Bitmap Pieces:") }, +{ 0, 0, 0, NULL, (void*) &appData.pixmapDirectory, "", NULL, PathName, _("Directory with Pixmap Pieces:") }, +{ 0, 0, 0, NULL, (void*) &BoardOptionsOK, "", NULL, EndMark , "" } +}; + +void GenericReadout() +{ + int i, j; + String name, val; + Arg args[16]; + char buf[MSG_SIZ]; + float x; + for(i=0; ; i++) { // send all options that had to be OK-ed to engine + switch(currentOption[i].type) { + case TextBox: + case FileName: + case PathName: + XtSetArg(args[0], XtNstring, &val); + XtGetValues(currentOption[i].handle, args, 1); + if(*(char**) currentOption[i].target == NULL || strcmp(*(char**) currentOption[i].target, val)) { + safeStrCpy(currentOption[i].name + 100, val, MSG_SIZ-100); // text value kept in pivate storage for each option + *(char**) currentOption[i].target = currentOption[i].name + 100; // option gets to point to that + } + break; + case Spin: + case Fractional: + XtSetArg(args[0], XtNstring, &val); + XtGetValues(currentOption[i].handle, args, 1); + sscanf(val, "%f", &x); + if(x > currentOption[i].max) x = currentOption[i].max; + if(x < currentOption[i].min) x = currentOption[i].min; + if(currentOption[i].value != x) { + currentOption[i].value = x; + if(currentOption[i].type == Spin) *(int*) currentOption[i].target = x; + else *(float*) currentOption[i].target = x; + } + break; + case CheckBox: + j = 0; + XtSetArg(args[0], XtNstate, &j); + XtGetValues(currentOption[i].handle, args, 1); + if(currentOption[i].value != j) { + currentOption[i].value = j; + *(Boolean*) currentOption[i].target = j; + } + break; + case ComboBox: + val = ((char**)currentOption[i].choice)[values[i]]; + if(val && (*(char**) currentOption[i].target == NULL || strcmp(*(char**) currentOption[i].target, val))) { + if(*(char**) currentOption[i].target) free(*(char**) currentOption[i].target); + *(char**) currentOption[i].target = strdup(val); + } + break; + case EndMark: + if(currentOption[i].target) // callback for implementing necessary actions on OK (like redraw) + ((ButtonCallback*) currentOption[i].target)(i); + break; + default: + printf("GenericReadout: unexpected case in switch.\n"); + case Button: + case Label: + break; + } + if(currentOption[i].type == EndMark) break; + } +} + +void GenericCallback(w, client_data, call_data) Widget w; XtPointer client_data, call_data; { - String name; - Widget w2; + String name, val; Arg args[16]; - char buf[80]; - + char buf[MSG_SIZ]; + int i, j; + int data = (intptr_t) client_data; + XtSetArg(args[0], XtNlabel, &name); XtGetValues(w, args, 1); - - if (strcmp(name, "cancel") == 0) { - XXXPopDown(); + + if (strcmp(name, _("cancel")) == 0) { + SettingsPopDown(); return; } - if (strcmp(name, "ok") == 0) { - int nr; String name; - name = XawDialogGetValueString(w2 = XtParent(w)); - if(sscanf(name ,"%d",&nr) != 1) { - sprintf(buf, "%d", appData.defaultFrcPosition); - XtSetArg(args[0],XtNvalue, buf); // erase bad (non-numeric) value - XtSetValues(w2, args, 1); - return; - } - XXXPopDown(); + if (strcmp(name, _("OK")) == 0) { // save buttons imply OK + GenericReadout(); + SettingsPopDown(); return; } + ((ButtonCallback*) currentOption[data].target)(data); } -void XXXPopUp() +void +GenericPopUp(Option *option, char *title) { Arg args[16]; - Widget popup, layout, dialog, edit; + Widget popup, layout, dialog, edit=NULL, form, last, b_ok, b_cancel, leftMargin = NULL, textField = NULL; Window root, child; - int x, y, i; - int win_x, win_y; + int x, y, i, j, height=999, width=1, h, c, w; + int win_x, win_y, maxWidth, maxTextWidth; unsigned int mask; - char def[80]; - - i = 0; + char def[MSG_SIZ], *msg; + static char pane[6] = "paneX"; + Widget texts[100], forelast = NULL, anchor, widest, lastrow = NULL; + + currentOption = option; // make available to callback + // kludge: fake address of a ChessProgramState struct that contains the options, so Spin and Combo callbacks work on it + currentCps = (ChessProgramState *) ((char *) option - ((char *)&first.option - (char *)&first)); + +// if(cps->nrOptions > 50) width = 4; else if(cps->nrOptions>24) width = 2; else width = 1; +// height = cps->nrOptions / width + 1; + i = 0; XtSetArg(args[i], XtNresizable, True); i++; - XtSetArg(args[i], XtNwidth, DIALOG_SIZE); i++; - XXXShell = popup = - XtCreatePopupShell("XXX Menu", transientShellWidgetClass, + SettingsShell = popup = + XtCreatePopupShell(title, transientShellWidgetClass, shellWidget, args, i); - + layout = XtCreateManagedWidget(layoutName, formWidgetClass, popup, layoutArgs, XtNumber(layoutArgs)); - - sprintf(def, "%d\n", appData.defaultFrcPosition); - i = 0; - XtSetArg(args[i], XtNlabel, ""); i++; - XtSetArg(args[i], XtNvalue, def); i++; - XtSetArg(args[i], XtNborderWidth, 0); i++; - dialog = XtCreateManagedWidget("XXX", dialogWidgetClass, - layout, args, i); - - XawDialogAddButton(dialog, "ok", XXXCallback, (XtPointer) dialog); - XawDialogAddButton(dialog, "cancel", XXXCallback, (XtPointer) dialog); - + for(c=0; c maxWidth) maxWidth = w; + widest = texts[h]; + } else { + if(w > maxTextWidth) maxTextWidth = w; + if(!widest) widest = texts[h]; + } + } + } + if(maxTextWidth + 110 < maxWidth) + maxTextWidth = maxWidth - 110; + else maxWidth = maxTextWidth + 110; + for(h=0; h