Fix u64 format for cygwin
[xboard.git] / xoptions.c
index b8a8a68..e31aa33 100644 (file)
@@ -45,6 +45,7 @@ extern char *getenv();
 #if HAVE_UNISTD_H
 # include <unistd.h>
 #endif
 #if HAVE_UNISTD_H
 # include <unistd.h>
 #endif
+#include <stdint.h>
 
 #include <X11/Intrinsic.h>
 #include <X11/StringDefs.h>
 
 #include <X11/Intrinsic.h>
 #include <X11/StringDefs.h>
@@ -78,6 +79,8 @@ extern char *getenv();
 # define N_(s)  s
 #endif
 
 # define N_(s)  s
 #endif
 
+extern void SendToProgram P((char *message, ChessProgramState *cps));
+
 extern Widget formWidget, shellWidget, boardWidget, menuBarWidget;
 extern Display *xDisplay;
 extern int squareSize;
 extern Widget formWidget, shellWidget, boardWidget, menuBarWidget;
 extern Display *xDisplay;
 extern int squareSize;
@@ -86,6 +89,7 @@ extern char *layoutName;
 extern Window xBoardWindow;
 extern Arg layoutArgs[2], formArgs[2];
 Pixel timerForegroundPixel, timerBackgroundPixel;
 extern Window xBoardWindow;
 extern Arg layoutArgs[2], formArgs[2];
 Pixel timerForegroundPixel, timerBackgroundPixel;
+extern int searchTime;
 
 // [HGM] the following code for makng menu popups was cloned from the FileNamePopUp routines
 
 
 // [HGM] the following code for makng menu popups was cloned from the FileNamePopUp routines
 
@@ -140,7 +144,6 @@ void ShuffleCallback(w, client_data, call_data)
         ShufflePopDown();
        shuffleOpenings = False; // [HGM] should be moved to New Variant menu, once we have it!
        ResetGameEvent();
         ShufflePopDown();
        shuffleOpenings = False; // [HGM] should be moved to New Variant menu, once we have it!
        ResetGameEvent();
-       AnalysisPopDown();
         return;
     }
     if (strcmp(name, _("random")) == 0) {
         return;
     }
     if (strcmp(name, _("random")) == 0) {
@@ -162,7 +165,6 @@ void ShuffleCallback(w, client_data, call_data)
        shuffleOpenings = True;
         ShufflePopDown();
        ResetGameEvent();
        shuffleOpenings = True;
         ShufflePopDown();
        ResetGameEvent();
-       AnalysisPopDown();
         return;
     }
 }
         return;
     }
 }
@@ -245,6 +247,7 @@ int tcIncrement, tcMoves;
 void TimeControlPopDown()
 {
     if (!TimeControlUp) return;
 void TimeControlPopDown()
 {
     if (!TimeControlUp) return;
+    previous = NULL;
     XtPopdown(TimeControlShell);
     XtDestroyWidget(TimeControlShell);
     TimeControlUp = False;
     XtPopdown(TimeControlShell);
     XtDestroyWidget(TimeControlShell);
     TimeControlUp = False;
@@ -265,54 +268,77 @@ void TimeControlCallback(w, client_data, call_data)
     XtGetValues(w, args, 1);
     
     if (strcmp(name, _("classical")) == 0) {
     XtGetValues(w, args, 1);
     
     if (strcmp(name, _("classical")) == 0) {
-       if(!tcInc) return;
+       if(tcInc == 0) return;
        j=0;
        XtSetArg(args[j], XtNlabel, _("minutes for each")); j++;
        XtSetValues(tcMess1, args, j);
        j=0;
        XtSetArg(args[j], XtNlabel, _("moves")); j++;
        XtSetValues(tcMess2, args, j);
        j=0;
        XtSetArg(args[j], XtNlabel, _("minutes for each")); j++;
        XtSetValues(tcMess1, args, j);
        j=0;
        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);
+       if(tcInc == 1) {
+           j=0;
+           XtSetArg(args[j], XtNstring, &name); j++;
+           XtGetValues(tcData, args, j);
+           tcIncrement = 0; sscanf(name, "%d", &tcIncrement);
+       }
        sprintf(buf, "%d", tcMoves);
        j=0;
        XtSetArg(args[j], XtNstring, buf); j++;
        XtSetValues(tcData, args, j);
        sprintf(buf, "%d", tcMoves);
        j=0;
        XtSetArg(args[j], XtNstring, buf); j++;
        XtSetValues(tcData, args, j);
-       tcInc = False;
+       tcInc = 0;
         return;
     }
     if (strcmp(name, _("incremental")) == 0) {
         return;
     }
     if (strcmp(name, _("incremental")) == 0) {
-       if(tcInc) return;
+       if(tcInc == 1) return;
        j=0;
        XtSetArg(args[j], XtNlabel, _("minutes, plus")); j++;
        XtSetValues(tcMess1, args, j);
        j=0;
        XtSetArg(args[j], XtNlabel, _("sec/move")); j++;
        XtSetValues(tcMess2, args, j);
        j=0;
        XtSetArg(args[j], XtNlabel, _("minutes, plus")); j++;
        XtSetValues(tcMess1, args, j);
        j=0;
        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);
+       if(tcInc == 0) {
+           j=0;
+           XtSetArg(args[j], XtNstring, &name); j++;
+           XtGetValues(tcData, args, j);
+           tcMoves = appData.movesPerSession; sscanf(name, "%d", &tcMoves);
+       }
        sprintf(buf, "%d", tcIncrement);
        j=0;
        XtSetArg(args[j], XtNstring, buf); j++;
        XtSetValues(tcData, args, j);
        sprintf(buf, "%d", tcIncrement);
        j=0;
        XtSetArg(args[j], XtNstring, buf); j++;
        XtSetValues(tcData, args, j);
-       tcInc = True;
+       tcInc = 1;
+        return;
+    }
+    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, tc, ok;
        XtSetArg(args[0], XtNstring, &txt);
        XtGetValues(tcData, args, 1);
         return;
     }
     if (strcmp(name, _(" OK ")) == 0) {
        int inc, mps, tc, 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);
            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);
            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
        }
        if(ok != 1) {
            XtSetArg(args[0], XtNstring, ""); // erase any offending input
@@ -321,15 +347,26 @@ void TimeControlCallback(w, client_data, call_data)
        }
        XtSetArg(args[0], XtNstring, &txt);
        XtGetValues(tcTime, args, 1);
        }
        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 
        XtSetArg(args[0], XtNstring, &txt);
        XtGetValues(tcOdds1, args, 1);
        appData.firstTimeOdds = first.timeOdds 
@@ -354,7 +391,7 @@ void TimeControlPopUp()
     unsigned int mask;
     char def[80];
     
     unsigned int mask;
     char def[80];
     
-    tcInc = (appData.timeIncrement >= 0);
+    tcInc = searchTime > 0 ? 2 : (appData.timeIncrement >= 0);
     tcMoves = appData.movesPerSession; tcIncrement = appData.timeIncrement;
     if(!tcInc) tcIncrement = 0;
     sprintf(def, "%d", tcInc ? tcIncrement : tcMoves);
     tcMoves = appData.movesPerSession; tcIncrement = appData.timeIncrement;
     if(!tcInc) tcIncrement = 0;
     sprintf(def, "%d", tcInc ? tcIncrement : tcMoves);
@@ -396,7 +433,7 @@ void TimeControlPopUp()
     XtAddEventHandler(tcTime, ButtonPressMask, False, SetFocus, (XtPointer) popup);
 
     j= 0;
     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++;
     XtSetArg(args[j], XtNborderWidth, 0); j++;
     XtSetArg(args[j], XtNfromHoriz, tcTime); j++;
     XtSetArg(args[j], XtNtop, XtChainTop);  j++;
@@ -425,7 +462,7 @@ void TimeControlPopUp()
     XtAddEventHandler(tcData, ButtonPressMask, False, SetFocus, (XtPointer) popup);
 
     j= 0;
     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++;
     XtSetArg(args[j], XtNjustify, XtJustifyLeft); j++;
     XtSetArg(args[j], XtNborderWidth, 0); j++;
     XtSetArg(args[j], XtNfromHoriz, tcData); j++;
@@ -493,18 +530,34 @@ void TimeControlPopUp()
     XtSetArg(args[j], XtNtop, XtChainBottom);  j++;
     XtSetArg(args[j], XtNleft, XtChainLeft);  j++;
     XtSetArg(args[j], XtNright, XtChainLeft);  j++;
     XtSetArg(args[j], XtNtop, XtChainBottom);  j++;
     XtSetArg(args[j], XtNleft, XtChainLeft);  j++;
     XtSetArg(args[j], XtNright, XtChainLeft);  j++;
-    b_clas= XtCreateManagedWidget(_("classical"), commandWidgetClass,
+    XtSetArg(args[j], XtNstate, tcInc==0); j++;
+    b_clas= XtCreateManagedWidget(_("classical"), toggleWidgetClass,
                                   form, args, j);   
     XtAddCallback(b_clas, XtNcallback, TimeControlCallback, (XtPointer) 0);
 
     j=0;
                                   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++;
     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,
+    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);
 
                                   form, args, j);   
     XtAddCallback(b_inc, XtNcallback, TimeControlCallback, (XtPointer) 0);
 
@@ -567,6 +620,7 @@ Widget engDrawMoves, engThreshold, engRule, engRepeat;
 void EnginePopDown()
 {
     if (!EngineUp) return;
 void EnginePopDown()
 {
     if (!EngineUp) return;
+    previous = NULL;
     XtPopdown(EngineShell);
     XtDestroyWidget(EngineShell);
     EngineUp = False;
     XtPopdown(EngineShell);
     XtDestroyWidget(EngineShell);
     EngineUp = False;
@@ -602,8 +656,8 @@ void EngineCallback(w, client_data, call_data)
        // read all switches
        appData.periodicUpdates = ReadToggle(w1);
 //     appData.hideThinkingFromHuman = ReadToggle(w2);
        // 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.testClaims    = ReadToggle(w5);
        appData.checkMates    = ReadToggle(w6);
        appData.materialDraws = ReadToggle(w7);
@@ -693,7 +747,7 @@ void EnginePopUp()
     XtSetArg(args[j-3], XtNstate,       appData.secondScoreIsAbsolute);
     w4 = XtCreateManagedWidget(_("Engine #2 Score is Absolute"), toggleWidgetClass, form, args, j);
 
     XtSetArg(args[j-3], XtNstate,       appData.secondScoreIsAbsolute);
     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);
 
     XtSetArg(args[j-1], XtNfromVert,  (XtArgVal) s1);
     XtSetArg(args[j-3], XtNstate,       appData.testClaims);
@@ -907,6 +961,7 @@ struct NewVarButton buttonDesc[] = {
     {N_("berolina"),          "#FFFFFF", 0, VariantBerolina},
     {N_("cylinder"),          "#FFFFFF", 0, VariantCylinder},
     {N_("shatranj"),          "#FFFFFF", 0, VariantShatranj},
     {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_("atomic"),            "#FFFFFF", 0, VariantAtomic},
     {N_("two kings"),         "#FFFFFF", 0, VariantTwoKings},
     {N_("3-checks"),          "#FFFFFF", 0, Variant3Check},
@@ -958,7 +1013,7 @@ void NewVariantCallback(w, client_data, call_data)
     XtGetValues(w, args, 1);
     
     if (strcmp(name, _("  OK  ")) == 0) {
     XtGetValues(w, args, 1);
     
     if (strcmp(name, _("  OK  ")) == 0) {
-       int nr = (int) XawToggleGetCurrent(buttonDesc[0].handle) - 1;
+       int nr = (intptr_t) XawToggleGetCurrent(buttonDesc[0].handle) - 1;
        if(nr < 0) return;
        v = buttonDesc[nr].variant;
        if(!appData.noChessProgram) { 
        if(nr < 0) return;
        v = buttonDesc[nr].variant;
        if(!appData.noChessProgram) { 
@@ -1079,7 +1134,7 @@ void NewVariantPopUp()
                                  "for missing bitmaps. (See manual.)")); j++;
     XtCreateManagedWidget("warning", labelWidgetClass, form, args, j);
 
                                  "for missing bitmaps. (See manual.)")); j++;
     XtCreateManagedWidget("warning", labelWidgetClass, form, args, j);
 
-    XtRealizeWidget(popup);
+           XtRealizeWidget(popup);
     CatchDeleteWindow(popup, "NewVariantPopDown");
     
     XQueryPointer(xDisplay, xBoardWindow, &root, &child,
     CatchDeleteWindow(popup, "NewVariantPopDown");
     
     XQueryPointer(xDisplay, xBoardWindow, &root, &child,
@@ -1125,6 +1180,7 @@ struct UciControl controlDesc[] = {
 void UciPopDown()
 {
     if (!UciUp) return;
 void UciPopDown()
 {
     if (!UciUp) return;
+    previous = NULL;
     XtPopdown(UciShell);
     XtDestroyWidget(UciShell);
     UciUp = False;
     XtPopdown(UciShell);
     XtDestroyWidget(UciShell);
     UciUp = False;
@@ -1323,6 +1379,7 @@ ChessProgramState *currentCps;
 void SettingsPopDown()
 {
     if (!SettingsUp) return;
 void SettingsPopDown()
 {
     if (!SettingsUp) return;
+    previous = NULL;
     XtPopdown(SettingsShell);
     XtDestroyWidget(SettingsShell);
     SettingsUp = False;
     XtPopdown(SettingsShell);
     XtDestroyWidget(SettingsShell);
     SettingsUp = False;
@@ -1338,23 +1395,24 @@ void SpinCallback(w, client_data, call_data)
     Arg args[16];
     char buf[MSG_SIZ];
     int i, j;
     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);
     
     j = 0;
     XtSetArg(args[0], XtNstring, &val);
     
     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, "+") == 0) {
     sscanf(val, "%d", &j);
     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) {
     } 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);
     XtSetArg(args[0], XtNstring, buf);
     } else return;
     sprintf(buf, "%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)
 }
 
 void SettingsCallback(w, client_data, call_data)
@@ -1366,6 +1424,7 @@ void SettingsCallback(w, client_data, call_data)
     Arg args[16];
     char buf[MSG_SIZ];
     int i, j;
     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);
     
     XtSetArg(args[0], XtNlabel, &name);
     XtGetValues(w, args, 1);
@@ -1374,7 +1433,7 @@ void SettingsCallback(w, client_data, call_data)
         SettingsPopDown();
         return;
     }
         SettingsPopDown();
         return;
     }
-    if (strcmp(name, _("OK")) == 0 || (int)client_data) { // save buttons imply OK
+    if (strcmp(name, _("OK")) == 0 || data) { // save buttons imply OK
        int nr;
 
        for(i=0; i<currentCps->nrOptions; i++) { // send all options that had to be OK-ed to engine
        int nr;
 
        for(i=0; i<currentCps->nrOptions; i++) { // send all options that had to be OK-ed to engine
@@ -1420,7 +1479,7 @@ void SettingsCallback(w, client_data, call_data)
                    break;
            }
        }
                    break;
            }
        }
-       if((int)client_data) { // send save-button command to engine
+       if(data) { // send save-button command to engine
            sprintf(buf, "option %s\n", name);
            SendToProgram(buf, currentCps);
        }
            sprintf(buf, "option %s\n", name);
            SendToProgram(buf, currentCps);
        }
@@ -1437,8 +1496,8 @@ void ComboSelect(w, addr, index) // callback for all combo items
      caddr_t index;
 {
     Arg args[16];
      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]);
 
     values[i] = j; // store in temporary, for transfer at OK
     XtSetArg(args[0], XtNlabel, ((char**)currentCps->option[i].textValue)[j]);
@@ -1465,7 +1524,7 @@ void CreateComboPopup(parent, name, n, mb)
                                          menu, args, j);
            XtAddCallback(entry, XtNcallback,
                          (XtCallbackProc) ComboSelect,
                                          menu, args, j);
            XtAddCallback(entry, XtNcallback,
                          (XtCallbackProc) ComboSelect,
-                         (caddr_t) (256*n+i));
+                         (caddr_t)(intptr_t) (256*n+i));
        i++;
     }
 }      
        i++;
     }
 }      
@@ -1473,18 +1532,22 @@ void CreateComboPopup(parent, name, n, mb)
 void SettingsPopUp(ChessProgramState *cps)
 {
     Arg args[16];
 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, oldform, last, b_ok, b_cancel, leftMargin = NULL;
     Window root, child;
     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;
     unsigned int mask;
     char def[80], *p, *q;
+    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;
 
 
     // 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,
     XtSetArg(args[i], XtNresizable, True); i++;
     SettingsShell = popup =
       XtCreatePopupShell(_("Settings Menu"), transientShellWidgetClass,
@@ -1493,12 +1556,21 @@ void SettingsPopUp(ChessProgramState *cps)
     layout =
       XtCreateManagedWidget(layoutName, formWidgetClass, popup,
                            layoutArgs, XtNumber(layoutArgs));
     layout =
       XtCreateManagedWidget(layoutName, formWidgetClass, popup,
                            layoutArgs, XtNumber(layoutArgs));
-  
+  for(c=0; c<width; c++) {
+    pane[4] = 'A'+c;
     form =
     form =
-      XtCreateManagedWidget(layoutName, formWidgetClass, layout,
+      XtCreateManagedWidget(pane, formWidgetClass, layout,
                            formArgs, XtNumber(formArgs));
                            formArgs, XtNumber(formArgs));
-    last = NULL;
-    for(i=0; i<cps->nrOptions; i++) {
+    j=0;
+    XtSetArg(args[j], XtNfromHoriz, leftMargin);  j++;
+    XtSetValues(form, args, j);
+    leftMargin = form;
+    last = widest = NULL; anchor = forelast;
+    for(h=0; h<height; h++) {
+       forelast = last;
+       i = h + c*height;
+        if(i >= cps->nrOptions) break;
        switch(cps->option[i].type) {
          case Spin:
            sprintf(def, "%d", cps->option[i].value);
        switch(cps->option[i].type) {
          case Spin:
            sprintf(def, "%d", cps->option[i].value);
@@ -1507,12 +1579,13 @@ void SettingsPopUp(ChessProgramState *cps)
            XtSetArg(args[j], XtNfromVert, last);  j++;
            XtSetArg(args[j], XtNborderWidth, 0);  j++;
            XtSetArg(args[j], XtNjustify, XtJustifyLeft);  j++;
            XtSetArg(args[j], XtNfromVert, last);  j++;
            XtSetArg(args[j], XtNborderWidth, 0);  j++;
            XtSetArg(args[j], XtNjustify, XtJustifyLeft);  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++;
            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], XtNeditType, XawtextEdit);  j++;
            XtSetArg(args[j], XtNuseStringInPlace, False);  j++;
            XtSetArg(args[j], XtNdisplayCaret, False);  j++;
@@ -1532,7 +1605,8 @@ void SettingsPopUp(ChessProgramState *cps)
            XtSetArg(args[j], XtNheight, 10);  j++;
            XtSetArg(args[j], XtNwidth, 20);  j++;
            edit = XtCreateManagedWidget("+", commandWidgetClass, form, args, 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++;
 
            j=0;
            XtSetArg(args[j], XtNfromVert, edit);  j++;
@@ -1540,7 +1614,8 @@ void SettingsPopUp(ChessProgramState *cps)
            XtSetArg(args[j], XtNheight, 10);  j++;
            XtSetArg(args[j], XtNwidth, 20);  j++;
            last = XtCreateManagedWidget("-", commandWidgetClass, form, args, 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;
            break;
          case CheckBox:
            j=0;
@@ -1563,8 +1638,9 @@ void SettingsPopUp(ChessProgramState *cps)
            XtSetArg(args[j], XtNfromVert, last);  j++;
            XtSetArg(args[j], XtNstate, cps->option[i].value);  j++;
            cps->option[i].handle = (void*) 
            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));
+               (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;
            break;
          case ComboBox:
            j=0;
@@ -1587,16 +1663,53 @@ void SettingsPopUp(ChessProgramState *cps)
        }
     }
 
        }
     }
 
+    // make an attempt to align all spins and textbox controls
+    maxWidth = maxTextWidth = 0;
+    for(h=0; h<height; h++) {
+       i = h + c*height;
+        if(i >= 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<height; h++) {
+       i = h + c*height;
+        if(i >= 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;
     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], XtNbottom, XtChainBottom);  j++;
     XtSetArg(args[j], XtNtop, XtChainBottom);  j++;
-    XtSetArg(args[j], XtNleft, XtChainLeft);  j++;
-    XtSetArg(args[j], XtNright, XtChainLeft);  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);
 
     b_ok = XtCreateManagedWidget(_("OK"), commandWidgetClass, form, args, j);   
     XtAddCallback(b_ok, XtNcallback, SettingsCallback, (XtPointer) 0);
 
-    XtSetArg(args[j], XtNfromHoriz, b_ok);  j++;
+    XtSetArg(args[j-1], XtNfromHoriz, b_ok);
     b_cancel = XtCreateManagedWidget(_("cancel"), commandWidgetClass, form, args, j);   
     XtAddCallback(b_cancel, XtNcallback, SettingsPopDown, (XtPointer) 0);
 
     b_cancel = XtCreateManagedWidget(_("cancel"), commandWidgetClass, form, args, j);   
     XtAddCallback(b_cancel, XtNcallback, SettingsPopDown, (XtPointer) 0);
 
@@ -1614,7 +1727,7 @@ void SettingsPopUp(ChessProgramState *cps)
     SettingsUp = True;
 
     previous = NULL;
     SettingsUp = True;
 
     previous = NULL;
-    SetFocus(edit, popup, (XEvent*) NULL, False);
+    if(edit)SetFocus(edit, popup, (XEvent*) NULL, False);
 }
 
 void FirstSettingsProc(w, event, prms, nprms)
 }
 
 void FirstSettingsProc(w, event, prms, nprms)
@@ -1635,107 +1748,10 @@ void SecondSettingsProc(w, event, prms, nprms)
    SettingsPopUp(&second);
 }
 
    SettingsPopUp(&second);
 }
 
-//--------------------------- General Popup for Cloning ----------------------------------
-#if 0
-int XXXUp;
-Widget XXXShell;
-
-void XXXPopDown()
-{
-    if (!XXXUp) return;
-    XtPopdown(XXXShell);
-    XtDestroyWidget(XXXShell);
-    XXXUp = False;
-    ModeHighlight();
-}
-
-void XXXCallback(w, client_data, call_data)
-     Widget w;
-     XtPointer client_data, call_data;
-{
-    String name;
-    Widget w2;
-    Arg args[16];
-    char buf[80];
-    
-    XtSetArg(args[0], XtNlabel, &name);
-    XtGetValues(w, args, 1);
-    
-    if (strcmp(name, _("cancel")) == 0) {
-        XXXPopDown();
-        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();
-        return;
-    }
-}
+//---------------------------- Chat Windows ----------------------------------------------
 
 
-void XXXPopUp()
+void OutputChatMessage(int partner, char *mess)
 {
 {
-    Arg args[16];
-    Widget popup, layout, dialog, edit;
-    Window root, child;
-    int x, y, i;
-    int win_x, win_y;
-    unsigned int mask;
-    char def[80];
-    
-    i = 0;
-    XtSetArg(args[i], XtNresizable, True); i++;
-    XtSetArg(args[i], XtNwidth, DIALOG_SIZE); i++;
-    XXXShell = popup =
-      XtCreatePopupShell(_("XXX Menu"), 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);
-    
-    XtRealizeWidget(popup);
-    CatchDeleteWindow(popup, "XXXPopDown");
-    
-    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);
-    XXXUp = True;
-    
-    edit = XtNameToWidget(dialog, "*value");
-
-    previous = NULL;
-    SetFocus(engThreshold, popup, (XEvent*) NULL, False);
+    return; // dummy
 }
 
 }
 
-void XXXMenuProc(w, event, prms, nprms)
-     Widget w;
-     XEvent *event;
-     String *prms;
-     Cardinal *nprms;
-{
-   XXXPopUp();
-}
-#endif
\ No newline at end of file