Split back-endish part off drawing code and move to board.c
[xboard.git] / xoptions.c
index 22aac1e..9a3f474 100644 (file)
@@ -113,6 +113,7 @@ typedef int OKCallback(int n);
 
 int values[MAX_OPTIONS];
 ChessProgramState *currentCps;
+int dialogError;
 static Option *currentOption;
 static Boolean browserUp;
 ButtonCallback *comboCallback;
@@ -249,14 +250,14 @@ CreateComboPopup (Widget parent, Option *option, int n)
 
 extern WindowPlacement wpComment, wpTags, wpMoveHistory;
 char *trialSound;
-static int oldCores, oldPonder;
+static int oldCores, oldPonder, oldShow, oldBlind;
 int MakeColors P((void));
 void CreateGCs P((int redo));
 void CreateAnyPieces P((void));
 int GenericReadout P((int selected));
 void GenericUpdate P((int selected));
 Widget shells[10];
-Widget marked[10];
+char *marked[10];
 Boolean shellUp[10];
 WindowPlacement *wp[10] = { NULL, &wpComment, &wpTags, NULL, NULL, NULL, NULL, &wpMoveHistory };
 Option *dialogOptions[10];
@@ -264,9 +265,7 @@ Option *dialogOptions[10];
 void
 MarkMenu (char *item, int dlgNr)
 {
-    Arg args[2];
-    XtSetArg(args[0], XtNleftBitmap, xMarkPixmap);
-    XtSetValues(marked[dlgNr] = XtNameToWidget(menuBarWidget, item), args, 1);
+    MarkMenuItem(marked[dlgNr] = item, True);
 }
 
 int
@@ -293,8 +292,8 @@ PopDown (int n)
     if(n == 0) XtDestroyWidget(shells[n]);
     shellUp[n] = False;
     if(marked[n]) {
-       XtSetArg(args[0], XtNleftBitmap, None);
-       XtSetValues(marked[n], args, 1);
+       MarkMenuItem(marked[n], False);
+       marked[n] = NULL;
     }
     if(!n) currentCps = NULL; // if an Engine Settings dialog was up, we must be popping it down now
     return 1;
@@ -303,7 +302,7 @@ PopDown (int n)
 void
 GenericPopDown (Widget w, XEvent *event, String *prms, Cardinal *nprms)
 {
-    if(browserUp) return; // prevent closing dialog when it has an open file-browse daughter
+    if(browserUp || dialogError) return; // prevent closing dialog when it has an open file-browse daughter
     PopDown(prms[0][0] - '0');
 }
 
@@ -409,6 +408,8 @@ GeneralOptionsOK (int n)
        int newPonder = appData.ponderNextMove;
        appData.ponderNextMove = oldPonder;
        PonderNextMoveEvent(newPonder);
+       if(!appData.highlightLastMove) ClearHighlights(), ClearPremoveHighlights();
+       if(oldShow != appData.showCoords || oldBlind != appData.blindfold) DrawPosition(TRUE, NULL);
        return 1;
 }
 
@@ -433,6 +434,7 @@ Option generalOptions[] = {
 { 0,  0, 0, NULL, (void*) &appData.showEvalInMoveHistory, "", NULL, CheckBox, N_("Scores in Move List") },
 { 0,  0, 0, NULL, (void*) &appData.showCoords, "", NULL, CheckBox, N_("Show Coordinates") },
 { 0,  0, 0, NULL, (void*) &appData.markers, "", NULL, CheckBox, N_("Show Target Squares") },
+{ 0,  0, 0, NULL, (void*) &appData.useStickyWindows, "", NULL, CheckBox, N_("Sticky Windows") },
 { 0,  0, 0, NULL, (void*) &appData.testLegality, "", NULL, CheckBox, N_("Test Legality") },
 { 0, 0, 10, NULL, (void*) &appData.flashCount, "", NULL, Spin, N_("Flash Moves (0 = no flashing):") },
 { 0, 1, 10, NULL, (void*) &appData.flashRate, "", NULL, Spin, N_("Flash Rate (high = fast):") },
@@ -629,7 +631,7 @@ Option loadOptions[] = {
 { 0, 0, 5000, NULL, (void*) &appData.eloThreshold2, "", NULL, Spin, N_("Elo of weakest player at least:") },
 { 0, 0, 5000, NULL, (void*) &appData.dateThreshold, "", NULL, Spin, N_("No games before year:") },
 { 0, 1, 50, NULL, (void*) &appData.stretch, "", NULL, Spin, N_("Minimum nr consecutive positions:") },
-{ 1, 0, 180, NULL, (void*) &searchMode, (char*) modeNames, modeValues, ComboBox, N_("Seach mode:") },
+{ 1, 0, 180, NULL, (void*) &searchMode, (char*) modeNames, modeValues, ComboBox, N_("Search mode:") },
 { 0, 0, 0, NULL, (void*) &appData.ignoreColors, "", NULL, CheckBox, N_("Also match reversed colors") },
 { 0, 0, 0, NULL, (void*) &appData.findMirror, "", NULL, CheckBox, N_("Also match left-right flipped position") },
 { 0,  0, 0, NULL, (void*) &LoadOptionsOK, "", NULL, EndMark , "" }
@@ -641,6 +643,7 @@ Option saveOptions[] = {
 { 0, 0, 0, NULL, (void*) &appData.savePositionFile, ".fen", NULL, FileName,  N_("Save Final Positions on File:") },
 { 0, 0, 0, NULL, (void*) &appData.pgnEventHeader, "", NULL, TextBox,  N_("PGN Event Header:") },
 { 0, 0, 0, NULL, (void*) &appData.oldSaveStyle, "", NULL, CheckBox, N_("Old Save Style (as opposed to PGN)") },
+{ 0, 0, 0, NULL, (void*) &appData.numberTag, "", NULL, CheckBox, N_("Include Number Tag in tourney PGN") },
 { 0, 0, 0, NULL, (void*) &appData.saveExtendedInfoInPGN, "", NULL, CheckBox, N_("Save Score/Depth Info in PGN") },
 { 0, 0, 0, NULL, (void*) &appData.saveOutOfBookInfo, "", NULL, CheckBox, N_("Save Out-of-Book Info in PGN           ") },
 { 0, 1, 0, NULL, NULL, "", NULL, EndMark , "" }
@@ -798,9 +801,13 @@ BoardOptionsOK (int n)
 Option boardOptions[] = {
 { 0,   0, 70, NULL, (void*) &appData.whitePieceColor, "", NULL, TextBox, N_("White Piece Color:") },
 { 1000, 1, 0, NULL, (void*) &DefColor, NULL, (char**) "#FFFFCC", Button, "      " },
+/* TRANSLATORS: R = single letter for the color red */
 {    1, 1, 0, NULL, (void*) &AdjustColor, NULL, NULL, Button, N_("R") },
+/* TRANSLATORS: G = single letter for the color green */
 {    2, 1, 0, NULL, (void*) &AdjustColor, NULL, NULL, Button, N_("G") },
+/* TRANSLATORS: B = single letter for the color blue */
 {    3, 1, 0, NULL, (void*) &AdjustColor, NULL, NULL, Button, N_("B") },
+/* TRANSLATORS: D = single letter to make a color darker */
 {    4, 1, 0, NULL, (void*) &AdjustColor, NULL, NULL, Button, N_("D") },
 { 0,   0, 70, NULL, (void*) &appData.blackPieceColor, "", NULL, TextBox, N_("Black Piece Color:") },
 { 1000, 1, 0, NULL, (void*) &DefColor, NULL, (char**) "#202020", Button, "      " },
@@ -1012,7 +1019,7 @@ GenericPopUp (Option *option, char *title, int dlgNr)
     Arg args[16];
     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 x, y, i, j, height=999, width=1, h, c, w, shrink=FALSE;
     int win_x, win_y, maxWidth, maxTextWidth;
     unsigned int mask;
     char def[MSG_SIZ], *msg;
@@ -1082,6 +1089,7 @@ GenericPopUp (Option *option, char *title, int dlgNr)
            XtSetArg(args[j], XtNfromVert, last);  j++;
            XtSetArg(args[j], XtNleft, XtChainLeft); j++;
            XtSetArg(args[j], XtNright, XtChainLeft); j++;
+           XtSetArg(args[j], XtNheight, textHeight),  j++;
            XtSetArg(args[j], XtNborderWidth, 0);  j++;
            XtSetArg(args[j], XtNjustify, XtJustifyLeft);  j++;
            XtSetArg(args[j], XtNlabel, _(option[i].name));  j++;
@@ -1095,14 +1103,13 @@ GenericPopUp (Option *option, char *title, int dlgNr)
            XtSetArg(args[j], XtNfromHoriz, dialog);  j++;
            XtSetArg(args[j], XtNborderWidth, 1); j++;
            XtSetArg(args[j], XtNwidth, w); j++;
-           XtSetArg(args[j], XtNheight, textHeight);  j++; // [HGM] use message widget
            if(option[i].type == TextBox && option[i].min) {
-               XtSetArg(args[j-1], XtNheight, option[i].min); // overwrite
+               XtSetArg(args[j], XtNheight, option[i].min); j++;
                if(option[i].value & 1) { XtSetArg(args[j], XtNscrollVertical, XawtextScrollAlways);  j++; }
                if(option[i].value & 2) { XtSetArg(args[j], XtNscrollHorizontal, XawtextScrollAlways);  j++; }
                if(option[i].value & 4) { XtSetArg(args[j], XtNautoFill, True);  j++; }
                if(option[i].value & 8) { XtSetArg(args[j], XtNwrap, XawtextWrapWord); j++; }
-           }
+           } else shrink = TRUE;
            XtSetArg(args[j], XtNleft, XtChainLeft); j++;
            XtSetArg(args[j], XtNeditType, XawtextEdit);  j++;
            XtSetArg(args[j], XtNuseStringInPlace, False);  j++;
@@ -1131,9 +1138,10 @@ GenericPopUp (Option *option, char *title, int dlgNr)
                msg = _("browse"); w = 0;
                /* automatically scale to width of text */
                XtSetArg(args[j], XtNwidth, (XtArgVal) NULL );  j++;
+               if(textHeight) XtSetArg(args[j], XtNheight, textHeight),  j++;
            } else {
                w = 20; msg = "+";
-               XtSetArg(args[j], XtNheight, 10);  j++;
+               XtSetArg(args[j], XtNheight, textHeight/2);  j++;
                XtSetArg(args[j], XtNwidth,   w);  j++;
            }
            edit = XtCreateManagedWidget(msg, commandWidgetClass, form, args, j);
@@ -1145,7 +1153,8 @@ GenericPopUp (Option *option, char *title, int dlgNr)
            j=0;
            XtSetArg(args[j], XtNfromVert, edit);  j++;
            XtSetArg(args[j], XtNfromHoriz, last);  j++;
-           XtSetArg(args[j], XtNheight, 10);  j++;
+           XtSetArg(args[j], XtNvertDistance, -1);  j++;
+           XtSetArg(args[j], XtNheight, textHeight/2);  j++;
            XtSetArg(args[j], XtNwidth, 20);  j++;
            XtSetArg(args[j], XtNleft, XtChainRight); j++;
            XtSetArg(args[j], XtNright, XtChainRight); j++;
@@ -1154,20 +1163,11 @@ GenericPopUp (Option *option, char *title, int dlgNr)
            break;
          case CheckBox:
            if(!currentCps) option[i].value = *(Boolean*)option[i].target;
-           j=0; // space holder
-           XtSetArg(args[j], XtNfromVert, last);  j++;
-           XtSetArg(args[j], XtNwidth, 10);  j++;
-           XtSetArg(args[j], XtNheight, textHeight-22);  j++;
-           XtSetArg(args[j], XtNleft, XtChainLeft); j++;
-           XtSetArg(args[j], XtNright, XtChainLeft); j++;
-           XtSetArg(args[j], XtNborderWidth, 0);  j++;
-printf("%d\n",textHeight);
-           if(textHeight < 24) dialog = last; else
-               dialog = XtCreateManagedWidget(" ", labelWidgetClass, form, args, j);
            j=0;
-           XtSetArg(args[j], XtNfromVert, dialog);  j++;
-           XtSetArg(args[j], XtNwidth, 10);  j++;
-           XtSetArg(args[j], XtNheight, 10);  j++;
+           XtSetArg(args[j], XtNfromVert, last);  j++;
+           XtSetArg(args[j], XtNvertDistance, (textHeight+2)/4 + 3);  j++;
+           XtSetArg(args[j], XtNwidth, textHeight/2);  j++;
+           XtSetArg(args[j], XtNheight, textHeight/2);  j++;
            XtSetArg(args[j], XtNleft, XtChainLeft); j++;
            XtSetArg(args[j], XtNright, XtChainLeft); j++;
            XtSetArg(args[j], XtNstate, option[i].value);  j++;
@@ -1180,6 +1180,7 @@ printf("%d\n",textHeight);
            j=0;
            XtSetArg(args[j], XtNfromVert, last);  j++;
            XtSetArg(args[j], XtNfromHoriz, option[i].type != Label ? dialog : NULL);  j++;
+           if(option[i].type != Label) XtSetArg(args[j], XtNheight, textHeight),  j++, shrink = TRUE;
            XtSetArg(args[j], XtNleft, XtChainLeft); j++;
            XtSetArg(args[j], XtNborderWidth, 0);  j++;
            XtSetArg(args[j], XtNjustify, XtJustifyLeft);  j++;
@@ -1194,9 +1195,13 @@ printf("%d\n",textHeight);
            if(option[i].min & SAME_ROW) {
                XtSetArg(args[j], XtNfromVert, lastrow);  j++;
                XtSetArg(args[j], XtNfromHoriz, last);  j++;
+               XtSetArg(args[j], XtNleft, XtChainRight); j++;
+               XtSetArg(args[j], XtNright, XtChainRight); j++;
+               if(shrink) XtSetArg(args[j], XtNheight, textHeight),  j++;
            } else {
                XtSetArg(args[j], XtNfromVert, last);  j++;
                XtSetArg(args[j], XtNfromHoriz, NULL);  j++; lastrow = forelast;
+               shrink = FALSE;
            }
            XtSetArg(args[j], XtNlabel, _(option[i].name));  j++;
            if(option[i].max) { XtSetArg(args[j], XtNwidth, option[i].max);  j++; }
@@ -1221,6 +1226,7 @@ printf("%d\n",textHeight);
            XtSetArg(args[j], XtNfromVert, last);  j++;
            XtSetArg(args[j], XtNleft, XtChainLeft); j++;
            XtSetArg(args[j], XtNright, XtChainLeft); j++;
+           XtSetArg(args[j], XtNheight, textHeight),  j++;
            XtSetArg(args[j], XtNborderWidth, 0);  j++;
            XtSetArg(args[j], XtNjustify, XtJustifyLeft);  j++;
            XtSetArg(args[j], XtNlabel, _(option[i].name));  j++;
@@ -1239,6 +1245,8 @@ printf("%d\n",textHeight);
            XtSetArg(args[j], XtNleft, XtChainLeft); j++;
            XtSetArg(args[j], XtNmenuName, XtNewString(option[i].name));  j++;
            XtSetArg(args[j], XtNlabel, _(((char**)option[i].textValue)[option[i].value]));  j++;
+           XtSetArg(args[j], XtNheight, textHeight),  j++;
+           shrink = TRUE;
            option[i].handle = (void*)
                (last = XtCreateManagedWidget(" ", menuButtonWidgetClass, form, args, j));
            CreateComboPopup(last, option + i, i);
@@ -1319,13 +1327,14 @@ printf("%d\n",textHeight);
        }
        j = 0;
        XtSetArg(args[j], XtNfromHoriz, last); last = forelast;
-    } else
+    } else shrink = FALSE,
     XtSetArg(args[j], XtNfromHoriz, widest ? widest : dialog);  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, XtChainRight);  j++;
     XtSetArg(args[j], XtNright, XtChainRight);  j++;
+    if(shrink) XtSetArg(args[j], XtNheight, textHeight),  j++;
     b_ok = XtCreateManagedWidget(_("OK"), commandWidgetClass, form, args, j);
     XtAddCallback(b_ok, XtNcallback, GenericCallback, (XtPointer)(intptr_t) dlgNr + (dlgNr<<16));
 
@@ -1362,26 +1371,26 @@ printf("%d\n",textHeight);
 
 
 void
-IcsOptionsProc (Widget w, XEvent *event, String *prms, Cardinal *nprms)
+IcsOptionsProc ()
 {
    GenericPopUp(icsOptions, _("ICS Options"), 0);
 }
 
 void
-LoadOptionsProc (Widget w, XEvent *event, String *prms, Cardinal *nprms)
+LoadOptionsProc ()
 {
    ASSIGN(searchMode, modeValues[appData.searchMode-1]);
    GenericPopUp(loadOptions, _("Load Game Options"), 0);
 }
 
 void
-SaveOptionsProc (Widget w, XEvent *event, String *prms, Cardinal *nprms)
+SaveOptionsProc ()
 {
    GenericPopUp(saveOptions, _("Save Game Options"), 0);
 }
 
 void
-SoundOptionsProc (Widget w, XEvent *event, String *prms, Cardinal *nprms)
+SoundOptionsProc ()
 {
    free(soundFiles[2]);
    soundFiles[2] = strdup("*");
@@ -1389,19 +1398,19 @@ SoundOptionsProc (Widget w, XEvent *event, String *prms, Cardinal *nprms)
 }
 
 void
-BoardOptionsProc (Widget w, XEvent *event, String *prms, Cardinal *nprms)
+BoardOptionsProc ()
 {
    GenericPopUp(boardOptions, _("Board Options"), 0);
 }
 
 void
-EngineMenuProc (Widget w, XEvent *event, String *prms, Cardinal *nprms)
+EngineMenuProc ()
 {
    GenericPopUp(adjudicationOptions, _("Adjudicate non-ICS Games"), 0);
 }
 
 void
-UciMenuProc (Widget w, XEvent *event, String *prms, Cardinal *nprms)
+UciMenuProc ()
 {
    oldCores = appData.smpCores;
    oldPonder = appData.ponderNextMove;
@@ -1409,20 +1418,21 @@ UciMenuProc (Widget w, XEvent *event, String *prms, Cardinal *nprms)
 }
 
 void
-NewVariantProc (Widget w, XEvent *event, String *prms, Cardinal *nprms)
+NewVariantProc ()
 {
    GenericPopUp(variantDescriptors, _("New Variant"), 0);
 }
 
 void
-OptionsProc (Widget w, XEvent *event, String *prms, Cardinal *nprms)
+OptionsProc ()
 {
    oldPonder = appData.ponderNextMove;
+   oldShow = appData.showCoords; oldBlind = appData.blindfold;
    GenericPopUp(generalOptions, _("General Options"), 0);
 }
 
 void
-MatchOptionsProc (Widget w, XEvent *event, String *prms, Cardinal *nprms)
+MatchOptionsProc ()
 {
    NamesToList(firstChessProgramNames, engineList, engineMnemonic, "all");
    comboCallback = &AddToTourney;
@@ -1480,7 +1490,7 @@ SendText (int n)
 }
 
 void
-IcsTextProc (Widget w, XEvent *event, String *prms, Cardinal *nprms)
+IcsTextProc ()
 {
    int i=0, j;
    char *p, *q, *r;
@@ -1507,7 +1517,7 @@ IcsTextProc (Widget w, XEvent *event, String *prms, Cardinal *nprms)
    textOptions[i].type = EndMark;
    textOptions[i].target = NULL;
    textOptions[i].min = 2;
-   MarkMenu("menuView.ICStex", 3);
+   MarkMenu("ICStex", 3);
    GenericPopUp(textOptions, _("ICS text menu"), 3);
 }
 
@@ -1565,7 +1575,7 @@ NewCommentPopup (char *title, char *text, int index)
     }
     if(commentText) free(commentText); commentText = strdup(text);
     commentIndex = index;
-    MarkMenu("menuView.Show Comments", 1);
+    MarkMenu("Show Comments", 1);
     if(GenericPopUp(commentOptions, title, 1))
        XtOverrideTranslations(commentOptions[0].handle, XtParseTranslationTable(commentTranslations));
 }
@@ -1607,7 +1617,7 @@ NewTagsPopup (char *text, char *msg)
     }
     if(tagsText) free(tagsText); tagsText = strdup(text);
     tagsOptions[0].textValue = msg;
-    MarkMenu("menuView.Show Tags", 2);
+    MarkMenu("Show Tags", 2);
     GenericPopUp(tagsOptions, title, 2);
 }
 
@@ -1639,7 +1649,7 @@ PutText (char *text, int pos)
 void
 InputBoxPopup ()
 {
-    MarkMenu("menuView.ICS Input Box", 4);
+    MarkMenu("ICS Input Box", 4);
     if(GenericPopUp(boxOptions, _("ICS input box"), 4))
        XtOverrideTranslations(boxOptions[0].handle, XtParseTranslationTable(ICSInputTranslations));
 }
@@ -1707,13 +1717,13 @@ SettingsPopUp (ChessProgramState *cps)
 }
 
 void
-FirstSettingsProc (Widget w, XEvent *event, String *prms, Cardinal *nprms)
+FirstSettingsProc ()
 {
     SettingsPopUp(&first);
 }
 
 void
-SecondSettingsProc (Widget w, XEvent *event, String *prms, Cardinal *nprms)
+SecondSettingsProc ()
 {
    if(WaitForEngine(&second, SettingsMenuIfReady)) return;
    SettingsPopUp(&second);
@@ -1745,7 +1755,7 @@ Option installOptions[] = {
 };
 
 void
-LoadEngineProc (Widget w, XEvent *event, String *prms, Cardinal *nprms)
+LoadEngineProc ()
 {
    isUCI = storeVariant = v1 = useNick = False; addToList = hasBook = True; // defaults
    if(engineChoice) free(engineChoice); engineChoice = strdup(engineNr[0]);
@@ -1758,7 +1768,7 @@ LoadEngineProc (Widget w, XEvent *event, String *prms, Cardinal *nprms)
 }
 
 void
-EditBookProc (Widget w, XEvent *event, String *prms, Cardinal *nprms)
+EditBookProc ()
 {
     EditBookEvent();
 }
@@ -1791,7 +1801,7 @@ SetRandom (int n)
 }
 
 void
-ShuffleMenuProc (Widget w, XEvent *event, String *prms, Cardinal *nprms)
+ShuffleMenuProc ()
 {
     GenericPopUp(shuffleOptions, _("New Shuffle Game"), 0);
 }
@@ -1877,7 +1887,7 @@ SetTcType (int n)
 }
 
 void
-TimeControlProc (Widget w, XEvent *event, String *prms, Cardinal *nprms)
+TimeControlProc ()
 {
    tmpMoves = appData.movesPerSession;
    tmpInc = appData.timeIncrement; if(tmpInc < 0) tmpInc = 0;