X-Git-Url: http://winboard.nl/cgi-bin?a=blobdiff_plain;f=dialogs.c;h=a2af38b7584de0ba57055f8f06eda0fcc2d9f489;hb=4dc77c6e72e3ec99cd8a57c9442b7511c47d3dca;hp=ba47eac14bec5b02aa2784b86066d59ddbc98fd0;hpb=fa8cdd39eca80f4bdbf6e8e8a290fa1b8979224e;p=xboard.git diff --git a/dialogs.c b/dialogs.c index ba47eac..a2af38b 100644 --- a/dialogs.c +++ b/dialogs.c @@ -1341,6 +1341,128 @@ TimeControlProc () GenericPopUp(tcOptions, _("Time Control"), TransientDlg, BoardWindow, MODAL); } +//------------------------------- Ask Question ----------------------------------------- + +int SendReply P((int n)); +char pendingReplyPrefix[MSG_SIZ]; +ProcRef pendingReplyPR; +char *answer; + +Option askOptions[] = { +{ 0, 0, 0, NULL, NULL, NULL, NULL, Label, NULL }, +{ 0, 0, 0, NULL, (void*) &answer, "", NULL, TextBox, "" }, +{ 0, 0, 0, NULL, (void*) &SendReply, "", NULL, EndMark , "" } +}; + +int +SendReply (int n) +{ + char buf[MSG_SIZ]; + int err; + char *reply=answer; +// GetWidgetText(&askOptions[1], &reply); + safeStrCpy(buf, pendingReplyPrefix, sizeof(buf)/sizeof(buf[0]) ); + if (*buf) strncat(buf, " ", MSG_SIZ - strlen(buf) - 1); + strncat(buf, reply, MSG_SIZ - strlen(buf) - 1); + strncat(buf, "\n", MSG_SIZ - strlen(buf) - 1); + OutputToProcess(pendingReplyPR, buf, strlen(buf), &err); // does not go into debug file??? => bug + if (err) DisplayFatalError(_("Error writing to chess program"), err, 0); + return TRUE; +} + +void +AskQuestion (char *title, char *question, char *replyPrefix, ProcRef pr) +{ + safeStrCpy(pendingReplyPrefix, replyPrefix, sizeof(pendingReplyPrefix)/sizeof(pendingReplyPrefix[0]) ); + pendingReplyPR = pr; + ASSIGN(answer, ""); + askOptions[0].name = question; + if(GenericPopUp(askOptions, title, AskDlg, BoardWindow, MODAL)) + 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); +} + //---------------------------- Chat Windows ---------------------------------------------- void @@ -1349,7 +1471,55 @@ OutputChatMessage (int partner, char *mess) return; // dummy } -//----------------------------- Various display boxes ----------------------------- +//----------------------------- 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); // pop up as daughter of the transient dialog + else + GenericPopUp(errorOptions+modal, title, modal ? FatalDlg: ErrorDlg, BoardWindow, modal); // kludge: option start address indicates modality +} void DisplayError (String message, int error)