From 5d8fad577baa59d7bbe8e9ee1f859161f8edf1b1 Mon Sep 17 00:00:00 2001 From: H.G. Muller Date: Mon, 23 May 2011 17:37:43 +0200 Subject: [PATCH] Allow generic dialog to ignore OK 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 | 41 ++++++++++++++++++++++------------------- xoptions.c | 40 +++++++++++++++++++++++++--------------- 2 files changed, 47 insertions(+), 34 deletions(-) diff --git a/winboard/wsettings.c b/winboard/wsettings.c index 72ceb96..159c0a1 100644 --- a/winboard/wsettings.c +++ b/winboard/wsettings.c @@ -41,8 +41,8 @@ char *engineList[1000] = {" "}, *engineMnemonic[1000] = {""}; void (*okFunc)(); ChessProgramState *activeCps; Option *activeList; -void InstallOK P((void)); -typedef void ButtonCallback(HWND h); +int InstallOK P((void)); +typedef int ButtonCallback(HWND h); ButtonCallback *comboCallback; void @@ -334,7 +334,7 @@ SetOptionValues(HWND hDlg, ChessProgramState *cps, Option *optionList) } -void +int GetOptionValues(HWND hDlg, ChessProgramState *cps, Option *optionList) // read out all controls, and if value is altered, remember it and send it to the engine { @@ -407,7 +407,8 @@ GetOptionValues(HWND hDlg, ChessProgramState *cps, Option *optionList) snprintf(buf, MSG_SIZ, "option %s=%s\n", optionList[j].name, newText); if(changed) SendToProgram(buf, cps); } - if(!cps && okFunc) ((ButtonCallback*) okFunc)(0); + if(!cps && okFunc) return ((ButtonCallback*) okFunc)(0); + return 1; } char *defaultExt[] = { NULL, "pgn", "fen", "exe", "trn", "bin", "log", "ini" }; @@ -431,7 +432,7 @@ LRESULT CALLBACK SettingsProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lPa case WM_COMMAND: switch( LOWORD(wParam) ) { case IDOK: - GetOptionValues(hDlg, activeCps, activeList); + if(!GetOptionValues(hDlg, activeCps, activeList)) return FALSE; EndDialog( hDlg, 0 ); comboCallback = NULL; activeCps = NULL; return TRUE; @@ -623,10 +624,11 @@ EngineOptionsPopup(HWND hwnd, ChessProgramState *cps) return; } -void InstallOK() -{ +int InstallOK() +{ if(isUCCI) isUCI = 2; if(engineChoice[0] == engineNr[0][0]) Load(&first, 0); else Load(&second, 1); + return 1; } Option installOptions[] = { @@ -686,19 +688,19 @@ void LoadEnginePopUp(HWND hwnd) Boolean autoinc, twice; -void MatchOK() +int MatchOK() { if(autoinc) appData.loadGameIndex = appData.loadPositionIndex = -(twice + 1); - if(appData.participants) free(appData.participants); - appData.participants = strdup(engineName); - if(CreateTourney(appData.tourneyFile)) MatchEvent(2); -// ScheduleDelayedEvent(MatchEvent(2), 10); // start tourney + if(CreateTourney(appData.tourneyFile)) MatchEvent(2); else return 0; + return 1; } Option tourneyOptions[] = { { 0, 0, 4, NULL, (void*) &appData.tourneyFile, "", NULL, FileName, N_("Tournament file:") }, + { 30, 0, 0, NULL, NULL, NULL, NULL, Label, N_("If you specify an existing file, the rest of this dialog will be ignored.") }, + { 30, 0, 0, NULL, NULL, NULL, NULL, Label, N_("Otherwise, the file will be created, with the settings you specify below:") }, { 0, 1, 0, NULL, (void*) &engineChoice, (char*) (engineMnemonic+1), (engineMnemonic+1), ComboBox, N_("Select Engine:") }, - { 0xD, 7, 0, NULL, (void*) &engineName, "", NULL, TextBox, "Tourney participants:" }, + { 0xD, 7, 0, NULL, (void*) &appData.participants, "", NULL, TextBox, "Tourney participants:" }, { 0, 0, 10, NULL, (void*) &appData.tourneyType, "", NULL, Spin, N_("Tourney type (0=RR, 1=gauntlet):") }, { 0, 0, 0, NULL, (void*) &appData.cycleSync, "", NULL, CheckBox, N_("Sync after cycle") }, { 0, 1, 1000000000, NULL, (void*) &appData.tourneyCycles, "", NULL, Spin, N_("Number of tourney cycles:") }, @@ -716,15 +718,16 @@ Option tourneyOptions[] = { { 0, 0, 0, NULL, (void*) &MatchOK, "", NULL, EndMark , "" } }; -void AddToTourney(HWND hDlg) +int AddToTourney(HWND hDlg) { char buf[MSG_SIZ]; -// GetDlgItemText( hDlg, 2001+2*3, buf, MSG_SIZ-3 ); // this gives the previous selection !!! +// GetDlgItemText( hDlg, 2001+2*7, buf, MSG_SIZ-3 ); // this gives the previous selection !!! // strncat(buf, "\r\n", MSG_SIZ); - int i = ComboBox_GetCurSel(GetDlgItem(hDlg, 2001+2*3)); + int i = ComboBox_GetCurSel(GetDlgItem(hDlg, 2001+2*7)); snprintf(buf, MSG_SIZ, "%s\r\n", engineMnemonic[i+1]); - SendMessage( GetDlgItem(hDlg, 2001+2*5), EM_SETSEL, 99999, 99999 ); - SendMessage( GetDlgItem(hDlg, 2001+2*5), EM_REPLACESEL, (WPARAM) FALSE, (LPARAM) buf ); + SendMessage( GetDlgItem(hDlg, 2001+2*9), EM_SETSEL, 99999, 99999 ); + SendMessage( GetDlgItem(hDlg, 2001+2*9), EM_REPLACESEL, (WPARAM) FALSE, (LPARAM) buf ); + return 0; } void TourneyPopup(HWND hwnd) @@ -735,7 +738,7 @@ void TourneyPopup(HWND hwnd) comboCallback = &AddToTourney; autoinc = appData.loadGameIndex < 0 || appData.loadPositionIndex < 0; twice = TRUE; - while(engineList[n]) n++; tourneyOptions[1].max = n-1; + while(engineList[n]) n++; tourneyOptions[3].max = n-1; snprintf(title, MSG_SIZ, _("Tournament and Match Options")); GenericPopup(hwnd, tourneyOptions); diff --git a/xoptions.c b/xoptions.c index fd61145..2acc5e2 100644 --- a/xoptions.c +++ b/xoptions.c @@ -605,6 +605,7 @@ void TimeControlProc(w, event, prms, nprms) //--------------------------- Engine-specific options menu ---------------------------------- typedef void ButtonCallback(int n); +typedef int OKCallback(int n); 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)); -void GenericReadout P((int selected)); +int GenericReadout P((int selected)); Widget shells[10]; Widget marked[10]; Boolean shellUp[10]; @@ -798,12 +799,14 @@ void AddToTourney(int n) 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(!CreateTourney(appData.tourneyFile)) return 0; 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[] = { @@ -825,11 +828,12 @@ Option matchOptions[] = { { 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); + return 1; } Option generalOptions[] = { @@ -934,7 +938,7 @@ Option variantDescriptors[] = { { 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 @@ -946,6 +950,7 @@ void CommonOptionsOK(int n) appData.ponderNextMove = oldPonder; PonderNextMoveEvent(newPonder); } + return 1; } Option commonEngineOptions[] = { @@ -978,9 +983,10 @@ Option adjudicationOptions[] = { { 0, 1, 0, NULL, NULL, "", NULL, EndMark , "" } }; -void IcsOptionsOK(int n) +int IcsOptionsOK(int n) { ParseIcsTextColors(); + return 1; } Option icsOptions[] = { @@ -1170,7 +1176,7 @@ void AdjustColor(int i) 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; @@ -1178,6 +1184,7 @@ void BoardOptionsOK(int n) CreateAnyPieces(); InitDrawingSizes(-1, 0); DrawPosition(True, NULL); + return 1; } Option boardOptions[] = { @@ -1228,9 +1235,9 @@ Option boardOptions[] = { { 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; @@ -1299,7 +1306,7 @@ void GenericReadout(int selected) 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"); @@ -1311,6 +1318,7 @@ void GenericReadout(int selected) } if(currentOption[i].type == EndMark) break; } + return res; } 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 - GenericReadout(-1); - PopDown(data); + if(GenericReadout(-1)) PopDown(data); return; } if(currentCps) { @@ -1851,9 +1858,10 @@ static int commentIndex; void ClearComment P((int n)); extern char commentTranslations[]; -void NewComCallback(int n) +int NewComCallback(int n) { ReplaceComment(commentIndex, commentText); + return 1; } void SaveChanges(int n) @@ -1897,9 +1905,10 @@ void NewCommentPopup(char *title, char *text, int index) static char *tagsText, *msgText; -void NewTagsCallback(int n) +int NewTagsCallback(int n) { ReplaceTags(tagsText, &gameInfo); + return 1; } void changeTags(int n) @@ -2038,10 +2047,11 @@ void SecondSettingsProc(w, event, prms, nprms) 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); + return 1; } Option installOptions[] = { -- 1.7.0.4