/*
* dialogs.c -- platform-independent code for dialogs of XBoard
*
- * Copyright 2000, 2009, 2010, 2011, 2012, 2013 Free Software Foundation, Inc.
+ * Copyright 2000, 2009, 2010, 2011, 2012, 2013, 2014 Free Software Foundation, Inc.
* ------------------------------------------------------------------------
*
* GNU XBoard is free software: you can redistribute it and/or modify
}
break;
case EndMark:
- if(opts[i].target) // callback for implementing necessary actions on OK (like redraw)
+ if(opts[i].target && selected != -2) // callback for implementing necessary actions on OK (like redraw)
res = ((OKCallback*) opts[i].target)(i);
break;
default:
static void CloneTourney P((void));
static void ReplaceParticipant P((void));
static void UpgradeParticipant P((void));
+static void PseudoOK P((void));
static int
MatchOK (int n)
{
ASSIGN(appData.participants, engineName);
if(!CreateTourney(tfName) || matchMode) return matchMode || !appData.participants[0];
- PopDown(TransientDlg); // early popdown to prevent FreezeUI called through MatchEvent from causing XtGrab warning
+ PopDown(MasterDlg); // early popdown to prevent FreezeUI called through MatchEvent from causing XtGrab warning
MatchEvent(2); // start tourney
return FALSE; // no double PopDown!
}
+static void
+DoTimeControl(int n)
+{
+ TimeControlProc();
+}
+
+static void
+DoCommonEngine(int n)
+{
+ UciMenuProc();
+}
+
+static void
+DoGeneral(int n)
+{
+ OptionsProc();
+}
+
+#define PARTICIPANTS 6 /* This MUST be the number of the Option for &engineName!*/
+
static Option matchOptions[] = {
{ 0, 0, 0, NULL, (void*) &tfName, ".trn", NULL, FileName, N_("Tournament file: ") },
{ 0, 0, 0, NULL, NULL, "", NULL, Label, N_("For concurrent playing of tourney with multiple XBoards:") },
{ 0, -2, 1000000000, NULL, (void*) &appData.loadPositionIndex, "", NULL, Spin, N_("Position Number (-1 or -2 = Auto-Increment):") },
{ 0, 0, 1000000000, NULL, (void*) &appData.rewindIndex, "", NULL, Spin, N_("Rewind Index after this many Games (0 = never):") },
{ 0, 0, 0, NULL, (void*) &appData.defNoBook, "", NULL, CheckBox, N_("Disable own engine books by default") },
+{ 0, 0, 0, NULL, (void*) &DoTimeControl, NULL, NULL, Button, N_("Time Control") },
+{ 0, SAME_ROW, 0, NULL, (void*) &DoCommonEngine, NULL, NULL, Button, N_("Common Engine") },
+{ 0, SAME_ROW, 0, NULL, (void*) &DoGeneral, NULL, NULL, Button, N_("General Options") },
+{ 0, SAME_ROW, 0, NULL, (void*) &PseudoOK, NULL, NULL, Button, N_("Continue Later") },
{ 0, 0, 0, NULL, (void*) &ReplaceParticipant, NULL, NULL, Button, N_("Replace Engine") },
{ 0, SAME_ROW, 0, NULL, (void*) &UpgradeParticipant, NULL, NULL, Button, N_("Upgrade Engine") },
{ 0, SAME_ROW, 0, NULL, (void*) &CloneTourney, NULL, NULL, Button, N_("Clone Tourney") },
static void
ReplaceParticipant ()
{
- GenericReadout(matchOptions, 7);
+ GenericReadout(matchOptions, PARTICIPANTS);
Substitute(strdup(engineName), True);
}
static void
UpgradeParticipant ()
{
- GenericReadout(matchOptions, 7);
+ GenericReadout(matchOptions, PARTICIPANTS);
Substitute(strdup(engineName), False);
}
static void
+PseudoOK ()
+{
+ GenericReadout(matchOptions, -2); // read all, but suppress calling of MatchOK
+ ASSIGN(appData.participants, engineName);
+ PopDown(MasterDlg); // early popdown to prevent FreezeUI called through MatchEvent from causing XtGrab warning
+}
+
+static void
CloneTourney ()
{
FILE *f;
if(sel < 1) buf[0] = NULLCHAR; // back to top level
else if(engineList[sel][0] == '#') safeStrCpy(buf, engineList[sel], MSG_SIZ); // group header, open group
else { // normal line, select engine
- AddLine(&matchOptions[7], engineMnemonic[sel]);
+ AddLine(&matchOptions[PARTICIPANTS], engineMnemonic[sel]);
return;
}
nr = NamesToList(firstChessProgramNames, engineList, engineMnemonic, buf); // replace list by only the group contents
ASSIGN(engineMnemonic[0], buf);
- LoadListBox(&matchOptions[8], _("# no engines are installed"), -1, -1);
- HighlightWithScroll(&matchOptions[8], 0, nr);
+ LoadListBox(&matchOptions[PARTICIPANTS+1], _("# no engines are installed"), -1, -1);
+ HighlightWithScroll(&matchOptions[PARTICIPANTS+1], 0, nr);
}
void
MatchOptionsProc ()
{
+ if(matchOptions[PARTICIPANTS+1].type != ListBox) {
+ DisplayError(_("Internal error: PARTICIPANTS set wrong"), 0);
+ return;
+ }
NamesToList(firstChessProgramNames, engineList, engineMnemonic, "");
matchOptions[9].min = -(appData.pairingEngine[0] != NULLCHAR); // with pairing engine, allow Swiss
ASSIGN(tfName, appData.tourneyFile[0] ? appData.tourneyFile : MakeName(appData.defName));
ASSIGN(engineName, appData.participants);
ASSIGN(engineMnemonic[0], "");
- GenericPopUp(matchOptions, _("Tournament Options"), TransientDlg, BoardWindow, MODAL, 0);
+ GenericPopUp(matchOptions, _("Tournament Options"), MasterDlg, BoardWindow, MODAL, 0);
}
// ------------------------------------------- General Options --------------------------------------------------
/* TRANSLATORS: the drop menu is used to drop a piece, e.g. during bughouse or editing a position */
{ 0, 0, 0, NULL, (void*) &appData.dropMenu, "", NULL, CheckBox, N_("Drop Menu") },
{ 0, 0, 0, NULL, (void*) &appData.variations, "", NULL, CheckBox, N_("Enable Variation Trees") },
+{ 0, 0, 0, NULL, (void*) &appData.headers, "", NULL, CheckBox, N_("Headers in Engine Output Window") },
{ 0, 0, 0, NULL, (void*) &appData.hideThinkingFromHuman, "", NULL, CheckBox, N_("Hide Thinking from Human") },
{ 0, 0, 0, NULL, (void*) &appData.highlightLastMove, "", NULL, CheckBox, N_("Highlight Last Move") },
{ 0, 0, 0, NULL, (void*) &appData.highlightMoveWithArrow, "", NULL, CheckBox, N_("Highlight with Arrow") },
{ VariantBerolina,SAME_ROW,135, NULL, (void*) &Pick, "#FFFFFF", NULL, Button, N_("berolina *")},
{ VariantAtomic, 0, 135, NULL, (void*) &Pick, "#FFFFFF", NULL, Button, N_("atomic")},
{ VariantTwoKings,SAME_ROW,135, NULL, (void*) &Pick, "#FFFFFF", NULL, Button, N_("two kings")},
-{ VariantNormal, 0, 135, NULL, (void*) &Pick, "#FFFFFF", NULL, Button, N_(" ")}, // dummy, to have good alignment
+{ -1, 0, 135, NULL, (void*) &Pick, "#FFFFFF", NULL, Button, N_(" ")}, // dummy, to have good alignment
{ VariantSpartan,SAME_ROW, 135, NULL, (void*) &Pick, "#FF0000", NULL, Button, N_("Spartan")},
{ 0, 0, 0, NULL, NULL, NULL, NULL, Label, N_("Board size ( -1 = default for selected variant):")},
{ 0, -1, BOARD_RANKS-1, NULL, (void*) &ranksTmp, "", NULL, Spin, N_("Number of Board Ranks:") },
{ VariantCourier, SAME_ROW,135, NULL, (void*) &Pick, "#BFFFBF", NULL, Button, N_("courier (12x8)")},
{ VariantChuChess, 0, 135, NULL, (void*) &Pick, "#BFBFBF", NULL, Button, N_("chu chess (10x10)")},
{ VariantChu, SAME_ROW, 135, NULL, (void*) &Pick, "#BFFFBF", NULL, Button, N_("chu shogi (12x12)")},
-//{ VariantNormal, 0, 135, NULL, (void*) &Pick, "#FFFFFF", NULL, Button, N_(" ")}, // dummy, to have good alignment
+//{ -1, 0, 135, NULL, (void*) &Pick, "#FFFFFF", NULL, Button, N_(" ")}, // dummy, to have good alignment
// optional buttons for engine-defined variants
{ VariantUnknown, 0, 135, NULL, (void*) &Pick, "#FFFFFF", NULL, -1, NULL },
{ VariantUnknown, SAME_ROW,135, NULL, (void*) &Pick, "#FFFFFF", NULL, -1, NULL },
if(!(last&1)) { // odd number, add filler
ASSIGN(variantDescriptors[start+last+1].name, " ");
variantDescriptors[start+last+1].type = Button;
+ variantDescriptors[start+last+1].value = -1;
}
safeStrCpy(buf, engineVariant, MSG_SIZ); *engineVariant = NULLCHAR; // yeghh...
GenericPopUp(variantDescriptors, _("New Variant"), TransientDlg, BoardWindow, MODAL, 0);
}
static Option shuffleOptions[] = {
- { 0, 0, 50, NULL, (void*) &shuffleOpenings, NULL, NULL, CheckBox, N_("shuffle") },
+ { 0, 0, 0, NULL, (void*) &shuffleOpenings, NULL, NULL, CheckBox, N_("shuffle") },
{ 0,-1,2000000000, NULL, (void*) &appData.defaultFrcPosition, "", NULL, Spin, N_("Start-position number:") },
{ 0, 0, 0, NULL, (void*) &SetRandom, NULL, NULL, Button, N_("randomize") },
{ 0, SAME_ROW, 0, NULL, (void*) &SetRandom, NULL, NULL, Button, N_("pick fixed") },
ClearHighlights();
return;
}
+ if(promoChar == '=' && !IS_SHOGI(gameInfo.variant)) promoChar = NULLCHAR;
UserMoveEvent(fromX, fromY, toX, toY, promoChar);
if (!appData.highlightLastMove || gotPremove) ClearHighlights();
}
void
-PromotionPopUp ()
+PromotionPopUp (char choice)
{ // choice depends on variant: prepare dialog acordingly
count = 8;
- SetPromo(_("Cancel"), --count, 0); // Beware: GenericPopUp cannot handle user buttons named "cancel" (lowe case)!
- if(!IS_SHOGI(gameInfo.variant)) {
+ SetPromo(_("Cancel"), --count, -1); // Beware: GenericPopUp cannot handle user buttons named "cancel" (lowe case)!
+ if(choice != '+') {
if (!appData.testLegality || gameInfo.variant == VariantSuicide ||
gameInfo.variant == VariantSpartan && !WhiteOnMove(currentMove) ||
gameInfo.variant == VariantGiveaway) {
SetWidgetLabel(&browseOptions[0], title);
}
+static char msg1[] = N_("FIRST TYPE DIRECTORY NAME HERE");
+static char msg2[] = N_("TRY ANOTHER NAME");
+
void
CreateDir (int n)
{
char *name, *errmsg = "";
GetWidgetText(&browseOptions[n-1], &name);
- if(!name[0]) errmsg = _("FIRST TYPE DIRECTORY NAME HERE"); else
- if(mkdir(name, 0755)) errmsg = _("TRY ANOTHER NAME");
+ if(!strcmp(name, msg1) || !strcmp(name, msg2)) return;
+ if(!name[0]) errmsg = _(msg1); else
+ if(mkdir(name, 0755)) errmsg = _(msg2);
else {
chdir(name);
Refresh(-1);