Allow generic dialog to ignore OK
authorH.G. Muller <h.g.muller@hccnet.nl>
Mon, 23 May 2011 15:37:43 +0000 (17:37 +0200)
committerH.G. Muller <h.g.muller@hccnet.nl>
Mon, 23 May 2011 16:42:46 +0000 (18:42 +0200)
The EndMark callback can now suppress popdown of the dialog on OK, when
it somehow does not like the values entered by the user. In XBoard this
required all the callbacks to return a value.
Caveat: A refused OK would still have set all new values given in the
dialog!

winboard/wsettings.c
xoptions.c

index 72ceb96..159c0a1 100644 (file)
@@ -41,8 +41,8 @@ char *engineList[1000] = {" "}, *engineMnemonic[1000] = {""};
 void (*okFunc)();\r
 ChessProgramState *activeCps;\r
 Option *activeList;\r
 void (*okFunc)();\r
 ChessProgramState *activeCps;\r
 Option *activeList;\r
-void InstallOK P((void));\r
-typedef void ButtonCallback(HWND h);\r
+int InstallOK P((void));\r
+typedef int ButtonCallback(HWND h);\r
 ButtonCallback *comboCallback;\r
 \r
 void\r
 ButtonCallback *comboCallback;\r
 \r
 void\r
@@ -334,7 +334,7 @@ SetOptionValues(HWND hDlg, ChessProgramState *cps, Option *optionList)
 }\r
 \r
 \r
 }\r
 \r
 \r
-void\r
+int\r
 GetOptionValues(HWND hDlg, ChessProgramState *cps, Option *optionList)\r
 // read out all controls, and if value is altered, remember it and send it to the engine\r
 {\r
 GetOptionValues(HWND hDlg, ChessProgramState *cps, Option *optionList)\r
 // read out all controls, and if value is altered, remember it and send it to the engine\r
 {\r
@@ -407,7 +407,8 @@ GetOptionValues(HWND hDlg, ChessProgramState *cps, Option *optionList)
          snprintf(buf, MSG_SIZ, "option %s=%s\n", optionList[j].name, newText);\r
        if(changed) SendToProgram(buf, cps);\r
     }\r
          snprintf(buf, MSG_SIZ, "option %s=%s\n", optionList[j].name, newText);\r
        if(changed) SendToProgram(buf, cps);\r
     }\r
-    if(!cps && okFunc) ((ButtonCallback*) okFunc)(0);\r
+    if(!cps && okFunc) return ((ButtonCallback*) okFunc)(0);\r
+    return 1;\r
 }\r
 \r
 char *defaultExt[] = { NULL, "pgn", "fen", "exe", "trn", "bin", "log", "ini" };\r
 }\r
 \r
 char *defaultExt[] = { NULL, "pgn", "fen", "exe", "trn", "bin", "log", "ini" };\r
@@ -431,7 +432,7 @@ LRESULT CALLBACK SettingsProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lPa
     case WM_COMMAND:\r
         switch( LOWORD(wParam) ) {\r
         case IDOK:\r
     case WM_COMMAND:\r
         switch( LOWORD(wParam) ) {\r
         case IDOK:\r
-           GetOptionValues(hDlg, activeCps, activeList);\r
+           if(!GetOptionValues(hDlg, activeCps, activeList)) return FALSE;\r
             EndDialog( hDlg, 0 );\r
            comboCallback = NULL; activeCps = NULL;\r
             return TRUE;\r
             EndDialog( hDlg, 0 );\r
            comboCallback = NULL; activeCps = NULL;\r
             return TRUE;\r
@@ -623,10 +624,11 @@ EngineOptionsPopup(HWND hwnd, ChessProgramState *cps)
     return;\r
 }\r
 \r
     return;\r
 }\r
 \r
-void InstallOK()\r
-{
+int InstallOK()\r
+{\r
     if(isUCCI) isUCI = 2;\r
     if(engineChoice[0] == engineNr[0][0])  Load(&first, 0); else Load(&second, 1);\r
     if(isUCCI) isUCI = 2;\r
     if(engineChoice[0] == engineNr[0][0])  Load(&first, 0); else Load(&second, 1);\r
+    return 1;\r
 }\r
 \r
 Option installOptions[] = {\r
 }\r
 \r
 Option installOptions[] = {\r
@@ -686,19 +688,19 @@ void LoadEnginePopUp(HWND hwnd)
 \r
 Boolean autoinc, twice;\r
 \r
 \r
 Boolean autoinc, twice;\r
 \r
-void MatchOK()\r
+int MatchOK()\r
 {\r
     if(autoinc) appData.loadGameIndex = appData.loadPositionIndex = -(twice + 1);\r
 {\r
     if(autoinc) appData.loadGameIndex = appData.loadPositionIndex = -(twice + 1);\r
-    if(appData.participants) free(appData.participants);\r
-    appData.participants = strdup(engineName);\r
-    if(CreateTourney(appData.tourneyFile)) MatchEvent(2); \r
-//     ScheduleDelayedEvent(MatchEvent(2), 10); // start tourney\r
+    if(CreateTourney(appData.tourneyFile)) MatchEvent(2); else return 0;\r
+    return 1;\r
 }\r
 \r
 Option tourneyOptions[] = {\r
   { 0,  0,          4, NULL, (void*) &appData.tourneyFile, "", NULL, FileName, N_("Tournament file:") },\r
 }\r
 \r
 Option tourneyOptions[] = {\r
   { 0,  0,          4, NULL, (void*) &appData.tourneyFile, "", NULL, FileName, N_("Tournament file:") },\r
+  { 30, 0,          0, NULL, NULL, NULL, NULL, Label, N_("If you specify an existing file, the rest of this dialog will be ignored.") },\r
+  { 30, 0,          0, NULL, NULL, NULL, NULL, Label, N_("Otherwise, the file will be created, with the settings you specify below:") },\r
   { 0,  1,          0, NULL, (void*) &engineChoice, (char*) (engineMnemonic+1), (engineMnemonic+1), ComboBox, N_("Select Engine:") },\r
   { 0,  1,          0, NULL, (void*) &engineChoice, (char*) (engineMnemonic+1), (engineMnemonic+1), ComboBox, N_("Select Engine:") },\r
-  { 0xD, 7,         0, NULL, (void*) &engineName, "", NULL, TextBox, "Tourney participants:" },\r
+  { 0xD, 7,         0, NULL, (void*) &appData.participants, "", NULL, TextBox, "Tourney participants:" },\r
   { 0,  0,         10, NULL, (void*) &appData.tourneyType, "", NULL, Spin, N_("Tourney type (0=RR, 1=gauntlet):") },\r
   { 0,  0,          0, NULL, (void*) &appData.cycleSync, "", NULL, CheckBox, N_("Sync after cycle") },\r
   { 0,  1, 1000000000, NULL, (void*) &appData.tourneyCycles, "", NULL, Spin, N_("Number of tourney cycles:") },\r
   { 0,  0,         10, NULL, (void*) &appData.tourneyType, "", NULL, Spin, N_("Tourney type (0=RR, 1=gauntlet):") },\r
   { 0,  0,          0, NULL, (void*) &appData.cycleSync, "", NULL, CheckBox, N_("Sync after cycle") },\r
   { 0,  1, 1000000000, NULL, (void*) &appData.tourneyCycles, "", NULL, Spin, N_("Number of tourney cycles:") },\r
@@ -716,15 +718,16 @@ Option tourneyOptions[] = {
   { 0, 0, 0, NULL, (void*) &MatchOK, "", NULL, EndMark , "" }\r
 };\r
 \r
   { 0, 0, 0, NULL, (void*) &MatchOK, "", NULL, EndMark , "" }\r
 };\r
 \r
-void AddToTourney(HWND hDlg)\r
+int AddToTourney(HWND hDlg)\r
 {\r
     char buf[MSG_SIZ];\r
 {\r
     char buf[MSG_SIZ];\r
-//    GetDlgItemText( hDlg, 2001+2*3, buf, MSG_SIZ-3 ); // this gives the previous selection !!!\r
+//    GetDlgItemText( hDlg, 2001+2*7, buf, MSG_SIZ-3 ); // this gives the previous selection !!!\r
 //    strncat(buf, "\r\n", MSG_SIZ);\r
 //    strncat(buf, "\r\n", MSG_SIZ);\r
-    int i = ComboBox_GetCurSel(GetDlgItem(hDlg, 2001+2*3));\r
+    int i = ComboBox_GetCurSel(GetDlgItem(hDlg, 2001+2*7));\r
     snprintf(buf, MSG_SIZ, "%s\r\n", engineMnemonic[i+1]);\r
     snprintf(buf, MSG_SIZ, "%s\r\n", engineMnemonic[i+1]);\r
-    SendMessage( GetDlgItem(hDlg, 2001+2*5), EM_SETSEL, 99999, 99999 );\r
-    SendMessage( GetDlgItem(hDlg, 2001+2*5), EM_REPLACESEL, (WPARAM) FALSE, (LPARAM) buf );\r
+    SendMessage( GetDlgItem(hDlg, 2001+2*9), EM_SETSEL, 99999, 99999 );\r
+    SendMessage( GetDlgItem(hDlg, 2001+2*9), EM_REPLACESEL, (WPARAM) FALSE, (LPARAM) buf );\r
+    return 0;\r
 }\r
 \r
 void TourneyPopup(HWND hwnd)\r
 }\r
 \r
 void TourneyPopup(HWND hwnd)\r
@@ -735,7 +738,7 @@ void TourneyPopup(HWND hwnd)
     comboCallback = &AddToTourney;\r
     autoinc = appData.loadGameIndex < 0 || appData.loadPositionIndex < 0;\r
     twice = TRUE;\r
     comboCallback = &AddToTourney;\r
     autoinc = appData.loadGameIndex < 0 || appData.loadPositionIndex < 0;\r
     twice = TRUE;\r
-    while(engineList[n]) n++; tourneyOptions[1].max = n-1;\r
+    while(engineList[n]) n++; tourneyOptions[3].max = n-1;\r
     snprintf(title, MSG_SIZ, _("Tournament and Match Options"));\r
 \r
     GenericPopup(hwnd, tourneyOptions);\r
     snprintf(title, MSG_SIZ, _("Tournament and Match Options"));\r
 \r
     GenericPopup(hwnd, tourneyOptions);\r
index fd61145..2acc5e2 100644 (file)
@@ -605,6 +605,7 @@ void TimeControlProc(w, event, prms, nprms)
 //--------------------------- Engine-specific options menu ----------------------------------
 
 typedef void ButtonCallback(int n);
 //--------------------------- Engine-specific options menu ----------------------------------
 
 typedef void ButtonCallback(int n);
+typedef int OKCallback(int n);
 
 int values[MAX_OPTIONS];
 ChessProgramState *currentCps;
 
 int values[MAX_OPTIONS];
 ChessProgramState *currentCps;
@@ -725,7 +726,7 @@ static int oldCores, oldPonder;
 int MakeColors P((void));
 void CreateGCs P((int redo));
 void CreateAnyPieces P((void));
 int MakeColors P((void));
 void CreateGCs P((int redo));
 void CreateAnyPieces P((void));
-void GenericReadout P((int selected));
+int GenericReadout P((int selected));
 Widget shells[10];
 Widget marked[10];
 Boolean shellUp[10];
 Widget shells[10];
 Widget marked[10];
 Boolean shellUp[10];
@@ -798,12 +799,14 @@ void AddToTourney(int n)
     XawTextReplace(matchOptions[3].handle, 9999, 9999, &t);
 }
 
     XawTextReplace(matchOptions[3].handle, 9999, 9999, &t);
 }
 
-void MatchOK(int n)
+int MatchOK(int n)
 {
     if(appData.participants && appData.participants[0]) free(appData.participants);
     appData.participants = strdup(engineName);
 {
     if(appData.participants && appData.participants[0]) free(appData.participants);
     appData.participants = strdup(engineName);
+    if(!CreateTourney(appData.tourneyFile)) return 0;
     PopDown(0); // early popdown to prevent FreezeUI called through MatchEvent from causing XtGrab warning
     PopDown(0); // early popdown to prevent FreezeUI called through MatchEvent from causing XtGrab warning
-    if(CreateTourney(appData.tourneyFile)) MatchEvent(2); // start tourney
+    MatchEvent(2); // start tourney
+    return 1;
 }
 
 Option matchOptions[] = {
 }
 
 Option matchOptions[] = {
@@ -825,11 +828,12 @@ Option matchOptions[] = {
 { 0, 0, 0, NULL, (void*) &MatchOK, "", NULL, EndMark , "" }
 };
 
 { 0, 0, 0, NULL, (void*) &MatchOK, "", NULL, EndMark , "" }
 };
 
-void GeneralOptionsOK(int n)
+int GeneralOptionsOK(int n)
 {
        int newPonder = appData.ponderNextMove;
        appData.ponderNextMove = oldPonder;
        PonderNextMoveEvent(newPonder);
 {
        int newPonder = appData.ponderNextMove;
        appData.ponderNextMove = oldPonder;
        PonderNextMoveEvent(newPonder);
+       return 1;
 }
 
 Option generalOptions[] = {
 }
 
 Option generalOptions[] = {
@@ -934,7 +938,7 @@ Option variantDescriptors[] = {
 { 0, 2, 0, NULL, NULL, "", NULL, EndMark , "" }
 };
 
 { 0, 2, 0, NULL, NULL, "", NULL, EndMark , "" }
 };
 
-void CommonOptionsOK(int n)
+int CommonOptionsOK(int n)
 {
        int newPonder = appData.ponderNextMove;
        // make sure changes are sent to first engine by re-initializing it
 {
        int newPonder = appData.ponderNextMove;
        // make sure changes are sent to first engine by re-initializing it
@@ -946,6 +950,7 @@ void CommonOptionsOK(int n)
            appData.ponderNextMove = oldPonder;
            PonderNextMoveEvent(newPonder);
        }
            appData.ponderNextMove = oldPonder;
            PonderNextMoveEvent(newPonder);
        }
+       return 1;
 }
 
 Option commonEngineOptions[] = {
 }
 
 Option commonEngineOptions[] = {
@@ -978,9 +983,10 @@ Option adjudicationOptions[] = {
 { 0, 1,    0, NULL, NULL, "", NULL, EndMark , "" }
 };
 
 { 0, 1,    0, NULL, NULL, "", NULL, EndMark , "" }
 };
 
-void IcsOptionsOK(int n)
+int IcsOptionsOK(int n)
 {
     ParseIcsTextColors();
 {
     ParseIcsTextColors();
+    return 1;
 }
 
 Option icsOptions[] = {
 }
 
 Option icsOptions[] = {
@@ -1170,7 +1176,7 @@ void AdjustColor(int i)
     RefreshColor(i-n-1, n);
 }
 
     RefreshColor(i-n-1, n);
 }
 
-void BoardOptionsOK(int n)
+int BoardOptionsOK(int n)
 {
     if(appData.overrideLineGap >= 0) lineGap = appData.overrideLineGap; else lineGap = defaultLineGap;
     useImages = useImageSqs = 0;
 {
     if(appData.overrideLineGap >= 0) lineGap = appData.overrideLineGap; else lineGap = defaultLineGap;
     useImages = useImageSqs = 0;
@@ -1178,6 +1184,7 @@ void BoardOptionsOK(int n)
     CreateAnyPieces();
     InitDrawingSizes(-1, 0);
     DrawPosition(True, NULL);
     CreateAnyPieces();
     InitDrawingSizes(-1, 0);
     DrawPosition(True, NULL);
+    return 1;
 }
 
 Option boardOptions[] = {
 }
 
 Option boardOptions[] = {
@@ -1228,9 +1235,9 @@ Option boardOptions[] = {
 { 0, 0, 0, NULL, (void*) &BoardOptionsOK, "", NULL, EndMark , "" }
 };
 
 { 0, 0, 0, NULL, (void*) &BoardOptionsOK, "", NULL, EndMark , "" }
 };
 
-void GenericReadout(int selected)
+int GenericReadout(int selected)
 {
 {
-    int i, j;
+    int i, j, res=1;
     String val;
     Arg args[16];
     char buf[MSG_SIZ], **dest;
     String val;
     Arg args[16];
     char buf[MSG_SIZ], **dest;
@@ -1299,7 +1306,7 @@ void GenericReadout(int selected)
                    break;
                case EndMark:
                    if(currentOption[i].target) // callback for implementing necessary actions on OK (like redraw)
                    break;
                case EndMark:
                    if(currentOption[i].target) // callback for implementing necessary actions on OK (like redraw)
-                       ((ButtonCallback*) currentOption[i].target)(i);
+                       res = ((OKCallback*) currentOption[i].target)(i);
                    break;
            default:
                printf("GenericReadout: unexpected case in switch.\n");
                    break;
            default:
                printf("GenericReadout: unexpected case in switch.\n");
@@ -1311,6 +1318,7 @@ void GenericReadout(int selected)
            }
            if(currentOption[i].type == EndMark) break;
        }
            }
            if(currentOption[i].type == EndMark) break;
        }
+       return res;
 }
 
 void GenericCallback(w, client_data, call_data)
 }
 
 void GenericCallback(w, client_data, call_data)
@@ -1332,8 +1340,7 @@ void GenericCallback(w, client_data, call_data)
         return;
     }
     if (strcmp(name, _("OK")) == 0) { // save buttons imply OK
         return;
     }
     if (strcmp(name, _("OK")) == 0) { // save buttons imply OK
-        GenericReadout(-1);
-        PopDown(data);
+        if(GenericReadout(-1)) PopDown(data);
         return;
     }
     if(currentCps) {
         return;
     }
     if(currentCps) {
@@ -1851,9 +1858,10 @@ static int commentIndex;
 void ClearComment P((int n));
 extern char commentTranslations[];
 
 void ClearComment P((int n));
 extern char commentTranslations[];
 
-void NewComCallback(int n)
+int NewComCallback(int n)
 {
     ReplaceComment(commentIndex, commentText);
 {
     ReplaceComment(commentIndex, commentText);
+    return 1;
 }
 
 void SaveChanges(int n)
 }
 
 void SaveChanges(int n)
@@ -1897,9 +1905,10 @@ void NewCommentPopup(char *title, char *text, int index)
 
 static char *tagsText, *msgText;
 
 
 static char *tagsText, *msgText;
 
-void NewTagsCallback(int n)
+int NewTagsCallback(int n)
 {
     ReplaceTags(tagsText, &gameInfo);
 {
     ReplaceTags(tagsText, &gameInfo);
+    return 1;
 }
 
 void changeTags(int n)
 }
 
 void changeTags(int n)
@@ -2038,10 +2047,11 @@ void SecondSettingsProc(w, event, prms, nprms)
    SettingsPopUp(&second);
 }
 
    SettingsPopUp(&second);
 }
 
-void InstallOK(int n)
+int InstallOK(int n)
 {
     PopDown(0); // early popdown, to allow FreezeUI to instate grab
     if(engineChoice[0] == engineNr[0][0])  Load(&first, 0); else Load(&second, 1);
 {
     PopDown(0); // early popdown, to allow FreezeUI to instate grab
     if(engineChoice[0] == engineNr[0][0])  Load(&first, 0); else Load(&second, 1);
+    return 1;
 }
 
 Option installOptions[] = {
 }
 
 Option installOptions[] = {