X-Git-Url: http://winboard.nl/cgi-bin?a=blobdiff_plain;f=xboard.c;h=6584d2adf4012b41909c36403849cfa3172d5f87;hb=14fa496aee4fc5ff4288ac254937a0cab78c12eb;hp=e08a5f5ce5b49559e6c2e73efad3aef7260d5c0b;hpb=3b417f05cba6e7b573d351790ef28cc2476fc407;p=xboard.git diff --git a/xboard.c b/xboard.c index e08a5f5..6584d2a 100644 --- a/xboard.c +++ b/xboard.c @@ -5,7 +5,7 @@ * Massachusetts. * * Enhancements Copyright 1992-2001, 2002, 2003, 2004, 2005, 2006, - * 2007, 2008, 2009, 2010 Free Software Foundation, Inc. + * 2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc. * * The following terms apply to Digital Equipment Corporation's copyright * interest in XBoard: @@ -60,6 +60,7 @@ #include #include #include +#include #if !OMIT_SOCKETS # if HAVE_SYS_SOCKET_H @@ -141,12 +142,6 @@ extern char *getenv(); # endif #endif - -# if HAVE_LIBREADLINE /* add gnu-readline support */ -#include -#include -# endif - #include #include #include @@ -231,21 +226,23 @@ void EvalGraphProc P((Widget w, XEvent *event, typedef struct { String string; + String ref; XtActionProc proc; } MenuItem; typedef struct { String name; + String ref; MenuItem *mi; } Menu; int main P((int argc, char **argv)); FILE * XsraSelFile P((Widget w, char *prompt, char *ok, char *cancel, char *failed, - char *init_path, char *mode, int (*show_entry)(), char **name_return)); + char *init_path, char *filter, char *mode, int (*show_entry)(), char **name_return)); RETSIGTYPE CmailSigHandler P((int sig)); RETSIGTYPE IntSigHandler P((int sig)); RETSIGTYPE TermSizeSigHandler P((int sig)); -void CreateGCs P((void)); +void CreateGCs P((int redo)); void CreateXIMPieces P((void)); void CreateXPMPieces P((void)); void CreateXPMBoard P((char *s, int n)); @@ -286,11 +283,9 @@ void CommentClick P((Widget w, XEvent * event, String * params, Cardinal * nParams)); void CommentPopUp P((char *title, char *label)); void CommentPopDown P((void)); -void CommentCallback P((Widget w, XtPointer client_data, - XtPointer call_data)); void ICSInputBoxPopUp P((void)); void ICSInputBoxPopDown P((void)); -void FileNamePopUp P((char *label, char *def, +void FileNamePopUp P((char *label, char *def, char *filter, FileProc proc, char *openMode)); void FileNamePopDown P((void)); void FileNameCallback P((Widget w, XtPointer client_data, @@ -305,9 +300,6 @@ void AskQuestionPopDown P((void)); void PromotionPopDown P((void)); void PromotionCallback P((Widget w, XtPointer client_data, XtPointer call_data)); -void EditCommentPopDown P((void)); -void EditCommentCallback P((Widget w, XtPointer client_data, - XtPointer call_data)); void SelectCommand P((Widget w, XtPointer client_data, XtPointer call_data)); void ResetProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms)); void LoadGameProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms)); @@ -349,6 +341,8 @@ void AnalyzeFileProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms)); void TwoMachinesProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms)); +void MatchProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms)); +void MatchOptionsProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms)); void IcsClientProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms)); void EditGameProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms)); @@ -395,28 +389,21 @@ void AnimateDraggingProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms)); void AnimateMovingProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms)); -void AutocommProc P((Widget w, XEvent *event, String *prms, - Cardinal *nprms)); void AutoflagProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms)); void AutoflipProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms)); -void AutobsProc P((Widget w, XEvent *event, String *prms, - Cardinal *nprms)); -void AutoraiseProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms)); -void AutosaveProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms)); void BlindfoldProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms)); void FlashMovesProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms)); void FlipViewProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms)); -void GetMoveListProc P((Widget w, XEvent *event, String *prms, - Cardinal *nprms)); void HighlightDraggingProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms)); void HighlightLastMoveProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms)); +void HighlightArrowProc P((Widget w, XEvent *event, String *prms, + Cardinal *nprms)); void MoveSoundProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms)); -void IcsAlarmProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms)); -void OldSaveStyleProc P((Widget w, XEvent *event, String *prms, - Cardinal *nprms)); +//void IcsAlarmProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms)); +void OneClickProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms)); void PeriodicUpdatesProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms)); void PonderNextMoveProc P((Widget w, XEvent *event, String *prms, @@ -425,8 +412,7 @@ void PopupMoveErrorsProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms)); void PopupExitMessageProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms)); -void PremoveProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms)); -void QuietPlayProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms)); +//void PremoveProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms)); void ShowCoordsProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms)); void ShowThinkingProc P((Widget w, XEvent *event, String *prms, @@ -461,24 +447,26 @@ void ShuffleMenuProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms)) void EngineMenuProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms)); void UciMenuProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms)); void TimeControlProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms)); +void OptionsProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms)); void NewVariantProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms)); +void IcsTextProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms)); void FirstSettingsProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms)); void SecondSettingsProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms)); void GameListOptionsPopUp P((Widget w, XEvent *event, String *prms, Cardinal *nprms)); +void IcsOptionsProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms)); +void SoundOptionsProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms)); +void BoardOptionsProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms)); +void LoadOptionsProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms)); +void SaveOptionsProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms)); void GameListOptionsPopDown P(()); void ShufflePopDown P(()); -void EnginePopDown P(()); -void UciPopDown P(()); void TimeControlPopDown P(()); -void NewVariantPopDown P(()); -void SettingsPopDown P(()); +void GenericPopDown P(()); void update_ics_width P(()); int get_term_width P(()); int CopyMemoProc P(()); - -# if HAVE_LIBREADLINE /* add gnu-readline support */ -static void ReadlineCompleteHandler P((char *)); -# endif +void DrawArrowHighlight P((int fromX, int fromY, int toX,int toY)); +Boolean IsDrawArrowEnabled P(()); /* * XBoard depends on Xt R4 or higher @@ -515,13 +503,6 @@ FileProc fileProc; char *fileOpenMode; char installDir[] = "."; // [HGM] UCI: needed for UCI; probably needs run-time initializtion -# if HAVE_LIBREADLINE /* gnu readline support */ -static char* readline_buffer; -static int readline_complete=0; -extern int sending_ICS_login; -extern int sending_ICS_password; -#endif - Position commentX = -1, commentY = -1; Dimension commentW, commentH; typedef unsigned int BoardSize; @@ -534,7 +515,7 @@ int squareSize, smallLayout = 0, tinyLayout = 0, fromX = -1, fromY = -1, toX, toY, commentUp = False, analysisUp = False, ICSInputBoxUp = False, askQuestionUp = False, filenameUp = False, promotionUp = False, pmFromX = -1, pmFromY = -1, - editUp = False, errorUp = False, errorExitStatus = -1, lineGap; + errorUp = False, errorExitStatus = -1, lineGap, defaultLineGap; Pixel timerForegroundPixel, timerBackgroundPixel; Pixel buttonForegroundPixel, buttonBackgroundPixel; char *chessDir, *programName, *programVersion, @@ -556,6 +537,9 @@ WindowPlacement wpEngineOutput; WindowPlacement wpGameList; WindowPlacement wpTags; +extern Widget shells[]; +extern Boolean shellUp[]; + #define SOLID 0 #define OUTLINE 1 Pixmap pieceBitmap[2][(int)BlackPawn]; @@ -608,166 +592,194 @@ static Pixmap xpmMask[BlackKing + 1]; SizeDefaults sizeDefaults[] = SIZE_DEFAULTS; MenuItem fileMenu[] = { - {N_("New Game"), ResetProc}, - {N_("New Shuffle Game ..."), ShuffleMenuProc}, - {N_("New Variant ..."), NewVariantProc}, // [HGM] variant: not functional yet - {"----", NothingProc}, - {N_("Load Game"), LoadGameProc}, - {N_("Load Next Game"), LoadNextGameProc}, - {N_("Load Previous Game"), LoadPrevGameProc}, - {N_("Reload Same Game"), ReloadGameProc}, - {N_("Save Game"), SaveGameProc}, - {"----", NothingProc}, - {N_("Copy Game"), CopyGameProc}, - {N_("Paste Game"), PasteGameProc}, - {"----", NothingProc}, - {N_("Load Position"), LoadPositionProc}, - {N_("Load Next Position"), LoadNextPositionProc}, - {N_("Load Previous Position"), LoadPrevPositionProc}, - {N_("Reload Same Position"), ReloadPositionProc}, - {N_("Save Position"), SavePositionProc}, - {"----", NothingProc}, - {N_("Copy Position"), CopyPositionProc}, - {N_("Paste Position"), PastePositionProc}, - {"----", NothingProc}, - {N_("Mail Move"), MailMoveProc}, - {N_("Reload CMail Message"), ReloadCmailMsgProc}, - {"----", NothingProc}, - {N_("Exit"), QuitProc}, - {NULL, NULL} + {N_("New Game Ctrl+N"), "New Game", ResetProc}, + {N_("New Shuffle Game ..."), "New Shuffle Game", ShuffleMenuProc}, + {N_("New Variant ... Alt+Shift+V"), "New Variant", NewVariantProc}, // [HGM] variant: not functional yet + {"----", NULL, NothingProc}, + {N_("Load Game Ctrl+O"), "Load Game", LoadGameProc}, + {N_("Load Position Ctrl+Shift+O"), "Load Position", LoadPositionProc}, +// {N_("Load Next Game"), "Load Next Game", LoadNextGameProc}, +// {N_("Load Previous Game"), "Load Previous Game", LoadPrevGameProc}, +// {N_("Reload Same Game"), "Reload Same Game", ReloadGameProc}, + {N_("Next Position Shift+PgDn"), "Load Next Position", LoadNextPositionProc}, + {N_("Prev Position Shift+PgUp"), "Load Previous Position", LoadPrevPositionProc}, + {"----", NULL, NothingProc}, +// {N_("Reload Same Position"), "Reload Same Position", ReloadPositionProc}, + {N_("Save Game Ctrl+S"), "Save Game", SaveGameProc}, + {N_("Save Position Ctrl+Shift+S"), "Save Position", SavePositionProc}, + {"----", NULL, NothingProc}, + {N_("Mail Move"), "Mail Move", MailMoveProc}, + {N_("Reload CMail Message"), "Reload CMail Message", ReloadCmailMsgProc}, + {"----", NULL, NothingProc}, + {N_("Quit Ctr+Q"), "Exit", QuitProc}, + {NULL, NULL, NULL} +}; + +MenuItem editMenu[] = { + {N_("Copy Game Ctrl+C"), "Copy Game", CopyGameProc}, + {N_("Copy Position Ctrl+Shift+C"), "Copy Position", CopyPositionProc}, + {"----", NULL, NothingProc}, + {N_("Paste Game Ctrl+V"), "Paste Game", PasteGameProc}, + {N_("Paste Position Ctrl+Shift+V"), "Paste Position", PastePositionProc}, + {"----", NULL, NothingProc}, + {N_("Edit Game Ctrl+E"), "Edit Game", EditGameProc}, + {N_("Edit Position Ctrl+Shift+E"), "Edit Position", EditPositionProc}, + {N_("Edit Tags"), "Edit Tags", EditTagsProc}, + {N_("Edit Comment"), "Edit Comment", EditCommentProc}, + {"----", NULL, NothingProc}, + {N_("Revert Home"), "Revert", RevertProc}, + {N_("Annotate"), "Annotate", AnnotateProc}, + {N_("Truncate Game End"), "Truncate Game", TruncateGameProc}, + {"----", NULL, NothingProc}, + {N_("Backward Alt+Left"), "Backward", BackwardProc}, + {N_("Forward Alt+Right"), "Forward", ForwardProc}, + {N_("Back to Start Alt+Home"), "Back to Start", ToStartProc}, + {N_("Forward to End Alt+End"), "Forward to End", ToEndProc}, + {NULL, NULL, NULL} +}; + +MenuItem viewMenu[] = { + {N_("Flip View F2"), "Flip View", FlipViewProc}, + {"----", NULL, NothingProc}, + {N_("Engine Output Alt+Shift+O"), "Show Engine Output", EngineOutputProc}, + {N_("Move History Alt+Shift+H"), "Show Move History", HistoryShowProc}, // [HGM] hist: activate 4.2.7 code + {N_("Evaluation Graph Alt+Shift+E"), "Show Evaluation Graph", EvalGraphProc}, + {N_("Game List Alt+Shift+G"), "Show Game List", ShowGameListProc}, + {N_("ICS text menu"), "ICStex", IcsTextProc}, + {"----", NULL, NothingProc}, + {N_("Tags"), "Show Tags", EditTagsProc}, + {N_("Comments"), "Show Comments", EditCommentProc}, + {N_("ICS Input Box"), "ICS Input Box", IcsInputBoxProc}, + {"----", NULL, NothingProc}, + {N_("Board..."), "Board Options", BoardOptionsProc}, + {N_("Game List Tags..."), "Game List", GameListOptionsPopUp}, + {NULL, NULL, NULL} }; MenuItem modeMenu[] = { - {N_("Machine White"), MachineWhiteProc}, - {N_("Machine Black"), MachineBlackProc}, - {N_("Two Machines"), TwoMachinesProc}, - {N_("Analysis Mode"), AnalyzeModeProc}, - {N_("Analyze File"), AnalyzeFileProc }, - {N_("ICS Client"), IcsClientProc}, - {N_("Edit Game"), EditGameProc}, - {N_("Edit Position"), EditPositionProc}, - {N_("Training"), TrainingProc}, - {"----", NothingProc}, - {N_("Show Engine Output"), EngineOutputProc}, - {N_("Show Evaluation Graph"), EvalGraphProc}, - {N_("Show Game List"), ShowGameListProc}, - {N_("Show Move History"), HistoryShowProc}, // [HGM] hist: activate 4.2.7 code - {"----", NothingProc}, - {N_("Edit Tags"), EditTagsProc}, - {N_("Edit Comment"), EditCommentProc}, - {N_("ICS Input Box"), IcsInputBoxProc}, - {N_("Pause"), PauseProc}, - {NULL, NULL} + {N_("Machine White Ctrl+W"), "Machine White", MachineWhiteProc}, + {N_("Machine Black Ctrl+B"), "Machine Black", MachineBlackProc}, + {N_("Two Machines Ctrl+T"), "Two Machines", TwoMachinesProc}, + {N_("Analysis Mode Ctrl+A"), "Analysis Mode", AnalyzeModeProc}, + {N_("Analyze File Ctrl+F"), "Analyze File", AnalyzeFileProc }, + {N_("Edit Game Ctrl+E"), "Edit Game", EditGameProc}, + {N_("Edit Position Ctrl+Shift+E"), "Edit Position", EditPositionProc}, + {N_("Training"), "Training", TrainingProc}, + {N_("ICS Client"), "ICS Client", IcsClientProc}, + {"----", NULL, NothingProc}, + {N_("Machine Match"), "Machine Match", MatchProc}, + {N_("Pause Pause"), "Pause", PauseProc}, + {NULL, NULL, NULL} }; MenuItem actionMenu[] = { - {N_("Accept"), AcceptProc}, - {N_("Decline"), DeclineProc}, - {N_("Rematch"), RematchProc}, - {"----", NothingProc}, - {N_("Call Flag"), CallFlagProc}, - {N_("Draw"), DrawProc}, - {N_("Adjourn"), AdjournProc}, - {N_("Abort"), AbortProc}, - {N_("Resign"), ResignProc}, - {"----", NothingProc}, - {N_("Stop Observing"), StopObservingProc}, - {N_("Stop Examining"), StopExaminingProc}, - {N_("Upload to Examine"), UploadProc}, - {"----", NothingProc}, - {N_("Adjudicate to White"), AdjuWhiteProc}, - {N_("Adjudicate to Black"), AdjuBlackProc}, - {N_("Adjudicate Draw"), AdjuDrawProc}, - {NULL, NULL} + {N_("Accept F3"), "Accept", AcceptProc}, + {N_("Decline F4"), "Decline", DeclineProc}, + {N_("Rematch F12"), "Rematch", RematchProc}, + {"----", NULL, NothingProc}, + {N_("Call Flag F5"), "Call Flag", CallFlagProc}, + {N_("Draw F6"), "Draw", DrawProc}, + {N_("Adjourn F7"), "Adjourn", AdjournProc}, + {N_("Abort F8"),"Abort", AbortProc}, + {N_("Resign F9"), "Resign", ResignProc}, + {"----", NULL, NothingProc}, + {N_("Stop Observing F10"), "Stop Observing", StopObservingProc}, + {N_("Stop Examining F11"), "Stop Examining", StopExaminingProc}, + {N_("Upload to Examine"), "Upload to Examine", UploadProc}, + {"----", NULL, NothingProc}, + {N_("Adjudicate to White"), "Adjudicate to White", AdjuWhiteProc}, + {N_("Adjudicate to Black"), "Adjudicate to Black", AdjuBlackProc}, + {N_("Adjudicate Draw"), "Adjudicate Draw", AdjuDrawProc}, + {NULL, NULL, NULL} }; -MenuItem stepMenu[] = { - {N_("Backward"), BackwardProc}, - {N_("Forward"), ForwardProc}, - {N_("Back to Start"), ToStartProc}, - {N_("Forward to End"), ToEndProc}, - {N_("Revert"), RevertProc}, - {N_("Annotate"), AnnotateProc}, - {N_("Truncate Game"), TruncateGameProc}, - {"----", NothingProc}, - {N_("Move Now"), MoveNowProc}, - {N_("Retract Move"), RetractMoveProc}, - {NULL, NULL} +MenuItem engineMenu[] = { + {N_("Engine #1 Settings ..."), "Engine #1 Settings", FirstSettingsProc}, + {N_("Engine #2 Settings ..."), "Engine #2 Settings", SecondSettingsProc}, + {"----", NULL, NothingProc}, + {N_("Hint"), "Hint", HintProc}, + {N_("Book"), "Book", BookProc}, + {"----", NULL, NothingProc}, + {N_("Move Now Ctrl+M"), "Move Now", MoveNowProc}, + {N_("Retract Move Ctrl+X"), "Retract Move", RetractMoveProc}, + {NULL, NULL, NULL} }; MenuItem optionsMenu[] = { - {N_("Flip View"), FlipViewProc}, - {"----", NothingProc}, - {N_("Adjudications ..."), EngineMenuProc}, - {N_("General Settings ..."), UciMenuProc}, - {N_("Engine #1 Settings ..."), FirstSettingsProc}, - {N_("Engine #2 Settings ..."), SecondSettingsProc}, - {N_("Time Control ..."), TimeControlProc}, - {N_("Game List ..."), GameListOptionsPopUp}, - {"----", NothingProc}, - {N_("Always Queen"), AlwaysQueenProc}, - {N_("Animate Dragging"), AnimateDraggingProc}, - {N_("Animate Moving"), AnimateMovingProc}, - {N_("Auto Comment"), AutocommProc}, - {N_("Auto Flag"), AutoflagProc}, - {N_("Auto Flip View"), AutoflipProc}, - {N_("Auto Observe"), AutobsProc}, - {N_("Auto Raise Board"), AutoraiseProc}, - {N_("Auto Save"), AutosaveProc}, - {N_("Blindfold"), BlindfoldProc}, - {N_("Flash Moves"), FlashMovesProc}, - {N_("Get Move List"), GetMoveListProc}, +#define OPTIONSDIALOG +#ifdef OPTIONSDIALOG + {N_("General ..."), "General", OptionsProc}, +#endif + {N_("Time Control ... Alt+Shift+T"), "Time Control", TimeControlProc}, + {N_("Common Engine ... Alt+Shift+U"), "Common Engine", UciMenuProc}, + {N_("Adjudications ... Alt+Shift+J"), "Adjudications", EngineMenuProc}, + {N_("ICS ..."), "ICS", IcsOptionsProc}, + {N_("Match ..."), "Match", MatchOptionsProc}, + {N_("Load Game ..."), "Load Game", LoadOptionsProc}, + {N_("Save Game ..."), "Save Game", SaveOptionsProc}, +// {N_(" ..."), "", OptionsProc}, + {N_("Game List ..."), "Game List", GameListOptionsPopUp}, + {N_("Sounds ..."), "Sounds", SoundOptionsProc}, + {"----", NULL, NothingProc}, +#ifndef OPTIONSDIALOG + {N_("Always Queen Ctrl+Shift+Q"), "Always Queen", AlwaysQueenProc}, + {N_("Animate Dragging"), "Animate Dragging", AnimateDraggingProc}, + {N_("Animate Moving Ctrl+Shift+A"), "Animate Moving", AnimateMovingProc}, + {N_("Auto Flag Ctrl+Shift+F"), "Auto Flag", AutoflagProc}, + {N_("Auto Flip View"), "Auto Flip View", AutoflipProc}, + {N_("Blindfold"), "Blindfold", BlindfoldProc}, + {N_("Flash Moves"), "Flash Moves", FlashMovesProc}, #if HIGHDRAG - {N_("Highlight Dragging"), HighlightDraggingProc}, + {N_("Highlight Dragging"), "Highlight Dragging", HighlightDraggingProc}, +#endif + {N_("Highlight Last Move"), "Highlight Last Move", HighlightLastMoveProc}, + {N_("Highlight With Arrow"), "Arrow", HighlightArrowProc}, + {N_("Move Sound"), "Move Sound", MoveSoundProc}, +// {N_("ICS Alarm"), "ICS Alarm", IcsAlarmProc}, + {N_("One-Click Moving"), "OneClick", OneClickProc}, + {N_("Periodic Updates"), "Periodic Updates", PeriodicUpdatesProc}, + {N_("Ponder Next Move Ctrl+Shift+P"), "Ponder Next Move", PonderNextMoveProc}, + {N_("Popup Exit Message"), "Popup Exit Message", PopupExitMessageProc}, + {N_("Popup Move Errors"), "Popup Move Errors", PopupMoveErrorsProc}, +// {N_("Premove"), "Premove", PremoveProc}, + {N_("Show Coords"), "Show Coords", ShowCoordsProc}, + {N_("Hide Thinking Ctrl+Shift+H"), "Hide Thinking", HideThinkingProc}, + {N_("Test Legality Ctrl+Shift+L"), "Test Legality", TestLegalityProc}, + {"----", NULL, NothingProc}, #endif - {N_("Highlight Last Move"), HighlightLastMoveProc}, - {N_("Move Sound"), MoveSoundProc}, - {N_("ICS Alarm"), IcsAlarmProc}, - {N_("Old Save Style"), OldSaveStyleProc}, - {N_("Periodic Updates"), PeriodicUpdatesProc}, - {N_("Ponder Next Move"), PonderNextMoveProc}, - {N_("Popup Exit Message"), PopupExitMessageProc}, - {N_("Popup Move Errors"), PopupMoveErrorsProc}, - {N_("Premove"), PremoveProc}, - {N_("Quiet Play"), QuietPlayProc}, - {N_("Show Coords"), ShowCoordsProc}, - {N_("Hide Thinking"), HideThinkingProc}, - {N_("Test Legality"), TestLegalityProc}, - {"----", NothingProc}, - {N_("Save Settings Now"), SaveSettingsProc}, - {N_("Save Settings on Exit"), SaveOnExitProc}, - {NULL, NULL} + {N_("Save Settings Now"), "Save Settings Now", SaveSettingsProc}, + {N_("Save Settings on Exit"), "Save Settings on Exit", SaveOnExitProc}, + {NULL, NULL, NULL} }; MenuItem helpMenu[] = { - {N_("Info XBoard"), InfoProc}, - {N_("Man XBoard"), ManProc}, - {"----", NothingProc}, - {N_("Hint"), HintProc}, - {N_("Book"), BookProc}, - {"----", NothingProc}, - {N_("About XBoard"), AboutProc}, - {NULL, NULL} + {N_("Info XBoard"), "Info XBoard", InfoProc}, + {N_("Man XBoard F1"), "Man XBoard", ManProc}, + {"----", NULL, NothingProc}, + {N_("About XBoard"), "About XBoard", AboutProc}, + {NULL, NULL, NULL} }; Menu menuBar[] = { - {N_("File"), fileMenu}, - {N_("Mode"), modeMenu}, - {N_("Action"), actionMenu}, - {N_("Step"), stepMenu}, - {N_("Options"), optionsMenu}, - {N_("Help"), helpMenu}, - {NULL, NULL} + {N_("File"), "File", fileMenu}, + {N_("Edit"), "Edit", editMenu}, + {N_("View"), "View", viewMenu}, + {N_("Mode"), "Mode", modeMenu}, + {N_("Action"), "Action", actionMenu}, + {N_("Engine"), "Engine", engineMenu}, + {N_("Options"), "Options", optionsMenu}, + {N_("Help"), "Help", helpMenu}, + {NULL, NULL, NULL} }; -#define PAUSE_BUTTON N_("P") +#define PAUSE_BUTTON "P" MenuItem buttonBar[] = { - {"<<", ToStartProc}, - {"<", BackwardProc}, - {PAUSE_BUTTON, PauseProc}, - {">", ForwardProc}, - {">>", ToEndProc}, - {NULL, NULL} + {"<<", "<<", ToStartProc}, + {"<", "<", BackwardProc}, + {PAUSE_BUTTON, PAUSE_BUTTON, PauseProc}, + {">", ">", ForwardProc}, + {">>", ">>", ToEndProc}, + {NULL, NULL, NULL} }; #define PIECE_MENU_SIZE 18 @@ -922,7 +934,6 @@ XtActionsRec boardActions[] = { { "ShowMoveListProc", HistoryShowProc}, { "EditTagsProc", EditCommentProc }, { "EditCommentProc", EditCommentProc }, - { "IcsAlarmProc", IcsAlarmProc }, { "IcsInputBoxProc", IcsInputBoxProc }, { "PauseProc", PauseProc }, { "AcceptProc", AcceptProc }, @@ -954,35 +965,31 @@ XtActionsRec boardActions[] = { { "EngineMenuProc", (XtActionProc) EngineMenuProc }, { "UciMenuProc", (XtActionProc) UciMenuProc }, { "TimeControlProc", (XtActionProc) TimeControlProc }, + { "FlipViewProc", FlipViewProc }, + { "PonderNextMoveProc", PonderNextMoveProc }, +#ifndef OPTIONSDIALOG { "AlwaysQueenProc", AlwaysQueenProc }, { "AnimateDraggingProc", AnimateDraggingProc }, { "AnimateMovingProc", AnimateMovingProc }, { "AutoflagProc", AutoflagProc }, { "AutoflipProc", AutoflipProc }, - { "AutobsProc", AutobsProc }, - { "AutoraiseProc", AutoraiseProc }, - { "AutosaveProc", AutosaveProc }, { "BlindfoldProc", BlindfoldProc }, { "FlashMovesProc", FlashMovesProc }, - { "FlipViewProc", FlipViewProc }, - { "GetMoveListProc", GetMoveListProc }, #if HIGHDRAG { "HighlightDraggingProc", HighlightDraggingProc }, #endif { "HighlightLastMoveProc", HighlightLastMoveProc }, - { "IcsAlarmProc", IcsAlarmProc }, +// { "IcsAlarmProc", IcsAlarmProc }, { "MoveSoundProc", MoveSoundProc }, - { "OldSaveStyleProc", OldSaveStyleProc }, { "PeriodicUpdatesProc", PeriodicUpdatesProc }, - { "PonderNextMoveProc", PonderNextMoveProc }, { "PopupExitMessageProc", PopupExitMessageProc }, { "PopupMoveErrorsProc", PopupMoveErrorsProc }, - { "PremoveProc", PremoveProc }, - { "QuietPlayProc", QuietPlayProc }, +// { "PremoveProc", PremoveProc }, { "ShowCoordsProc", ShowCoordsProc }, { "ShowThinkingProc", ShowThinkingProc }, { "HideThinkingProc", HideThinkingProc }, { "TestLegalityProc", TestLegalityProc }, +#endif { "SaveSettingsProc", SaveSettingsProc }, { "SaveOnExitProc", SaveOnExitProc }, { "InfoProc", InfoProc }, @@ -995,7 +1002,6 @@ XtActionsRec boardActions[] = { { "NothingProc", NothingProc }, { "CommentClick", (XtActionProc) CommentClick }, { "CommentPopDown", (XtActionProc) CommentPopDown }, - { "EditCommentPopDown", (XtActionProc) EditCommentPopDown }, { "TagsPopDown", (XtActionProc) TagsPopDown }, { "ErrorPopDown", (XtActionProc) ErrorPopDown }, { "ICSInputBoxPopDown", (XtActionProc) ICSInputBoxPopDown }, @@ -1008,11 +1014,8 @@ XtActionsRec boardActions[] = { { "EngineOutputPopDown", (XtActionProc) EngineOutputPopDown }, { "EvalGraphPopDown", (XtActionProc) EvalGraphPopDown }, { "ShufflePopDown", (XtActionProc) ShufflePopDown }, - { "EnginePopDown", (XtActionProc) EnginePopDown }, - { "UciPopDown", (XtActionProc) UciPopDown }, { "TimeControlPopDown", (XtActionProc) TimeControlPopDown }, - { "NewVariantPopDown", (XtActionProc) NewVariantPopDown }, - { "SettingsPopDown", (XtActionProc) SettingsPopDown }, + { "GenericPopDown", (XtActionProc) GenericPopDown }, { "CopyMemoProc", (XtActionProc) CopyMemoProc }, }; @@ -1027,8 +1030,8 @@ char globalTranslations[] = :Ctrlc: CopyGameProc() \n \ :Ctrlv: PasteGameProc() \n \ :CtrlO: LoadPositionProc() \n \ - :Shift MetaNext: LoadNextPositionProc() \n \ - :Shift MetaPrior: LoadPrevPositionProc() \n \ + :ShiftNext: LoadNextPositionProc() \n \ + :ShiftPrior: LoadPrevPositionProc() \n \ :CtrlS: SavePositionProc() \n \ :CtrlC: CopyPositionProc() \n \ :CtrlV: PastePositionProc() \n \ @@ -1059,17 +1062,23 @@ char globalTranslations[] = :MetaRight: ForwardProc() \n \ :MetaHome: ToStartProc() \n \ :MetaLeft: BackwardProc() \n \ + :Home: RevertProc() \n \ + :End: TruncateGameProc() \n \ :Ctrlm: MoveNowProc() \n \ :Ctrlx: RetractMoveProc() \n \ :MetaJ: EngineMenuProc() \n \ :MetaU: UciMenuProc() \n \ :MetaT: TimeControlProc() \n \ + :CtrlP: PonderNextMoveProc() \n " +#ifndef OPTIONSDIALOG + "\ :CtrlQ: AlwaysQueenProc() \n \ :CtrlF: AutoflagProc() \n \ :CtrlA: AnimateMovingProc() \n \ - :CtrlP: PonderNextMoveProc() \n \ :CtrlL: TestLegalityProc() \n \ - :CtrlH: HideThinkingProc() \n \ + :CtrlH: HideThinkingProc() \n " +#endif + "\ :-: Iconify() \n \ :F1: ManProc() \n \ :F2: FlipViewProc() \n \ @@ -1473,7 +1482,7 @@ void SaveFontArg(FILE *f, ArgDescriptor *ad) { char *name; - int i, n = (int)ad->argLoc; + int i, n = (int)(intptr_t)ad->argLoc; switch(n) { case 0: // CLOCK_FONT name = appData.clockFont; @@ -1505,14 +1514,14 @@ ExportSounds() void SaveAttribsArg(FILE *f, ArgDescriptor *ad) { // here the "argLoc" defines a table index. It could have contained the 'ta' pointer itself, though - fprintf(f, OPTCHAR "%s" SEPCHAR "%s\n", ad->argName, (&appData.colorShout)[(int)ad->argLoc]); + fprintf(f, OPTCHAR "%s" SEPCHAR "%s\n", ad->argName, (&appData.colorShout)[(int)(intptr_t)ad->argLoc]); } void SaveColor(FILE *f, ArgDescriptor *ad) { // in WinBoard the color is an int and has to be converted to text. In X it would be a string already? - if(colorVariable[(int)ad->argLoc]) - fprintf(f, OPTCHAR "%s" SEPCHAR "%s\n", ad->argName, *(char**)colorVariable[(int)ad->argLoc]); + if(colorVariable[(int)(intptr_t)ad->argLoc]) + fprintf(f, OPTCHAR "%s" SEPCHAR "%s\n", ad->argName, *(char**)colorVariable[(int)(intptr_t)ad->argLoc]); } void @@ -1527,7 +1536,7 @@ ParseCommPortSettings(char *s) } extern Widget engineOutputShell; -extern Widget tagsShell, editTagsShell; + void GetActualPlacement(Widget wg, WindowPlacement *wp) { @@ -1559,10 +1568,8 @@ GetWindowCoords() if(MoveHistoryIsUp()) GetActualPlacement(historyShell, &wpMoveHistory); if(EvalGraphIsUp()) GetActualPlacement(evalGraphShell, &wpEvalGraph); if(GameListIsUp()) GetActualPlacement(gameListShell, &wpGameList); - if(commentShell) GetActualPlacement(commentShell, &wpComment); - else GetActualPlacement(editShell, &wpComment); - if(tagsShell) GetActualPlacement(tagsShell, &wpTags); - else GetActualPlacement(editTagsShell, &wpTags); + if(shellUp[1]) GetActualPlacement(shells[1], &wpComment); + if(shellUp[2]) GetActualPlacement(shells[2], &wpTags); } void @@ -1659,6 +1666,7 @@ void InitDrawingSizes(BoardSize boardSize, int flags) XtSetArg(args[0], XtNdefaultDistance, &sep); XtGetValues(formWidget, args, 1); + if(appData.overrideLineGap >= 0) lineGap = appData.overrideLineGap; boardWidth = lineGap + BOARD_WIDTH * (squareSize + lineGap); boardHeight = lineGap + BOARD_HEIGHT * (squareSize + lineGap); CreateGrid(); @@ -1786,6 +1794,104 @@ void InitDrawingSizes(BoardSize boardSize, int flags) } #endif +void ParseIcsTextColors() +{ // [HGM] tken out of main(), so it can be called from ICS-Options dialog + if (parse_cpair(ColorShout, appData.colorShout) < 0 || + parse_cpair(ColorSShout, appData.colorSShout) < 0 || + parse_cpair(ColorChannel1, appData.colorChannel1) < 0 || + parse_cpair(ColorChannel, appData.colorChannel) < 0 || + parse_cpair(ColorKibitz, appData.colorKibitz) < 0 || + parse_cpair(ColorTell, appData.colorTell) < 0 || + parse_cpair(ColorChallenge, appData.colorChallenge) < 0 || + parse_cpair(ColorRequest, appData.colorRequest) < 0 || + parse_cpair(ColorSeek, appData.colorSeek) < 0 || + parse_cpair(ColorNormal, appData.colorNormal) < 0) + { + if (appData.colorize) { + fprintf(stderr, + _("%s: can't parse color names; disabling colorization\n"), + programName); + } + appData.colorize = FALSE; + } +} + +int MakeColors() +{ // [HGM] taken out of main(), so it can be called from BoardOptions dialog + XrmValue vFrom, vTo; + int forceMono = False; + + if (!appData.monoMode) { + vFrom.addr = (caddr_t) appData.lightSquareColor; + vFrom.size = strlen(appData.lightSquareColor); + XtConvert(shellWidget, XtRString, &vFrom, XtRPixel, &vTo); + if (vTo.addr == NULL) { + appData.monoMode = True; + forceMono = True; + } else { + lightSquareColor = *(Pixel *) vTo.addr; + } + } + if (!appData.monoMode) { + vFrom.addr = (caddr_t) appData.darkSquareColor; + vFrom.size = strlen(appData.darkSquareColor); + XtConvert(shellWidget, XtRString, &vFrom, XtRPixel, &vTo); + if (vTo.addr == NULL) { + appData.monoMode = True; + forceMono = True; + } else { + darkSquareColor = *(Pixel *) vTo.addr; + } + } + if (!appData.monoMode) { + vFrom.addr = (caddr_t) appData.whitePieceColor; + vFrom.size = strlen(appData.whitePieceColor); + XtConvert(shellWidget, XtRString, &vFrom, XtRPixel, &vTo); + if (vTo.addr == NULL) { + appData.monoMode = True; + forceMono = True; + } else { + whitePieceColor = *(Pixel *) vTo.addr; + } + } + if (!appData.monoMode) { + vFrom.addr = (caddr_t) appData.blackPieceColor; + vFrom.size = strlen(appData.blackPieceColor); + XtConvert(shellWidget, XtRString, &vFrom, XtRPixel, &vTo); + if (vTo.addr == NULL) { + appData.monoMode = True; + forceMono = True; + } else { + blackPieceColor = *(Pixel *) vTo.addr; + } + } + + if (!appData.monoMode) { + vFrom.addr = (caddr_t) appData.highlightSquareColor; + vFrom.size = strlen(appData.highlightSquareColor); + XtConvert(shellWidget, XtRString, &vFrom, XtRPixel, &vTo); + if (vTo.addr == NULL) { + appData.monoMode = True; + forceMono = True; + } else { + highlightSquareColor = *(Pixel *) vTo.addr; + } + } + + if (!appData.monoMode) { + vFrom.addr = (caddr_t) appData.premoveHighlightColor; + vFrom.size = strlen(appData.premoveHighlightColor); + XtConvert(shellWidget, XtRString, &vFrom, XtRPixel, &vTo); + if (vTo.addr == NULL) { + appData.monoMode = True; + forceMono = True; + } else { + premoveHighlightColor = *(Pixel *) vTo.addr; + } + } + return forceMono; +} + int main(argc, argv) int argc; @@ -1806,12 +1912,6 @@ main(argc, argv) setbuf(stdout, NULL); setbuf(stderr, NULL); debugFP = stderr; - -# if HAVE_LIBREADLINE - /* install gnu-readline handler */ - rl_callback_handler_install("> ", ReadlineCompleteHandler); - rl_readline_name="XBoard"; -# endif if(argc > 1 && (!strcmp(argv[1], "-v" ) || !strcmp(argv[1], "--version" ))) { printf("%s version %s\n", PACKAGE_NAME, PACKAGE_VERSION); @@ -1981,6 +2081,7 @@ XBoard square size (hint): %d\n\ fprintf(stderr, _("Closest %s size: %d\n"), IMAGE_EXT, squareSize); } } + defaultLineGap = lineGap; if(appData.overrideLineGap >= 0) lineGap = appData.overrideLineGap; /* [HR] height treated separately (hacked) */ @@ -2026,74 +2127,7 @@ XBoard square size (hint): %d\n\ appData.monoMode = True; } - if (!appData.monoMode) { - vFrom.addr = (caddr_t) appData.lightSquareColor; - vFrom.size = strlen(appData.lightSquareColor); - XtConvert(shellWidget, XtRString, &vFrom, XtRPixel, &vTo); - if (vTo.addr == NULL) { - appData.monoMode = True; - forceMono = True; - } else { - lightSquareColor = *(Pixel *) vTo.addr; - } - } - if (!appData.monoMode) { - vFrom.addr = (caddr_t) appData.darkSquareColor; - vFrom.size = strlen(appData.darkSquareColor); - XtConvert(shellWidget, XtRString, &vFrom, XtRPixel, &vTo); - if (vTo.addr == NULL) { - appData.monoMode = True; - forceMono = True; - } else { - darkSquareColor = *(Pixel *) vTo.addr; - } - } - if (!appData.monoMode) { - vFrom.addr = (caddr_t) appData.whitePieceColor; - vFrom.size = strlen(appData.whitePieceColor); - XtConvert(shellWidget, XtRString, &vFrom, XtRPixel, &vTo); - if (vTo.addr == NULL) { - appData.monoMode = True; - forceMono = True; - } else { - whitePieceColor = *(Pixel *) vTo.addr; - } - } - if (!appData.monoMode) { - vFrom.addr = (caddr_t) appData.blackPieceColor; - vFrom.size = strlen(appData.blackPieceColor); - XtConvert(shellWidget, XtRString, &vFrom, XtRPixel, &vTo); - if (vTo.addr == NULL) { - appData.monoMode = True; - forceMono = True; - } else { - blackPieceColor = *(Pixel *) vTo.addr; - } - } - - if (!appData.monoMode) { - vFrom.addr = (caddr_t) appData.highlightSquareColor; - vFrom.size = strlen(appData.highlightSquareColor); - XtConvert(shellWidget, XtRString, &vFrom, XtRPixel, &vTo); - if (vTo.addr == NULL) { - appData.monoMode = True; - forceMono = True; - } else { - highlightSquareColor = *(Pixel *) vTo.addr; - } - } - - if (!appData.monoMode) { - vFrom.addr = (caddr_t) appData.premoveHighlightColor; - vFrom.size = strlen(appData.premoveHighlightColor); - XtConvert(shellWidget, XtRString, &vFrom, XtRPixel, &vTo); - if (vTo.addr == NULL) { - appData.monoMode = True; - forceMono = True; - } else { - premoveHighlightColor = *(Pixel *) vTo.addr; - } - } + forceMono = MakeColors(); if (forceMono) { fprintf(stderr, _("%s: too few colors available; trying monochrome mode\n"), @@ -2120,24 +2154,7 @@ XBoard square size (hint): %d\n\ (unsigned long) XBlackPixel(xDisplay, xScreen)); } - if (parse_cpair(ColorShout, appData.colorShout) < 0 || - parse_cpair(ColorSShout, appData.colorSShout) < 0 || - parse_cpair(ColorChannel1, appData.colorChannel1) < 0 || - parse_cpair(ColorChannel, appData.colorChannel) < 0 || - parse_cpair(ColorKibitz, appData.colorKibitz) < 0 || - parse_cpair(ColorTell, appData.colorTell) < 0 || - parse_cpair(ColorChallenge, appData.colorChallenge) < 0 || - parse_cpair(ColorRequest, appData.colorRequest) < 0 || - parse_cpair(ColorSeek, appData.colorSeek) < 0 || - parse_cpair(ColorNormal, appData.colorNormal) < 0) - { - if (appData.colorize) { - fprintf(stderr, - _("%s: can't parse color names; disabling colorization\n"), - programName); - } - appData.colorize = FALSE; - } + ParseIcsTextColors(); textColors[ColorNone].fg = textColors[ColorNone].bg = -1; textColors[ColorNone].attr = 0; @@ -2395,6 +2412,7 @@ XBoard square size (hint): %d\n\ ReadBitmap(&xMarkPixmap, "checkmark.bm", checkmark_bits, checkmark_width, checkmark_height); XtSetArg(args[0], XtNleftBitmap, xMarkPixmap); +#ifndef OPTIONSDIALOG if (appData.alwaysPromoteToQueen) { XtSetValues(XtNameToWidget(menuBarWidget, "menuOptions.Always Queen"), args, 1); @@ -2408,10 +2426,6 @@ XBoard square size (hint): %d\n\ XtSetValues(XtNameToWidget(menuBarWidget, "menuOptions.Animate Moving"), args, 1); } - if (appData.autoComment) { - XtSetValues(XtNameToWidget(menuBarWidget, "menuOptions.Auto Comment"), - args, 1); - } if (appData.autoCallFlag) { XtSetValues(XtNameToWidget(menuBarWidget, "menuOptions.Auto Flag"), args, 1); @@ -2420,26 +2434,6 @@ XBoard square size (hint): %d\n\ XtSetValues(XtNameToWidget(menuBarWidget,"menuOptions.Auto Flip View"), args, 1); } - if (appData.autoObserve) { - XtSetValues(XtNameToWidget(menuBarWidget, "menuOptions.Auto Observe"), - args, 1); - } - if (appData.autoRaiseBoard) { - XtSetValues(XtNameToWidget(menuBarWidget, - "menuOptions.Auto Raise Board"), args, 1); - } - if (appData.autoSaveGames) { - XtSetValues(XtNameToWidget(menuBarWidget, "menuOptions.Auto Save"), - args, 1); - } - if (appData.saveGameFile[0] != NULLCHAR) { - /* Can't turn this off from menu */ - XtSetValues(XtNameToWidget(menuBarWidget, "menuOptions.Auto Save"), - args, 1); - XtSetSensitive(XtNameToWidget(menuBarWidget, "menuOptions.Auto Save"), - False); - - } if (appData.blindfold) { XtSetValues(XtNameToWidget(menuBarWidget, "menuOptions.Blindfold"), args, 1); @@ -2449,10 +2443,6 @@ XBoard square size (hint): %d\n\ "menuOptions.Flash Moves"), args, 1); } - if (appData.getMoveList) { - XtSetValues(XtNameToWidget(menuBarWidget, "menuOptions.Get Move List"), - args, 1); - } #if HIGHDRAG if (appData.highlightDragging) { XtSetValues(XtNameToWidget(menuBarWidget, @@ -2465,17 +2455,22 @@ XBoard square size (hint): %d\n\ "menuOptions.Highlight Last Move"), args, 1); } - if (appData.icsAlarm) { - XtSetValues(XtNameToWidget(menuBarWidget, "menuOptions.ICS Alarm"), + if (appData.highlightMoveWithArrow) { + XtSetValues(XtNameToWidget(menuBarWidget, + "menuOptions.Arrow"), args, 1); } +// if (appData.icsAlarm) { +// XtSetValues(XtNameToWidget(menuBarWidget, "menuOptions.ICS Alarm"), +// args, 1); +// } if (appData.ringBellAfterMoves) { XtSetValues(XtNameToWidget(menuBarWidget, "menuOptions.Move Sound"), args, 1); } - if (appData.oldSaveStyle) { + if (appData.oneClick) { XtSetValues(XtNameToWidget(menuBarWidget, - "menuOptions.Old Save Style"), args, 1); + "menuOptions.OneClick"), args, 1); } if (appData.periodicUpdates) { XtSetValues(XtNameToWidget(menuBarWidget, @@ -2493,14 +2488,10 @@ XBoard square size (hint): %d\n\ XtSetValues(XtNameToWidget(menuBarWidget, "menuOptions.Popup Move Errors"), args, 1); } - if (appData.premove) { - XtSetValues(XtNameToWidget(menuBarWidget, - "menuOptions.Premove"), args, 1); - } - if (appData.quietPlay) { - XtSetValues(XtNameToWidget(menuBarWidget, - "menuOptions.Quiet Play"), args, 1); - } +// if (appData.premove) { +// XtSetValues(XtNameToWidget(menuBarWidget, +// "menuOptions.Premove"), args, 1); +// } if (appData.showCoords) { XtSetValues(XtNameToWidget(menuBarWidget, "menuOptions.Show Coords"), args, 1); @@ -2513,6 +2504,7 @@ XBoard square size (hint): %d\n\ XtSetValues(XtNameToWidget(menuBarWidget,"menuOptions.Test Legality"), args, 1); } +#endif if (saveSettingsOnExit) { XtSetValues(XtNameToWidget(menuBarWidget,"menuOptions.Save Settings on Exit"), args, 1); @@ -2551,7 +2543,7 @@ XBoard square size (hint): %d\n\ CatchDeleteWindow(shellWidget, "QuitProc"); - CreateGCs(); + CreateGCs(False); CreateGrid(); #if HAVE_LIBXPM if (appData.bitmapDirectory[0] != NULLCHAR) { @@ -2638,13 +2630,6 @@ ShutDownFrontEnd() if (saveSettingsOnExit) SaveSettings(settingsFileName); unlink(gameCopyFilename); unlink(gamePasteFilename); - -# if HAVE_LIBREADLINE - /* remove gnu-readline handler. */ - rl_callback_handler_remove(); -#endif - - return; } RETSIGTYPE TermSizeSigHandler(int sig) @@ -2724,7 +2709,6 @@ void ResetFrontEnd() { CommentPopDown(); - EditCommentPopDown(); TagsPopDown(); return; } @@ -2740,15 +2724,15 @@ GreyRevert(grey) { Widget w; if (!menuBarWidget) return; - w = XtNameToWidget(menuBarWidget, "menuStep.Revert"); + w = XtNameToWidget(menuBarWidget, "menuEdit.Revert"); if (w == NULL) { - DisplayError("menuStep.Revert", 0); + DisplayError("menuEdit.Revert", 0); } else { XtSetSensitive(w, !grey); } - w = XtNameToWidget(menuBarWidget, "menuStep.Annotate"); + w = XtNameToWidget(menuBarWidget, "menuEdit.Annotate"); if (w == NULL) { - DisplayError("menuStep.Annotate", 0); + DisplayError("menuEdit.Annotate", 0); } else { XtSetSensitive(w, !grey); } @@ -2779,15 +2763,20 @@ Enables icsEnables[] = { { "menuMode.Analysis Mode", False }, { "menuMode.Analyze File", False }, { "menuMode.Two Machines", False }, + { "menuMode.Machine Match", False }, #ifndef ZIPPY - { "menuHelp.Hint", False }, - { "menuHelp.Book", False }, - { "menuStep.Move Now", False }, + { "menuEngine.Hint", False }, + { "menuEngine.Book", False }, + { "menuEngine.Move Now", False }, +#ifndef OPTIONSDIALOG { "menuOptions.Periodic Updates", False }, { "menuOptions.Hide Thinking", False }, { "menuOptions.Ponder Next Move", False }, #endif - { "menuStep.Annotate", False }, + { "menuEngine.Engine #1 Settings", False }, +#endif + { "menuEngine.Engine #2 Settings", False }, + { "menuEdit.Annotate", False }, { NULL, False } }; @@ -2799,33 +2788,36 @@ Enables ncpEnables[] = { { "menuMode.Analysis Mode", False }, { "menuMode.Analyze File", False }, { "menuMode.Two Machines", False }, + { "menuMode.Machine Match", False }, { "menuMode.ICS Client", False }, - { "menuMode.ICS Input Box", False }, + { "menuView.ICStex", False }, + { "menuView.ICS Input Box", False }, { "Action", False }, - { "menuStep.Revert", False }, - { "menuStep.Annotate", False }, - { "menuStep.Move Now", False }, - { "menuStep.Retract Move", False }, - { "menuOptions.Auto Comment", False }, + { "menuEdit.Revert", False }, + { "menuEdit.Annotate", False }, + { "menuEngine.Engine #1 Settings", False }, + { "menuEngine.Engine #2 Settings", False }, + { "menuEngine.Move Now", False }, + { "menuEngine.Retract Move", False }, + { "menuOptions.ICS", False }, +#ifndef OPTIONSDIALOG { "menuOptions.Auto Flag", False }, { "menuOptions.Auto Flip View", False }, - { "menuOptions.Auto Observe", False }, - { "menuOptions.Auto Raise Board", False }, - { "menuOptions.Get Move List", False }, - { "menuOptions.ICS Alarm", False }, +// { "menuOptions.ICS Alarm", False }, { "menuOptions.Move Sound", False }, - { "menuOptions.Quiet Play", False }, { "menuOptions.Hide Thinking", False }, { "menuOptions.Periodic Updates", False }, { "menuOptions.Ponder Next Move", False }, - { "menuHelp.Hint", False }, - { "menuHelp.Book", False }, +#endif + { "menuEngine.Hint", False }, + { "menuEngine.Book", False }, { NULL, False } }; Enables gnuEnables[] = { { "menuMode.ICS Client", False }, - { "menuMode.ICS Input Box", False }, + { "menuView.ICStex", False }, + { "menuView.ICS Input Box", False }, { "menuAction.Accept", False }, { "menuAction.Decline", False }, { "menuAction.Rematch", False }, @@ -2833,14 +2825,9 @@ Enables gnuEnables[] = { { "menuAction.Stop Examining", False }, { "menuAction.Stop Observing", False }, { "menuAction.Upload to Examine", False }, - { "menuStep.Revert", False }, - { "menuStep.Annotate", False }, - { "menuOptions.Auto Comment", False }, - { "menuOptions.Auto Observe", False }, - { "menuOptions.Auto Raise Board", False }, - { "menuOptions.Get Move List", False }, - { "menuOptions.Premove", False }, - { "menuOptions.Quiet Play", False }, + { "menuEdit.Revert", False }, + { "menuEdit.Annotate", False }, + { "menuOptions.ICS", False }, /* The next two options rely on SetCmailMode being called *after* */ /* SetGNUMode so that when GNU is being used to give hints these */ @@ -2867,60 +2854,62 @@ Enables cmailEnables[] = { Enables trainingOnEnables[] = { { "menuMode.Edit Comment", False }, { "menuMode.Pause", False }, - { "menuStep.Forward", False }, - { "menuStep.Backward", False }, - { "menuStep.Forward to End", False }, - { "menuStep.Back to Start", False }, - { "menuStep.Move Now", False }, - { "menuStep.Truncate Game", False }, + { "menuEdit.Forward", False }, + { "menuEdit.Backward", False }, + { "menuEdit.Forward to End", False }, + { "menuEdit.Back to Start", False }, + { "menuEngine.Move Now", False }, + { "menuEdit.Truncate Game", False }, { NULL, False } }; Enables trainingOffEnables[] = { { "menuMode.Edit Comment", True }, { "menuMode.Pause", True }, - { "menuStep.Forward", True }, - { "menuStep.Backward", True }, - { "menuStep.Forward to End", True }, - { "menuStep.Back to Start", True }, - { "menuStep.Move Now", True }, - { "menuStep.Truncate Game", True }, + { "menuEdit.Forward", True }, + { "menuEdit.Backward", True }, + { "menuEdit.Forward to End", True }, + { "menuEdit.Back to Start", True }, + { "menuEngine.Move Now", True }, + { "menuEdit.Truncate Game", True }, { NULL, False } }; Enables machineThinkingEnables[] = { { "menuFile.Load Game", False }, - { "menuFile.Load Next Game", False }, - { "menuFile.Load Previous Game", False }, - { "menuFile.Reload Same Game", False }, - { "menuFile.Paste Game", False }, +// { "menuFile.Load Next Game", False }, +// { "menuFile.Load Previous Game", False }, +// { "menuFile.Reload Same Game", False }, + { "menuEdit.Paste Game", False }, { "menuFile.Load Position", False }, - { "menuFile.Load Next Position", False }, - { "menuFile.Load Previous Position", False }, - { "menuFile.Reload Same Position", False }, - { "menuFile.Paste Position", False }, +// { "menuFile.Load Next Position", False }, +// { "menuFile.Load Previous Position", False }, +// { "menuFile.Reload Same Position", False }, + { "menuEdit.Paste Position", False }, { "menuMode.Machine White", False }, { "menuMode.Machine Black", False }, { "menuMode.Two Machines", False }, - { "menuStep.Retract Move", False }, + { "menuMode.Machine Match", False }, + { "menuEngine.Retract Move", False }, { NULL, False } }; Enables userThinkingEnables[] = { { "menuFile.Load Game", True }, - { "menuFile.Load Next Game", True }, - { "menuFile.Load Previous Game", True }, - { "menuFile.Reload Same Game", True }, - { "menuFile.Paste Game", True }, +// { "menuFile.Load Next Game", True }, +// { "menuFile.Load Previous Game", True }, +// { "menuFile.Reload Same Game", True }, + { "menuEdit.Paste Game", True }, { "menuFile.Load Position", True }, - { "menuFile.Load Next Position", True }, - { "menuFile.Load Previous Position", True }, - { "menuFile.Reload Same Position", True }, - { "menuFile.Paste Position", True }, +// { "menuFile.Load Next Position", True }, +// { "menuFile.Load Previous Position", True }, +// { "menuFile.Reload Same Position", True }, + { "menuEdit.Paste Position", True }, { "menuMode.Machine White", True }, { "menuMode.Machine Black", True }, { "menuMode.Two Machines", True }, - { "menuStep.Retract Move", True }, + { "menuMode.Machine Match", True }, + { "menuEngine.Retract Move", True }, { NULL, False } }; @@ -2996,50 +2985,50 @@ SetMachineThinkingEnables() } // [HGM] code borrowed from winboard.c (which should thus go to backend.c!) -#define HISTORY_SIZE 64 -static char *history[HISTORY_SIZE]; -int histIn = 0, histP = 0; - -void -SaveInHistory(char *cmd) -{ - if (history[histIn] != NULL) { - free(history[histIn]); - history[histIn] = NULL; - } - if (*cmd == NULLCHAR) return; - history[histIn] = StrSave(cmd); - histIn = (histIn + 1) % HISTORY_SIZE; - if (history[histIn] != NULL) { - free(history[histIn]); - history[histIn] = NULL; - } - histP = histIn; -} - -char * -PrevInHistory(char *cmd) -{ - int newhp; - if (histP == histIn) { - if (history[histIn] != NULL) free(history[histIn]); - history[histIn] = StrSave(cmd); - } - newhp = (histP - 1 + HISTORY_SIZE) % HISTORY_SIZE; - if (newhp == histIn || history[newhp] == NULL) return NULL; - histP = newhp; - return history[histP]; -} - -char * -NextInHistory() -{ - if (histP == histIn) return NULL; - histP = (histP + 1) % HISTORY_SIZE; - return history[histP]; -} -// end of borrowed code - +#define HISTORY_SIZE 64 +static char *history[HISTORY_SIZE]; +int histIn = 0, histP = 0; + +void +SaveInHistory(char *cmd) +{ + if (history[histIn] != NULL) { + free(history[histIn]); + history[histIn] = NULL; + } + if (*cmd == NULLCHAR) return; + history[histIn] = StrSave(cmd); + histIn = (histIn + 1) % HISTORY_SIZE; + if (history[histIn] != NULL) { + free(history[histIn]); + history[histIn] = NULL; + } + histP = histIn; +} + +char * +PrevInHistory(char *cmd) +{ + int newhp; + if (histP == histIn) { + if (history[histIn] != NULL) free(history[histIn]); + history[histIn] = StrSave(cmd); + } + newhp = (histP - 1 + HISTORY_SIZE) % HISTORY_SIZE; + if (newhp == histIn || history[newhp] == NULL) return NULL; + histP = newhp; + return history[histP]; +} + +char * +NextInHistory() +{ + if (histP == histIn) return NULL; + histP = (histP + 1) % HISTORY_SIZE; + return history[histP]; +} +// end of borrowed code + #define Abs(n) ((n)<0 ? -(n) : (n)) /* @@ -3143,7 +3132,32 @@ FindFont(pattern, targetPxlSize) return p; } -void CreateGCs() +void DeleteGCs() +{ // [HGM] deletes GCs that are to be remade, to prevent resource leak; + // must be called before all non-first callse to CreateGCs() + XtReleaseGC(shellWidget, highlineGC); + XtReleaseGC(shellWidget, lightSquareGC); + XtReleaseGC(shellWidget, darkSquareGC); + XtReleaseGC(shellWidget, lineGC); + if (appData.monoMode) { + if (DefaultDepth(xDisplay, xScreen) == 1) { + XtReleaseGC(shellWidget, wbPieceGC); + } else { + XtReleaseGC(shellWidget, bwPieceGC); + } + } else { + XtReleaseGC(shellWidget, prelineGC); + XtReleaseGC(shellWidget, jailSquareGC); + XtReleaseGC(shellWidget, wdPieceGC); + XtReleaseGC(shellWidget, wlPieceGC); + XtReleaseGC(shellWidget, wjPieceGC); + XtReleaseGC(shellWidget, bdPieceGC); + XtReleaseGC(shellWidget, blPieceGC); + XtReleaseGC(shellWidget, bjPieceGC); + } +} + +void CreateGCs(int redo) { XtGCMask value_mask = GCLineWidth | GCLineStyle | GCForeground | GCBackground | GCFunction | GCPlaneMask; @@ -3155,20 +3169,23 @@ void CreateGCs() gc_values.line_style = LineSolid; gc_values.function = GXcopy; - gc_values.foreground = XBlackPixel(xDisplay, xScreen); - gc_values.background = XBlackPixel(xDisplay, xScreen); - lineGC = XtGetGC(shellWidget, value_mask, &gc_values); - + if(redo) { + DeleteGCs(); // called a second time; clean up old GCs first + } else { // [HGM] grid and font GCs created on first call only gc_values.foreground = XBlackPixel(xDisplay, xScreen); gc_values.background = XWhitePixel(xDisplay, xScreen); coordGC = XtGetGC(shellWidget, value_mask, &gc_values); XSetFont(xDisplay, coordGC, coordFontID); - // [HGM] make font for holdings counts (white on black0 + // [HGM] make font for holdings counts (white on black) gc_values.foreground = XWhitePixel(xDisplay, xScreen); gc_values.background = XBlackPixel(xDisplay, xScreen); countGC = XtGetGC(shellWidget, value_mask, &gc_values); XSetFont(xDisplay, countGC, countFontID); + } + gc_values.foreground = XBlackPixel(xDisplay, xScreen); + gc_values.background = XBlackPixel(xDisplay, xScreen); + lineGC = XtGetGC(shellWidget, value_mask, &gc_values); if (appData.monoMode) { gc_values.foreground = XWhitePixel(xDisplay, xScreen); @@ -3296,6 +3313,8 @@ void loadXIM(xim, xmask, filename, dest, mask) } } + fclose(fp); + /* create Pixmap of piece */ *dest = XCreatePixmap(xDisplay, DefaultRootWindow(xDisplay), w, h, xim->depth); @@ -3416,17 +3435,31 @@ void CreateXIMPieces() XSynchronize(xDisplay, False); /* Work-around for xlib/xt buffering bug */ } +static VariantClass oldVariant = (VariantClass) -1; // [HGM] pieces: redo every time variant changes + #if HAVE_LIBXPM void CreateXPMBoard(char *s, int kind) { XpmAttributes attr; attr.valuemask = 0; - if(s == NULL || *s == 0 || *s == '*') return; + if(s == NULL || *s == 0 || *s == '*') { useTexture &= ~(kind+1); return; } if (XpmReadFileToPixmap(xDisplay, xBoardWindow, s, &(xpmBoardBitmap[kind]), NULL, &attr) == 0) { useTexture |= kind + 1; textureW[kind] = attr.width; textureH[kind] = attr.height; } } +void FreeXPMPieces() +{ // [HGM] to prevent resoucre leak on calling CreaeXPMPieces() a second time, + // thisroutine has to be called t free the old piece pixmaps + int piece, kind; + for (piece = (int) WhitePawn; piece <= (int) WhiteKing + 4; piece++) + for (kind=0; kind<4; kind++) XFreePixmap(xDisplay, xpmPieceBitmap2[kind][piece]); + if(useImageSqs) { + XFreePixmap(xDisplay, xpmLightSquare); + XFreePixmap(xDisplay, xpmDarkSquare); + } +} + void CreateXPMPieces() { int piece, kind, r; @@ -3435,6 +3468,9 @@ void CreateXPMPieces() XpmAttributes attr; static char *xpmkind[] = { "ll", "ld", "dl", "dd" }; XpmColorSymbol symbols[4]; + static int redo = False; + + if(redo) FreeXPMPieces(); else redo = 1; /* The XSynchronize calls were copied from CreatePieces. Not sure if needed, but can't hurt */ @@ -3559,6 +3595,7 @@ void CreateXPMPieces() xpmJailSquare = xpmLightSquare; fprintf(stderr, _("Done.\n")); } + oldVariant = -1; // kludge to force re-makig of animation masks XSynchronize(xDisplay, False); /* Work-around for xlib/xt buffering bug */ } @@ -3727,8 +3764,8 @@ void CreateMenuBarPopup(parent, name, mb) entry = XtCreateManagedWidget(mi->string, smeLineObjectClass, menu, args, j); } else { - XtSetArg(args[j], XtNlabel, XtNewString(_(mi->string))); - entry = XtCreateManagedWidget(mi->string, smeBSBObjectClass, + XtSetArg(args[j], XtNlabel, XtNewString(mi->string)); + entry = XtCreateManagedWidget(mi->ref, smeBSBObjectClass, menu, args, j+1); XtAddCallback(entry, XtNcallback, (XtCallbackProc) MenuBarSelect, @@ -3755,17 +3792,17 @@ Widget CreateMenuBar(mb) while (mb->name != NULL) { safeStrCpy(menuName, "menu", sizeof(menuName)/sizeof(menuName[0]) ); - strncat(menuName, mb->name, MSG_SIZ - strlen(menuName) - 1); + strncat(menuName, mb->ref, MSG_SIZ - strlen(menuName) - 1); j = 0; XtSetArg(args[j], XtNmenuName, XtNewString(menuName)); j++; if (tinyLayout) { char shortName[2]; - shortName[0] = _(mb->name)[0]; + shortName[0] = mb->name[0]; shortName[1] = NULLCHAR; XtSetArg(args[j], XtNlabel, XtNewString(shortName)); j++; } else { - XtSetArg(args[j], XtNlabel, XtNewString(_(mb->name))); j++; + XtSetArg(args[j], XtNlabel, XtNewString(mb->name)); j++; } XtSetArg(args[j], XtNborderWidth, 0); j++; @@ -3914,6 +3951,7 @@ void PieceMenuPopup(w, event, params, num_params) Cardinal *num_params; { String whichMenu; int menuNr; + shiftKey = strcmp(params[0], "menuW"); // used to indicate black if (event->type == ButtonRelease) menuNr = RightClick(Release, event->xbutton.x, event->xbutton.y, &pmFromX, &pmFromY); else if (event->type == ButtonPress) @@ -3952,11 +3990,7 @@ void WhiteClock(w, event, prms, nprms) String *prms; Cardinal *nprms; { - if (gameMode == EditPosition || gameMode == IcsExamining) { - SetWhiteToPlayEvent(); - } else if (gameMode == IcsPlayingBlack || gameMode == MachinePlaysWhite) { - CallFlagEvent(); - } + ClockClick(0); } void BlackClock(w, event, prms, nprms) @@ -3965,11 +3999,7 @@ void BlackClock(w, event, prms, nprms) String *prms; Cardinal *nprms; { - if (gameMode == EditPosition || gameMode == IcsExamining) { - SetBlackToPlayEvent(); - } else if (gameMode == IcsPlayingWhite || gameMode == MachinePlaysBlack) { - CallFlagEvent(); - } + ClockClick(1); } @@ -4005,7 +4035,7 @@ static void drawHighlight(file, rank, gc) { int x, y; - if (lineGap == 0 || appData.blindfold) return; + if (lineGap == 0) return; if (flipView) { x = lineGap/2 + ((BOARD_WIDTH-1)-file) * @@ -4266,7 +4296,7 @@ static void colorDrawPieceImage(piece, square_color, x, y, dest) } break; } - if(appData.upsideDown && flipView) kind ^= 2; // swap white and black pieces + if(appData.upsideDown && flipView) { kind ^= 2; p += p < BlackPawn ? BlackPawn : -BlackPawn; }// swap white and black pieces if(useTexture & square_color+1) { BlankSquare(x, y, square_color, piece, dest, 1); // erase previous contents with background XSetClipMask(xDisplay, wlPieceGC, xpmMask[p]); @@ -4391,9 +4421,9 @@ void DrawSquare(row, column, piece, do_flash) BlankSquare(x, y, square_color, piece, xBoardWindow, 1); } else { drawfunc = ChooseDrawFunc(); + if (do_flash && appData.flashCount > 0) { for (i=0; ixbutton.x, event->xbutton.y, 1)) break; + if(SeekGraphClick(Press, event->xbutton.x, event->xbutton.y, 1)) break; default: return; } @@ -4492,7 +4522,6 @@ static int too_many_diffs(b1, b2) } } } - return 0; } @@ -4599,7 +4628,7 @@ void XDrawPosition(w, repaint, board) } if (!lastBoardValid[nr] || (nr == 0 && lastFlipView != flipView)) { XtSetArg(args[0], XtNleftBitmap, (flipView ? xMarkPixmap : None)); - XtSetValues(XtNameToWidget(menuBarWidget, "menuOptions.Flip View"), + XtSetValues(XtNameToWidget(menuBarWidget, "menuView.Flip View"), args, 1); } @@ -4610,6 +4639,10 @@ void XDrawPosition(w, repaint, board) if (!repaint && lastBoardValid[nr] && (nr == 1 || lastFlipView == flipView)) { + if ( lineGap && IsDrawArrowEnabled()) + XDrawSegments(xDisplay, xBoardWindow, lineGC, + gridSegments, BOARD_HEIGHT + BOARD_WIDTH + 2); + /* If too much changes (begin observing new game, etc.), don't do flashing */ do_flash = too_many_diffs(board, lastBoard[nr]) ? 0 : 1; @@ -4672,6 +4705,7 @@ void XDrawPosition(w, repaint, board) if (hi2X >= 0 && hi2Y >= 0) { drawHighlight(hi2X, hi2Y, highlineGC); } + DrawArrowHighlight(hi1X, hi1Y, hi2X, hi2Y); } /* If piece being dragged around board, must redraw that too */ DrawDragPiece(); @@ -4732,6 +4766,7 @@ void HandleUserMove(w, event, prms, nprms) void AnimateUserMove (Widget w, XEvent * event, String * params, Cardinal * nParams) { + if(!PromoScroll(event->xmotion.x, event->xmotion.y)) DragPieceMove(event->xmotion.x, event->xmotion.y); } @@ -4741,264 +4776,6 @@ void HandlePV (Widget w, XEvent * event, MovePV(event->xmotion.x, event->xmotion.y, lineGap + BOARD_HEIGHT * (squareSize + lineGap)); } -Widget CommentCreate(name, text, mutable, callback, lines) - char *name, *text; - int /*Boolean*/ mutable; - XtCallbackProc callback; - int lines; -{ - Arg args[16]; - Widget shell, layout, form, edit, b_ok, b_cancel, b_clear, b_close, b_edit; - Dimension bw_width; - int j; - - j = 0; - XtSetArg(args[j], XtNwidth, &bw_width); j++; - XtGetValues(boardWidget, args, j); - - j = 0; - XtSetArg(args[j], XtNresizable, True); j++; -#if TOPLEVEL - shell = - XtCreatePopupShell(name, topLevelShellWidgetClass, - shellWidget, args, j); -#else - shell = - XtCreatePopupShell(name, transientShellWidgetClass, - shellWidget, args, j); -#endif - layout = - XtCreateManagedWidget(layoutName, formWidgetClass, shell, - layoutArgs, XtNumber(layoutArgs)); - form = - XtCreateManagedWidget("form", formWidgetClass, layout, - formArgs, XtNumber(formArgs)); - - j = 0; - if (mutable) { - XtSetArg(args[j], XtNeditType, XawtextEdit); j++; - XtSetArg(args[j], XtNuseStringInPlace, False); j++; - } - XtSetArg(args[j], XtNstring, text); j++; - XtSetArg(args[j], XtNtop, XtChainTop); j++; - XtSetArg(args[j], XtNbottom, XtChainBottom); j++; - XtSetArg(args[j], XtNleft, XtChainLeft); j++; - XtSetArg(args[j], XtNright, XtChainRight); j++; - XtSetArg(args[j], XtNresizable, True); j++; - XtSetArg(args[j], XtNwidth, bw_width); j++; /*force wider than buttons*/ - /* !!Work around an apparent bug in XFree86 4.0.1 (X11R6.4.3) */ - XtSetArg(args[j], XtNscrollVertical, XawtextScrollAlways); j++; - XtSetArg(args[j], XtNautoFill, True); j++; - XtSetArg(args[j], XtNwrap, XawtextWrapWord); j++; - edit = - XtCreateManagedWidget("text", asciiTextWidgetClass, form, args, j); - XtOverrideTranslations(edit, XtParseTranslationTable(commentTranslations)); - - if (mutable) { - j = 0; - XtSetArg(args[j], XtNfromVert, edit); j++; - XtSetArg(args[j], XtNtop, XtChainBottom); j++; - XtSetArg(args[j], XtNbottom, XtChainBottom); j++; - XtSetArg(args[j], XtNleft, XtChainLeft); j++; - XtSetArg(args[j], XtNright, XtChainLeft); j++; - b_ok = - XtCreateManagedWidget(_("ok"), commandWidgetClass, form, args, j); - XtAddCallback(b_ok, XtNcallback, callback, (XtPointer) 0); - - j = 0; - XtSetArg(args[j], XtNfromVert, edit); j++; - XtSetArg(args[j], XtNfromHoriz, b_ok); j++; - XtSetArg(args[j], XtNtop, XtChainBottom); j++; - XtSetArg(args[j], XtNbottom, XtChainBottom); j++; - XtSetArg(args[j], XtNleft, XtChainLeft); j++; - XtSetArg(args[j], XtNright, XtChainLeft); j++; - b_cancel = - XtCreateManagedWidget(_("cancel"), commandWidgetClass, form, args, j); - XtAddCallback(b_cancel, XtNcallback, callback, (XtPointer) 0); - - j = 0; - XtSetArg(args[j], XtNfromVert, edit); j++; - XtSetArg(args[j], XtNfromHoriz, b_cancel); j++; - XtSetArg(args[j], XtNtop, XtChainBottom); j++; - XtSetArg(args[j], XtNbottom, XtChainBottom); j++; - XtSetArg(args[j], XtNleft, XtChainLeft); j++; - XtSetArg(args[j], XtNright, XtChainLeft); j++; - b_clear = - XtCreateManagedWidget(_("clear"), commandWidgetClass, form, args, j); - XtAddCallback(b_clear, XtNcallback, callback, (XtPointer) 0); - } else { - j = 0; - XtSetArg(args[j], XtNfromVert, edit); j++; - XtSetArg(args[j], XtNtop, XtChainBottom); j++; - XtSetArg(args[j], XtNbottom, XtChainBottom); j++; - XtSetArg(args[j], XtNleft, XtChainLeft); j++; - XtSetArg(args[j], XtNright, XtChainLeft); j++; - b_close = - XtCreateManagedWidget(_("close"), commandWidgetClass, form, args, j); - XtAddCallback(b_close, XtNcallback, callback, (XtPointer) 0); - - j = 0; - XtSetArg(args[j], XtNfromVert, edit); j++; - XtSetArg(args[j], XtNfromHoriz, b_close); j++; - XtSetArg(args[j], XtNtop, XtChainBottom); j++; - XtSetArg(args[j], XtNbottom, XtChainBottom); j++; - XtSetArg(args[j], XtNleft, XtChainLeft); j++; - XtSetArg(args[j], XtNright, XtChainLeft); j++; - b_edit = - XtCreateManagedWidget(_("edit"), commandWidgetClass, form, args, j); - XtAddCallback(b_edit, XtNcallback, callback, (XtPointer) 0); - } - - XtRealizeWidget(shell); - - if (commentX == -1) { - int xx, yy; - Window junk; - Dimension pw_height; - Dimension ew_height; - - j = 0; - XtSetArg(args[j], XtNheight, &ew_height); j++; - XtGetValues(edit, args, j); - - j = 0; - XtSetArg(args[j], XtNheight, &pw_height); j++; - XtGetValues(shell, args, j); - commentH = pw_height + (lines - 1) * ew_height; - commentW = bw_width - 16; - - XSync(xDisplay, False); -#ifdef NOTDEF - /* This code seems to tickle an X bug if it is executed too soon - after xboard starts up. The coordinates get transformed as if - the main window was positioned at (0, 0). - */ - XtTranslateCoords(shellWidget, - (bw_width - commentW) / 2, 0 - commentH / 2, - &commentX, &commentY); -#else /*!NOTDEF*/ - XTranslateCoordinates(xDisplay, XtWindow(shellWidget), - RootWindowOfScreen(XtScreen(shellWidget)), - (bw_width - commentW) / 2, 0 - commentH / 2, - &xx, &yy, &junk); - commentX = xx; - commentY = yy; -#endif /*!NOTDEF*/ - if (commentY < 0) commentY = 0; /*avoid positioning top offscreen*/ - } - - if(wpComment.width > 0) { - commentX = wpComment.x; - commentY = wpComment.y; - commentW = wpComment.width; - commentH = wpComment.height; - } - - j = 0; - XtSetArg(args[j], XtNheight, commentH); j++; - XtSetArg(args[j], XtNwidth, commentW); j++; - XtSetArg(args[j], XtNx, commentX); j++; - XtSetArg(args[j], XtNy, commentY); j++; - XtSetValues(shell, args, j); - XtSetKeyboardFocus(shell, edit); - - return shell; -} - -/* Used for analysis window and ICS input window */ -Widget MiscCreate(name, text, mutable, callback, lines) - char *name, *text; - int /*Boolean*/ mutable; - XtCallbackProc callback; - int lines; -{ - Arg args[16]; - Widget shell, layout, form, edit; - Position x, y; - Dimension bw_width, pw_height, ew_height, w, h; - int j; - int xx, yy; - Window junk; - - j = 0; - XtSetArg(args[j], XtNresizable, True); j++; -#if TOPLEVEL - shell = - XtCreatePopupShell(name, topLevelShellWidgetClass, - shellWidget, args, j); -#else - shell = - XtCreatePopupShell(name, transientShellWidgetClass, - shellWidget, args, j); -#endif - layout = - XtCreateManagedWidget(layoutName, formWidgetClass, shell, - layoutArgs, XtNumber(layoutArgs)); - form = - XtCreateManagedWidget("form", formWidgetClass, layout, - formArgs, XtNumber(formArgs)); - - j = 0; - if (mutable) { - XtSetArg(args[j], XtNeditType, XawtextEdit); j++; - XtSetArg(args[j], XtNuseStringInPlace, False); j++; - } - XtSetArg(args[j], XtNstring, text); j++; - XtSetArg(args[j], XtNtop, XtChainTop); j++; - XtSetArg(args[j], XtNbottom, XtChainBottom); j++; - XtSetArg(args[j], XtNleft, XtChainLeft); j++; - XtSetArg(args[j], XtNright, XtChainRight); j++; - XtSetArg(args[j], XtNresizable, True); j++; - /* !!Work around an apparent bug in XFree86 4.0.1 (X11R6.4.3) */ - XtSetArg(args[j], XtNscrollVertical, XawtextScrollAlways); j++; - XtSetArg(args[j], XtNautoFill, True); j++; - XtSetArg(args[j], XtNwrap, XawtextWrapWord); j++; - edit = - XtCreateManagedWidget("text", asciiTextWidgetClass, form, args, j); - - XtRealizeWidget(shell); - - j = 0; - XtSetArg(args[j], XtNwidth, &bw_width); j++; - XtGetValues(boardWidget, args, j); - - j = 0; - XtSetArg(args[j], XtNheight, &ew_height); j++; - XtGetValues(edit, args, j); - - j = 0; - XtSetArg(args[j], XtNheight, &pw_height); j++; - XtGetValues(shell, args, j); - h = pw_height + (lines - 1) * ew_height; - w = bw_width - 16; - - XSync(xDisplay, False); -#ifdef NOTDEF - /* This code seems to tickle an X bug if it is executed too soon - after xboard starts up. The coordinates get transformed as if - the main window was positioned at (0, 0). - */ - XtTranslateCoords(shellWidget, (bw_width - w) / 2, 0 - h / 2, &x, &y); -#else /*!NOTDEF*/ - XTranslateCoordinates(xDisplay, XtWindow(shellWidget), - RootWindowOfScreen(XtScreen(shellWidget)), - (bw_width - w) / 2, 0 - h / 2, &xx, &yy, &junk); -#endif /*!NOTDEF*/ - x = xx; - y = yy; - if (y < 0) y = 0; /*avoid positioning top offscreen*/ - - j = 0; - XtSetArg(args[j], XtNheight, h); j++; - XtSetArg(args[j], XtNwidth, w); j++; - XtSetArg(args[j], XtNx, x); j++; - XtSetArg(args[j], XtNy, y); j++; - XtSetValues(shell, args, j); - - return shell; -} - - static int savedIndex; /* gross that this is global */ void CommentClick (Widget w, XEvent * event, String * params, Cardinal * nParams) @@ -5019,124 +4796,18 @@ void EditCommentPopUp(index, title, text) int index; char *title, *text; { - Widget edit; - Arg args[16]; - int j; - savedIndex = index; if (text == NULL) text = ""; - - if (editShell == NULL) { - editShell = - CommentCreate(title, text, True, EditCommentCallback, 4); - XtRealizeWidget(editShell); - CatchDeleteWindow(editShell, "EditCommentPopDown"); - } else { - edit = XtNameToWidget(editShell, "*form.text"); - j = 0; - XtSetArg(args[j], XtNstring, text); j++; - XtSetValues(edit, args, j); - j = 0; - XtSetArg(args[j], XtNiconName, (XtArgVal) title); j++; - XtSetArg(args[j], XtNtitle, (XtArgVal) title); j++; - XtSetValues(editShell, args, j); - } - - XtPopup(editShell, XtGrabNone); - - editUp = True; - j = 0; - XtSetArg(args[j], XtNleftBitmap, xMarkPixmap); j++; - XtSetValues(XtNameToWidget(menuBarWidget, "menuMode.Edit Comment"), - args, j); -} - -void EditCommentCallback(w, client_data, call_data) - Widget w; - XtPointer client_data, call_data; -{ - String name, val; - Arg args[16]; - int j; - Widget edit; - - j = 0; - XtSetArg(args[j], XtNlabel, &name); j++; - XtGetValues(w, args, j); - - if (strcmp(name, _("ok")) == 0) { - edit = XtNameToWidget(editShell, "*form.text"); - j = 0; - XtSetArg(args[j], XtNstring, &val); j++; - XtGetValues(edit, args, j); - ReplaceComment(savedIndex, val); - EditCommentPopDown(); - } else if (strcmp(name, _("cancel")) == 0) { - EditCommentPopDown(); - } else if (strcmp(name, _("clear")) == 0) { - edit = XtNameToWidget(editShell, "*form.text"); - XtCallActionProc(edit, "select-all", NULL, NULL, 0); - XtCallActionProc(edit, "kill-selection", NULL, NULL, 0); - } -} - -void EditCommentPopDown() -{ - Arg args[16]; - int j; - - if (!editUp) return; - j = 0; - XtSetArg(args[j], XtNx, &commentX); j++; - XtSetArg(args[j], XtNy, &commentY); j++; - XtSetArg(args[j], XtNheight, &commentH); j++; - XtSetArg(args[j], XtNwidth, &commentW); j++; - XtGetValues(editShell, args, j); - XtPopdown(editShell); - editUp = False; - j = 0; - XtSetArg(args[j], XtNleftBitmap, None); j++; - XtSetValues(XtNameToWidget(menuBarWidget, "menuMode.Edit Comment"), - args, j); + NewCommentPopup(title, text, index); } void ICSInputBoxPopUp() { - Widget edit; - Arg args[16]; - int j; - char *title = _("ICS Input"); - XtTranslations tr; - - if (ICSInputShell == NULL) { - ICSInputShell = MiscCreate(title, "", True, NULL, 1); - tr = XtParseTranslationTable(ICSInputTranslations); - edit = XtNameToWidget(ICSInputShell, "*form.text"); - XtOverrideTranslations(edit, tr); - XtRealizeWidget(ICSInputShell); - CatchDeleteWindow(ICSInputShell, "ICSInputBoxPopDown"); - - } else { - edit = XtNameToWidget(ICSInputShell, "*form.text"); - j = 0; - XtSetArg(args[j], XtNstring, ""); j++; - XtSetValues(edit, args, j); - j = 0; - XtSetArg(args[j], XtNiconName, (XtArgVal) title); j++; - XtSetArg(args[j], XtNtitle, (XtArgVal) title); j++; - XtSetValues(ICSInputShell, args, j); - } - - XtPopup(ICSInputShell, XtGrabNone); - XtSetKeyboardFocus(ICSInputShell, edit); - - ICSInputBoxUp = True; - j = 0; - XtSetArg(args[j], XtNleftBitmap, xMarkPixmap); j++; - XtSetValues(XtNameToWidget(menuBarWidget, "menuMode.ICS Input Box"), - args, j); + InputBoxPopup(); } +extern Option boxOptions[]; + void ICSInputSendText() { Widget edit; @@ -5144,7 +4815,7 @@ void ICSInputSendText() Arg args[16]; String val; - edit = XtNameToWidget(ICSInputShell, "*form.text"); + edit = boxOptions[0].handle; j = 0; XtSetArg(args[j], XtNstring, &val); j++; XtGetValues(edit, args, j); @@ -5156,90 +4827,25 @@ void ICSInputSendText() void ICSInputBoxPopDown() { - Arg args[16]; - int j; - - if (!ICSInputBoxUp) return; - j = 0; - XtPopdown(ICSInputShell); - ICSInputBoxUp = False; - j = 0; - XtSetArg(args[j], XtNleftBitmap, None); j++; - XtSetValues(XtNameToWidget(menuBarWidget, "menuMode.ICS Input Box"), - args, j); + PopDown(4); } void CommentPopUp(title, text) char *title, *text; { - Arg args[16]; - int j; - Widget edit; - savedIndex = currentMove; // [HGM] vari - if (commentShell == NULL) { - commentShell = - CommentCreate(title, text, False, CommentCallback, 4); - XtRealizeWidget(commentShell); - CatchDeleteWindow(commentShell, "CommentPopDown"); - } else { - edit = XtNameToWidget(commentShell, "*form.text"); - j = 0; - XtSetArg(args[j], XtNstring, text); j++; - XtSetValues(edit, args, j); - j = 0; - XtSetArg(args[j], XtNiconName, (XtArgVal) title); j++; - XtSetArg(args[j], XtNtitle, (XtArgVal) title); j++; - XtSetValues(commentShell, args, j); - } - - XtPopup(commentShell, XtGrabNone); - XSync(xDisplay, False); - - commentUp = True; + NewCommentPopup(title, text, currentMove); } -void CommentCallback(w, client_data, call_data) - Widget w; - XtPointer client_data, call_data; -{ - String name; - Arg args[16]; - int j; - - j = 0; - XtSetArg(args[j], XtNlabel, &name); j++; - XtGetValues(w, args, j); - - if (strcmp(name, _("close")) == 0) { - CommentPopDown(); - } else if (strcmp(name, _("edit")) == 0) { - CommentPopDown(); - EditCommentEvent(); - } -} - - void CommentPopDown() { - Arg args[16]; - int j; - - if (!commentUp) return; - j = 0; - XtSetArg(args[j], XtNx, &commentX); j++; - XtSetArg(args[j], XtNy, &commentY); j++; - XtSetArg(args[j], XtNwidth, &commentW); j++; - XtSetArg(args[j], XtNheight, &commentH); j++; - XtGetValues(commentShell, args, j); - XtPopdown(commentShell); - XSync(xDisplay, False); - commentUp = False; + PopDown(1); } -void FileNamePopUp(label, def, proc, openMode) +void FileNamePopUp(label, def, filter, proc, openMode) char *label; char *def; + char *filter; FileProc proc; char *openMode; { @@ -5250,7 +4856,7 @@ void FileNamePopUp(label, def, proc, openMode) int index; // this is not supported yet FILE *f; if(f = XsraSelFile(shellWidget, label, NULL, NULL, "could not open: ", - def, openMode, NULL, &name)) + (def[0] ? def : NULL), filter, openMode, NULL, &name)) (void) (*fileProc)(f, index=0, name); } } @@ -5360,6 +4966,16 @@ void PromotionPopUp() layout, args, j); if(gameInfo.variant != VariantShogi) { + if(gameInfo.variant == VariantSpartan && !WhiteOnMove(currentMove)) { + XawDialogAddButton(dialog, _("Warlord"), PromotionCallback, + (XtPointer) dialog); + XawDialogAddButton(dialog, _("General"), PromotionCallback, + (XtPointer) dialog); + XawDialogAddButton(dialog, _("Lieutenant"), PromotionCallback, + (XtPointer) dialog); + XawDialogAddButton(dialog, _("Captain"), PromotionCallback, + (XtPointer) dialog); + } else { XawDialogAddButton(dialog, _("Queen"), PromotionCallback, (XtPointer) dialog); XawDialogAddButton(dialog, _("Rook"), PromotionCallback, @@ -5368,7 +4984,9 @@ void PromotionPopUp() (XtPointer) dialog); XawDialogAddButton(dialog, _("Knight"), PromotionCallback, (XtPointer) dialog); + } if (!appData.testLegality || gameInfo.variant == VariantSuicide || + gameInfo.variant == VariantSpartan && !WhiteOnMove(currentMove) || gameInfo.variant == VariantGiveaway) { XawDialogAddButton(dialog, _("King"), PromotionCallback, (XtPointer) dialog); @@ -5702,7 +5320,7 @@ void LoadGameProc(w, event, prms, nprms) if (gameMode == AnalyzeMode || gameMode == AnalyzeFile) { Reset(FALSE, TRUE); } - FileNamePopUp(_("Load game file name?"), "", LoadGamePopUp, "rb"); + FileNamePopUp(_("Load game file name?"), "", ".pgn .game", LoadGamePopUp, "rb"); } void LoadNextGameProc(w, event, prms, nprms) @@ -5768,7 +5386,7 @@ void LoadPositionProc(w, event, prms, nprms) if (gameMode == AnalyzeMode || gameMode == AnalyzeFile) { Reset(FALSE, TRUE); } - FileNamePopUp(_("Load position file name?"), "", LoadPosition, "rb"); + FileNamePopUp(_("Load position file name?"), "", ".fen .epd .pos", LoadPosition, "rb"); } void SaveGameProc(w, event, prms, nprms) @@ -5779,6 +5397,7 @@ void SaveGameProc(w, event, prms, nprms) { FileNamePopUp(_("Save game file name?"), DefaultFileName(appData.oldSaveStyle ? "game" : "pgn"), + appData.oldSaveStyle ? ".game" : ".pgn", SaveGame, "a"); } @@ -5790,6 +5409,7 @@ void SavePositionProc(w, event, prms, nprms) { FileNamePopUp(_("Save position file name?"), DefaultFileName(appData.oldSaveStyle ? "pos" : "fen"), + appData.oldSaveStyle ? ".pos" : ".fen", SavePosition, "a"); } @@ -5932,6 +5552,7 @@ SendGameSelection(Widget w, Atom *selection, Atom *target, rewind(f); selection_tmp = XtMalloc(len + 1); count = fread(selection_tmp, 1, len, f); + fclose(f); if (len != count) { XtFree(selection_tmp); return False; @@ -6113,8 +5734,10 @@ void AnalyzeModeProc(w, event, prms, nprms) if (appData.debugMode) fprintf(debugFP, _("ICS engine analyze starting... \n")); } +#ifndef OPTIONSDIALOG if (!appData.showThinking) ShowThinkingProc(w,event,prms,nprms); +#endif AnalyzeModeEvent(); } @@ -6132,12 +5755,12 @@ void AnalyzeFileProc(w, event, prms, nprms) return; } Reset(FALSE, TRUE); - +#ifndef OPTIONSDIALOG if (!appData.showThinking) ShowThinkingProc(w,event,prms,nprms); - +#endif AnalyzeFileEvent(); - FileNamePopUp(_("File to analyze"), "", LoadGamePopUp, "rb"); + FileNamePopUp(_("File to analyze"), "", ".pgn .game", LoadGamePopUp, "rb"); AnalysisPeriodicEvent(1); } @@ -6150,6 +5773,20 @@ void TwoMachinesProc(w, event, prms, nprms) TwoMachinesEvent(); } +void MatchProc(w, event, prms, nprms) + Widget w; + XEvent *event; + String *prms; + Cardinal *nprms; +{ + if(gameMode != BeginningOfGame) { DisplayError(_("You can only start a match from the initial position."), 0); return; } + matchMode = 2; // This is back-end, really + appData.matchGames = appData.defaultMatchGames; + matchGame = 1; + first.matchWins = second.matchWins = 0; + TwoMachinesEvent(); +} + void IcsClientProc(w, event, prms, nprms) Widget w; XEvent *event; @@ -6192,11 +5829,15 @@ void EditCommentProc(w, event, prms, nprms) String *prms; Cardinal *nprms; { - if (editUp) { - EditCommentPopDown(); - } else { + Arg args[5]; + int j; + if (PopDown(1)) { // popdown succesful + j = 0; + XtSetArg(args[j], XtNleftBitmap, None); j++; + XtSetValues(XtNameToWidget(menuBarWidget, "menuEdit.Edit Comment"), args, j); + XtSetValues(XtNameToWidget(menuBarWidget, "menuView.Show Comments"), args, j); + } else // was not up EditCommentEvent(); - } } void IcsInputBoxProc(w, event, prms, nprms) @@ -6205,11 +5846,7 @@ void IcsInputBoxProc(w, event, prms, nprms) String *prms; Cardinal *nprms; { - if (ICSInputBoxUp) { - ICSInputBoxPopDown(); - } else { - ICSInputBoxPopUp(); - } + if (!PopDown(4)) ICSInputBoxPopUp(); } void AcceptProc(w, event, prms, nprms) @@ -6317,7 +5954,7 @@ void EnterKeyProc(w, event, prms, nprms) String *prms; Cardinal *nprms; { - if (ICSInputBoxUp == True) + if (shellUp[4] == True) ICSInputSendText(); } @@ -6333,8 +5970,8 @@ void UpKeyProc(w, event, prms, nprms) String val; XawTextBlock t; - if (!ICSInputBoxUp) return; - edit = XtNameToWidget(ICSInputShell, "*form.text"); + if (!shellUp[4]) return; + edit = boxOptions[0].handle; j = 0; XtSetArg(args[j], XtNstring, &val); j++; XtGetValues(edit, args, j); @@ -6358,8 +5995,8 @@ void DownKeyProc(w, event, prms, nprms) String val; XawTextBlock t; - if (!ICSInputBoxUp) return; - edit = XtNameToWidget(ICSInputShell, "*form.text"); + if (!shellUp[4]) return; + edit = boxOptions[0].handle; val = NextInHistory(); XtCallActionProc(edit, "select-all", NULL, NULL, 0); XtCallActionProc(edit, "kill-selection", NULL, NULL, 0); @@ -6479,8 +6116,17 @@ void MoveNowProc(w, event, prms, nprms) MoveNowEvent(); } +void FlipViewProc(w, event, prms, nprms) + Widget w; + XEvent *event; + String *prms; + Cardinal *nprms; +{ + flipView = !flipView; + DrawPosition(True, NULL); +} -void AlwaysQueenProc(w, event, prms, nprms) +void PonderNextMoveProc(w, event, prms, nprms) Widget w; XEvent *event; String *prms; @@ -6488,18 +6134,20 @@ void AlwaysQueenProc(w, event, prms, nprms) { Arg args[16]; - appData.alwaysPromoteToQueen = !appData.alwaysPromoteToQueen; - - if (appData.alwaysPromoteToQueen) { + PonderNextMoveEvent(!appData.ponderNextMove); +#ifndef OPTIONSDIALOG + if (appData.ponderNextMove) { XtSetArg(args[0], XtNleftBitmap, xMarkPixmap); } else { XtSetArg(args[0], XtNleftBitmap, None); } - XtSetValues(XtNameToWidget(menuBarWidget, "menuOptions.Always Queen"), + XtSetValues(XtNameToWidget(menuBarWidget, "menuOptions.Ponder Next Move"), args, 1); +#endif } -void AnimateDraggingProc(w, event, prms, nprms) +#ifndef OPTIONSDIALOG +void AlwaysQueenProc(w, event, prms, nprms) Widget w; XEvent *event; String *prms; @@ -6507,19 +6155,18 @@ void AnimateDraggingProc(w, event, prms, nprms) { Arg args[16]; - appData.animateDragging = !appData.animateDragging; + appData.alwaysPromoteToQueen = !appData.alwaysPromoteToQueen; - if (appData.animateDragging) { + if (appData.alwaysPromoteToQueen) { XtSetArg(args[0], XtNleftBitmap, xMarkPixmap); - CreateAnimVars(); } else { XtSetArg(args[0], XtNleftBitmap, None); } - XtSetValues(XtNameToWidget(menuBarWidget, "menuOptions.Animate Dragging"), + XtSetValues(XtNameToWidget(menuBarWidget, "menuOptions.Always Queen"), args, 1); } -void AnimateMovingProc(w, event, prms, nprms) +void AnimateDraggingProc(w, event, prms, nprms) Widget w; XEvent *event; String *prms; @@ -6527,19 +6174,19 @@ void AnimateMovingProc(w, event, prms, nprms) { Arg args[16]; - appData.animate = !appData.animate; + appData.animateDragging = !appData.animateDragging; - if (appData.animate) { + if (appData.animateDragging) { XtSetArg(args[0], XtNleftBitmap, xMarkPixmap); CreateAnimVars(); } else { XtSetArg(args[0], XtNleftBitmap, None); } - XtSetValues(XtNameToWidget(menuBarWidget, "menuOptions.Animate Moving"), + XtSetValues(XtNameToWidget(menuBarWidget, "menuOptions.Animate Dragging"), args, 1); } -void AutocommProc(w, event, prms, nprms) +void AnimateMovingProc(w, event, prms, nprms) Widget w; XEvent *event; String *prms; @@ -6547,18 +6194,18 @@ void AutocommProc(w, event, prms, nprms) { Arg args[16]; - appData.autoComment = !appData.autoComment; + appData.animate = !appData.animate; - if (appData.autoComment) { + if (appData.animate) { XtSetArg(args[0], XtNleftBitmap, xMarkPixmap); + CreateAnimVars(); } else { XtSetArg(args[0], XtNleftBitmap, None); } - XtSetValues(XtNameToWidget(menuBarWidget, "menuOptions.Auto Comment"), + XtSetValues(XtNameToWidget(menuBarWidget, "menuOptions.Animate Moving"), args, 1); } - void AutoflagProc(w, event, prms, nprms) Widget w; XEvent *event; @@ -6597,63 +6244,6 @@ void AutoflipProc(w, event, prms, nprms) args, 1); } -void AutobsProc(w, event, prms, nprms) - Widget w; - XEvent *event; - String *prms; - Cardinal *nprms; -{ - Arg args[16]; - - appData.autoObserve = !appData.autoObserve; - - if (appData.autoObserve) { - XtSetArg(args[0], XtNleftBitmap, xMarkPixmap); - } else { - XtSetArg(args[0], XtNleftBitmap, None); - } - XtSetValues(XtNameToWidget(menuBarWidget, "menuOptions.Auto Observe"), - args, 1); -} - -void AutoraiseProc(w, event, prms, nprms) - Widget w; - XEvent *event; - String *prms; - Cardinal *nprms; -{ - Arg args[16]; - - appData.autoRaiseBoard = !appData.autoRaiseBoard; - - if (appData.autoRaiseBoard) { - XtSetArg(args[0], XtNleftBitmap, xMarkPixmap); - } else { - XtSetArg(args[0], XtNleftBitmap, None); - } - XtSetValues(XtNameToWidget(menuBarWidget, "menuOptions.Auto Raise Board"), - args, 1); -} - -void AutosaveProc(w, event, prms, nprms) - Widget w; - XEvent *event; - String *prms; - Cardinal *nprms; -{ - Arg args[16]; - - appData.autoSaveGames = !appData.autoSaveGames; - - if (appData.autoSaveGames) { - XtSetArg(args[0], XtNleftBitmap, xMarkPixmap); - } else { - XtSetArg(args[0], XtNleftBitmap, None); - } - XtSetValues(XtNameToWidget(menuBarWidget, "menuOptions.Auto Save"), - args, 1); -} - void BlindfoldProc(w, event, prms, nprms) Widget w; XEvent *event; @@ -6718,17 +6308,8 @@ void FlashMovesProc(w, event, prms, nprms) args, 1); } -void FlipViewProc(w, event, prms, nprms) - Widget w; - XEvent *event; - String *prms; - Cardinal *nprms; -{ - flipView = !flipView; - DrawPosition(True, NULL); -} - -void GetMoveListProc(w, event, prms, nprms) +#if HIGHDRAG +void HighlightDraggingProc(w, event, prms, nprms) Widget w; XEvent *event; String *prms; @@ -6736,20 +6317,19 @@ void GetMoveListProc(w, event, prms, nprms) { Arg args[16]; - appData.getMoveList = !appData.getMoveList; + appData.highlightDragging = !appData.highlightDragging; - if (appData.getMoveList) { + if (appData.highlightDragging) { XtSetArg(args[0], XtNleftBitmap, xMarkPixmap); - GetMoveListEvent(); } else { XtSetArg(args[0], XtNleftBitmap, None); } - XtSetValues(XtNameToWidget(menuBarWidget, "menuOptions.Get Move List"), - args, 1); + XtSetValues(XtNameToWidget(menuBarWidget, + "menuOptions.Highlight Dragging"), args, 1); } +#endif -#if HIGHDRAG -void HighlightDraggingProc(w, event, prms, nprms) +void HighlightLastMoveProc(w, event, prms, nprms) Widget w; XEvent *event; String *prms; @@ -6757,19 +6337,18 @@ void HighlightDraggingProc(w, event, prms, nprms) { Arg args[16]; - appData.highlightDragging = !appData.highlightDragging; + appData.highlightLastMove = !appData.highlightLastMove; - if (appData.highlightDragging) { + if (appData.highlightLastMove) { XtSetArg(args[0], XtNleftBitmap, xMarkPixmap); } else { XtSetArg(args[0], XtNleftBitmap, None); } XtSetValues(XtNameToWidget(menuBarWidget, - "menuOptions.Highlight Dragging"), args, 1); + "menuOptions.Highlight Last Move"), args, 1); } -#endif -void HighlightLastMoveProc(w, event, prms, nprms) +void HighlightArrowProc(w, event, prms, nprms) Widget w; XEvent *event; String *prms; @@ -6777,17 +6356,18 @@ void HighlightLastMoveProc(w, event, prms, nprms) { Arg args[16]; - appData.highlightLastMove = !appData.highlightLastMove; + appData.highlightMoveWithArrow = !appData.highlightMoveWithArrow; - if (appData.highlightLastMove) { + if (appData.highlightMoveWithArrow) { XtSetArg(args[0], XtNleftBitmap, xMarkPixmap); } else { XtSetArg(args[0], XtNleftBitmap, None); } XtSetValues(XtNameToWidget(menuBarWidget, - "menuOptions.Highlight Last Move"), args, 1); + "menuOptions.Arrow"), args, 1); } +#if 0 void IcsAlarmProc(w, event, prms, nprms) Widget w; XEvent *event; @@ -6806,6 +6386,7 @@ void IcsAlarmProc(w, event, prms, nprms) XtSetValues(XtNameToWidget(menuBarWidget, "menuOptions.ICS Alarm"), args, 1); } +#endif void MoveSoundProc(w, event, prms, nprms) Widget w; @@ -6826,8 +6407,7 @@ void MoveSoundProc(w, event, prms, nprms) args, 1); } - -void OldSaveStyleProc(w, event, prms, nprms) +void OneClickProc(w, event, prms, nprms) Widget w; XEvent *event; String *prms; @@ -6835,14 +6415,14 @@ void OldSaveStyleProc(w, event, prms, nprms) { Arg args[16]; - appData.oldSaveStyle = !appData.oldSaveStyle; + appData.oneClick = !appData.oneClick; - if (appData.oldSaveStyle) { + if (appData.oneClick) { XtSetArg(args[0], XtNleftBitmap, xMarkPixmap); } else { XtSetArg(args[0], XtNleftBitmap, None); } - XtSetValues(XtNameToWidget(menuBarWidget, "menuOptions.Old Save Style"), + XtSetValues(XtNameToWidget(menuBarWidget, "menuOptions.OneClick"), args, 1); } @@ -6865,25 +6445,6 @@ void PeriodicUpdatesProc(w, event, prms, nprms) args, 1); } -void PonderNextMoveProc(w, event, prms, nprms) - Widget w; - XEvent *event; - String *prms; - Cardinal *nprms; -{ - Arg args[16]; - - PonderNextMoveEvent(!appData.ponderNextMove); - - if (appData.ponderNextMove) { - XtSetArg(args[0], XtNleftBitmap, xMarkPixmap); - } else { - XtSetArg(args[0], XtNleftBitmap, None); - } - XtSetValues(XtNameToWidget(menuBarWidget, "menuOptions.Ponder Next Move"), - args, 1); -} - void PopupExitMessageProc(w, event, prms, nprms) Widget w; XEvent *event; @@ -6922,6 +6483,7 @@ void PopupMoveErrorsProc(w, event, prms, nprms) args, 1); } +#if 0 void PremoveProc(w, event, prms, nprms) Widget w; XEvent *event; @@ -6940,25 +6502,7 @@ void PremoveProc(w, event, prms, nprms) XtSetValues(XtNameToWidget(menuBarWidget, "menuOptions.Premove"), args, 1); } - -void QuietPlayProc(w, event, prms, nprms) - Widget w; - XEvent *event; - String *prms; - Cardinal *nprms; -{ - Arg args[16]; - - appData.quietPlay = !appData.quietPlay; - - if (appData.quietPlay) { - XtSetArg(args[0], XtNleftBitmap, xMarkPixmap); - } else { - XtSetArg(args[0], XtNleftBitmap, None); - } - XtSetValues(XtNameToWidget(menuBarWidget, "menuOptions.Quiet Play"), - args, 1); -} +#endif void ShowCoordsProc(w, event, prms, nprms) Widget w; @@ -7010,6 +6554,7 @@ void HideThinkingProc(w, event, prms, nprms) XtSetValues(XtNameToWidget(menuBarWidget, "menuOptions.Hide Thinking"), args, 1); } +#endif void SaveOnExitProc(w, event, prms, nprms) Widget w; @@ -7471,7 +7016,9 @@ PlaySound(name) putc(BELLCHAR, stderr); } else { char buf[2048]; - snprintf(buf, sizeof(buf), "%s '%s' &", appData.soundProgram, name); + char *prefix = "", *sep = ""; + if(!strchr(name, '/')) { prefix = appData.soundDirectory; sep = "/"; } + snprintf(buf, sizeof(buf), "%s '%s%s%s' &", appData.soundProgram, prefix, sep, name); system(buf); } } @@ -8167,97 +7714,16 @@ DoInputCallback(closure, source, xid) } q = is->buf; while (p < is->unused) { - *q++ = *p++; + *q++ = *p++; } is->unused = q; } else { -# if HAVE_LIBREADLINE - /* check if input is from stdin, if yes, use gnu-readline */ - if( is->fd==fileno(stdin) ) - { - /* to clear the line */ - printf("\r \r"); - - /* read from stdin */ - rl_callback_read_char(); - /* redisplay the current line */ - if(sending_ICS_password) - { - int i; char buf[MSG_SIZ]; - - bzero(buf,MSG_SIZ); - - /* blank the password */ - count = strlen(rl_line_buffer); - if(count>MSG_SIZ-1) - { - printf("PROBLEM with readline\n"); - count=MSG_SIZ; - } - for(i=0;iINPUT_SOURCE_BUF_SIZE-1) - { - printf("PROBLEM with readline\n"); - count = INPUT_SOURCE_BUF_SIZE; - }; - strncpy(is->buf,readline_buffer,count); - is->buf[count]='\n';count++; - - /* reset gnu-readline state */ - free(readline_buffer); - readline_buffer=NULL; - readline_complete=0; - - if (count == -1) - error = errno; - else - error = 0; - (is->func)(is, is->closure, is->buf, count, error); - - /* are we done with the password? */ - if(sending_ICS_password) - sending_ICS_password=0; - if(sending_ICS_login) - sending_ICS_login=0; - } - } - else - { - /* input not from stdin, use default method */ - count = read(is->fd, is->buf, INPUT_SOURCE_BUF_SIZE); - if (count == -1) - error = errno; - else - error = 0; - (is->func)(is, is->closure, is->buf, count, error); - }; -#else /* no readline support */ - count = read(is->fd, is->buf, INPUT_SOURCE_BUF_SIZE); - if (count == -1) - error = errno; - else - error = 0; - (is->func)(is, is->closure, is->buf, count, error); -#endif - + count = read(is->fd, is->buf, INPUT_SOURCE_BUF_SIZE); + if (count == -1) + error = errno; + else + error = 0; + (is->func)(is, is->closure, is->buf, count, error); } } @@ -8313,36 +7779,28 @@ int OutputToProcess(pr, message, count, outError) ChildProc *cp = (ChildProc *) pr; int outCount; - if (pr == NoProc) { - if (appData.noJoin || !appData.useInternalWrap) - outCount = fwrite(message, 1, count, stdout); - else + if (appData.noJoin || !appData.useInternalWrap) + outCount = fwrite(message, 1, count, stdout); + else { - int width = get_term_width(); - int len = wrap(NULL, message, count, width, &line); - char *msg = malloc(len); - int dbgchk; - - if (!msg) - outCount = fwrite(message, 1, count, stdout); - else + int width = get_term_width(); + int len = wrap(NULL, message, count, width, &line); + char *msg = malloc(len); + int dbgchk; + + if (!msg) + outCount = fwrite(message, 1, count, stdout); + else { - dbgchk = wrap(msg, message, count, width, &line); - if (dbgchk != len && appData.debugMode) - fprintf(debugFP, "wrap(): dbgchk(%d) != len(%d)\n", dbgchk, len); - outCount = fwrite(msg, 1, dbgchk, stdout); - free(msg); + dbgchk = wrap(msg, message, count, width, &line); + if (dbgchk != len && appData.debugMode) + fprintf(debugFP, "wrap(): dbgchk(%d) != len(%d)\n", dbgchk, len); + outCount = fwrite(msg, 1, dbgchk, stdout); + free(msg); } } - -# if HAVE_LIBREADLINE - /* readline support */ - if(strlen(rl_line_buffer)) - printf("\n> %s",rl_line_buffer); -#endif - } else outCount = write(cp->fdTo, message, count); @@ -8519,11 +7977,10 @@ InitAnimState (anim, info) static void CreateAnimVars () { - static VariantClass old = (VariantClass) -1; // [HGM] pieces: redo every time variant changes XWindowAttributes info; - if (xpmDone && gameInfo.variant == old) return; - if(xpmDone) old = gameInfo.variant; // first time pieces might not be created yet + if (xpmDone && gameInfo.variant == oldVariant) return; + if(xpmDone) oldVariant = gameInfo.variant; // first time pieces might not be created yet XGetWindowAttributes(xDisplay, xBoardWindow, &info); InitAnimState(&game, &info); @@ -8821,6 +8278,7 @@ BeginAnimation(anim, piece, startColor, start) { Pixmap mask; + if(appData.upsideDown && flipView) piece += piece < BlackPawn ? BlackPawn : -BlackPawn; /* The old buffer is initialised with the start square (empty) */ BlankSquare(start->x, start->y, startColor, EmptySquare, anim->saveBuf, 0); anim->prevFrame = *start; @@ -9076,6 +8534,16 @@ DragPieceBegin(x, y) } } +void +ChangeDragPiece(ChessSquare piece) +{ + Pixmap mask; + player.dragPiece = piece; + /* The piece will be drawn using its own bitmap as a matte */ + SelectGCMask(piece, &player.pieceGC, &player.outlineGC, &mask); + XSetClipMask(xDisplay, player.pieceGC, mask); +} + static void DragPieceMove(x, y) int x; int y; @@ -9186,17 +8654,195 @@ void NotifyFrontendLogin() update_ics_width(); } -# if HAVE_LIBREADLINE -static void -ReadlineCompleteHandler(char* ptr) +/* [AS] Arrow highlighting support */ + +static double A_WIDTH = 5; /* Width of arrow body */ + +#define A_HEIGHT_FACTOR 6 /* Length of arrow "point", relative to body width */ +#define A_WIDTH_FACTOR 3 /* Width of arrow "point", relative to body width */ + +static double Sqr( double x ) { - /* make gnu-readline keep the history */ - readline_buffer = ptr; - readline_complete = 1; - - if (ptr && *ptr && !sending_ICS_password && !sending_ICS_login) - add_history(ptr); + return x*x; +} - return; +static int Round( double x ) +{ + return (int) (x + 0.5); +} + +void SquareToPos(int rank, int file, int *x, int *y) +{ + if (flipView) { + *x = lineGap + ((BOARD_WIDTH-1)-file) * (squareSize + lineGap); + *y = lineGap + rank * (squareSize + lineGap); + } else { + *x = lineGap + file * (squareSize + lineGap); + *y = lineGap + ((BOARD_HEIGHT-1)-rank) * (squareSize + lineGap); + } +} + +/* Draw an arrow between two points using current settings */ +void DrawArrowBetweenPoints( int s_x, int s_y, int d_x, int d_y ) +{ + XPoint arrow[7]; + double dx, dy, j, k, x, y; + + if( d_x == s_x ) { + int h = (d_y > s_y) ? +A_WIDTH*A_HEIGHT_FACTOR : -A_WIDTH*A_HEIGHT_FACTOR; + + arrow[0].x = s_x + A_WIDTH + 0.5; + arrow[0].y = s_y; + + arrow[1].x = s_x + A_WIDTH + 0.5; + arrow[1].y = d_y - h; + + arrow[2].x = arrow[1].x + A_WIDTH*(A_WIDTH_FACTOR-1) + 0.5; + arrow[2].y = d_y - h; + + arrow[3].x = d_x; + arrow[3].y = d_y; + + arrow[5].x = arrow[1].x - 2*A_WIDTH + 0.5; + arrow[5].y = d_y - h; + + arrow[4].x = arrow[5].x - A_WIDTH*(A_WIDTH_FACTOR-1) + 0.5; + arrow[4].y = d_y - h; + + arrow[6].x = arrow[1].x - 2*A_WIDTH + 0.5; + arrow[6].y = s_y; + } + else if( d_y == s_y ) { + int w = (d_x > s_x) ? +A_WIDTH*A_HEIGHT_FACTOR : -A_WIDTH*A_HEIGHT_FACTOR; + + arrow[0].x = s_x; + arrow[0].y = s_y + A_WIDTH + 0.5; + + arrow[1].x = d_x - w; + arrow[1].y = s_y + A_WIDTH + 0.5; + + arrow[2].x = d_x - w; + arrow[2].y = arrow[1].y + A_WIDTH*(A_WIDTH_FACTOR-1) + 0.5; + + arrow[3].x = d_x; + arrow[3].y = d_y; + + arrow[5].x = d_x - w; + arrow[5].y = arrow[1].y - 2*A_WIDTH + 0.5; + + arrow[4].x = d_x - w; + arrow[4].y = arrow[5].y - A_WIDTH*(A_WIDTH_FACTOR-1) + 0.5; + + arrow[6].x = s_x; + arrow[6].y = arrow[1].y - 2*A_WIDTH + 0.5; + } + else { + /* [AS] Needed a lot of paper for this! :-) */ + dy = (double) (d_y - s_y) / (double) (d_x - s_x); + dx = (double) (s_x - d_x) / (double) (s_y - d_y); + + j = sqrt( Sqr(A_WIDTH) / (1.0 + Sqr(dx)) ); + + k = sqrt( Sqr(A_WIDTH*A_HEIGHT_FACTOR) / (1.0 + Sqr(dy)) ); + + x = s_x; + y = s_y; + + arrow[0].x = Round(x - j); + arrow[0].y = Round(y + j*dx); + + arrow[1].x = Round(arrow[0].x + 2*j); // [HGM] prevent width to be affected by rounding twice + arrow[1].y = Round(arrow[0].y - 2*j*dx); + + if( d_x > s_x ) { + x = (double) d_x - k; + y = (double) d_y - k*dy; + } + else { + x = (double) d_x + k; + y = (double) d_y + k*dy; + } + + x = Round(x); y = Round(y); // [HGM] make sure width of shaft is rounded the same way on both ends + + arrow[6].x = Round(x - j); + arrow[6].y = Round(y + j*dx); + + arrow[2].x = Round(arrow[6].x + 2*j); + arrow[2].y = Round(arrow[6].y - 2*j*dx); + + arrow[3].x = Round(arrow[2].x + j*(A_WIDTH_FACTOR-1)); + arrow[3].y = Round(arrow[2].y - j*(A_WIDTH_FACTOR-1)*dx); + + arrow[4].x = d_x; + arrow[4].y = d_y; + + arrow[5].x = Round(arrow[6].x - j*(A_WIDTH_FACTOR-1)); + arrow[5].y = Round(arrow[6].y + j*(A_WIDTH_FACTOR-1)*dx); + } + + XFillPolygon(xDisplay, xBoardWindow, highlineGC, arrow, 7, Nonconvex, CoordModeOrigin); +// Polygon( hdc, arrow, 7 ); +} + +/* [AS] Draw an arrow between two squares */ +void DrawArrowBetweenSquares( int s_col, int s_row, int d_col, int d_row ) +{ + int s_x, s_y, d_x, d_y, hor, vert, i; + + if( s_col == d_col && s_row == d_row ) { + return; + } + + /* Get source and destination points */ + SquareToPos( s_row, s_col, &s_x, &s_y); + SquareToPos( d_row, d_col, &d_x, &d_y); + + if( d_y > s_y ) { + d_y += squareSize / 2 - squareSize / 4; // [HGM] round towards same centers on all sides! + } + else if( d_y < s_y ) { + d_y += squareSize / 2 + squareSize / 4; + } + else { + d_y += squareSize / 2; + } + + if( d_x > s_x ) { + d_x += squareSize / 2 - squareSize / 4; + } + else if( d_x < s_x ) { + d_x += squareSize / 2 + squareSize / 4; + } + else { + d_x += squareSize / 2; + } + + s_x += squareSize / 2; + s_y += squareSize / 2; + + /* Adjust width */ + A_WIDTH = squareSize / 14.; //[HGM] make float + + DrawArrowBetweenPoints( s_x, s_y, d_x, d_y ); + + hor = 64*s_col + 32; vert = 64*s_row + 32; + for(i=0; i<= 64; i++) { + damage[0][vert+6>>6][hor+6>>6] = True; + damage[0][vert-6>>6][hor+6>>6] = True; + damage[0][vert+6>>6][hor-6>>6] = True; + damage[0][vert-6>>6][hor-6>>6] = True; + hor += d_col - s_col; vert += d_row - s_row; + } +} + +Boolean IsDrawArrowEnabled() +{ + return appData.highlightMoveWithArrow && squareSize >= 32; +} + +void DrawArrowHighlight(int fromX, int fromY, int toX,int toY) +{ + if( IsDrawArrowEnabled() && fromX >= 0 && fromY >= 0 && toX >= 0 && toY >= 0) + DrawArrowBetweenSquares(fromX, fromY, toX, toY); } -#endif