X-Git-Url: http://winboard.nl/cgi-bin?a=blobdiff_plain;f=dialogs.c;h=8de450d1e2d72b2f1658c01836c62dc0fec364ec;hb=73419c47f539f4f6d0700fe8ec89bb0f6259c94e;hp=1d1d3585b1cdd824d6c912e97fa0fc586ebe04b2;hpb=cfc88b71a13cd4ee57c6d16b9016b54faa1f6b48;p=xboard.git diff --git a/dialogs.c b/dialogs.c index 1d1d358..8de450d 100644 --- a/dialogs.c +++ b/dialogs.c @@ -319,7 +319,7 @@ MatchOptionsProc () matchOptions[5].min = -(appData.pairingEngine[0] != NULLCHAR); // with pairing engine, allow Swiss ASSIGN(tfName, appData.tourneyFile[0] ? appData.tourneyFile : MakeName(appData.defName)); ASSIGN(engineName, appData.participants); - GenericPopUp(matchOptions, _("Match Options"), TransientDlg, BoardWindow, MODAL); + GenericPopUp(matchOptions, _("Match Options"), TransientDlg, BoardWindow, MODAL, 0); } // ------------------------------------------- General Options -------------------------------------------------- @@ -360,6 +360,7 @@ static Option generalOptions[] = { { 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, 0, NULL, (void*) &appData.topLevel, "", NULL, CheckBox, N_("Top-Level Dialogs") }, { 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):") }, { 0, 5,100, NULL, (void*) &appData.animSpeed, "", NULL, Spin, N_("Animation Speed (high = slow):") }, @@ -372,7 +373,7 @@ OptionsProc () { oldPonder = appData.ponderNextMove; oldShow = appData.showCoords; oldBlind = appData.blindfold; - GenericPopUp(generalOptions, _("General Options"), TransientDlg, BoardWindow, MODAL); + GenericPopUp(generalOptions, _("General Options"), TransientDlg, BoardWindow, MODAL, 0); } //---------------------------------------------- New Variant ------------------------------------------------ @@ -460,7 +461,7 @@ Pick (int n) void NewVariantProc () { - GenericPopUp(variantDescriptors, _("New Variant"), TransientDlg, BoardWindow, MODAL); + GenericPopUp(variantDescriptors, _("New Variant"), TransientDlg, BoardWindow, MODAL, 0); } //------------------------------------------- Common Engine Options ------------------------------------- @@ -504,7 +505,7 @@ UciMenuProc () { oldCores = appData.smpCores; oldPonder = appData.ponderNextMove; - GenericPopUp(commonEngineOptions, _("Common Engine Settings"), TransientDlg, BoardWindow, MODAL); + GenericPopUp(commonEngineOptions, _("Common Engine Settings"), TransientDlg, BoardWindow, MODAL, 0); } //------------------------------------------ Adjudication Options -------------------------------------- @@ -526,7 +527,7 @@ static Option adjudicationOptions[] = { void EngineMenuProc () { - GenericPopUp(adjudicationOptions, _("Adjudicate non-ICS Games"), TransientDlg, BoardWindow, MODAL); + GenericPopUp(adjudicationOptions, _("Adjudicate non-ICS Games"), TransientDlg, BoardWindow, MODAL, 0); } //--------------------------------------------- ICS Options --------------------------------------------- @@ -574,7 +575,7 @@ Option icsOptions[] = { void IcsOptionsProc () { - GenericPopUp(icsOptions, _("ICS Options"), TransientDlg, BoardWindow, MODAL); + GenericPopUp(icsOptions, _("ICS Options"), TransientDlg, BoardWindow, MODAL, 0); } //-------------------------------------------- Load Game Options --------------------------------- @@ -610,10 +611,16 @@ static Option loadOptions[] = { }; void -LoadOptionsProc () +LoadOptionsPopUp (DialogClass parent) { ASSIGN(searchMode, modeValues[appData.searchMode-1]); - GenericPopUp(loadOptions, _("Load Game Options"), TransientDlg, BoardWindow, MODAL); + GenericPopUp(loadOptions, _("Load Game Options"), TransientDlg, parent, MODAL, 0); +} + +void +LoadOptionsProc () +{ // called from menu + LoadOptionsPopUp(BoardWindow); } //------------------------------------------- Save Game Options -------------------------------------------- @@ -633,7 +640,7 @@ static Option saveOptions[] = { void SaveOptionsProc () { - GenericPopUp(saveOptions, _("Save Game Options"), TransientDlg, BoardWindow, MODAL); + GenericPopUp(saveOptions, _("Save Game Options"), TransientDlg, BoardWindow, MODAL, 0); } //----------------------------------------------- Sound Options --------------------------------------------- @@ -713,7 +720,7 @@ SoundOptionsProc () { free(soundFiles[2]); soundFiles[2] = strdup("*"); - GenericPopUp(soundOptions, _("Sound Options"), TransientDlg, BoardWindow, MODAL); + GenericPopUp(soundOptions, _("Sound Options"), TransientDlg, BoardWindow, MODAL, 0); } //--------------------------------------------- Board Options -------------------------------------- @@ -830,7 +837,7 @@ AdjustColor (int i) void BoardOptionsProc () { - GenericPopUp(boardOptions, _("Board Options"), TransientDlg, BoardWindow, MODAL); + GenericPopUp(boardOptions, _("Board Options"), TransientDlg, BoardWindow, MODAL, 0); } //-------------------------------------------- ICS Text Menu Options ------------------------------ @@ -882,7 +889,7 @@ IcsTextProc () textOptions[i].target = NULL; textOptions[i].min = 2; MarkMenu("ICStex", TextMenuDlg); - GenericPopUp(textOptions, _("ICS text menu"), TextMenuDlg, BoardWindow, NONMODAL); + GenericPopUp(textOptions, _("ICS text menu"), TextMenuDlg, BoardWindow, NONMODAL, 1); } //---------------------------------------------------- Edit Comment ----------------------------------- @@ -929,7 +936,7 @@ NewCommentPopup (char *title, char *text, int index) if(commentText) free(commentText); commentText = strdup(text); commentIndex = index; MarkMenu("Show Comments", CommentDlg); - if(GenericPopUp(commentOptions, title, CommentDlg, BoardWindow, NONMODAL)) + if(GenericPopUp(commentOptions, title, CommentDlg, BoardWindow, NONMODAL, 1)) AddHandler(&commentOptions[0], 1); } @@ -983,7 +990,7 @@ NewTagsPopup (char *text, char *msg) if(tagsText) free(tagsText); tagsText = strdup(text); tagsOptions[0].name = msg; MarkMenu("Show Tags", TagsDlg); - GenericPopUp(tagsOptions, title, TagsDlg, BoardWindow, NONMODAL); + GenericPopUp(tagsOptions, title, TagsDlg, BoardWindow, NONMODAL, 1); } //---------------------------------------------- ICS Input Box ---------------------------------- @@ -1089,7 +1096,7 @@ void ICSInputBoxPopUp () { MarkMenu("ICS Input Box", InputBoxDlg); - if(GenericPopUp(boxOptions, _("ICS input box"), InputBoxDlg, BoardWindow, NONMODAL)) + if(GenericPopUp(boxOptions, _("ICS input box"), InputBoxDlg, BoardWindow, NONMODAL, 0)) AddHandler(&boxOptions[0], 3); } @@ -1120,7 +1127,7 @@ PopUpMoveDialog (char firstchar) { static char buf[2]; buf[0] = firstchar; ASSIGN(icsText, buf); - if(GenericPopUp(typeOptions, _("Type a move"), TransientDlg, BoardWindow, MODAL)) + if(GenericPopUp(typeOptions, _("Type a move"), TransientDlg, BoardWindow, MODAL, 0)) AddHandler(&typeOptions[0], 2); } @@ -1145,7 +1152,7 @@ void SettingsPopUp (ChessProgramState *cps) { currentCps = cps; - GenericPopUp(cps->option, _("Engine Settings"), TransientDlg, BoardWindow, MODAL); + GenericPopUp(cps->option, _("Engine Settings"), TransientDlg, BoardWindow, MODAL, 0); } void @@ -1202,7 +1209,7 @@ LoadEngineProc () if(nickName) free(nickName); nickName = strdup(""); if(params) free(params); params = strdup(""); NamesToList(firstChessProgramNames, engineList, engineMnemonic, "all"); - GenericPopUp(installOptions, _("Load engine"), TransientDlg, BoardWindow, MODAL); + GenericPopUp(installOptions, _("Load engine"), TransientDlg, BoardWindow, MODAL, 0); } //----------------------------------------------------- Edit Book ----------------------------------------- @@ -1245,7 +1252,7 @@ SetRandom (int n) void ShuffleMenuProc () { - GenericPopUp(shuffleOptions, _("New Shuffle Game"), TransientDlg, BoardWindow, MODAL); + GenericPopUp(shuffleOptions, _("New Shuffle Game"), TransientDlg, BoardWindow, MODAL, 0); } //------------------------------------------------------ Time Control ----------------------------------- @@ -1338,7 +1345,7 @@ TimeControlProc () tmpInc = appData.timeIncrement; if(tmpInc < 0) tmpInc = 0; tmpOdds1 = tmpOdds2 = 1; tcType = 0; tmpTc = atoi(appData.timeControl); - GenericPopUp(tcOptions, _("Time Control"), TransientDlg, BoardWindow, MODAL); + GenericPopUp(tcOptions, _("Time Control"), TransientDlg, BoardWindow, MODAL, 0); } //------------------------------- Ask Question ----------------------------------------- @@ -1377,10 +1384,92 @@ AskQuestion (char *title, char *question, char *replyPrefix, ProcRef pr) pendingReplyPR = pr; ASSIGN(answer, ""); askOptions[0].name = question; - if(GenericPopUp(askOptions, title, AskDlg, BoardWindow, MODAL)) + if(GenericPopUp(askOptions, title, AskDlg, BoardWindow, MODAL, 0)) AddHandler(&askOptions[1], 2); } +//---------------------------- Promotion Popup -------------------------------------- + +static int count; + +static void PromoPick P((int n)); + +static Option promoOptions[] = { +{ 0, 0, 0, NULL, (void*) &PromoPick, NULL, NULL, Button, "" }, +{ 0, SAME_ROW, 0, NULL, (void*) &PromoPick, NULL, NULL, Button, "" }, +{ 0, SAME_ROW, 0, NULL, (void*) &PromoPick, NULL, NULL, Button, "" }, +{ 0, SAME_ROW, 0, NULL, (void*) &PromoPick, NULL, NULL, Button, "" }, +{ 0, SAME_ROW, 0, NULL, (void*) &PromoPick, NULL, NULL, Button, "" }, +{ 0, SAME_ROW, 0, NULL, (void*) &PromoPick, NULL, NULL, Button, "" }, +{ 0, SAME_ROW, 0, NULL, (void*) &PromoPick, NULL, NULL, Button, "" }, +{ 0, SAME_ROW | NO_OK, 0, NULL, NULL, "", NULL, EndMark , "" } +}; + +static void +PromoPick (int n) +{ + int promoChar = promoOptions[n+count].value; + + PopDown(PromoDlg); + + if (promoChar == 0) fromX = -1; + if (fromX == -1) return; + + if (! promoChar) { + fromX = fromY = -1; + ClearHighlights(); + return; + } + UserMoveEvent(fromX, fromY, toX, toY, promoChar); + + if (!appData.highlightLastMove || gotPremove) ClearHighlights(); + if (gotPremove) SetPremoveHighlights(fromX, fromY, toX, toY); + fromX = fromY = -1; +} + +static void +SetPromo (char *name, int nr, char promoChar) +{ + safeStrCpy(promoOptions[nr].name, name, MSG_SIZ); + promoOptions[nr].value = promoChar; +} + +void +PromotionPopUp () +{ // choice depends on variant: prepare dialog acordingly + count = 7; + SetPromo(_("Cancel"), --count, 0); // Beware: GenericPopUp cannot handle user buttons named "cancel" (lowe case)! + if(gameInfo.variant != VariantShogi) { + if (!appData.testLegality || gameInfo.variant == VariantSuicide || + gameInfo.variant == VariantSpartan && !WhiteOnMove(currentMove) || + gameInfo.variant == VariantGiveaway) { + SetPromo(_("King"), --count, 'k'); + } + if(gameInfo.variant == VariantSpartan && !WhiteOnMove(currentMove)) { + SetPromo(_("Captain"), --count, 'c'); + SetPromo(_("Lieutenant"), --count, 'l'); + SetPromo(_("General"), --count, 'g'); + SetPromo(_("Warlord"), --count, 'w'); + } else { + SetPromo(_("Knight"), --count, 'n'); + SetPromo(_("Bishop"), --count, 'b'); + SetPromo(_("Rook"), --count, 'r'); + if(gameInfo.variant == VariantCapablanca || + gameInfo.variant == VariantGothic || + gameInfo.variant == VariantCapaRandom) { + SetPromo(_("Archbishop"), --count, 'a'); + SetPromo(_("Chancellor"), --count, 'c'); + } + SetPromo(_("Queen"), --count, 'q'); + } + } else // [HGM] shogi + { + SetPromo(_("Defer"), --count, '='); + SetPromo(_("Promote"), --count, '+'); + } + GenericPopUp(promoOptions + count, "Promotion", PromoDlg, BoardWindow, NONMODAL, 0); +} + //---------------------------- Chat Windows ---------------------------------------------- void @@ -1389,7 +1478,149 @@ OutputChatMessage (int partner, char *mess) return; // dummy } -//----------------------------- Various display boxes ----------------------------- +//--------------------------------- Game-List options dialog ------------------------------------------ + +char *strings[LPUSERGLT_SIZE]; +int stringPtr; + +void +GLT_ClearList () +{ + strings[0] = NULL; + stringPtr = 0; +} + +void +GLT_AddToList (char *name) +{ + strings[stringPtr++] = name; + strings[stringPtr] = NULL; +} + +Boolean +GLT_GetFromList (int index, char *name) +{ + safeStrCpy(name, strings[index], MSG_SIZ); + return TRUE; +} + +void +GLT_DeSelectList () +{ +} + +static void GLT_Button P((int n)); +static int GLT_OK P((int n)); + +static Option listOptions[] = { +{ 0, LR|TB, 200, NULL, (void*) strings, "", NULL, ListBox, "" }, +{ 0, 0, 0, NULL, (void*) &GLT_Button, NULL, NULL, Button, N_("factory") }, +{ 0, SAME_ROW, 0, NULL, (void*) &GLT_Button, NULL, NULL, Button, N_("up") }, +{ 0, SAME_ROW, 0, NULL, (void*) &GLT_Button, NULL, NULL, Button, N_("down") }, +{ 0, SAME_ROW, 0, NULL, (void*) &GLT_OK, "", NULL, EndMark , "" } +}; + +static int +GLT_OK (int n) +{ + GLT_ParseList(); + appData.gameListTags = strdup(lpUserGLT); + return 1; +} + +static void +GLT_Button (int n) +{ + int index = SelectedListBoxItem (&listOptions[0]); + char *p; + if (index < 0) { + DisplayError(_("No tag selected"), 0); + return; + } + p = strings[index]; + if (n == 3) { + if(index >= strlen(GLT_ALL_TAGS)) return; + strings[index] = strings[index+1]; + strings[++index] = p; + } else + if (n == 2) { + if(index == 0) return; + strings[index] = strings[index-1]; + strings[--index] = p; + } else + if (n == 1) { + safeStrCpy(lpUserGLT, GLT_DEFAULT_TAGS, LPUSERGLT_SIZE); + GLT_TagsToList(lpUserGLT); + index = 0; + LoadListBox(&listOptions[0], "?"); // Note: the others don't need this, as the highlight switching redraws the change items + } + HighlightListBoxItem(&listOptions[0], index); +} + +void +GameListOptionsPopUp (DialogClass parent) +{ + safeStrCpy(lpUserGLT, appData.gameListTags, LPUSERGLT_SIZE); + GLT_TagsToList(lpUserGLT); + + GenericPopUp(listOptions, _("Game-list options"), TransientDlg, parent, MODAL, 0); +} + +void +GameListOptionsProc () +{ + GameListOptionsPopUp(BoardWindow); +} + +//----------------------------- Error popup in various uses ----------------------------- + +/* + * [HGM] Note: + * XBoard has always had some pathologic behavior with multiple simultaneous error popups, + * (which can occur even for modal popups when asynchrounous events, e.g. caused by engine, request a popup), + * and this new implementation reproduces that as well: + * Only the shell of the last instance is remembered in shells[ErrorDlg] (which replaces errorShell), + * so that PopDowns ordered from the code always refer to that instance, and once that is down, + * have no clue as to how to reach the others. For the Delete Window button calling PopDown this + * has now been repaired, as the action routine assigned to it gets the shell passed as argument. + */ + +int errorUp = False; + +void +ErrorPopDown () +{ + if (!errorUp) return; + dialogError = errorUp = False; + PopDown(ErrorDlg); PopDown(FatalDlg); // on explicit request we pop down any error dialog + if (errorExitStatus != -1) ExitEvent(errorExitStatus); +} + +static int +ErrorOK (int n) +{ + dialogError = errorUp = False; + PopDown(n == 1 ? FatalDlg : ErrorDlg); // kludge: non-modal dialogs have one less (dummy) option + if (errorExitStatus != -1) ExitEvent(errorExitStatus); + return FALSE; // prevent second Popdown ! +} + +static Option errorOptions[] = { +{ 0, 0, 0, NULL, NULL, NULL, NULL, Label, NULL }, // dummy option: will never be displayed +{ 0, 0, 0, NULL, NULL, NULL, NULL, Label, NULL }, // textValue field will be set before popup +{ 0,NO_CANCEL,0, NULL, (void*) &ErrorOK, "", NULL, EndMark , "" } +}; + +void +ErrorPopUp (char *title, char *label, int modal) +{ + errorUp = True; + errorOptions[1].name = label; + if(dialogError = shellUp[TransientDlg]) + GenericPopUp(errorOptions+1, title, FatalDlg, TransientDlg, MODAL, 0); // pop up as daughter of the transient dialog + else + GenericPopUp(errorOptions+modal, title, modal ? FatalDlg: ErrorDlg, BoardWindow, modal, 0); // kludge: option start address indicates modality +} void DisplayError (String message, int error)