/*
* dialogs.c -- platform-independent code for dialogs of XBoard
*
- * Copyright 2000, 2009, 2010, 2011, 2012, 2013, 2014, 2015 Free Software Foundation, Inc.
+ * Copyright 2000, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016 Free Software Foundation, Inc.
* ------------------------------------------------------------------------
*
* GNU XBoard is free software: you can redistribute it and/or modify
SetCurrentComboSelection (Option *opt)
{
int j;
+ if(currentCps) ; else
if(!opt->textValue) opt->value = *(int*)opt->target; /* numeric */else {
for(j=0; opt->choice[j]; j++) // look up actual value in list of possible values, to get selection nr
if(*(char**)opt->target && !strcmp(*(char**)opt->target, ((char**)opt->textValue)[j])) break;
opt->value = j + (opt->choice[j] == NULL);
}
+ SetComboChoice(opt, opt->value);
return opt->value;
}
static void
PseudoOK ()
{
+ if(matchMode) return;
GenericReadout(matchOptions, -2); // read all, but suppress calling of MatchOK
ASSIGN(appData.participants, engineName);
+ ASSIGN(appData.tourneyFile, tfName);
PopDown(MasterDlg); // early popdown to prevent FreezeUI called through MatchEvent from causing XtGrab warning
}
{ 0, 0, 0, NULL, NULL, NULL, NULL, Label, NULL },
{ 200, T_VSCRL | T_FILL | T_WRAP | T_TOP, 200, NULL, (void*) &tagsText, NULL, (char **) &TagsClick, TextBox, "", &appData.tagsFont },
{ 0, 0, 100, NULL, (void*) &NewMove, NULL, NULL, Button, N_("add next move") },
-{ 0,SAME_ROW,100,NULL, (void*) &changeTags, NULL, NULL, Button, N_("save changes") },
+{ 0,SAME_ROW,100,NULL, (void*) &changeTags, NULL, NULL, Button, N_("commit changes") },
{ 0,SAME_ROW, 0, NULL, (void*) &NewTagsCallback, "", NULL, EndMark , "" }
};
}
void
-NewTagsPopup (char *text, char *msg)
+NewTagsPopup (char *text, char *msg, char *ttl)
{
- char *title = bookUp ? _("Edit book") : _("Tags");
+ char *title = bookUp ? _("Edit book") : ttl;
tagsOptions[2].type = bookUp ? Button : Skip;
tagsOptions[3].min = bookUp ? SAME_ROW : 0;
void
TagsPopUp (char *tags, char *msg)
{
- NewTagsPopup(tags, cmailMsgLoaded ? msg : NULL);
+ NewTagsPopup(tags, cmailMsgLoaded ? msg : NULL, _("Tags"));
}
void
EditTagsPopUp (char *tags, char **dest)
{ // wrapper to preserve old name used in back-end
resPtr = dest;
- NewTagsPopup(tags, NULL);
+ NewTagsPopup(tags, NULL, _("Tags"));
+}
+
+void
+EditEnginePopUp (char *tags, char **dest)
+{ // wrapper to preserve old name used in back-end
+ TagsPopDown();
+ resPtr = dest;
+ NewTagsPopup(tags, NULL, _("Registered Engines"));
}
void
SettingsPopUp(&second);
}
+void
+RefreshSettingsDialog (ChessProgramState *cps, int val)
+{
+ if(val == 1) { // option values changed
+ if(shellUp[TransientDlg] && cps == currentCps) {
+ GenericUpdate(cps->option, -1); // normally update values when dialog is up
+ }
+ return; // and be done
+ }
+ if(val == 2) { // option list changed
+ if(!shellUp[TransientDlg] || cps != currentCps) return; // our dialog is not up, so nothing to do
+ }
+ PopDown(TransientDlg); // make sure any other dialog closes first
+ SettingsPopUp(cps); // and popup new one
+}
+
//----------------------------------------------- Load Engine --------------------------------------
char *engineDir, *engineLine, *nickName, *params;
//------------------------------------------------------ Time Control -----------------------------------
static int TcOK P((int n));
-int tmpMoves, tmpTc, tmpInc, tmpOdds1, tmpOdds2, tcType;
+int tmpMoves, tmpTc, tmpInc, tmpOdds1, tmpOdds2, tcType, by60;
static void SetTcType P((int n));
{ 0, 0, 0, NULL, (void*) &SetTcType, NULL, NULL, Button, N_("classical") },
{ 0,SAME_ROW,0,NULL, (void*) &SetTcType, NULL, NULL, Button, N_("incremental") },
{ 0,SAME_ROW,0,NULL, (void*) &SetTcType, NULL, NULL, Button, N_("fixed max") },
+{ 0, 0, 0, NULL, (void*) &by60, "", NULL, CheckBox, N_("Divide entered times by 60") },
{ 0, 0, 200, NULL, (void*) &tmpMoves, NULL, NULL, Spin, N_("Moves per session:") },
{ 0, 0,10000, NULL, (void*) &tmpTc, NULL, NULL, Spin, N_("Initial time (min):") },
{ 0, 0, 10000, NULL, (void*) &tmpInc, NULL, NULL, Spin, N_("Increment or max (sec/move):") },
static int
TcOK (int n)
{
- char *tc;
+ char *tc, buf[MSG_SIZ];
if(tcType == 0 && tmpMoves <= 0) return 0;
if(tcType == 2 && tmpInc <= 0) return 0;
- GetWidgetText(&tcOptions[4], &tc); // get original text, in case it is min:sec
+ GetWidgetText(&tcOptions[5], &tc); // get original text, in case it is min:sec
+ if(by60) snprintf(buf, MSG_SIZ, "%d:%02d", tmpTc/60, tmpTc%60), tc=buf;
searchTime = 0;
switch(tcType) {
case 0:
case 1:
if(!ParseTimeControl(tc, tmpInc, 0)) return 0;
ASSIGN(appData.timeControl, tc);
- appData.timeIncrement = tmpInc;
+ appData.timeIncrement = (by60 ? tmpInc/60. : tmpInc);
break;
case 2:
- searchTime = tmpInc;
+ searchTime = (by60 ? tmpInc/60 : tmpInc);
}
appData.firstTimeOdds = first.timeOdds = tmpOdds1;
appData.secondTimeOdds = second.timeOdds = tmpOdds2;
{
switch(tcType = n) {
case 0:
- SetWidgetText(&tcOptions[3], Value(tmpMoves), TransientDlg);
- SetWidgetText(&tcOptions[4], Value(tmpTc), TransientDlg);
- SetWidgetText(&tcOptions[5], _("Unused"), TransientDlg);
+ SetWidgetText(&tcOptions[4], Value(tmpMoves), TransientDlg);
+ SetWidgetText(&tcOptions[5], Value(tmpTc), TransientDlg);
+ SetWidgetText(&tcOptions[6], _("Unused"), TransientDlg);
break;
case 1:
- SetWidgetText(&tcOptions[3], _("Unused"), TransientDlg);
- SetWidgetText(&tcOptions[4], Value(tmpTc), TransientDlg);
- SetWidgetText(&tcOptions[5], Value(tmpInc), TransientDlg);
+ SetWidgetText(&tcOptions[4], _("Unused"), TransientDlg);
+ SetWidgetText(&tcOptions[5], Value(tmpTc), TransientDlg);
+ SetWidgetText(&tcOptions[6], Value(tmpInc), TransientDlg);
break;
case 2:
- SetWidgetText(&tcOptions[3], _("Unused"), TransientDlg);
SetWidgetText(&tcOptions[4], _("Unused"), TransientDlg);
- SetWidgetText(&tcOptions[5], Value(tmpInc), TransientDlg);
+ SetWidgetText(&tcOptions[5], _("Unused"), TransientDlg);
+ SetWidgetText(&tcOptions[6], Value(tmpInc), TransientDlg);
}
}
void
TimeControlProc ()
{
+ if(gameMode != BeginningOfGame) {
+ DisplayError(_("Changing time control during a game is not implemented"), 0);
+ return;
+ }
tmpMoves = appData.movesPerSession;
tmpInc = appData.timeIncrement; if(tmpInc < 0) tmpInc = 0;
tmpOdds1 = tmpOdds2 = 1; tcType = 0;
tmpTc = atoi(appData.timeControl);
+ by60 = 0;
GenericPopUp(tcOptions, _("Time Control"), TransientDlg, BoardWindow, MODAL, 0);
SetTcType(searchTime ? 2 : appData.timeIncrement < 0 ? 0 : 1);
}
{ // choice depends on variant: prepare dialog acordingly
count = 8;
SetPromo(_("Cancel"), --count, -1); // Beware: GenericPopUp cannot handle user buttons named "cancel" (lowe case)!
- if(choice != '+') {
+ if(choice != '+' && !IS_SHOGI(gameInfo.variant)) {
if (!appData.testLegality || gameInfo.variant == VariantSuicide ||
gameInfo.variant == VariantSpartan && !WhiteOnMove(currentMove) ||
gameInfo.variant == VariantGiveaway) {
char *p = texts[partner];
int len = strlen(mess) + 1;
+ if(!DialogExists(ChatDlg)) return;
if(p) len += strlen(p);
texts[partner] = (char*) malloc(len);
snprintf(texts[partner], len, "%s%s", p ? p : "", mess);
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 if(dialogError = shellUp[MasterDlg])
+ GenericPopUp(errorOptions+1, title, FatalDlg, MasterDlg, MODAL, 0); // pop up as daughter of the master dialog
else
GenericPopUp(errorOptions+modal, title, modal ? FatalDlg: ErrorDlg, BoardWindow, modal, 0); // kludge: option start address indicates modality
}
{
char buf[MSG_SIZ];
+ if(status == 666) { // ignore this error when ICS Console window is up
+ if(shellUp[ChatDlg]) return;
+ status = 0;
+ }
+
errorExitStatus = status;
if (error == 0) {
fprintf(stderr, "%s: %s\n", programName, message);
}
if(mainOptions[W_BOARD].handle) {
if (appData.popupExitMessage) {
+ if(appData.icsActive) SendToICS("logout\n"); // [HGM] make sure no new games will be started
ErrorPopUp(status ? _("Fatal Error") : _("Exiting"), message, TRUE);
} else {
ExitEvent(status);
static Option *
Exp (int n, int x, int y)
{
- static int but1, but3, oldW, oldH;
+ static int but1, but3, oldW, oldH, oldX, oldY;
int menuNr = -3, sizing, f, r;
TimeMark now;
extern Boolean right;
}
if(n == 0) { // motion
+ oldX = x; oldY = y;
if(SeekGraphClick(Press, x, y, 1)) return NULL;
if((but1 || dragging == 2) && !PromoScroll(x, y)) DragPieceMove(x, y);
if(but3) MovePV(x, y, lineGap + BOARD_HEIGHT * (squareSize + lineGap));
case 3: menuNr = RightClick(Press, x, y, &pmFromX, &pmFromY), but3 = 1; break;
case -2: shiftKey = !shiftKey;
case -3: menuNr = RightClick(Release, x, y, &pmFromX, &pmFromY), but3 = 0; break;
- case 4: BackwardEvent(); break;
- case 5: ForwardEvent(); break;
+ case 4: Wheel(-1, oldX, oldY); break;
+ case 5: Wheel(1, oldX, oldY); break;
case 10:
sizing = (oldW != x || oldH != y);
oldW = x; oldH = y;