#include "xgamelist.h"\r
#include "xhistory.h"\r
#include "xedittags.h"\r
+#include "gettext.h"\r
+\r
+// must be moved to xengineoutput.h\r
+\r
+void EngineOutputProc P((Widget w, XEvent *event,\r
+ String *prms, Cardinal *nprms));\r
+\r
+void EngineOutputPopDown();\r
+\r
\r
#ifdef __EMX__\r
#ifndef HAVE_USLEEP\r
#define usleep(t) _sleep2(((t)+500)/1000)\r
#endif\r
\r
+#ifdef ENABLE_NLS\r
+# define _(s) gettext (s)\r
+# define N_(s) gettext_noop (s)\r
+#else\r
+# define _(s) (s)\r
+# define N_(s) s\r
+#endif\r
+\r
typedef struct {\r
String string;\r
XtActionProc proc;\r
Cardinal *nprms));\r
void ShowThinkingProc P((Widget w, XEvent *event, String *prms,\r
Cardinal *nprms));\r
+void HideThinkingProc P((Widget w, XEvent *event, String *prms,\r
+ Cardinal *nprms));\r
void TestLegalityProc P((Widget w, XEvent *event, String *prms,\r
Cardinal *nprms));\r
void InfoProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms));\r
static void DragPieceEnd P((int x, int y));\r
static void DrawDragPiece P((void));\r
char *ModeToWidgetName P((GameMode mode));\r
-\r
+void EngineOutputUpdate( FrontEndProgramStats * stats );\r
+void ShuffleMenuProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms));\r
+void EngineMenuProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms));\r
+void UciMenuProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms));\r
+void TimeControlProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms));\r
+void NewVariantProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms));\r
+void FirstSettingsProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms));\r
+void SecondSettingsProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms));\r
+void ShufflePopDown P(());\r
+void EnginePopDown P(());\r
+void UciPopDown P(());\r
+void TimeControlPopDown P(());\r
+void NewVariantPopDown P(());\r
+void SettingsPopDown P(());\r
/*\r
* XBoard depends on Xt R4 or higher\r
*/\r
jailSquareColor, highlightSquareColor, premoveHighlightColor;\r
GC lightSquareGC, darkSquareGC, jailSquareGC, lineGC, wdPieceGC, wlPieceGC,\r
bdPieceGC, blPieceGC, wbPieceGC, bwPieceGC, coordGC, highlineGC,\r
- wjPieceGC, bjPieceGC, prelineGC;\r
+ wjPieceGC, bjPieceGC, prelineGC, countGC;\r
Pixmap iconPixmap, wIconPixmap, bIconPixmap, xMarkPixmap;\r
Widget shellWidget, layoutWidget, formWidget, boardWidget, messageWidget, \r
whiteTimerWidget, blackTimerWidget, titleWidget, widgetList[16], \r
ICSInputShell, fileNameShell, askQuestionShell;\r
XSegment gridSegments[(BOARD_SIZE + 1) * 2];\r
XSegment jailGridSegments[(BOARD_SIZE + 3) * 2];\r
-Font clockFontID, coordFontID;\r
-XFontStruct *clockFontStruct, *coordFontStruct;\r
+Font clockFontID, coordFontID, countFontID;\r
+XFontStruct *clockFontStruct, *coordFontStruct, *countFontStruct;\r
XtAppContext appContext;\r
char *layoutName;\r
char *oldICSInteractionTitle;\r
\r
FileProc fileProc;\r
char *fileOpenMode;\r
+char installDir[] = "."; // [HGM] UCI: needed for UCI; probably needs run-time initializtion\r
\r
Position commentX = -1, commentY = -1;\r
Dimension commentW, commentH;\r
\r
int squareSize, smallLayout = 0, tinyLayout = 0,\r
+ marginW, marginH, // [HGM] for run-time resizing\r
fromX = -1, fromY = -1, toX, toY, commentUp = False, analysisUp = False,\r
ICSInputBoxUp = False, askQuestionUp = False,\r
filenameUp = False, promotionUp = False, pmFromX = -1, pmFromY = -1,\r
SizeDefaults sizeDefaults[] = SIZE_DEFAULTS;\r
\r
MenuItem fileMenu[] = {\r
- {"Reset Game", ResetProc},\r
+ {N_("New Game"), ResetProc},\r
+ {N_("New Shuffle Game ..."), ShuffleMenuProc},\r
+ {N_("New Variant ..."), NewVariantProc}, // [HGM] variant: not functional yet\r
{"----", NothingProc},\r
- {"Load Game", LoadGameProc},\r
- {"Load Next Game", LoadNextGameProc},\r
- {"Load Previous Game", LoadPrevGameProc},\r
- {"Reload Same Game", ReloadGameProc},\r
- {"Save Game", SaveGameProc},\r
+ {N_("Load Game"), LoadGameProc},\r
+ {N_("Load Next Game"), LoadNextGameProc},\r
+ {N_("Load Previous Game"), LoadPrevGameProc},\r
+ {N_("Reload Same Game"), ReloadGameProc},\r
+ {N_("Save Game"), SaveGameProc},\r
{"----", NothingProc},\r
- {"Copy Game", CopyGameProc},\r
- {"Paste Game", PasteGameProc},\r
+ {N_("Copy Game"), CopyGameProc},\r
+ {N_("Paste Game"), PasteGameProc},\r
{"----", NothingProc},\r
- {"Load Position", LoadPositionProc},\r
- {"Load Next Position", LoadNextPositionProc},\r
- {"Load Previous Position", LoadPrevPositionProc},\r
- {"Reload Same Position", ReloadPositionProc},\r
- {"Save Position", SavePositionProc},\r
+ {N_("Load Position"), LoadPositionProc},\r
+ {N_("Load Next Position"), LoadNextPositionProc},\r
+ {N_("Load Previous Position"), LoadPrevPositionProc},\r
+ {N_("Reload Same Position"), ReloadPositionProc},\r
+ {N_("Save Position"), SavePositionProc},\r
{"----", NothingProc},\r
- {"Copy Position", CopyPositionProc},\r
- {"Paste Position", PastePositionProc},\r
+ {N_("Copy Position"), CopyPositionProc},\r
+ {N_("Paste Position"), PastePositionProc},\r
{"----", NothingProc},\r
- {"Mail Move", MailMoveProc},\r
- {"Reload CMail Message", ReloadCmailMsgProc},\r
+ {N_("Mail Move"), MailMoveProc},\r
+ {N_("Reload CMail Message"), ReloadCmailMsgProc},\r
{"----", NothingProc},\r
- {"Exit", QuitProc},\r
+ {N_("Exit"), QuitProc},\r
{NULL, NULL}\r
};\r
\r
MenuItem modeMenu[] = {\r
- {"Machine White", MachineWhiteProc},\r
- {"Machine Black", MachineBlackProc},\r
- {"Two Machines", TwoMachinesProc},\r
- {"Analysis Mode", AnalyzeModeProc},\r
- {"Analyze File", AnalyzeFileProc },\r
- {"ICS Client", IcsClientProc},\r
- {"Edit Game", EditGameProc},\r
- {"Edit Position", EditPositionProc},\r
- {"Training", TrainingProc},\r
+ {N_("Machine White"), MachineWhiteProc},\r
+ {N_("Machine Black"), MachineBlackProc},\r
+ {N_("Two Machines"), TwoMachinesProc},\r
+ {N_("Analysis Mode"), AnalyzeModeProc},\r
+ {N_("Analyze File"), AnalyzeFileProc },\r
+ {N_("ICS Client"), IcsClientProc},\r
+ {N_("Edit Game"), EditGameProc},\r
+ {N_("Edit Position"), EditPositionProc},\r
+ {N_("Training"), TrainingProc},\r
+ {"----", NothingProc},\r
+ {N_("Show Engine Output"), EngineOutputProc},\r
+ {N_("Show Evaluation Graph"), NothingProc}, // [HGM] evalgr: not functional yet\r
+ {N_("Show Game List"), ShowGameListProc},\r
+ {"Show Move History", HistoryShowProc}, // [HGM] hist: activate 4.2.7 code\r
{"----", NothingProc},\r
- {"Show Game List", ShowGameListProc},\r
- {"Show Move List", HistoryShowProc},\r
- {"Edit Tags", EditTagsProc},\r
- {"Edit Comment", EditCommentProc},\r
- {"ICS Input Box", IcsInputBoxProc},\r
- {"Pause", PauseProc},\r
+ {N_("Edit Tags"), EditTagsProc},\r
+ {N_("Edit Comment"), EditCommentProc},\r
+ {N_("ICS Input Box"), IcsInputBoxProc},\r
+ {N_("Pause"), PauseProc},\r
{NULL, NULL}\r
};\r
\r
MenuItem actionMenu[] = {\r
- {"Accept", AcceptProc},\r
- {"Decline", DeclineProc},\r
- {"Rematch", RematchProc},\r
+ {N_("Accept"), AcceptProc},\r
+ {N_("Decline"), DeclineProc},\r
+ {N_("Rematch"), RematchProc},\r
{"----", NothingProc}, \r
- {"Call Flag", CallFlagProc},\r
- {"Draw", DrawProc},\r
- {"Adjourn", AdjournProc},\r
- {"Abort", AbortProc},\r
- {"Resign", ResignProc},\r
+ {N_("Call Flag"), CallFlagProc},\r
+ {N_("Draw"), DrawProc},\r
+ {N_("Adjourn"), AdjournProc},\r
+ {N_("Abort"), AbortProc},\r
+ {N_("Resign"), ResignProc},\r
{"----", NothingProc}, \r
- {"Stop Observing", StopObservingProc},\r
- {"Stop Examining", StopExaminingProc},\r
+ {N_("Stop Observing"), StopObservingProc},\r
+ {N_("Stop Examining"), StopExaminingProc},\r
{NULL, NULL}\r
};\r
\r
MenuItem stepMenu[] = {\r
- {"Backward", BackwardProc},\r
- {"Forward", ForwardProc},\r
- {"Back to Start", ToStartProc},\r
- {"Forward to End", ToEndProc},\r
- {"Revert", RevertProc},\r
- {"Truncate Game", TruncateGameProc},\r
+ {N_("Backward"), BackwardProc},\r
+ {N_("Forward"), ForwardProc},\r
+ {N_("Back to Start"), ToStartProc},\r
+ {N_("Forward to End"), ToEndProc},\r
+ {N_("Revert"), RevertProc},\r
+ {N_("Truncate Game"), TruncateGameProc},\r
{"----", NothingProc}, \r
- {"Move Now", MoveNowProc},\r
- {"Retract Move", RetractMoveProc},\r
+ {N_("Move Now"), MoveNowProc},\r
+ {N_("Retract Move"), RetractMoveProc},\r
{NULL, NULL}\r
}; \r
\r
MenuItem optionsMenu[] = {\r
- {"Always Queen", AlwaysQueenProc},\r
- {"Animate Dragging", AnimateDraggingProc},\r
- {"Animate Moving", AnimateMovingProc},\r
- {"Auto Comment", AutocommProc},\r
- {"Auto Flag", AutoflagProc},\r
- {"Auto Flip View", AutoflipProc},\r
- {"Auto Observe", AutobsProc},\r
- {"Auto Raise Board", AutoraiseProc},\r
- {"Auto Save", AutosaveProc},\r
- {"Blindfold", BlindfoldProc},\r
- {"Flash Moves", FlashMovesProc},\r
- {"Flip View", FlipViewProc},\r
- {"Get Move List", GetMoveListProc},\r
+ {N_("Flip View"), FlipViewProc},\r
+ {"----", NothingProc}, \r
+ {N_("Adjudications ..."), EngineMenuProc}, \r
+ {N_("General Settings ..."), UciMenuProc}, \r
+ {N_("Engine #1 Settings ..."), FirstSettingsProc}, \r
+ {N_("Engine #2 Settings ..."), SecondSettingsProc}, \r
+ {N_("Time Control ..."), TimeControlProc}, \r
+ {"----", NothingProc}, \r
+ {N_("Always Queen"), AlwaysQueenProc},\r
+ {N_("Animate Dragging"), AnimateDraggingProc},\r
+ {N_("Animate Moving"), AnimateMovingProc},\r
+ {N_("Auto Comment"), AutocommProc},\r
+ {N_("Auto Flag"), AutoflagProc},\r
+ {N_("Auto Flip View"), AutoflipProc},\r
+ {N_("Auto Observe"), AutobsProc},\r
+ {N_("Auto Raise Board"), AutoraiseProc},\r
+ {N_("Auto Save"), AutosaveProc},\r
+ {N_("Blindfold"), BlindfoldProc},\r
+ {N_("Flash Moves"), FlashMovesProc},\r
+ {N_("Get Move List"), GetMoveListProc},\r
#if HIGHDRAG\r
- {"Highlight Dragging", HighlightDraggingProc},\r
+ {N_("Highlight Dragging"), HighlightDraggingProc},\r
#endif\r
- {"Highlight Last Move", HighlightLastMoveProc},\r
- {"Move Sound", MoveSoundProc},\r
- {"ICS Alarm", IcsAlarmProc},\r
- {"Old Save Style", OldSaveStyleProc},\r
- {"Periodic Updates", PeriodicUpdatesProc}, \r
- {"Ponder Next Move", PonderNextMoveProc},\r
- {"Popup Exit Message", PopupExitMessageProc}, \r
- {"Popup Move Errors", PopupMoveErrorsProc}, \r
- {"Premove", PremoveProc},\r
- {"Quiet Play", QuietPlayProc},\r
- {"Show Coords", ShowCoordsProc},\r
- {"Show Thinking", ShowThinkingProc},\r
- {"Test Legality", TestLegalityProc},\r
+ {N_("Highlight Last Move"), HighlightLastMoveProc},\r
+ {N_("Move Sound"), MoveSoundProc},\r
+ {N_("ICS Alarm"), IcsAlarmProc},\r
+ {N_("Old Save Style"), OldSaveStyleProc},\r
+ {N_("Periodic Updates"), PeriodicUpdatesProc}, \r
+ {N_("Ponder Next Move"), PonderNextMoveProc},\r
+ {N_("Popup Exit Message"), PopupExitMessageProc}, \r
+ {N_("Popup Move Errors"), PopupMoveErrorsProc}, \r
+ {N_("Premove"), PremoveProc},\r
+ {N_("Quiet Play"), QuietPlayProc},\r
+ {N_("Show Coords"), ShowCoordsProc},\r
+ {N_("Hide Thinking"), HideThinkingProc},\r
+ {N_("Test Legality"), TestLegalityProc},\r
{NULL, NULL}\r
};\r
\r
MenuItem helpMenu[] = {\r
- {"Info XBoard", InfoProc},\r
- {"Man XBoard", ManProc},\r
+ {N_("Info XBoard"), InfoProc},\r
+ {N_("Man XBoard"), ManProc},\r
{"----", NothingProc},\r
- {"Hint", HintProc},\r
- {"Book", BookProc},\r
+ {N_("Hint"), HintProc},\r
+ {N_("Book"), BookProc},\r
{"----", NothingProc},\r
- {"About XBoard", AboutProc},\r
+ {N_("About XBoard"), AboutProc},\r
{NULL, NULL}\r
};\r
\r
Menu menuBar[] = {\r
- {"File", fileMenu},\r
- {"Mode", modeMenu},\r
- {"Action", actionMenu},\r
- {"Step", stepMenu},\r
- {"Options", optionsMenu},\r
- {"Help", helpMenu},\r
+ {N_("File"), fileMenu},\r
+ {N_("Mode"), modeMenu},\r
+ {N_("Action"), actionMenu},\r
+ {N_("Step"), stepMenu},\r
+ {N_("Options"), optionsMenu},\r
+ {N_("Help"), helpMenu},\r
{NULL, NULL}\r
};\r
\r
-#define PAUSE_BUTTON "P"\r
+#define PAUSE_BUTTON N_("P")\r
MenuItem buttonBar[] = {\r
{"<<", ToStartProc},\r
{"<", BackwardProc},\r
\r
#define PIECE_MENU_SIZE 11\r
String pieceMenuStrings[2][PIECE_MENU_SIZE] = {\r
- { "White", "----", "Pawn", "Knight", "Bishop", "Rook", "Queen", "King",\r
- "----", "Empty square", "Clear board" },\r
- { "Black", "----", "Pawn", "Knight", "Bishop", "Rook", "Queen", "King",\r
- "----", "Empty square", "Clear board" },\r
- };\r
+ { N_("White"), "----", N_("Pawn"), N_("Knight"), N_("Bishop"), N_("Rook"),\r
+ N_("Queen"), N_("King"), "----", N_("Empty square"), N_("Clear board") },\r
+ { N_("Black"), "----", N_("Pawn"), N_("Knight"), N_("Bishop"), N_("Rook"),\r
+ N_("Queen"), N_("King"), "----", N_("Empty square"), N_("Clear board") }, \r
+};\r
/* must be in same order as PieceMenuStrings! */\r
ChessSquare pieceMenuTranslation[2][PIECE_MENU_SIZE] = {\r
{ WhitePlay, (ChessSquare) 0, WhitePawn, WhiteKnight, WhiteBishop,\r
\r
#define DROP_MENU_SIZE 6\r
String dropMenuStrings[DROP_MENU_SIZE] = {\r
- "----", "Pawn", "Knight", "Bishop", "Rook", "Queen"\r
+ "----", N_("Pawn"), N_("Knight"), N_("Bishop"), N_("Rook"), N_("Queen")\r
};\r
/* must be in same order as PieceMenuStrings! */\r
ChessSquare dropMenuTranslation[DROP_MENU_SIZE] = {\r
{ "secondHost", "secondHost", XtRString, sizeof(String),\r
XtOffset(AppDataPtr, secondHost), XtRString, SECOND_HOST },\r
{ "firstDirectory", "firstDirectory", XtRString, sizeof(String),\r
- XtOffset(AppDataPtr, firstDirectory), XtRString, FIRST_DIRECTORY },\r
+ XtOffset(AppDataPtr, firstDirectory), XtRString, "." },\r
{ "secondDirectory", "secondDirectory", XtRString, sizeof(String),\r
- XtOffset(AppDataPtr, secondDirectory), XtRString, SECOND_DIRECTORY },\r
+ XtOffset(AppDataPtr, secondDirectory), XtRString, "." },\r
{ "bitmapDirectory", "bitmapDirectory", XtRString,\r
sizeof(String), XtOffset(AppDataPtr, bitmapDirectory),\r
XtRString, "" },\r
(XtPointer) 0 },\r
{ "showThinking", "showThinking", XtRBoolean, sizeof(Boolean),\r
XtOffset(AppDataPtr, showThinking), XtRImmediate,\r
- (XtPointer) False },\r
+ (XtPointer) True },\r
{ "ponderNextMove", "ponderNextMove", XtRBoolean, sizeof(Boolean),\r
XtOffset(AppDataPtr, ponderNextMove), XtRImmediate,\r
(XtPointer) True },\r
{ "showButtonBar", "showButtonBar", XtRBoolean,\r
sizeof(Boolean), XtOffset(AppDataPtr, showButtonBar),\r
XtRImmediate, (XtPointer) True },\r
+ {"icsEngineAnalyze", "icsEngineAnalyze", XtRBoolean, /* [DM] icsEngineAnalyze */\r
+ sizeof(Boolean), XtOffset(AppDataPtr, icsEngineAnalyze),\r
+ XtRImmediate, (XtPointer) False },\r
{ "firstScoreAbs", "firstScoreAbs", XtRBoolean,\r
sizeof(Boolean), XtOffset(AppDataPtr, firstScoreIsAbsolute),\r
XtRImmediate, (XtPointer) False },\r
XtRImmediate, (XtPointer) False },\r
{ "hideThinkingFromHuman", "hideThinkingFromHuman", XtRBoolean,\r
sizeof(Boolean), XtOffset(AppDataPtr, hideThinkingFromHuman),\r
- XtRImmediate, (XtPointer) False },\r
+ XtRImmediate, (XtPointer) True },\r
{ "adjudicateLossThreshold", "adjudicateLossThreshold", XtRInt,\r
sizeof(int), XtOffset(AppDataPtr, adjudicateLossThreshold),\r
XtRImmediate, (XtPointer) 0},\r
{ "pgnEventHeader", "pgnEventHeader", XtRString,\r
sizeof(String), XtOffset(AppDataPtr, pgnEventHeader),\r
XtRImmediate, (XtPointer) "Computer Chess Game" }, \r
- { "defaultFrcPosition", "defaultFrcPosition", XtRInt,\r
- sizeof(int), XtOffset(AppDataPtr, defaultFrcPosition),\r
- XtRImmediate, (XtPointer) -1 }, \r
+ { "defaultFrcPosition", "defaultFrcPositon", XtRInt,\r
+ sizeof(int), XtOffset(AppDataPtr, defaultFrcPosition),\r
+ XtRImmediate, (XtPointer) -1},\r
\r
// [HGM] 4.3.xx options\r
{ "boardWidth", "boardWidth", XtRInt,\r
XtRImmediate, (XtPointer) False},\r
{ "testClaims", "testClaims", XtRBoolean,\r
sizeof(Boolean), XtOffset(AppDataPtr, testClaims),\r
- XtRImmediate, (XtPointer) False},\r
+ XtRImmediate, (XtPointer) True},\r
{ "checkMates", "checkMates", XtRBoolean,\r
sizeof(Boolean), XtOffset(AppDataPtr, checkMates),\r
- XtRImmediate, (XtPointer) False},\r
+ XtRImmediate, (XtPointer) True},\r
{ "materialDraws", "materialDraws", XtRBoolean,\r
sizeof(Boolean), XtOffset(AppDataPtr, materialDraws),\r
- XtRImmediate, (XtPointer) False},\r
+ XtRImmediate, (XtPointer) True},\r
{ "trivialDraws", "trivialDraws", XtRBoolean,\r
sizeof(Boolean), XtOffset(AppDataPtr, trivialDraws),\r
XtRImmediate, (XtPointer) False},\r
{ "suppressLoadMoves", "suppressLoadMoves", XtRBoolean,\r
sizeof(Boolean), XtOffset(AppDataPtr, suppressLoadMoves),\r
XtRImmediate, (XtPointer) False},\r
+ { "userName", "userName", XtRString,\r
+ sizeof(String), XtOffset(AppDataPtr, userName),\r
+ XtRImmediate, (XtPointer) 0},\r
+ { "egtFormats", "egtFormats", XtRString,\r
+ sizeof(String), XtOffset(AppDataPtr, egtFormats),\r
+ XtRImmediate, (XtPointer) 0},\r
+ { "rewindIndex", "rewindIndex", XtRInt,\r
+ sizeof(int), XtOffset(AppDataPtr, rewindIndex),\r
+ XtRImmediate, (XtPointer) 0},\r
+ { "sameColorGames", "sameColorGames", XtRInt,\r
+ sizeof(int), XtOffset(AppDataPtr, sameColorGames),\r
+ XtRImmediate, (XtPointer) 0},\r
+ { "smpCores", "smpCores", XtRInt,\r
+ sizeof(int), XtOffset(AppDataPtr, smpCores),\r
+ XtRImmediate, (XtPointer) 1},\r
+ { "niceEngines", "niceEngines", XtRInt,\r
+ sizeof(int), XtOffset(AppDataPtr, niceEngines),\r
+ XtRImmediate, (XtPointer) 0},\r
+ { "nameOfDebugFile", "nameOfDebugFile", XtRString,\r
+ sizeof(String), XtOffset(AppDataPtr, nameOfDebugFile),\r
+ XtRImmediate, (XtPointer) "xboard.debug"},\r
+ { "noGUI", "noGUI", XtRBoolean,\r
+ sizeof(Boolean), XtOffset(AppDataPtr, noGUI),\r
+ XtRImmediate, (XtPointer) 0},\r
+ { "firstOptions", "firstOptions", XtRString,\r
+ sizeof(String), XtOffset(AppDataPtr, firstOptions),\r
+ XtRImmediate, (XtPointer) "" },\r
+ { "secondOptions", "secondOptions", XtRString,\r
+ sizeof(String), XtOffset(AppDataPtr, secondOptions),\r
+ XtRImmediate, (XtPointer) "" },\r
+\r
+ // [HGM] Winboard_x UCI options\r
+ { "firstIsUCI", "firstIsUCI", XtRBoolean,\r
+ sizeof(Boolean), XtOffset(AppDataPtr, firstIsUCI),\r
+ XtRImmediate, (XtPointer) False},\r
+ { "secondIsUCI", "secondIsUCI", XtRBoolean,\r
+ sizeof(Boolean), XtOffset(AppDataPtr, secondIsUCI),\r
+ XtRImmediate, (XtPointer) False},\r
+ { "firstHasOwnBookUCI", "firstHasOwnBookUCI", XtRBoolean,\r
+ sizeof(Boolean), XtOffset(AppDataPtr, firstHasOwnBookUCI),\r
+ XtRImmediate, (XtPointer) True},\r
+ { "secondHasOwnBookUCI", "secondHasOwnBookUCI", XtRBoolean,\r
+ sizeof(Boolean), XtOffset(AppDataPtr, secondHasOwnBookUCI),\r
+ XtRImmediate, (XtPointer) True},\r
+ { "usePolyglotBook", "usePolyglotBook", XtRBoolean,\r
+ sizeof(Boolean), XtOffset(AppDataPtr, usePolyglotBook),\r
+ XtRImmediate, (XtPointer) False},\r
+ { "defaultHashSize", "defaultHashSize", XtRInt,\r
+ sizeof(int), XtOffset(AppDataPtr, defaultHashSize),\r
+ XtRImmediate, (XtPointer) 64},\r
+ { "defaultCacheSizeEGTB", "defaultCacheSizeEGTB", XtRInt,\r
+ sizeof(int), XtOffset(AppDataPtr, defaultCacheSizeEGTB),\r
+ XtRImmediate, (XtPointer) 4},\r
+ { "polyglotDir", "polyglotDir", XtRString,\r
+ sizeof(String), XtOffset(AppDataPtr, polyglotDir),\r
+ XtRImmediate, (XtPointer) "." },\r
+ { "polyglotBook", "polyglotBook", XtRString,\r
+ sizeof(String), XtOffset(AppDataPtr, polyglotBook),\r
+ XtRImmediate, (XtPointer) "" }, \r
+ { "defaultPathEGTB", "defaultPathEGTB", XtRString,\r
+ sizeof(String), XtOffset(AppDataPtr, defaultPathEGTB),\r
+ XtRImmediate, (XtPointer) "/usr/local/share/egtb"},\r
+ { "delayBeforeQuit", "delayBeforeQuit", XtRInt,\r
+ sizeof(int), XtOffset(AppDataPtr, delayBeforeQuit),\r
+ XtRImmediate, (XtPointer) 0},\r
+ { "delayAfterQuit", "delayAfterQuit", XtRInt,\r
+ sizeof(int), XtOffset(AppDataPtr, delayAfterQuit),\r
+ XtRImmediate, (XtPointer) 0},\r
};\r
\r
XrmOptionDescRec shellOptions[] = {\r
{ "-hideThinkingFromHuman", "hideThinkingFromHuman", XrmoptionSepArg, NULL },\r
{ "-adjudicateLossThreshold", "adjudicateLossThreshold", XrmoptionSepArg, NULL },\r
{ "-pgnEventHeader", "pgnEventHeader", XrmoptionSepArg, NULL },\r
+ { "-firstIsUCI", "firstIsUCI", XrmoptionSepArg, NULL },\r
+ { "-secondIsUCI", "secondIsUCI", XrmoptionSepArg, NULL },\r
+ { "-fUCI", "firstIsUCI", XrmoptionNoArg, "True" },\r
+ { "-sUCI", "secondIsUCI", XrmoptionNoArg, "True" },\r
+ { "-firstHasOwnBookUCI", "firstHasOwnBookUCI", XrmoptionSepArg, NULL },\r
+ { "-secondHasOwnBookUCI", "secondHasOwnBookUCI", XrmoptionSepArg, NULL },\r
+ { "-fNoOwnBookUCI", "firstHasOwnBookUCI", XrmoptionNoArg, "False" },\r
+ { "-sNoOwnBookUCI", "secondHasOwnBookUCI", XrmoptionNoArg, "False" },\r
+ { "-firstXBook", "firstHasOwnBookUCI", XrmoptionNoArg, "False" },\r
+ { "-secondXBook", "secondHasOwnBookUCI", XrmoptionNoArg, "False" },\r
+ { "-polyglotDir", "polyglotDir", XrmoptionSepArg, NULL },\r
+ { "-usePolyglotBook", "usePolyglotBook", XrmoptionSepArg, NULL },\r
+ { "-polyglotBook", "polyglotBook", XrmoptionSepArg, NULL },\r
+ { "-defaultHashSize", "defaultHashSize", XrmoptionSepArg, NULL },\r
+ { "-defaultCacheSizeEGTB", "defaultCacheSizeEGTB", XrmoptionSepArg, NULL },\r
+ { "-defaultPathEGTB", "defaultPathEGTB", XrmoptionSepArg, NULL },\r
{ "-defaultFrcPosition", "defaultFrcPosition", XrmoptionSepArg, NULL },\r
// [HGM] I am sure AS added many more options, but we have to fish them out, from the list in winboard.c\r
\r
{ "-serverMoves", "serverMoves", XrmoptionSepArg, NULL }, \r
{ "-serverPause", "serverPause", XrmoptionSepArg, NULL }, \r
{ "-suppressLoadMoves", "suppressLoadMoves", XrmoptionSepArg, NULL }, \r
+ { "-egtFormats", "egtFormats", XrmoptionSepArg, NULL }, \r
+ { "-userName", "userName", XrmoptionSepArg, NULL }, \r
+ { "-smpCores", "smpCores", XrmoptionSepArg, NULL }, \r
+ { "-sameColorGames", "sameColorGames", XrmoptionSepArg, NULL }, \r
+ { "-rewindIndex", "rewindIndex", XrmoptionSepArg, NULL }, \r
+ { "-niceEngines", "niceEngines", XrmoptionSepArg, NULL }, \r
+ { "-delayBeforeQuit", "delayBeforeQuit", XrmoptionSepArg, NULL }, \r
+ { "-delayAfterQuit", "delayAfterQuit", XrmoptionSepArg, NULL }, \r
+ { "-nameOfDebugFile", "nameOfDebugFile", XrmoptionSepArg, NULL }, \r
+ { "-noGUI", "noGUI", XrmoptionNoArg, "True" }, \r
+ { "-firstOptions", "firstOptions", XrmoptionSepArg, NULL }, \r
+ { "-secondOptions", "secondOptions", XrmoptionSepArg, NULL }, \r
};\r
\r
\r
{ "EditGameProc", EditGameProc },\r
{ "EditPositionProc", EditPositionProc },\r
{ "TrainingProc", EditPositionProc },\r
+ { "EngineOutputProc", EngineOutputProc}, // [HGM] Winboard_x engine-output window\r
{ "ShowGameListProc", ShowGameListProc },\r
{ "ShowMoveListProc", HistoryShowProc},\r
{ "EditTagsProc", EditCommentProc },\r
{ "QuietPlayProc", QuietPlayProc },\r
{ "ShowCoordsProc", ShowCoordsProc },\r
{ "ShowThinkingProc", ShowThinkingProc },\r
+ { "HideThinkingProc", HideThinkingProc },\r
{ "TestLegalityProc", TestLegalityProc },\r
{ "InfoProc", InfoProc },\r
{ "ManProc", ManProc },\r
{ "GameListPopDown", (XtActionProc) GameListPopDown },\r
{ "PromotionPopDown", (XtActionProc) PromotionPopDown },\r
{ "HistoryPopDown", (XtActionProc) HistoryPopDown },\r
+ { "EngineOutputPopDown", (XtActionProc) EngineOutputPopDown },\r
+ { "ShufflePopDown", (XtActionProc) ShufflePopDown },\r
+ { "EnginePopDown", (XtActionProc) EnginePopDown },\r
+ { "UciPopDown", (XtActionProc) UciPopDown },\r
+ { "TimeControlPopDown", (XtActionProc) TimeControlPopDown },\r
+ { "NewVariantPopDown", (XtActionProc) NewVariantPopDown },\r
+ { "SettingsPopDown", (XtActionProc) SettingsPopDown },\r
};\r
\r
char globalTranslations[] =\r
dir = opendir(dirname);\r
if (!dir)\r
{\r
- fprintf(stderr, "%s: Can't access XPM directory %s\n", \r
+ fprintf(stderr, _("%s: Can't access XPM directory %s\n"), \r
programName, dirname);\r
exit(1);\r
}\r
{\r
int i;\r
\r
- fprintf(fp, "Available `%s' sizes:\n", ext);\r
+ fprintf(fp, _("Available `%s' sizes:\n"), ext);\r
for (i=1; i<MAXSQSIZE; ++i) {\r
if (xpm_avail[i])\r
printf("%d\n", i);\r
}\r
\r
if (!sm_index) {\r
- fprintf(stderr, "Error: No `%s' files!\n", ext);\r
+ fprintf(stderr, _("Error: No `%s' files!\n"), ext);\r
exit(1);\r
}\r
\r
int size;\r
char *ext;\r
{\r
- fprintf(stderr, "Warning: No DIR structure found on this system --\n");\r
- fprintf(stderr, " Unable to autosize for XPM/XIM pieces.\n");\r
- fprintf(stderr, " Please report this error to frankm@hiwaay.net.\n");\r
- fprintf(stderr, " Include system type & operating system in message.\n");\r
+ fprintf(stderr, _("\\r
+Warning: No DIR structure found on this system --\n\\r
+ Unable to autosize for XPM/XIM pieces.\n\\r
+ Please report this error to frankm@hiwaay.net.\n\\r
+ Include system type & operating system in message.\n"));\r
return size;\r
}\r
#endif /* HAVE_DIR_STRUCT */\r
}\r
if (!StrCaseCmp(buf, "default")) return -1;\r
\r
- fprintf(stderr, "%s: unrecognized color %s\n", programName, buf);\r
+ fprintf(stderr, _("%s: unrecognized color %s\n"), programName, buf);\r
return -2;\r
}\r
\r
char *str;\r
{\r
if ((textColors[(int)cc].fg=parse_color(str, 0)) == -2) {\r
- fprintf(stderr, "%s: can't parse foreground color in `%s'\n",\r
+ fprintf(stderr, _("%s: can't parse foreground color in `%s'\n"),\r
programName, str);\r
return -1;\r
}\r
#ifdef IDSIZES\r
// eventually, all layout determining code should go into a subroutine, but until then IDSIZE remains undefined\r
#else\r
+#define BoardSize int\r
void InitDrawingSizes(BoardSize boardSize, int flags)\r
-{ // [HGM] Dummy routine to be able to link with backend files from 4.3.xx, which call it\r
- ;\r
+{ // [HGM] resize is functional now, but for board format changes only (nr of ranks, files)\r
+ Dimension timerWidth, boardWidth, boardHeight, w, h, sep, bor, wr, hr;\r
+ Arg args[16];\r
+ XtGeometryResult gres;\r
+ int i;\r
+\r
+ if(!formWidget) return;\r
+\r
+ /*\r
+ * Enable shell resizing.\r
+ */\r
+ shellArgs[0].value = (XtArgVal) &w;\r
+ shellArgs[1].value = (XtArgVal) &h;\r
+ XtGetValues(shellWidget, shellArgs, 2);\r
+\r
+ shellArgs[4].value = 2*w; shellArgs[2].value = 10;\r
+ shellArgs[5].value = 2*h; shellArgs[3].value = 10;\r
+ XtSetValues(shellWidget, &shellArgs[2], 4);\r
+\r
+ XtSetArg(args[0], XtNdefaultDistance, &sep);\r
+ XtGetValues(formWidget, args, 1);\r
+\r
+ boardWidth = lineGap + BOARD_WIDTH * (squareSize + lineGap);\r
+ boardHeight = lineGap + BOARD_HEIGHT * (squareSize + lineGap);\r
+ CreateGrid();\r
+\r
+ XtSetArg(args[0], XtNwidth, boardWidth);\r
+ XtSetArg(args[1], XtNheight, boardHeight);\r
+ XtSetValues(boardWidget, args, 2);\r
+\r
+ timerWidth = (boardWidth - sep) / 2;\r
+ XtSetArg(args[0], XtNwidth, timerWidth);\r
+ XtSetValues(whiteTimerWidget, args, 1);\r
+ XtSetValues(blackTimerWidget, args, 1);\r
+\r
+ XawFormDoLayout(formWidget, False);\r
+\r
+ if (appData.titleInWindow) {\r
+ i = 0;\r
+ XtSetArg(args[i], XtNborderWidth, &bor); i++;\r
+ XtSetArg(args[i], XtNheight, &h); i++;\r
+ XtGetValues(titleWidget, args, i);\r
+ if (smallLayout) {\r
+ w = boardWidth - 2*bor;\r
+ } else {\r
+ XtSetArg(args[0], XtNwidth, &w);\r
+ XtGetValues(menuBarWidget, args, 1);\r
+ w = boardWidth - w - sep - 2*bor - 2; // WIDTH_FUDGE\r
+ }\r
+\r
+ gres = XtMakeResizeRequest(titleWidget, w, h, &wr, &hr);\r
+ if (gres != XtGeometryYes && appData.debugMode) {\r
+ fprintf(stderr,\r
+ _("%s: titleWidget geometry error %d %d %d %d %d\n"),\r
+ programName, gres, w, h, wr, hr);\r
+ }\r
+ }\r
+\r
+ XawFormDoLayout(formWidget, True);\r
+\r
+ /*\r
+ * Inhibit shell resizing.\r
+ */\r
+ shellArgs[0].value = w = (XtArgVal) boardWidth + marginW;\r
+ shellArgs[1].value = h = (XtArgVal) boardHeight + marginH;\r
+ shellArgs[4].value = shellArgs[2].value = w;\r
+ shellArgs[5].value = shellArgs[3].value = h;\r
+ XtSetValues(shellWidget, &shellArgs[0], 6);\r
}\r
#endif\r
\r
char *p;\r
XrmDatabase xdb;\r
int forceMono = False;\r
+#define INDIRECTION\r
+#ifdef INDIRECTION\r
+ // [HGM] before anything else, expand any indirection files amongst options\r
+ char *argvCopy[1000]; // 1000 seems enough\r
+ char newArgs[10000]; // holds actual characters\r
+ int k = 0;\r
+\r
+ srandom(time(0)); // [HGM] book: make random truly random\r
+\r
+ j = 0;\r
+ for(i=0; i<argc; i++) {\r
+ if(j >= 1000-2) { printf(_("too many arguments\n")); exit(-1); }\r
+//fprintf(stderr, "arg %s\n", argv[i]);\r
+ if(argv[i][0] != '@') argvCopy[j++] = argv[i]; else {\r
+ char c;\r
+ FILE *f = fopen(argv[i]+1, "rb");\r
+ if(f == NULL) { fprintf(stderr, _("ignore %s\n"), argv[i]); continue; } // do not expand non-existing\r
+ argvCopy[j++] = newArgs + k; // get ready for first argument from file\r
+ while((c = fgetc(f)) != EOF) { // each line of file inserts 1 argument in the list\r
+ if(c == '\n') {\r
+ if(j >= 1000-2) { printf(_("too many arguments\n")); exit(-1); }\r
+ newArgs[k++] = 0; // terminate current arg\r
+ if(k >= 10000-1) { printf(_("too long arguments\n")); exit(-1); }\r
+ argvCopy[j++] = newArgs + k; // get ready for next\r
+ } else {\r
+ if(k >= 10000-1) { printf(_("too long arguments\n")); exit(-1); }\r
+ newArgs[k++] = c;\r
+ }\r
+ }\r
+ newArgs[k] = 0;\r
+ j--;\r
+ fclose(f);\r
+ }\r
+ }\r
+ argvCopy[j] = NULL;\r
+ argv = argvCopy;\r
+ argc = j;\r
+#if 0\r
+ if(appData.debugMode,1) { // OK, appData is not initialized here yet...\r
+ for(i=0; i<argc; i++) fprintf(stderr, "argv[%2d] = '%s'\n", i, argv[i]);\r
+ }\r
+#endif\r
+#endif\r
+\r
\r
setbuf(stdout, NULL);\r
setbuf(stderr, NULL);\r
else\r
programName++;\r
\r
+#ifdef ENABLE_NLS\r
+ XtSetLanguageProc(NULL, NULL, NULL);\r
+ bindtextdomain(PRODUCT, LOCALEDIR);\r
+ textdomain(PRODUCT);\r
+#endif\r
+\r
shellWidget =\r
XtAppInitialize(&appContext, "XBoard", shellOptions,\r
XtNumber(shellOptions),\r
&argc, argv, xboardResources, NULL, 0);\r
if (argc > 1) {\r
- fprintf(stderr, "%s: unrecognized argument %s\n",\r
+ fprintf(stderr, _("%s: unrecognized argument %s\n"),\r
programName, argv[1]);\r
exit(2);\r
}\r
chessDir = ".";\r
} else {\r
if (chdir(chessDir) != 0) {\r
- fprintf(stderr, "%s: can't cd to CHESSDIR: ", programName);\r
+ fprintf(stderr, _("%s: can't cd to CHESSDIR: "), programName);\r
perror(chessDir);\r
exit(1);\r
}\r
clientResources, XtNumber(clientResources),\r
NULL, 0);\r
\r
+ if (appData.debugMode && appData.nameOfDebugFile && strcmp(appData.nameOfDebugFile, "stderr")) {\r
+ /* [DM] debug info to file [HGM] make the filename a command-line option, and allow it to remain stderr */\r
+ if ((debugFP = fopen(appData.nameOfDebugFile, "w")) == NULL) {\r
+ printf(_("Failed to open file '%s'\n"), appData.nameOfDebugFile);\r
+ exit(errno);\r
+ }\r
+ setbuf(debugFP, NULL);\r
+ }\r
+ \r
/* [HGM,HR] make sure board size is acceptable */\r
if(appData.NrFiles > BOARD_SIZE ||\r
appData.NrRanks > BOARD_SIZE )\r
- DisplayFatalError("Recompile with BOARD_SIZE > 12, to support this size", 0, 2);\r
-\r
- /* [HGM] The following line must be moved to the "New Shuffle Game" menu as soon as there is one! */\r
- if(appData.defaultFrcPosition != -1) shuffleOpenings = TRUE;\r
+ DisplayFatalError(_("Recompile with BOARD_SIZE > 12, to support this size"), 0, 2);\r
\r
#if !HIGHDRAG\r
/* This feature does not work; animation needs a rewrite */\r
&lineGap, &clockFontPxlSize, &coordFontPxlSize,\r
&fontPxlSize, &smallLayout, &tinyLayout);\r
if (i == 0) {\r
- fprintf(stderr, "%s: bad boardSize syntax %s\n",\r
+ fprintf(stderr, _("%s: bad boardSize syntax %s\n"),\r
programName, appData.boardSize);\r
exit(2);\r
}\r
while (szd->name != NULL &&\r
StrCaseCmp(szd->name, appData.boardSize) != 0) szd++;\r
if (szd->name == NULL) {\r
- fprintf(stderr, "%s: unrecognized boardSize name %s\n",\r
+ fprintf(stderr, _("%s: unrecognized boardSize name %s\n"),\r
programName, appData.boardSize);\r
exit(2);\r
}\r
if (strlen(appData.pixmapDirectory) > 0) {\r
p = ExpandPathName(appData.pixmapDirectory);\r
if (!p) {\r
- fprintf(stderr, "Error expanding path name \"%s\"\n",\r
+ fprintf(stderr, _("Error expanding path name \"%s\"\n"),\r
appData.pixmapDirectory);\r
exit(1);\r
}\r
if (appData.debugMode) {\r
- fprintf(stderr, "XBoard square size (hint): %d\n", squareSize);\r
- fprintf(stderr, "%s fulldir:%s:\n", IMAGE_EXT, p);\r
+ fprintf(stderr, _("\\r
+XBoard square size (hint): %d\n\\r
+%s fulldir:%s:\n"), squareSize, IMAGE_EXT, p);\r
}\r
squareSize = xpm_closest_to(p, squareSize, IMAGE_EXT);\r
if (appData.debugMode) {\r
- fprintf(stderr, "Closest %s size: %d\n", IMAGE_EXT, squareSize);\r
+ fprintf(stderr, _("Closest %s size: %d\n"), IMAGE_EXT, squareSize);\r
}\r
}\r
\r
coordFontID = XLoadFont(xDisplay, appData.coordFont);\r
coordFontStruct = XQueryFont(xDisplay, coordFontID);\r
appData.font = FindFont(appData.font, fontPxlSize);\r
+ countFontID = XLoadFont(xDisplay, appData.coordFont); // [HGM] holdings\r
+ countFontStruct = XQueryFont(xDisplay, countFontID);\r
+// appData.font = FindFont(appData.font, fontPxlSize);\r
\r
xdb = XtDatabase(xDisplay);\r
XrmPutStringResource(&xdb, "*font", appData.font);\r
}\r
\r
if (forceMono) {\r
- fprintf(stderr, "%s: too few colors available; trying monochrome mode\n",\r
+ fprintf(stderr, _("%s: too few colors available; trying monochrome mode\n"),\r
programName);\r
}\r
\r
if (appData.monoMode && appData.debugMode) {\r
- fprintf(stderr, "white pixel = 0x%lx, black pixel = 0x%lx\n",\r
+ fprintf(stderr, _("white pixel = 0x%lx, black pixel = 0x%lx\n"),\r
(unsigned long) XWhitePixel(xDisplay, xScreen),\r
(unsigned long) XBlackPixel(xDisplay, xScreen));\r
}\r
{\r
if (appData.colorize) {\r
fprintf(stderr,\r
- "%s: can't parse color names; disabling colorization\n",\r
+ _("%s: can't parse color names; disabling colorization\n"),\r
programName);\r
}\r
appData.colorize = FALSE;\r
formArgs, XtNumber(formArgs));\r
XtSetArg(args[0], XtNdefaultDistance, &sep);\r
XtGetValues(formWidget, args, 1);\r
- \r
+\r
j = 0;\r
widgetList[j++] = menuBarWidget = CreateMenuBar(menuBar);\r
+ XtSetArg(args[0], XtNtop, XtChainTop);\r
+ XtSetArg(args[1], XtNbottom, XtChainTop);\r
+ XtSetValues(menuBarWidget, args, 2);\r
\r
widgetList[j++] = whiteTimerWidget =\r
XtCreateWidget("whiteTime", labelWidgetClass,\r
formWidget, timerArgs, XtNumber(timerArgs));\r
XtSetArg(args[0], XtNfont, clockFontStruct);\r
- XtSetValues(whiteTimerWidget, args, 1);\r
+ XtSetArg(args[1], XtNtop, XtChainTop);\r
+ XtSetArg(args[2], XtNbottom, XtChainTop);\r
+ XtSetValues(whiteTimerWidget, args, 3);\r
\r
widgetList[j++] = blackTimerWidget =\r
XtCreateWidget("blackTime", labelWidgetClass,\r
formWidget, timerArgs, XtNumber(timerArgs));\r
XtSetArg(args[0], XtNfont, clockFontStruct);\r
- XtSetValues(blackTimerWidget, args, 1);\r
+ XtSetArg(args[1], XtNtop, XtChainTop);\r
+ XtSetArg(args[2], XtNbottom, XtChainTop);\r
+ XtSetValues(blackTimerWidget, args, 3);\r
\r
if (appData.titleInWindow) {\r
widgetList[j++] = titleWidget = \r
XtCreateWidget("title", labelWidgetClass, formWidget,\r
titleArgs, XtNumber(titleArgs));\r
+ XtSetArg(args[0], XtNtop, XtChainTop);\r
+ XtSetArg(args[1], XtNbottom, XtChainTop);\r
+ XtSetValues(titleWidget, args, 2);\r
}\r
\r
if (appData.showButtonBar) {\r
widgetList[j++] = buttonBarWidget = CreateButtonBar(buttonBar);\r
+ XtSetArg(args[0], XtNleft, XtChainRight); // [HGM] glue to right window edge\r
+ XtSetArg(args[1], XtNright, XtChainRight); // for good run-time sizing\r
+ XtSetArg(args[2], XtNtop, XtChainTop);\r
+ XtSetArg(args[3], XtNbottom, XtChainTop);\r
+ XtSetValues(buttonBarWidget, args, 4);\r
}\r
\r
widgetList[j++] = messageWidget =\r
XtCreateWidget("message", labelWidgetClass, formWidget,\r
messageArgs, XtNumber(messageArgs));\r
- \r
+ XtSetArg(args[0], XtNtop, XtChainTop);\r
+ XtSetArg(args[1], XtNbottom, XtChainTop);\r
+ XtSetValues(messageWidget, args, 2);\r
+\r
widgetList[j++] = boardWidget =\r
XtCreateWidget("board", widgetClass, formWidget, boardArgs,\r
XtNumber(boardArgs));\r
}\r
i = 0;\r
XtSetArg(args[0], XtNfromVert, messageWidget);\r
- XtSetValues(boardWidget, args, 1);\r
+ XtSetArg(args[1], XtNtop, XtChainTop);\r
+ XtSetArg(args[2], XtNbottom, XtChainBottom);\r
+ XtSetArg(args[3], XtNleft, XtChainLeft);\r
+ XtSetArg(args[4], XtNright, XtChainRight);\r
+ XtSetValues(boardWidget, args, 5);\r
\r
XtRealizeWidget(shellWidget);\r
\r
* The value "2" is probably larger than needed.\r
*/\r
XawFormDoLayout(formWidget, False);\r
+\r
#define WIDTH_FUDGE 2\r
i = 0;\r
XtSetArg(args[i], XtNborderWidth, &bor); i++;\r
\r
gres = XtMakeResizeRequest(messageWidget, w, h, &wr, &hr);\r
if (gres != XtGeometryYes && appData.debugMode) {\r
- fprintf(stderr, "%s: messageWidget geometry error %d %d %d %d %d\n",\r
+ fprintf(stderr, _("%s: messageWidget geometry error %d %d %d %d %d\n"),\r
programName, gres, w, h, wr, hr);\r
}\r
\r
w--;\r
gres = XtMakeResizeRequest(messageWidget, w, h, &wr, &hr);\r
if (gres != XtGeometryYes && appData.debugMode) {\r
- fprintf(stderr, "%s: messageWidget geometry error %d %d %d %d %d\n",\r
+ fprintf(stderr, _("%s: messageWidget geometry error %d %d %d %d %d\n"),\r
programName, gres, w, h, wr, hr);\r
}\r
/* !! end hack */\r
+ XtSetArg(args[0], XtNleft, XtChainLeft); // [HGM] glue ends for good run-time sizing\r
+ XtSetArg(args[1], XtNright, XtChainRight);\r
+ XtSetValues(messageWidget, args, 2);\r
\r
if (appData.titleInWindow) {\r
i = 0;\r
gres = XtMakeResizeRequest(titleWidget, w, h, &wr, &hr);\r
if (gres != XtGeometryYes && appData.debugMode) {\r
fprintf(stderr,\r
- "%s: titleWidget geometry error %d %d %d %d %d\n",\r
+ _("%s: titleWidget geometry error %d %d %d %d %d\n"),\r
programName, gres, w, h, wr, hr);\r
}\r
}\r
XtSetValues(XtNameToWidget(menuBarWidget, "menuOptions.Show Coords"),\r
args, 1);\r
}\r
- if (appData.showThinking) {\r
- XtSetValues(XtNameToWidget(menuBarWidget, "menuOptions.Show Thinking"),\r
+ if (appData.hideThinkingFromHuman) {\r
+ XtSetValues(XtNameToWidget(menuBarWidget, "menuOptions.Hide Thinking"),\r
args, 1);\r
}\r
if (appData.testLegality) {\r
shellArgs[4].value = shellArgs[2].value = w;\r
shellArgs[5].value = shellArgs[3].value = h;\r
XtSetValues(shellWidget, &shellArgs[2], 4);\r
- \r
+ marginW = w - boardWidth; // [HGM] needed to set new shellWidget size when we resize board\r
+ marginH = h - boardHeight;\r
+\r
CatchDeleteWindow(shellWidget, "QuitProc");\r
\r
CreateGCs();\r
InitPosition(TRUE);\r
\r
XtAppMainLoop(appContext);\r
+ if (appData.debugMode) fclose(debugFP); // [DM] debug\r
return 0;\r
}\r
\r
{ "menuHelp.Book", False },\r
{ "menuStep.Move Now", False },\r
{ "menuOptions.Periodic Updates", False }, \r
- { "menuOptions.Show Thinking", False },\r
+ { "menuOptions.Hide Thinking", False },\r
{ "menuOptions.Ponder Next Move", False },\r
#endif\r
{ NULL, False }\r
{ "menuOptions.ICS Alarm", False },\r
{ "menuOptions.Move Sound", False },\r
{ "menuOptions.Quiet Play", False },\r
- { "menuOptions.Show Thinking", False },\r
+ { "menuOptions.Hide Thinking", False },\r
{ "menuOptions.Periodic Updates", False }, \r
{ "menuOptions.Ponder Next Move", False },\r
{ "menuHelp.Hint", False },\r
void SetICSMode()\r
{\r
SetMenuEnables(icsEnables);\r
+\r
+#ifdef ZIPPY\r
+ if (appData.zippyPlay && !appData.noChessProgram) /* [DM] icsEngineAnalyze */\r
+ XtSetSensitive(XtNameToWidget(menuBarWidget, "menuMode.Analysis Mode"), True);\r
+#endif\r
}\r
\r
void\r
char **fonts, *p, *best, *scalable, *scalableTail;\r
int i, j, nfonts, minerr, err, pxlSize;\r
\r
+#ifdef ENABLE_NLS\r
+ char **missing_list;\r
+ int missing_count;\r
+ char *def_string, *base_fnt_lst, strInt[3];\r
+ XFontSet fntSet;\r
+ XFontStruct **fnt_list;\r
+\r
+ base_fnt_lst = calloc(1, strlen(pattern) + 3);\r
+ sprintf(strInt, "%d", targetPxlSize);\r
+ p = strstr(pattern, "--");\r
+ strncpy(base_fnt_lst, pattern, p - pattern + 2);\r
+ strcat(base_fnt_lst, strInt);\r
+ strcat(base_fnt_lst, strchr(p + 2, '-'));\r
+\r
+ if ((fntSet = XCreateFontSet(xDisplay, \r
+ base_fnt_lst, \r
+ &missing_list, \r
+ &missing_count, \r
+ &def_string)) == NULL) {\r
+\r
+ fprintf(stderr, _("Unable to create font set.\n"));\r
+ exit (2);\r
+ }\r
+\r
+ nfonts = XFontsOfFontSet(fntSet, &fnt_list, &fonts);\r
+#else\r
fonts = XListFonts(xDisplay, pattern, 999999, &nfonts);\r
if (nfonts < 1) {\r
- fprintf(stderr, "%s: no fonts match pattern %s\n",\r
+ fprintf(stderr, _("%s: no fonts match pattern %s\n"),\r
programName, pattern);\r
exit(2);\r
}\r
+#endif\r
+\r
best = fonts[0];\r
scalable = NULL;\r
minerr = 999999;\r
strcpy(p, best);\r
}\r
if (appData.debugMode) {\r
- fprintf(debugFP, "resolved %s at pixel size %d\n to %s\n",\r
+ fprintf(debugFP, _("resolved %s at pixel size %d\n to %s\n"),\r
pattern, targetPxlSize, p);\r
}\r
- XFreeFontNames(fonts);\r
+#ifdef ENABLE_NLS\r
+ if (missing_count > 0)\r
+ XFreeStringList(missing_list);\r
+ XFreeFontSet(xDisplay, fntSet);\r
+#else\r
+ XFreeFontNames(fonts);\r
+#endif\r
return p;\r
}\r
\r
coordGC = XtGetGC(shellWidget, value_mask, &gc_values);\r
XSetFont(xDisplay, coordGC, coordFontID);\r
\r
+ // [HGM] make font for holdings counts (white on black0\r
+ gc_values.foreground = XWhitePixel(xDisplay, xScreen);\r
+ gc_values.background = XBlackPixel(xDisplay, xScreen);\r
+ countGC = XtGetGC(shellWidget, value_mask, &gc_values);\r
+ XSetFont(xDisplay, countGC, countFontID);\r
+ \r
if (appData.monoMode) {\r
gc_values.foreground = XWhitePixel(xDisplay, xScreen);\r
gc_values.background = XWhitePixel(xDisplay, xScreen);\r
\r
fp = fopen(filename, "rb");\r
if (!fp) {\r
- fprintf(stderr, "%s: error loading XIM!\n", programName);\r
+ fprintf(stderr, _("%s: error loading XIM!\n"), programName);\r
exit(1);\r
}\r
\r
} else {\r
useImages = 1;\r
if (appData.monoMode) {\r
- DisplayFatalError("XIM pieces cannot be used in monochrome mode",\r
+ DisplayFatalError(_("XIM pieces cannot be used in monochrome mode"),\r
0, 2);\r
ExitEvent(2);\r
}\r
- fprintf(stderr, "\nLoading XIMs...\n");\r
+ fprintf(stderr, _("\nLoading XIMs...\n"));\r
/* Load pieces */\r
for (piece = (int) WhitePawn; piece <= (int) WhiteKing; piece++) {\r
fprintf(stderr, "%d", piece+1);\r
XGetImage(xDisplay, DefaultRootWindow(xDisplay),\r
0, 0, ss, ss, AllPlanes, XYPixmap);\r
if (appData.debugMode)\r
- fprintf(stderr, "(File:%s:) ", buf);\r
+ fprintf(stderr, _("(File:%s:) "), buf);\r
loadXIM(ximPieceBitmap[kind][piece], \r
ximtemp, buf,\r
&(xpmPieceBitmap[kind][piece]),\r
useImageSqs = 0;\r
} else {\r
useImageSqs = 1;\r
- fprintf(stderr, "light square ");\r
+ fprintf(stderr, _("light square "));\r
ximLightSquare= \r
XGetImage(xDisplay, DefaultRootWindow(xDisplay),\r
0, 0, ss, ss, AllPlanes, XYPixmap);\r
if (appData.debugMode)\r
- fprintf(stderr, "(File:%s:) ", buf);\r
+ fprintf(stderr, _("(File:%s:) "), buf);\r
\r
loadXIM(ximLightSquare, NULL, buf, &xpmLightSquare, NULL);\r
- fprintf(stderr, "dark square ");\r
+ fprintf(stderr, _("dark square "));\r
sprintf(buf, "%s/dsq%u.xim",\r
ExpandPathName(appData.pixmapDirectory), ss);\r
if (appData.debugMode)\r
- fprintf(stderr, "(File:%s:) ", buf);\r
+ fprintf(stderr, _("(File:%s:) "), buf);\r
ximDarkSquare= \r
XGetImage(xDisplay, DefaultRootWindow(xDisplay),\r
0, 0, ss, ss, AllPlanes, XYPixmap);\r
loadXIM(ximDarkSquare, NULL, buf, &xpmDarkSquare, NULL);\r
xpmJailSquare = xpmLightSquare;\r
}\r
- fprintf(stderr, "Done.\n");\r
+ fprintf(stderr, _("Done.\n"));\r
}\r
XSynchronize(xDisplay, False); /* Work-around for xlib/xt buffering bug */\r
}\r
attr.numsymbols = 4;\r
\r
if (appData.monoMode) {\r
- DisplayFatalError("XPM pieces cannot be used in monochrome mode",\r
+ DisplayFatalError(_("XPM pieces cannot be used in monochrome mode"),\r
0, 2);\r
ExitEvent(2);\r
}\r
/* Load pieces */\r
while (pieces->size != squareSize && pieces->size) pieces++;\r
if (!pieces->size) {\r
- fprintf(stderr, "No builtin XPM pieces of size %d\n", squareSize);\r
+ fprintf(stderr, _("No builtin XPM pieces of size %d\n"), squareSize);\r
exit(1);\r
}\r
for (piece = (int) WhitePawn; piece <= (int) WhiteKing; piece++) {\r
pieces->xpm[piece][kind],\r
&(xpmPieceBitmap[kind][piece]),\r
NULL, &attr)) != 0) {\r
- fprintf(stderr, "Error %d loading XPM image \"%s\"\n",\r
+ fprintf(stderr, _("Error %d loading XPM image \"%s\"\n"),\r
r, buf);\r
exit(1); \r
} \r
} else {\r
useImages = 1;\r
\r
- fprintf(stderr, "\nLoading XPMs...\n");\r
+ fprintf(stderr, _("\nLoading XPMs...\n"));\r
\r
/* Load pieces */\r
for (piece = (int) WhitePawn; piece <= (int) WhiteKing; piece++) {\r
ToLower(PieceToChar((ChessSquare)piece)),\r
xpmkind[kind], ss);\r
if (appData.debugMode) {\r
- fprintf(stderr, "(File:%s:) ", buf);\r
+ fprintf(stderr, _("(File:%s:) "), buf);\r
}\r
if ((r=XpmReadFileToPixmap(xDisplay, xBoardWindow, buf,\r
&(xpmPieceBitmap[kind][piece]),\r
NULL, &attr)) != 0) {\r
- fprintf(stderr, "Error %d loading XPM file \"%s\"\n",\r
+ fprintf(stderr, _("Error %d loading XPM file \"%s\"\n"),\r
r, buf);\r
exit(1); \r
} \r
/* Load light and dark squares */\r
/* If the LSQ and DSQ pieces don't exist, we will \r
draw them with solid squares. */\r
- fprintf(stderr, "light square ");\r
+ fprintf(stderr, _("light square "));\r
sprintf(buf, "%s/lsq%u.xpm", ExpandPathName(appData.pixmapDirectory), ss);\r
if (access(buf, 0) != 0) {\r
useImageSqs = 0;\r
} else {\r
useImageSqs = 1;\r
if (appData.debugMode)\r
- fprintf(stderr, "(File:%s:) ", buf);\r
+ fprintf(stderr, _("(File:%s:) "), buf);\r
\r
if ((r=XpmReadFileToPixmap(xDisplay, xBoardWindow, buf,\r
&xpmLightSquare, NULL, &attr)) != 0) {\r
- fprintf(stderr, "Error %d loading XPM file \"%s\"\n", r, buf);\r
+ fprintf(stderr, _("Error %d loading XPM file \"%s\"\n"), r, buf);\r
exit(1);\r
}\r
- fprintf(stderr, "dark square ");\r
+ fprintf(stderr, _("dark square "));\r
sprintf(buf, "%s/dsq%u.xpm",\r
ExpandPathName(appData.pixmapDirectory), ss);\r
if (appData.debugMode) {\r
- fprintf(stderr, "(File:%s:) ", buf);\r
+ fprintf(stderr, _("(File:%s:) "), buf);\r
}\r
if ((r=XpmReadFileToPixmap(xDisplay, xBoardWindow, buf,\r
&xpmDarkSquare, NULL, &attr)) != 0) {\r
- fprintf(stderr, "Error %d loading XPM file \"%s\"\n", r, buf);\r
+ fprintf(stderr, _("Error %d loading XPM file \"%s\"\n"), r, buf);\r
exit(1);\r
}\r
}\r
xpmJailSquare = xpmLightSquare;\r
- fprintf(stderr, "Done.\n");\r
+ fprintf(stderr, _("Done.\n"));\r
}\r
XSynchronize(xDisplay, False); /* Work-around for xlib/xt\r
buffering bug */ \r
if (errcode != BitmapSuccess) {\r
switch (errcode) {\r
case BitmapOpenFailed:\r
- sprintf(msg, "Can't open bitmap file %s", fullname);\r
+ sprintf(msg, _("Can't open bitmap file %s"), fullname);\r
break;\r
case BitmapFileInvalid:\r
- sprintf(msg, "Invalid bitmap in file %s", fullname);\r
+ sprintf(msg, _("Invalid bitmap in file %s"), fullname);\r
break;\r
case BitmapNoMemory:\r
- sprintf(msg, "Ran out of memory reading bitmap file %s",\r
+ sprintf(msg, _("Ran out of memory reading bitmap file %s"),\r
fullname);\r
break;\r
default:\r
- sprintf(msg, "Unknown XReadBitmapFile error %d on file %s",\r
+ sprintf(msg, _("Unknown XReadBitmapFile error %d on file %s"),\r
errcode, fullname);\r
break;\r
}\r
- fprintf(stderr, "%s: %s...using built-in\n",\r
+ fprintf(stderr, _("%s: %s...using built-in\n"),\r
programName, msg);\r
} else if (w != wreq || h != hreq) {\r
fprintf(stderr,\r
- "%s: Bitmap %s is %dx%d, not %dx%d...using built-in\n",\r
+ _("%s: Bitmap %s is %dx%d, not %dx%d...using built-in\n"),\r
programName, fullname, w, h, wreq, hreq);\r
} else {\r
return;\r
}\r
if (bits == NULL) {\r
#if 0\r
- fprintf(stderr, "%s: No built-in bitmap for %s; giving up\n",\r
+ fprintf(stderr, _("%s: No built-in bitmap for %s; giving up\n"),\r
programName, name);\r
exit(1);\r
#endif\r
entry = XtCreateManagedWidget(mi->string, smeLineObjectClass,\r
menu, args, j);\r
} else {\r
+ XtSetArg(args[j], XtNlabel, XtNewString(_(mi->string)));\r
entry = XtCreateManagedWidget(mi->string, smeBSBObjectClass,\r
- menu, args, j);\r
+ menu, args, j+1);\r
XtAddCallback(entry, XtNcallback,\r
(XtCallbackProc) MenuBarSelect,\r
(caddr_t) mi->proc);\r
XtSetArg(args[j], XtNmenuName, XtNewString(menuName)); j++;\r
if (tinyLayout) {\r
char shortName[2];\r
- shortName[0] = mb->name[0];\r
+ shortName[0] = _(mb->name)[0];\r
shortName[1] = NULLCHAR;\r
XtSetArg(args[j], XtNlabel, XtNewString(shortName)); j++;\r
}\r
+ else {\r
+ XtSetArg(args[j], XtNlabel, XtNewString(_(mb->name))); j++;\r
+ }\r
+\r
XtSetArg(args[j], XtNborderWidth, 0); j++;\r
anchor = XtCreateManagedWidget(mb->name, menuButtonWidgetClass,\r
menuBar, args, j);\r
XtSetArg(args[j], XtNinternalWidth, 2); j++;\r
XtSetArg(args[j], XtNborderWidth, 0); j++;\r
}\r
+ XtSetArg(args[j], XtNlabel, XtNewString(_(mi->string))); j++;\r
button = XtCreateManagedWidget(mi->string, commandWidgetClass,\r
buttonBar, args, j);\r
XtAddCallback(button, XtNcallback,\r
entry = XtCreateManagedWidget(item, smeLineObjectClass,\r
menu, NULL, 0);\r
} else {\r
+ XtSetArg(args[0], XtNlabel, XtNewString(_(item))); \r
entry = XtCreateManagedWidget(item, smeBSBObjectClass,\r
- menu, NULL, 0);\r
+ menu, args, 1);\r
selection = pieceMenuTranslation[color][i];\r
XtAddCallback(entry, XtNcallback,\r
(XtCallbackProc) PieceMenuSelect,\r
(unsigned)(ButtonPressMask|ButtonReleaseMask),\r
GrabModeAsync, GrabModeAsync);\r
\r
- XtSetArg(args[0], XtNlabel, "Drop");\r
+ XtSetArg(args[0], XtNlabel, _("Drop"));\r
dropMenu = XtCreatePopupShell("menuD", simpleMenuWidgetClass,\r
boardWidget, args, 1);\r
for (i = 0; i < DROP_MENU_SIZE; i++) {\r
entry = XtCreateManagedWidget(item, smeLineObjectClass,\r
dropMenu, NULL, 0);\r
} else {\r
+ XtSetArg(args[0], XtNlabel, XtNewString(_(item))); \r
entry = XtCreateManagedWidget(item, smeBSBObjectClass,\r
- dropMenu, NULL, 0);\r
+ dropMenu, args, 1);\r
selection = dropMenuTranslation[i];\r
XtAddCallback(entry, XtNcallback,\r
(XtCallbackProc) DropMenuSelect,\r
\r
if (gameInfo.variant == VariantXiangqi) {\r
if (column >= 3 && column <= 5 && row >= 0 && row <= 2) {\r
- square_color = 0;\r
- } else if (column >= 3 && column <= 5 && row >= 7 && row <= 9) {\r
square_color = 1;\r
+ } else if (column >= 3 && column <= 5 && row >= 7 && row <= 9) {\r
+ square_color = 0;\r
} else if (row <= 4) {\r
- square_color = 1;\r
- } else {\r
square_color = 0;\r
+ } else {\r
+ square_color = 1;\r
}\r
} else {\r
square_color = ((column + row) % 2) == 1;\r
}\r
\r
/* [hgm] holdings: next line makes all holdings squares light */\r
- if(column < BOARD_LEFT || column >= BOARD_RGHT) square_color = 0;\r
+ if(column < BOARD_LEFT || column >= BOARD_RGHT) square_color = 1;\r
\r
return square_color;\r
}\r
DrawFunc drawfunc;\r
int flash_delay;\r
\r
+ if(gameInfo.variant == VariantShogi) { // [HGM] shogi: in shogi Q is used for Lance\r
+ if(piece == WhiteQueen) piece = WhiteLance; else\r
+ if(piece == BlackQueen) piece = BlackLance;\r
+ }\r
+#ifdef GOTHIC\r
+ else if(gameInfo.variant == VariantGothic) { // [HGM] shogi: in Gothic Chancelor has alternative look\r
+ if(piece == WhiteMarshall) piece = WhiteSilver; else\r
+ if(piece == BlackMarshall) piece = BlackSilver;\r
+ }\r
+#endif\r
+\r
/* Calculate delay in milliseconds (2-delays per complete flash) */\r
flash_delay = 500 / appData.flashRate;\r
\r
\r
square_color = SquareColor(row, column);\r
\r
- if ( // [HGM] holdings: next 5 lines blank out area between board and holdings\r
+ if ( // [HGM] holdings: blank out area between board and holdings\r
column == BOARD_LEFT-1 || column == BOARD_RGHT\r
|| (column == BOARD_LEFT-2 && row < BOARD_HEIGHT-gameInfo.holdingsSize)\r
|| (column == BOARD_RGHT+1 && row >= gameInfo.holdingsSize) ) {\r
BlankSquare(x, y, 2, EmptySquare, xBoardWindow);\r
+\r
+ // [HGM] print piece counts next to holdings\r
+ string[1] = NULLCHAR;\r
+ if (column == (flipView ? BOARD_LEFT-1 : BOARD_RGHT) && piece > 1 ) {\r
+ string[0] = '0' + piece;\r
+ XTextExtents(countFontStruct, string, 1, &direction, \r
+ &font_ascent, &font_descent, &overall);\r
+ if (appData.monoMode) {\r
+ XDrawImageString(xDisplay, xBoardWindow, countGC,\r
+ x + squareSize - overall.width - 2, \r
+ y + font_ascent + 1, string, 1);\r
+ } else {\r
+ XDrawString(xDisplay, xBoardWindow, countGC,\r
+ x + squareSize - overall.width - 2, \r
+ y + font_ascent + 1, string, 1);\r
+ }\r
+ }\r
+ if (column == (flipView ? BOARD_RGHT : BOARD_LEFT-1) && piece > 1) {\r
+ string[0] = '0' + piece;\r
+ XTextExtents(countFontStruct, string, 1, &direction, \r
+ &font_ascent, &font_descent, &overall);\r
+ if (appData.monoMode) {\r
+ XDrawImageString(xDisplay, xBoardWindow, countGC,\r
+ x + 2, y + font_ascent + 1, string, 1);\r
+ } else {\r
+ XDrawString(xDisplay, xBoardWindow, countGC,\r
+ x + 2, y + font_ascent + 1, string, 1);\r
+ } \r
+ } \r
} else {\r
if (piece == EmptySquare || appData.blindfold) {\r
BlankSquare(x, y, square_color, piece, xBoardWindow);\r
}\r
\r
string[1] = NULLCHAR;\r
- if (appData.showCoords && row == (flipView ? BOARD_HEIGHT-1 : 0)) {\r
- string[0] = 'a' + column;\r
+ if (appData.showCoords && row == (flipView ? BOARD_HEIGHT-1 : 0)\r
+ && column >= BOARD_LEFT && column < BOARD_RGHT) {\r
+ string[0] = 'a' + column - BOARD_LEFT;\r
XTextExtents(coordFontStruct, string, 1, &direction, \r
&font_ascent, &font_descent, &overall);\r
if (appData.monoMode) {\r
y + squareSize - font_descent - 1, string, 1);\r
}\r
}\r
- if (appData.showCoords && column == (flipView ? BOARD_WIDTH-1 : 0)) {\r
+ if (appData.showCoords && column == (flipView ? BOARD_RGHT-1 : BOARD_LEFT)) {\r
string[0] = ONE + row;\r
XTextExtents(coordFontStruct, string, 1, &direction, \r
&font_ascent, &font_descent, &overall);\r
} else {\r
if (lineGap > 0)\r
XDrawSegments(xDisplay, xBoardWindow, lineGC,\r
- gridSegments, (BOARD_SIZE + 1) * 2);\r
+ gridSegments, BOARD_HEIGHT + BOARD_WIDTH + 2);\r
\r
for (i = 0; i < BOARD_HEIGHT; i++)\r
for (j = 0; j < BOARD_WIDTH; j++) {\r
XtSetArg(args[j], XtNleft, XtChainLeft); j++;\r
XtSetArg(args[j], XtNright, XtChainLeft); j++;\r
b_ok =\r
- XtCreateManagedWidget("ok", commandWidgetClass, form, args, j);\r
+ XtCreateManagedWidget(_("ok"), commandWidgetClass, form, args, j);\r
XtAddCallback(b_ok, XtNcallback, callback, (XtPointer) 0);\r
\r
j = 0;\r
XtSetArg(args[j], XtNleft, XtChainLeft); j++;\r
XtSetArg(args[j], XtNright, XtChainLeft); j++;\r
b_cancel =\r
- XtCreateManagedWidget("cancel", commandWidgetClass, form, args, j);\r
+ XtCreateManagedWidget(_("cancel"), commandWidgetClass, form, args, j);\r
XtAddCallback(b_cancel, XtNcallback, callback, (XtPointer) 0);\r
\r
j = 0;\r
XtSetArg(args[j], XtNleft, XtChainLeft); j++;\r
XtSetArg(args[j], XtNright, XtChainLeft); j++;\r
b_clear =\r
- XtCreateManagedWidget("clear", commandWidgetClass, form, args, j);\r
+ XtCreateManagedWidget(_("clear"), commandWidgetClass, form, args, j);\r
XtAddCallback(b_clear, XtNcallback, callback, (XtPointer) 0);\r
} else {\r
j = 0;\r
XtSetArg(args[j], XtNleft, XtChainLeft); j++;\r
XtSetArg(args[j], XtNright, XtChainLeft); j++;\r
b_close =\r
- XtCreateManagedWidget("close", commandWidgetClass, form, args, j);\r
+ XtCreateManagedWidget(_("close"), commandWidgetClass, form, args, j);\r
XtAddCallback(b_close, XtNcallback, callback, (XtPointer) 0);\r
\r
j = 0;\r
XtSetArg(args[j], XtNleft, XtChainLeft); j++;\r
XtSetArg(args[j], XtNright, XtChainLeft); j++;\r
b_edit =\r
- XtCreateManagedWidget("edit", commandWidgetClass, form, args, j);\r
+ XtCreateManagedWidget(_("edit"), commandWidgetClass, form, args, j);\r
XtAddCallback(b_edit, XtNcallback, callback, (XtPointer) 0);\r
}\r
\r
XtSetArg(args[j], XtNlabel, &name); j++;\r
XtGetValues(w, args, j);\r
\r
- if (strcmp(name, "ok") == 0) {\r
+ if (strcmp(name, _("ok")) == 0) {\r
edit = XtNameToWidget(editShell, "*form.text");\r
j = 0;\r
XtSetArg(args[j], XtNstring, &val); j++;\r
XtGetValues(edit, args, j);\r
ReplaceComment(savedIndex, val);\r
EditCommentPopDown();\r
- } else if (strcmp(name, "cancel") == 0) {\r
+ } else if (strcmp(name, _("cancel")) == 0) {\r
EditCommentPopDown();\r
- } else if (strcmp(name, "clear") == 0) {\r
+ } else if (strcmp(name, _("clear")) == 0) {\r
edit = XtNameToWidget(editShell, "*form.text");\r
XtCallActionProc(edit, "select-all", NULL, NULL, 0);\r
XtCallActionProc(edit, "kill-selection", NULL, NULL, 0);\r
Widget edit;\r
Arg args[16];\r
int j;\r
- char *title = "ICS Input";\r
+ char *title = _("ICS Input");\r
XtTranslations tr;\r
\r
if (ICSInputShell == NULL) {\r
XtSetArg(args[j], XtNlabel, &name); j++;\r
XtGetValues(w, args, j);\r
\r
- if (strcmp(name, "close") == 0) {\r
+ if (strcmp(name, _("close")) == 0) {\r
CommentPopDown();\r
- } else if (strcmp(name, "edit") == 0) {\r
+ } else if (strcmp(name, _("edit")) == 0) {\r
CommentPopDown();\r
EditCommentEvent();\r
}\r
XtPopdown(analysisShell);\r
XSync(xDisplay, False);\r
analysisUp = False;\r
+ if (appData.icsEngineAnalyze) ExitAnalyzeMode(); /* [DM] icsEngineAnalyze */\r
}\r
\r
\r
i = 0;\r
XtSetArg(args[i], XtNresizable, True); i++;\r
XtSetArg(args[i], XtNwidth, DIALOG_SIZE); i++;\r
+ XtSetArg(args[i], XtNtitle, XtNewString(_("File name prompt"))); i++;\r
fileNameShell = popup =\r
XtCreatePopupShell("File name prompt", transientShellWidgetClass,\r
shellWidget, args, i);\r
dialog = XtCreateManagedWidget("fileName", dialogWidgetClass,\r
layout, args, i);\r
\r
- XawDialogAddButton(dialog, "ok", FileNameCallback, (XtPointer) dialog);\r
- XawDialogAddButton(dialog, "cancel", FileNameCallback,\r
+ XawDialogAddButton(dialog, _("ok"), FileNameCallback, (XtPointer) dialog);\r
+ XawDialogAddButton(dialog, _("cancel"), FileNameCallback,\r
(XtPointer) dialog);\r
\r
XtRealizeWidget(popup);\r
XtSetArg(args[0], XtNlabel, &name);\r
XtGetValues(w, args, 1);\r
\r
- if (strcmp(name, "cancel") == 0) {\r
+ if (strcmp(name, _("cancel")) == 0) {\r
FileNamePopDown();\r
return;\r
}\r
}\r
fullname = ExpandPathName(buf);\r
if (!fullname) {\r
- ErrorPopUp("Error", "Can't open file", FALSE);\r
+ ErrorPopUp(_("Error"), _("Can't open file"), FALSE);\r
}\r
else {\r
f = fopen(fullname, fileOpenMode);\r
if (f == NULL) {\r
- DisplayError("Failed to open file", errno);\r
+ DisplayError(_("Failed to open file"), errno);\r
} else {\r
(void) (*fileProc)(f, index, buf);\r
}\r
\r
j = 0;\r
XtSetArg(args[j], XtNresizable, True); j++;\r
+ XtSetArg(args[j], XtNtitle, XtNewString(_("Promotion"))); j++;\r
promotionShell =\r
XtCreatePopupShell("Promotion", transientShellWidgetClass,\r
shellWidget, args, j);\r
layoutArgs, XtNumber(layoutArgs));\r
\r
j = 0;\r
- XtSetArg(args[j], XtNlabel, "Promote pawn to what?"); j++;\r
+ XtSetArg(args[j], XtNlabel, _("Promote pawn to what?")); j++;\r
XtSetArg(args[j], XtNborderWidth, 0); j++;\r
dialog = XtCreateManagedWidget("promotion", dialogWidgetClass,\r
layout, args, j);\r
\r
- XawDialogAddButton(dialog, "Queen", PromotionCallback, \r
+ XawDialogAddButton(dialog, _("Queen"), PromotionCallback, \r
(XtPointer) dialog);\r
- XawDialogAddButton(dialog, "Rook", PromotionCallback, \r
+ XawDialogAddButton(dialog, _("Rook"), PromotionCallback, \r
(XtPointer) dialog);\r
- XawDialogAddButton(dialog, "Bishop", PromotionCallback, \r
+ XawDialogAddButton(dialog, _("Bishop"), PromotionCallback, \r
(XtPointer) dialog);\r
- XawDialogAddButton(dialog, "Knight", PromotionCallback, \r
+ XawDialogAddButton(dialog, _("Knight"), PromotionCallback, \r
(XtPointer) dialog);\r
if (!appData.testLegality || gameInfo.variant == VariantSuicide ||\r
gameInfo.variant == VariantGiveaway) {\r
- XawDialogAddButton(dialog, "King", PromotionCallback, \r
+ XawDialogAddButton(dialog, _("King"), PromotionCallback, \r
(XtPointer) dialog);\r
}\r
- XawDialogAddButton(dialog, "cancel", PromotionCallback, \r
+ XawDialogAddButton(dialog, _("cancel"), PromotionCallback, \r
(XtPointer) dialog);\r
\r
XtRealizeWidget(promotionShell);\r
\r
if (fromX == -1) return;\r
\r
- if (strcmp(name, "cancel") == 0) {\r
+ if (strcmp(name, _("cancel")) == 0) {\r
fromX = fromY = -1;\r
ClearHighlights();\r
return;\r
- } else if (strcmp(name, "Knight") == 0) {\r
+ } else if (strcmp(name, _("Knight")) == 0) {\r
promoChar = 'n';\r
} else {\r
promoChar = ToLower(name[0]);\r
dialog = XtCreateManagedWidget("dialog", dialogWidgetClass,\r
layout, args, i);\r
\r
- XawDialogAddButton(dialog, "ok", ErrorCallback, (XtPointer) dialog);\r
+ XawDialogAddButton(dialog, _("ok"), ErrorCallback, (XtPointer) dialog);\r
\r
XtRealizeWidget(errorShell);\r
CatchDeleteWindow(errorShell, "ErrorPopDown");\r
if (gameNumber == 0) {\r
int error = GameListBuild(f);\r
if (error) {\r
- DisplayError("Cannot build game list", error);\r
+ DisplayError(_("Cannot build game list"), error);\r
} else if (!ListEmpty(&gameList) &&\r
((ListGame *) gameList.tailPred)->number > 1) {\r
GameListPopUp(f, title);\r
if (gameMode == AnalyzeMode || gameMode == AnalyzeFile) {\r
Reset(FALSE, TRUE);\r
}\r
- FileNamePopUp("Load game file name?", "", LoadGamePopUp, "rb");\r
+ FileNamePopUp(_("Load game file name?"), "", LoadGamePopUp, "rb");\r
}\r
\r
void LoadNextGameProc(w, event, prms, nprms)\r
if (gameMode == AnalyzeMode || gameMode == AnalyzeFile) {\r
Reset(FALSE, TRUE);\r
}\r
- FileNamePopUp("Load position file name?", "", LoadPosition, "rb");\r
+ FileNamePopUp(_("Load position file name?"), "", LoadPosition, "rb");\r
}\r
\r
void SaveGameProc(w, event, prms, nprms)\r
String *prms;\r
Cardinal *nprms;\r
{\r
- FileNamePopUp("Save game file name?",\r
+ FileNamePopUp(_("Save game file name?"),\r
DefaultFileName(appData.oldSaveStyle ? "game" : "pgn"),\r
SaveGame, "a");\r
}\r
String *prms;\r
Cardinal *nprms;\r
{\r
- FileNamePopUp("Save position file name?",\r
+ FileNamePopUp(_("Save position file name?"),\r
DefaultFileName(appData.oldSaveStyle ? "pos" : "fen"),\r
SavePosition, "a");\r
}\r
}\r
f = fopen(gamePasteFilename, "w");\r
if (f == NULL) {\r
- DisplayError("Can't open temp file", errno);\r
+ DisplayError(_("Can't open temp file"), errno);\r
return;\r
}\r
fwrite(value, 1, *len, f);\r
String *prms;\r
Cardinal *nprms;\r
{\r
+ char buf[MSG_SIZ];\r
+ \r
if (!first.analysisSupport) {\r
- char buf[MSG_SIZ];\r
- sprintf(buf, "%s does not support analysis", first.tidy);\r
+ sprintf(buf, _("%s does not support analysis"), first.tidy);\r
DisplayError(buf, 0);\r
return;\r
}\r
+ /* [DM] icsEngineAnalyze [HGM] This is horrible code; reverse the gameMode and isEngineAnalyze tests! */\r
+ if (appData.icsActive) {\r
+ if (gameMode != IcsObserving) {\r
+ sprintf(buf,_("You are not observing a game"));\r
+ DisplayError(buf, 0);\r
+ /* secure check */\r
+ if (appData.icsEngineAnalyze) {\r
+ if (appData.debugMode)\r
+ fprintf(debugFP, _("Found unexpected active ICS engine analyze \n"));\r
+ ExitAnalyzeMode();\r
+ ModeHighlight();\r
+ }\r
+ return;\r
+ }\r
+ /* if enable, use want disable icsEngineAnalyze */\r
+ if (appData.icsEngineAnalyze) {\r
+ ExitAnalyzeMode();\r
+ ModeHighlight();\r
+ return;\r
+ }\r
+ appData.icsEngineAnalyze = TRUE;\r
+ if (appData.debugMode)\r
+ fprintf(debugFP, _("ICS engine analyze starting... \n"));\r
+ } \r
if (!appData.showThinking)\r
ShowThinkingProc(w,event,prms,nprms);\r
\r
{\r
if (!first.analysisSupport) {\r
char buf[MSG_SIZ];\r
- sprintf(buf, "%s does not support analysis", first.tidy);\r
+ sprintf(buf, _("%s does not support analysis"), first.tidy);\r
DisplayError(buf, 0);\r
return;\r
}\r
ShowThinkingProc(w,event,prms,nprms);\r
\r
AnalyzeFileEvent();\r
- FileNamePopUp("File to analyze", "", LoadGamePopUp, "rb");\r
+ FileNamePopUp(_("File to analyze"), "", LoadGamePopUp, "rb");\r
AnalysisPeriodicEvent(1);\r
}\r
\r
{\r
Arg args[16];\r
\r
- ShowThinkingEvent(!appData.showThinking);\r
-\r
+ appData.showThinking = !appData.showThinking; // [HGM] thinking: tken out of ShowThinkingEvent\r
+ ShowThinkingEvent();\r
+#if 0\r
+ // [HGM] thinking: currently no suc menu item; replaced by Hide Thinking (From Human)\r
if (appData.showThinking) {\r
XtSetArg(args[0], XtNleftBitmap, xMarkPixmap);\r
} else {\r
}\r
XtSetValues(XtNameToWidget(menuBarWidget, "menuOptions.Show Thinking"),\r
args, 1);\r
+#endif\r
+}\r
+\r
+void HideThinkingProc(w, event, prms, nprms)\r
+ Widget w;\r
+ XEvent *event;\r
+ String *prms;\r
+ Cardinal *nprms;\r
+{\r
+ Arg args[16];\r
+\r
+ appData.hideThinkingFromHuman = !appData.hideThinkingFromHuman; // [HGM] thinking: tken out of ShowThinkingEvent\r
+ ShowThinkingEvent();\r
+\r
+ if (appData.hideThinkingFromHuman) {\r
+ XtSetArg(args[0], XtNleftBitmap, xMarkPixmap);\r
+ } else {\r
+ XtSetArg(args[0], XtNleftBitmap, None);\r
+ }\r
+ XtSetValues(XtNameToWidget(menuBarWidget, "menuOptions.Hide Thinking"),\r
+ args, 1);\r
}\r
\r
void InfoProc(w, event, prms, nprms)\r
#else\r
char *zippy = "";\r
#endif\r
- sprintf(buf, "%s%s\n\n%s\n%s\n\n%s%s\n%s",\r
+ sprintf(buf, "%s%s\n\n%s\n%s\n%s\n%s\n\n%s%s\n%s",\r
programVersion, zippy,\r
"Copyright 1991 Digital Equipment Corporation",\r
"Enhancements Copyright 1992-2001 Free Software Foundation",\r
+ "Enhancements Copyright 2005 Alessandro Scotti",\r
+ "Enhancements Copyright 2007-2008 H.G.Muller",\r
PRODUCT, " is free software and carries NO WARRANTY;",\r
"see the file COPYING for more information.");\r
- ErrorPopUp("About XBoard", buf, FALSE);\r
+ ErrorPopUp(_("About XBoard"), buf, FALSE);\r
}\r
\r
void DebugProc(w, event, prms, nprms)\r
} else if (appData.cmailGameName[0] != NULLCHAR) {\r
sprintf(icon, "%s", "CMail");\r
sprintf(title, "%s: %s", programName, "CMail");\r
+#ifdef GOTHIC\r
+ // [HGM] license: This stuff should really be done in back-end, but WinBoard already had a pop-up for it\r
+ } else if (gameInfo.variant == VariantGothic) {\r
+ strcpy(icon, programName);\r
+ strcpy(title, GOTHIC);\r
+#endif\r
+#ifdef FALCON\r
+ } else if (gameInfo.variant == VariantFalcon) {\r
+ strcpy(icon, programName);\r
+ strcpy(title, FALCON);\r
+#endif\r
} else if (appData.noChessProgram) {\r
strcpy(icon, programName);\r
strcpy(title, programName);\r
sprintf(buf, "%s: %s", message, strerror(error));\r
message = buf;\r
} \r
- ErrorPopUp("Error", message, FALSE);\r
+ ErrorPopUp(_("Error"), message, FALSE);\r
}\r
\r
\r
fprintf(stderr, "%s: %s\n", programName, message);\r
}\r
if (appData.popupMoveErrors) {\r
- ErrorPopUp("Error", message, FALSE);\r
+ ErrorPopUp(_("Error"), message, FALSE);\r
} else {\r
DisplayMessage(message, "");\r
}\r
message = buf;\r
}\r
if (appData.popupExitMessage && boardWidget && XtIsRealized(boardWidget)) {\r
- ErrorPopUp(status ? "Fatal Error" : "Exiting", message, TRUE);\r
+ ErrorPopUp(status ? _("Fatal Error") : _("Exiting"), message, TRUE);\r
} else {\r
ExitEvent(status);\r
}\r
String message;\r
{\r
ErrorPopDown();\r
- ErrorPopUp("Information", message, TRUE);\r
+ ErrorPopUp(_("Information"), message, TRUE);\r
}\r
\r
void DisplayNote(message)\r
String message;\r
{\r
ErrorPopDown();\r
- ErrorPopUp("Note", message, FALSE);\r
+ ErrorPopUp(_("Note"), message, FALSE);\r
}\r
\r
static int\r
Cardinal *nprms;\r
{\r
if (*nprms != 4) {\r
- fprintf(stderr, "AskQuestionProc needed 4 parameters, got %d\n",\r
+ fprintf(stderr, _("AskQuestionProc needed 4 parameters, got %d\n"),\r
*nprms);\r
return;\r
}\r
OutputToProcess(pendingReplyPR, buf, strlen(buf), &err);\r
AskQuestionPopDown();\r
\r
- if (err) DisplayFatalError("Error writing to chess program", err, 0);\r
+ if (err) DisplayFatalError(_("Error writing to chess program"), err, 0);\r
}\r
\r
void AskQuestionCallback(w, client_data, call_data)\r
XtSetArg(args[0], XtNlabel, &name);\r
XtGetValues(w, args, 1);\r
\r
- if (strcmp(name, "cancel") == 0) {\r
+ if (strcmp(name, _("cancel")) == 0) {\r
AskQuestionPopDown();\r
} else {\r
AskQuestionReplyAction(w, NULL, NULL, NULL);\r
dialog = XtCreateManagedWidget("question", dialogWidgetClass,\r
layout, args, i);\r
\r
- XawDialogAddButton(dialog, "enter", AskQuestionCallback,\r
+ XawDialogAddButton(dialog, _("enter"), AskQuestionCallback,\r
(XtPointer) dialog);\r
- XawDialogAddButton(dialog, "cancel", AskQuestionCallback,\r
+ XawDialogAddButton(dialog, _("cancel"), AskQuestionCallback,\r
(XtPointer) dialog);\r
\r
XtRealizeWidget(popup);\r
count = strlen(buf);\r
outCount = OutputToProcess(NoProc, buf, count, &error);\r
if (outCount < count) {\r
- DisplayFatalError("Error writing to display", error, 1);\r
+ DisplayFatalError(_("Error writing to display"), error, 1);\r
}\r
\r
if (continuation) return;\r
pwd = getpwnam(buf);\r
if (!pwd)\r
{\r
- fprintf(stderr, "ERROR: Unknown user %s (in path %s)\n",\r
+ fprintf(stderr, _("ERROR: Unknown user %s (in path %s)\n"),\r
buf, path);\r
return NULL;\r
}\r
XtPointer arg;\r
XtIntervalId *id;\r
{\r
- if (gameMode == AnalyzeMode || gameMode == AnalyzeFile) {\r
+ if (gameMode == AnalyzeMode || gameMode == AnalyzeFile \r
+ || appData.icsEngineAnalyze) { // [DM]\r
AnalysisPeriodicEvent(0);\r
StartAnalysisClock();\r
}\r
int highlight;\r
{\r
Arg args[16];\r
- DisplayTimerLabel(whiteTimerWidget, "White", timeRemaining, highlight);\r
+\r
+ if(appData.noGUI) return;\r
+ DisplayTimerLabel(whiteTimerWidget, _("White"), timeRemaining, highlight);\r
if (highlight && iconPixmap == bIconPixmap) {\r
iconPixmap = wIconPixmap;\r
XtSetArg(args[0], XtNiconPixmap, iconPixmap);\r
int highlight;\r
{\r
Arg args[16];\r
- DisplayTimerLabel(blackTimerWidget, "Black", timeRemaining, highlight);\r
+\r
+ if(appData.noGUI) return;\r
+ DisplayTimerLabel(blackTimerWidget, _("Black"), timeRemaining, highlight);\r
if (highlight && iconPixmap == wIconPixmap) {\r
iconPixmap = bIconPixmap;\r
XtSetArg(args[0], XtNiconPixmap, iconPixmap);\r
\r
if ((pid = fork()) == 0) {\r
/* Child process */\r
- dup2(to_prog[0], 0);\r
- dup2(from_prog[1], 1);\r
- close(to_prog[0]);\r
- close(to_prog[1]);\r
+ // [HGM] PSWBTM: made order resistant against case where fd of created pipe was 0 or 1\r
+ close(to_prog[1]); // first close the unused pipe ends\r
close(from_prog[0]);\r
- close(from_prog[1]);\r
- dup2(1, fileno(stderr)); /* force stderr to the pipe */\r
+ dup2(to_prog[0], 0); // to_prog was created first, nd is the only one to use 0 or 1\r
+ dup2(from_prog[1], 1);\r
+ if(to_prog[0] >= 2) close(to_prog[0]); // if 0 or 1, the dup2 already cosed the original\r
+ close(from_prog[1]); // and closing again loses one of the pipes!\r
+ if(fileno(stderr) >= 2) // better safe than sorry...\r
+ dup2(1, fileno(stderr)); /* force stderr to the pipe */\r
\r
if (dir[0] != NULLCHAR && chdir(dir) != 0) {\r
perror(dir);\r
exit(1);\r
}\r
\r
+ nice(appData.niceEngines); // [HGM] nice: adjust priority of engine proc\r
+\r
execvp(argv[0], argv);\r
\r
/* If we get here, exec failed */\r
return 0;\r
}\r
\r
+// [HGM] kill: implement the 'hard killing' of AS's Winboard_x\r
+static RETSIGTYPE AlarmCallBack(int n)\r
+{\r
+ return;\r
+}\r
+\r
void\r
-DestroyChildProcess(pr, signal)\r
+DestroyChildProcess(pr, signalType)\r
ProcRef pr;\r
- int signal;\r
+ int signalType;\r
{\r
ChildProc *cp = (ChildProc *) pr;\r
\r
if (cp->kind != CPReal) return;\r
cp->kind = CPNone;\r
- if (signal) {\r
- kill(cp->pid, SIGTERM);\r
+ if (signalType == 10) { // [HGM] kill: if it does not terminate in 3 sec, kill\r
+ signal(SIGALRM, AlarmCallBack);\r
+ alarm(3);\r
+ if(wait((int *) 0) == -1) { // process does not terminate on its own accord\r
+ kill(cp->pid, SIGKILL); // kill it forcefully\r
+ wait((int *) 0); // and wait again\r
+ }\r
+ } else {\r
+ if (signalType) {\r
+ kill(cp->pid, signalType == 9 ? SIGKILL : SIGTERM); // [HGM] kill: use hard kill if so requested\r
+ }\r
+ /* Process is exiting either because of the kill or because of\r
+ a quit command sent by the backend; either way, wait for it to die.\r
+ */\r
+ wait((int *) 0);\r
}\r
- /* Process is exiting either because of the kill or because of\r
- a quit command sent by the backend; either way, wait for it to die.\r
- */\r
- wait((int *) 0);\r
close(cp->fdFrom);\r
close(cp->fdTo);\r
}\r
ProcRef *pr;\r
{\r
#if OMIT_SOCKETS\r
- DisplayFatalError("Socket support is not configured in", 0, 2);\r
+ DisplayFatalError(_("Socket support is not configured in"), 0, 2);\r
#else /* !OMIT_SOCKETS */\r
int s;\r
struct sockaddr_in sa;\r
char *host, *user, *cmd;\r
ProcRef *pr;\r
{\r
- DisplayFatalError("internal rcmd not implemented for Unix", 0, 1);\r
+ DisplayFatalError(_("internal rcmd not implemented for Unix"), 0, 1);\r
return -1;\r
} \r
\r
#endif\r
\r
if (appData.debugMode) {\r
- printf("AnimateMove: piece %d %s from %d,%d to %d,%d \n",\r
- piece, hop ? "hops" : "slides", fromX, fromY, toX, toY);\r
- }\r
+ fprintf(debugFP, hop ? _("AnimateMove: piece %d hops from %d,%d to %d,%d \n") :\r
+ _("AnimateMove: piece %d slides from %d,%d to %d,%d \n"),\r
+ piece, fromX, fromY, toX, toY); }\r
\r
ScreenSquare(fromX, fromY, &start, &startColor);\r
ScreenSquare(toX, toY, &finish, &endColor);\r
SetProgramStats( FrontEndProgramStats * stats )\r
{\r
// [HR] TODO\r
+ // [HGM] done, but perhaps backend should call this directly?\r
+ EngineOutputUpdate( stats );\r
}\r