configure: added install of sounds in .../games/xboard/sounds/default
[xboard.git] / xoptions.c
index 6fe3822..2b29bbe 100644 (file)
@@ -624,6 +624,7 @@ 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)
 {
@@ -659,6 +660,7 @@ void SpinCallback(w, client_data, call_data)
        XtSetArg(args[0], XtNstring, &q);
        XtGetValues(currentOption[data].handle, args, 1);
        for(r = ""; *q; q++) if(*q == '.') r = q; else if(*q == '/') r = ""; // last dot after last slash
+       browserUp = True;
        if(XsraSelFile(shells[0], currentOption[data].name, NULL, NULL, "", "", r,
                                  currentOption[data].type == PathName ? "p" : "f", NULL, &p)) {
                int len = strlen(p);
@@ -666,6 +668,7 @@ void SpinCallback(w, client_data, call_data)
                XtSetArg(args[0], XtNstring, p);
                XtSetValues(currentOption[data].handle, args, 1);
        }
+       browserUp = False;
        SetFocus(currentOption[data].handle, shells[0], (XEvent*) NULL, False);
        return;
     } else
@@ -732,8 +735,7 @@ char *trialSound;
 static int oldCores, oldPonder;
 int MakeColors P((void));
 void CreateGCs P((int redo));
-void CreateXPMBoard P((char *s, int kind));
-void CreateXPMPieces P((void));
+void CreateAnyPieces P((void));
 void GenericReadout();
 Widget shells[10];
 Widget marked[10];
@@ -785,6 +787,7 @@ void GenericPopDown(w, event, prms, nprms)
      Cardinal *nprms;
 {
     int n;
+    if(browserUp) return; // prevent closing dialog when it has an open file-browse daughter
     PopDown(prms[0][0] - '0');
 }
 
@@ -1145,12 +1148,11 @@ void AdjustColor(int i)
 
 void BoardOptionsOK(int n)
 {
-    extern int defaultLineGap;
+    extern int defaultLineGap, useImages, useImageSqs;
     if(appData.overrideLineGap >= 0) lineGap = appData.overrideLineGap; else lineGap = defaultLineGap;
+    useImages = useImageSqs = 0;
     MakeColors(); CreateGCs(True);
-    CreateXPMPieces();
-    CreateXPMBoard(appData.liteBackTextureFile, 1);
-    CreateXPMBoard(appData.darkBackTextureFile, 0);
+    CreateAnyPieces();
     InitDrawingSizes(-1, 0);
     DrawPosition(True, NULL);
 }
@@ -1193,7 +1195,7 @@ Option boardOptions[] = {
 {    3, 1, 0, NULL, (void*) &AdjustColor, NULL, NULL, Button, "B" },
 {    4, 1, 0, NULL, (void*) &AdjustColor, NULL, NULL, Button, "D" },
 { 0, 0, 0, NULL, (void*) &appData.upsideDown, "", NULL, CheckBox, _("Flip Pieces Shogi Style        (Colored buttons restore default)") },
-{ 0, 0, 0, NULL, (void*) &appData.allWhite, "", NULL, CheckBox, _("Use Outline Pieces for Black") },
+//{ 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:") },
@@ -1233,13 +1235,14 @@ void GenericReadout()
                    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) {
+                   if(currentOption[i].type == Fractional)
+                       *(float*) currentOption[i].target = x; // engines never have float options!
+                   else if(currentOption[i].value != x) {
                        currentOption[i].value = x;
-                       if(currentCps) { // engines never have float options, so no decimals!
+                       if(currentCps) {
                            snprintf(buf, MSG_SIZ,  "option %s=%.0f\n", currentOption[i].name, x);
                            SendToProgram(buf, currentCps);
-                       } else if(currentOption[i].type == Spin) *(int*) currentOption[i].target = x;
-                       else *(float*) currentOption[i].target = x;
+                       } else *(int*) currentOption[i].target = x;
                    }
                    break;
                case CheckBox:
@@ -1582,7 +1585,19 @@ GenericPopUp(Option *option, char *title, int dlgNr)
 
   if(!(option[i].min & 2)) {
     j=0;
-    if(option[i].min & 1) { XtSetArg(args[j], XtNfromHoriz, last); last = forelast; } else
+    if(option[i].min & 1) {
+       for(j=i-1; option[j+1].min&1 && option[j].type == Button; j--) {
+           XtSetArg(args[0], XtNtop, XtChainBottom);
+           XtSetArg(args[1], XtNbottom, XtChainBottom);
+           XtSetValues(option[j].handle, args, 2);
+       }
+       if(option[j].type == TextBox && option[j].name[0] == NULLCHAR) {
+           XtSetArg(args[0], XtNbottom, XtChainBottom);
+           XtSetValues(option[j].handle, args, 1);
+       }
+       j = 0;
+       XtSetArg(args[j], XtNfromHoriz, last); last = forelast;
+    } else
     XtSetArg(args[j], XtNfromHoriz, widest ? widest : dialog);  j++;
     XtSetArg(args[j], XtNfromVert, anchor ? anchor : last);  j++;
     XtSetArg(args[j], XtNbottom, XtChainBottom);  j++;
@@ -1859,13 +1874,13 @@ void changeTags(int n)
 {
     Arg args[16];
     XtSetArg(args[0], XtNstring, &tagsText);
-    XtGetValues(currentOption[0].handle, args, 1);
+    XtGetValues(currentOption[1].handle, args, 1);
     ReplaceTags(tagsText, &gameInfo);
 }
 
 Option tagsOptions[] = {
-{ 0xD, 200, 250, NULL, (void*) &tagsText, "", NULL, TextBox, "" },
 {   0,  0,    0, NULL, NULL, NULL, NULL, Label,  "" },
+{ 0xD, 200, 250, NULL, (void*) &tagsText, "", NULL, TextBox, "" },
 {   0,  0,    0, NULL, (void*) &changeTags, NULL, NULL, Button, "save changes" },
 {   0,  1,    0, NULL, (void*) &NewTagsCallback, "", NULL, EndMark , "" }
 };
@@ -1877,10 +1892,10 @@ void NewTagsPopup(char *text, char *msg)
 
     if(shells[2]) { // if already exists, alter title and content
        XtSetArg(args[0], XtNstring, text);
-       XtSetValues(tagsOptions[0].handle, args, 1);
+       XtSetValues(tagsOptions[1].handle, args, 1);
     }
     tagsText = text;
-    tagsOptions[1].textValue = msg;
+    tagsOptions[0].textValue = msg;
     MarkMenu("menuView.Show Tags", 2);
     GenericPopUp(tagsOptions, _("Tags"), 2);
 }
@@ -1926,70 +1941,27 @@ void TypeInProc(w, event, prms, nprms)
      String *prms;
      Cardinal *nprms;
 {
-    Widget edit;
-    int j, fromX, fromY, toX, toY;
-    Arg args[16];
+    Arg args[2];
     String val;
-    char *move, promoChar;
-    ChessMove moveType;
 
-    if(prms[0][0] == '0') PopDown(0); // escape hit
-    edit = boxOptions[0].handle;
-    j = 0;
-    XtSetArg(args[j], XtNstring, &val); j++;
-    XtGetValues(edit, args, j);
-      move = val;
-      { int n; Board board;\r
-       // [HGM] FENedit\r
-       if(gameMode == EditPosition && ParseFEN(board, &n, move) ) {\r
-               EditPositionPasteFEN(move);\r
-               PopDown(0);\r
-               return;\r
-       }\r
-       // [HGM] movenum: allow move number to be typed in any mode\r
-       if(sscanf(move, "%d", &n) == 1 && n != 0 ) {\r
-         ToNrEvent(2*n-1);\r
-         PopDown(0);\r
-         return;\r
-       }\r
-      }\r
-      if (gameMode != EditGame && currentMove != forwardMostMove && \r
-       gameMode != Training) {\r
-       DisplayMoveError(_("Displayed move is not current"));\r
-      } else {\r
-       int ok = ParseOneMove(move, gameMode == EditPosition ? blackPlaysFirst : currentMove, \r
-         &moveType, &fromX, &fromY, &toX, &toY, &promoChar);\r
-       if(!ok && move[0] >= 'a') { move[0] += 'A' - 'a'; ok = 2; } // [HGM] try also capitalized\r
-       if (ok==1 || ok && ParseOneMove(move, gameMode == EditPosition ? blackPlaysFirst : currentMove, \r
-         &moveType, &fromX, &fromY, &toX, &toY, &promoChar)) {\r
-         UserMoveEvent(fromX, fromY, toX, toY, promoChar);     \r
-       } else {\r
-         DisplayMoveError(_("Could not parse move"));\r
-       }\r
-      }\r
-      PopDown(0);\r
+    if(prms[0][0] == '1') {
+       XtSetArg(args[0], XtNstring, &val);
+       XtGetValues(boxOptions[0].handle, args, 1);
+       TypeInDoneEvent((char*)val);
+    }
+    PopDown(0);\r
 }
 
 char moveTypeInTranslations[] =
     "<Key>Return: TypeInProc(1) \n"
     "<Key>Escape: TypeInProc(0) \n";
 
-void MoveTypeInPopup(char firstchar)
+void PopUpMoveDialog(char firstchar)
 {
     static char buf[2];
-    if ((gameMode == BeginningOfGame && !appData.icsActive) || \r
-        gameMode == MachinePlaysWhite || gameMode == MachinePlaysBlack ||\r
-       gameMode == AnalyzeMode || gameMode == EditGame || \r
-       gameMode == EditPosition || gameMode == IcsExamining ||\r
-       gameMode == IcsPlayingWhite || gameMode == IcsPlayingBlack ||\r
-       isdigit(firstchar) && // [HGM] movenum: allow typing in of move nr in 'passive' modes\r
-               ( gameMode == AnalyzeFile || gameMode == PlayFromGameFile ||\r
-                 gameMode == IcsObserving || gameMode == TwoMachinesPlay    ) ||\r
-       gameMode == Training) {\r
-           buf[0]= firstchar; icsText = buf;
-           if(GenericPopUp(boxOptions, _("Type a move"), 0))
-               XtOverrideTranslations(boxOptions[0].handle, XtParseTranslationTable(moveTypeInTranslations));
-       }
+    buf[0] = firstchar; icsText = buf;
+    if(GenericPopUp(boxOptions, _("Type a move"), 0))
+       XtOverrideTranslations(boxOptions[0].handle, XtParseTranslationTable(moveTypeInTranslations));
 }
 
 void MoveTypeInProc(Widget widget, caddr_t unused, XEvent *event)
@@ -2001,9 +1973,8 @@ void MoveTypeInProc(Widget widget, caddr_t unused, XEvent *event)
     XQueryKeymap(xDisplay,keys);
     metaL = XKeysymToKeycode(xDisplay, XK_Meta_L);
     metaR = XKeysymToKeycode(xDisplay, XK_Meta_R);
-//{int i; for(i=0;i<32;i++)printf("%02x",keys[i]);printf("\n");}
     if ( n == 1 && *buf > 32 && !(keys[metaL>>3]&1<<(metaL&7)) && !(keys[metaR>>3]&1<<(metaR&7))) // printable, no alt
-       MoveTypeInPopup(*buf);
+       PopUpMoveDialog(*buf);
 
 }