X-Git-Url: http://winboard.nl/cgi-bin?a=blobdiff_plain;f=xboard.c;h=c83d83bfc6de2001a96f69e2b4aeaa8f4baf5ed8;hb=91d449673b904139f4bbce9e9206c161a6a9b488;hp=e0129a485a661486c626aa620b4868012004438e;hpb=fe5ba22edf2cb7c260ecf17c7f095f0bc3e1b0a3;p=xboard.git diff --git a/xboard.c b/xboard.c index e0129a4..c83d83b 100644 --- a/xboard.c +++ b/xboard.c @@ -49,6 +49,8 @@ *------------------------------------------------------------------------ ** See the file ChangeLog for a revision history. */ +#define HIGHDRAG 1 + #include "config.h" #include @@ -227,18 +229,18 @@ void EvalGraphProc P((Widget w, XEvent *event, #endif typedef struct { - String string; - XtActionProc proc; + String string; + XtActionProc proc; } MenuItem; typedef struct { - String name; - MenuItem *mi; + String name; + MenuItem *mi; } Menu; typedef struct { - char *name; - gboolean value; + char *name; + gboolean value; } Enables; @@ -261,7 +263,9 @@ static void DropMenuSelect P((Widget w, ChessSquare piece, caddr_t junk)); int EventToSquare P((int x, int limit)); void DrawSquare P((int row, int column, ChessSquare piece, int do_flash)); void AnimateUserMove P((Widget w, XEvent * event, - String * params, Cardinal * nParams)); + String * params, Cardinal * nParams)); +void HandlePV 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, @@ -269,9 +273,9 @@ void CommentCallback P((Widget w, XtPointer client_data, void ICSInputBoxPopUp P((void)); void ICSInputBoxPopDown P((void)); void AskQuestionReplyAction P((Widget w, XEvent *event, - String *prms, Cardinal *nprms)); + String *prms, Cardinal *nprms)); void AskQuestionProc P((Widget w, XEvent *event, - String *prms, Cardinal *nprms)); + String *prms, Cardinal *nprms)); void AskQuestionPopDown P((void)); void PromotionPopDown P((void)); void PromotionCallback P((Widget w, XtPointer client_data, @@ -288,7 +292,7 @@ void CopyGameProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms)); void PasteGameProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms)); void MailMoveProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms)); void ReloadCmailMsgProc P((Widget w, XEvent *event, String *prms, - Cardinal *nprms)); + Cardinal *nprms)); void EditCommentProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms)); void IcsInputBoxProc P((Widget w, XEvent *event, @@ -318,6 +322,9 @@ void TimeControlProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms)) void NewVariantProc 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 GameListOptionsPopDown P(()); +void PromoPopDown P(()); void ShufflePopDown P(()); void EnginePopDown P(()); void UciPopDown P(()); @@ -327,13 +334,14 @@ void SettingsPopDown P(()); void SetMenuEnables P((Enables *enab)); void update_ics_width P(()); int get_term_width P(()); +int CopyMemoProc P(()); /* -* XBoard depends on Xt R4 or higher -*/ + * XBoard depends on Xt R4 or higher + */ int xtVersion = XtSpecificationRelease; int xScreen; -Display *xDisplay; + Window xBoardWindow; Pixel lightSquareColor, darkSquareColor, whitePieceColor, blackPieceColor, jailSquareColor, highlightSquareColor, premoveHighlightColor; @@ -348,13 +356,13 @@ GC lightSquareGC, darkSquareGC, jailSquareGC, wdPieceGC, wlPieceGC, bdPieceGC, blPieceGC, wbPieceGC, bwPieceGC, coordGC, wjPieceGC, bjPieceGC; Pixmap iconPixmap, wIconPixmap, bIconPixmap, xMarkPixmap; -Widget shellWidget, layoutWidget, formWidget, boardWidget, messageWidget, +Widget layoutWidget, formWidget, boardWidget, messageWidget, whiteTimerWidget, blackTimerWidget, titleWidget, widgetList[16], commentShell, promotionShell, whitePieceMenu, blackPieceMenu, dropMenu, menuBarWidget, editShell, errorShell, analysisShell, ICSInputShell, fileNameShell, askQuestionShell; -Widget historyShell, evalGraphShell, gameListShell; +Widget evalGraphShell, gameListShell; //XSegment gridSegments[BOARD_RANKS + BOARD_FILES + 2]; //XSegment jailGridSegments[BOARD_RANKS + BOARD_FILES + 6]; @@ -426,15 +434,15 @@ XImage *xim_Cross; but that would require a fairly major rewrite. */ typedef struct { - Pixmap saveBuf; - Pixmap newBuf; - GC blitGC, pieceGC, outlineGC; - XPoint startSquare, prevFrame, mouseDelta; - int startColor; - int dragPiece; - Boolean dragActive; - int startBoardX, startBoardY; - } AnimState; + Pixmap saveBuf; + Pixmap newBuf; + GC blitGC, pieceGC, outlineGC; + XPoint startSquare, prevFrame, mouseDelta; + int startColor; + int dragPiece; + Boolean dragActive; + int startBoardX, startBoardY; +} AnimState; /* There can be two pieces being animated at once: a player can begin dragging a piece before the remote opponent has moved. */ @@ -453,92 +461,92 @@ static Pixmap xpmMask[BlackKing + 1]; SizeDefaults sizeDefaults[] = SIZE_DEFAULTS; Enables icsEnables[] = { - { "menuFile.Mail Move", False }, - { "menuFile.Reload CMail Message", False }, - { "menuMode.Machine Black", False }, - { "menuMode.Machine White", False }, - { "menuMode.Analysis Mode", False }, - { "menuMode.Analyze File", False }, - { "menuMode.Two Machines", False }, + { "menuFile.Mail Move", False }, + { "menuFile.Reload CMail Message", False }, + { "menuMode.Machine Black", False }, + { "menuMode.Machine White", False }, + { "menuMode.Analysis Mode", False }, + { "menuMode.Analyze File", False }, + { "menuMode.Two Machines", False }, #ifndef ZIPPY - { "menuHelp.Hint", False }, - { "menuHelp.Book", False }, - { "menuStep.Move Now", False }, - { "menuOptions.Periodic Updates", False }, - { "menuOptions.Hide Thinking", False }, - { "menuOptions.Ponder Next Move", False }, + { "menuHelp.Hint", False }, + { "menuHelp.Book", False }, + { "menuStep.Move Now", False }, + { "menuOptions.Periodic Updates", False }, + { "menuOptions.Hide Thinking", False }, + { "menuOptions.Ponder Next Move", False }, #endif - { NULL, False } + { NULL, False } }; Enables ncpEnables[] = { - { "menuFile.Mail Move", False }, - { "menuFile.Reload CMail Message", False }, - { "menuMode.Machine White", False }, - { "menuMode.Machine Black", False }, - { "menuMode.Analysis Mode", False }, - { "menuMode.Analyze File", False }, - { "menuMode.Two Machines", False }, - { "menuMode.ICS Client", False }, - { "menuMode.ICS Input Box", False }, - { "Action", False }, - { "menuStep.Revert", False }, - { "menuStep.Move Now", False }, - { "menuStep.Retract Move", False }, - { "menuOptions.Auto Comment", False }, - { "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.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 }, - { NULL, False } + { "menuFile.Mail Move", False }, + { "menuFile.Reload CMail Message", False }, + { "menuMode.Machine White", False }, + { "menuMode.Machine Black", False }, + { "menuMode.Analysis Mode", False }, + { "menuMode.Analyze File", False }, + { "menuMode.Two Machines", False }, + { "menuMode.ICS Client", False }, + { "menuMode.ICS Input Box", False }, + { "Action", False }, + { "menuStep.Revert", False }, + { "menuStep.Move Now", False }, + { "menuStep.Retract Move", False }, + { "menuOptions.Auto Comment", False }, + { "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.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 }, + { NULL, False } }; Enables gnuEnables[] = { - { "menuMode.ICS Client", False }, - { "menuMode.ICS Input Box", False }, - { "menuAction.Accept", False }, - { "menuAction.Decline", False }, - { "menuAction.Rematch", False }, - { "menuAction.Adjourn", False }, - { "menuAction.Stop Examining", False }, - { "menuAction.Stop Observing", False }, - { "menuStep.Revert", 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 }, - - /* The next two options rely on SetCmailMode being called *after* */ - /* SetGNUMode so that when GNU is being used to give hints these */ - /* menu options are still available */ - - { "menuFile.Mail Move", False }, - { "menuFile.Reload CMail Message", False }, - { NULL, False } + { "menuMode.ICS Client", False }, + { "menuMode.ICS Input Box", False }, + { "menuAction.Accept", False }, + { "menuAction.Decline", False }, + { "menuAction.Rematch", False }, + { "menuAction.Adjourn", False }, + { "menuAction.Stop Examining", False }, + { "menuAction.Stop Observing", False }, + { "menuStep.Revert", 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 }, + + /* The next two options rely on SetCmailMode being called *after* */ + /* SetGNUMode so that when GNU is being used to give hints these */ + /* menu options are still available */ + + { "menuFile.Mail Move", False }, + { "menuFile.Reload CMail Message", False }, + { NULL, False } }; Enables cmailEnables[] = { - { "Action", True }, - { "menuAction.Call Flag", False }, - { "menuAction.Draw", True }, - { "menuAction.Adjourn", False }, - { "menuAction.Abort", False }, - { "menuAction.Stop Observing", False }, - { "menuAction.Stop Examining", False }, - { "menuFile.Mail Move", True }, - { "menuFile.Reload CMail Message", True }, - { NULL, False } + { "Action", True }, + { "menuAction.Call Flag", False }, + { "menuAction.Draw", True }, + { "menuAction.Adjourn", False }, + { "menuAction.Abort", False }, + { "menuAction.Stop Observing", False }, + { "menuAction.Stop Examining", False }, + { "menuFile.Mail Move", True }, + { "menuFile.Reload CMail Message", True }, + { NULL, False } }; Enables trainingOnEnables[] = { @@ -604,27 +612,27 @@ Enables userThinkingEnables[] = { MenuItem fileMenu[] = { - {N_("New Shuffle Game ..."), ShuffleMenuProc}, - {N_("New Variant ..."), NewVariantProc}, // [HGM] variant: not functional yet - // {"----", NothingProc}, - // {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}, - {NULL, NULL} + {N_("New Shuffle Game ..."), ShuffleMenuProc}, + {N_("New Variant ..."), NewVariantProc}, // [HGM] variant: not functional yet + // {"----", NothingProc}, + // {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}, + {NULL, NULL} }; MenuItem modeMenu[] = { @@ -632,281 +640,324 @@ MenuItem modeMenu[] = { // {N_("Machine Black"), MachineBlackProc}, // {N_("Two Machines"), TwoMachinesProc}, // {N_("Analysis Mode"), AnalyzeModeProc}, - // {N_("Analyze File"), AnalyzeFileProc }, - // {N_("ICS Client"), IcsClientProc}, + // {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}, - // {"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}, - {NULL, NULL} + // {"----", NothingProc}, + {N_("Show Engine Output"), EngineOutputProc}, + {N_("Show Evaluation Graph"), EvalGraphProc}, + {N_("Show Game List"), ShowGameListProc}, + // {"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}, + {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}, - {"----", 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}, - //#if HIGHDRAG - // {N_("Highlight Dragging"), HighlightDraggingProc}, - //#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_("Hide Thinking"), HideThinkingProc}, - // {N_("Test Legality"), TestLegalityProc}, - // {N_("Show Coords"), ShowCoordsProc}, - {"----", NothingProc}, - {N_("Save Settings Now"), SaveSettingsProc}, - {N_("Save Settings on Exit"), SaveOnExitProc}, - {NULL, NULL} + {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}, + //#if HIGHDRAG + // {N_("Highlight Dragging"), HighlightDraggingProc}, + //#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_("Hide Thinking"), HideThinkingProc}, + // {N_("Test Legality"), TestLegalityProc}, + // {N_("Show Coords"), ShowCoordsProc}, + {"----", NothingProc}, + {N_("Save Settings Now"), SaveSettingsProc}, + {N_("Save Settings on Exit"), SaveOnExitProc}, + {NULL, NULL} }; Menu menuBar[] = { - {N_("File"), fileMenu}, - {N_("Mode"), modeMenu}, - {N_("Options"), optionsMenu}, - {NULL, NULL} + {N_("File"), fileMenu}, + {N_("Mode"), modeMenu}, + {N_("Options"), optionsMenu}, + {NULL, NULL} }; #define PIECE_MENU_SIZE 18 String pieceMenuStrings[2][PIECE_MENU_SIZE] = { - { N_("White"), "----", N_("Pawn"), N_("Knight"), N_("Bishop"), N_("Rook"), - N_("Queen"), N_("King"), "----", N_("Elephant"), N_("Cannon"), - N_("Archbishop"), N_("Chancellor"), "----", N_("Promote"), N_("Demote"), - N_("Empty square"), N_("Clear board") }, - { N_("Black"), "----", N_("Pawn"), N_("Knight"), N_("Bishop"), N_("Rook"), - N_("Queen"), N_("King"), "----", N_("Elephant"), N_("Cannon"), - N_("Archbishop"), N_("Chancellor"), "----", N_("Promote"), N_("Demote"), - N_("Empty square"), N_("Clear board") } + { N_("White"), "----", N_("Pawn"), N_("Knight"), N_("Bishop"), N_("Rook"), + N_("Queen"), N_("King"), "----", N_("Elephant"), N_("Cannon"), + N_("Archbishop"), N_("Chancellor"), "----", N_("Promote"), N_("Demote"), + N_("Empty square"), N_("Clear board") }, + { N_("Black"), "----", N_("Pawn"), N_("Knight"), N_("Bishop"), N_("Rook"), + N_("Queen"), N_("King"), "----", N_("Elephant"), N_("Cannon"), + N_("Archbishop"), N_("Chancellor"), "----", N_("Promote"), N_("Demote"), + N_("Empty square"), N_("Clear board") } }; /* must be in same order as PieceMenuStrings! */ ChessSquare pieceMenuTranslation[2][PIECE_MENU_SIZE] = { - { WhitePlay, (ChessSquare) 0, WhitePawn, WhiteKnight, WhiteBishop, - WhiteRook, WhiteQueen, WhiteKing, (ChessSquare) 0, WhiteAlfil, - WhiteCannon, WhiteAngel, WhiteMarshall, (ChessSquare) 0, - PromotePiece, DemotePiece, EmptySquare, ClearBoard }, - { BlackPlay, (ChessSquare) 0, BlackPawn, BlackKnight, BlackBishop, - BlackRook, BlackQueen, BlackKing, (ChessSquare) 0, BlackAlfil, - BlackCannon, BlackAngel, BlackMarshall, (ChessSquare) 0, - PromotePiece, DemotePiece, EmptySquare, ClearBoard }, + { WhitePlay, (ChessSquare) 0, WhitePawn, WhiteKnight, WhiteBishop, + WhiteRook, WhiteQueen, WhiteKing, (ChessSquare) 0, WhiteAlfil, + WhiteCannon, WhiteAngel, WhiteMarshall, (ChessSquare) 0, + PromotePiece, DemotePiece, EmptySquare, ClearBoard }, + { BlackPlay, (ChessSquare) 0, BlackPawn, BlackKnight, BlackBishop, + BlackRook, BlackQueen, BlackKing, (ChessSquare) 0, BlackAlfil, + BlackCannon, BlackAngel, BlackMarshall, (ChessSquare) 0, + PromotePiece, DemotePiece, EmptySquare, ClearBoard }, }; #define DROP_MENU_SIZE 6 String dropMenuStrings[DROP_MENU_SIZE] = { - "----", N_("Pawn"), N_("Knight"), N_("Bishop"), N_("Rook"), N_("Queen") - }; + "----", N_("Pawn"), N_("Knight"), N_("Bishop"), N_("Rook"), N_("Queen") +}; /* must be in same order as PieceMenuStrings! */ ChessSquare dropMenuTranslation[DROP_MENU_SIZE] = { - (ChessSquare) 0, WhitePawn, WhiteKnight, WhiteBishop, - WhiteRook, WhiteQueen + (ChessSquare) 0, WhitePawn, WhiteKnight, WhiteBishop, + WhiteRook, WhiteQueen }; typedef struct { - char piece; - char* widget; + char piece; + char* widget; } DropMenuEnables; DropMenuEnables dmEnables[] = { - { 'P', "Pawn" }, - { 'N', "Knight" }, - { 'B', "Bishop" }, - { 'R', "Rook" }, - { 'Q', "Queen" } + { 'P', "Pawn" }, + { 'N', "Knight" }, + { 'B', "Bishop" }, + { 'R', "Rook" }, + { 'Q', "Queen" } }; Arg layoutArgs[] = { - { XtNborderWidth, 0 }, - { XtNdefaultDistance, 0 }, + { XtNborderWidth, 0 }, + { XtNdefaultDistance, 0 }, }; Arg formArgs[] = { - { XtNborderWidth, 0 }, - { XtNresizable, (XtArgVal) True }, + { XtNborderWidth, 0 }, + { XtNresizable, (XtArgVal) True }, }; Arg boardArgs[] = { - { XtNborderWidth, 0 }, - { XtNwidth, 0 }, - { XtNheight, 0 } + { XtNborderWidth, 0 }, + { XtNwidth, 0 }, + { XtNheight, 0 } }; XtResource clientResources[] = { - { "flashCount", "flashCount", XtRInt, sizeof(int), - XtOffset(AppDataPtr, flashCount), XtRImmediate, - (XtPointer) FLASH_COUNT }, -}; - -XrmOptionDescRec shellOptions[] = { - { "-flashCount", "flashCount", XrmoptionSepArg, NULL }, - { "-flash", "flashCount", XrmoptionNoArg, "3" }, - { "-xflash", "flashCount", XrmoptionNoArg, "0" }, + { "flashCount", "flashCount", XtRInt, sizeof(int), + XtOffset(AppDataPtr, flashCount), XtRImmediate, + (XtPointer) FLASH_COUNT }, }; XtActionsRec boardActions[] = { - // { "HandleUserMove", HandleUserMove }, - { "AnimateUserMove", AnimateUserMove }, - // { "FileNameAction", FileNameAction }, - { "AskQuestionProc", AskQuestionProc }, - { "AskQuestionReplyAction", AskQuestionReplyAction }, - { "PieceMenuPopup", PieceMenuPopup }, - // { "WhiteClock", WhiteClock }, - // { "BlackClock", BlackClock }, - { "Iconify", Iconify }, - { "LoadSelectedProc", LoadSelectedProc }, - // { "LoadPositionProc", LoadPositionProc }, - // { "LoadNextPositionProc", LoadNextPositionProc }, - // { "LoadPrevPositionProc", LoadPrevPositionProc }, - // { "ReloadPositionProc", ReloadPositionProc }, - { "CopyPositionProc", CopyPositionProc }, - { "PastePositionProc", PastePositionProc }, - { "CopyGameProc", CopyGameProc }, - { "PasteGameProc", PasteGameProc }, - // { "SaveGameProc", SaveGameProc }, - // { "SavePositionProc", SavePositionProc }, - { "MailMoveProc", MailMoveProc }, - { "ReloadCmailMsgProc", ReloadCmailMsgProc }, - // { "MachineWhiteProc", MachineWhiteProc }, - // { "MachineBlackProc", MachineBlackProc }, - // { "AnalysisModeProc", AnalyzeModeProc }, - // { "AnalyzeFileProc", AnalyzeFileProc }, - // { "TwoMachinesProc", TwoMachinesProc }, - // { "IcsClientProc", IcsClientProc }, - // { "EditGameProc", EditGameProc }, - // { "EditPositionProc", EditPositionProc }, - // { "TrainingProc", EditPositionProc }, - { "EngineOutputProc", EngineOutputProc}, // [HGM] Winboard_x engine-output window - { "EvalGraphProc", EvalGraphProc}, // [HGM] Winboard_x avaluation graph window - { "ShowGameListProc", ShowGameListProc }, - // { "ShowMoveListProc", HistoryShowProc}, - // { "EditTagsProc", EditCommentProc }, - { "EditCommentProc", EditCommentProc }, - // { "IcsAlarmProc", IcsAlarmProc }, - { "IcsInputBoxProc", IcsInputBoxProc }, - // { "AcceptProc", AcceptProc }, - // { "DeclineProc", DeclineProc }, - // { "RematchProc", RematchProc }, - // { "CallFlagProc", CallFlagProc }, - // { "DrawProc", DrawProc }, - // { "AdjournProc", AdjournProc }, - // { "AbortProc", AbortProc }, - // { "ResignProc", ResignProc }, - // { "AdjuWhiteProc", AdjuWhiteProc }, - // { "AdjuBlackProc", AdjuBlackProc }, - // { "AdjuDrawProc", AdjuDrawProc }, - { "EnterKeyProc", EnterKeyProc }, - // { "StopObservingProc", StopObservingProc }, - // { "StopExaminingProc", StopExaminingProc }, - // { "BackwardProc", BackwardProc }, - // { "ForwardProc", ForwardProc }, - // { "ToStartProc", ToStartProc }, - // { "ToEndProc", ToEndProc }, - // { "RevertProc", RevertProc }, - // { "TruncateGameProc", TruncateGameProc }, - // { "MoveNowProc", MoveNowProc }, - // { "RetractMoveProc", RetractMoveProc }, - // { "AlwaysQueenProc", AlwaysQueenProc }, - // { "AnimateDraggingProc", AnimateDraggingProc }, - // { "AnimateMovingProc", AnimateMovingProc }, - // { "AutoflagProc", AutoflagProc }, - // { "AutoflipProc", AutoflipProc }, - // { "AutobsProc", AutobsProc }, - // { "AutoraiseProc", AutoraiseProc }, - // { "AutosaveProc", AutosaveProc }, - // { "BlindfoldProc", BlindfoldProc }, - // { "FlashMovesProc", FlashMovesProc }, - // { "FlipViewProc", FlipViewProc }, - // { "GetMoveListProc", GetMoveListProc }, + // { "HandleUserMove", HandleUserMove }, + { "AnimateUserMove", AnimateUserMove }, + // { "FileNameAction", FileNameAction }, + { "HandlePV", HandlePV }, + { "UnLoadPV", UnLoadPV }, + { "AskQuestionProc", AskQuestionProc }, + { "AskQuestionReplyAction", AskQuestionReplyAction }, + { "PieceMenuPopup", PieceMenuPopup }, + // { "WhiteClock", WhiteClock }, + // { "BlackClock", BlackClock }, + { "Iconify", Iconify }, + { "LoadSelectedProc", LoadSelectedProc }, + // { "LoadPositionProc", LoadPositionProc }, + // { "LoadNextPositionProc", LoadNextPositionProc }, + // { "LoadPrevPositionProc", LoadPrevPositionProc }, + // { "ReloadPositionProc", ReloadPositionProc }, + { "SetFilterProc", SetFilterProc }, + { "CopyPositionProc", CopyPositionProc }, + { "PastePositionProc", PastePositionProc }, + { "CopyGameProc", CopyGameProc }, + { "PasteGameProc", PasteGameProc }, + // { "SaveGameProc", SaveGameProc }, + // { "SavePositionProc", SavePositionProc }, + { "MailMoveProc", MailMoveProc }, + { "ReloadCmailMsgProc", ReloadCmailMsgProc }, + // { "MachineWhiteProc", MachineWhiteProc }, + // { "MachineBlackProc", MachineBlackProc }, + // { "AnalysisModeProc", AnalyzeModeProc }, + // { "AnalyzeFileProc", AnalyzeFileProc }, + // { "TwoMachinesProc", TwoMachinesProc }, + // { "IcsClientProc", IcsClientProc }, + // { "EditGameProc", EditGameProc }, + // { "EditPositionProc", EditPositionProc }, + // { "TrainingProc", EditPositionProc }, + { "EngineOutputProc", EngineOutputProc}, // [HGM] Winboard_x engine-output window + { "EvalGraphProc", EvalGraphProc}, // [HGM] Winboard_x avaluation graph window + { "ShowGameListProc", ShowGameListProc }, + // { "ShowMoveListProc", HistoryShowProc}, + // { "EditTagsProc", EditCommentProc }, + { "EditCommentProc", EditCommentProc }, + // { "IcsAlarmProc", IcsAlarmProc }, + { "IcsInputBoxProc", IcsInputBoxProc }, + // { "AcceptProc", AcceptProc }, + // { "DeclineProc", DeclineProc }, + // { "RematchProc", RematchProc }, + // { "CallFlagProc", CallFlagProc }, + // { "DrawProc", DrawProc }, + // { "AdjournProc", AdjournProc }, + // { "AbortProc", AbortProc }, + // { "ResignProc", ResignProc }, + // { "AdjuWhiteProc", AdjuWhiteProc }, + // { "AdjuBlackProc", AdjuBlackProc }, + // { "AdjuDrawProc", AdjuDrawProc }, + { "EnterKeyProc", EnterKeyProc }, + // { "StopObservingProc", StopObservingProc }, + // { "StopExaminingProc", StopExaminingProc }, + // { "BackwardProc", BackwardProc }, + // { "ForwardProc", ForwardProc }, + // { "ToStartProc", ToStartProc }, + // { "ToEndProc", ToEndProc }, + // { "RevertProc", RevertProc }, + // { "TruncateGameProc", TruncateGameProc }, + // { "MoveNowProc", MoveNowProc }, + // { "RetractMoveProc", RetractMoveProc }, + // { "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 }, + // { "HighlightDraggingProc", HighlightDraggingProc }, #endif - // { "HighlightLastMoveProc", HighlightLastMoveProc }, - // { "IcsAlarmProc", IcsAlarmProc }, - // { "MoveSoundProc", MoveSoundProc }, - // { "OldSaveStyleProc", OldSaveStyleProc }, - // { "PeriodicUpdatesProc", PeriodicUpdatesProc }, - // { "PonderNextMoveProc", PonderNextMoveProc }, - // { "PopupExitMessageProc", PopupExitMessageProc }, - // { "PopupMoveErrorsProc", PopupMoveErrorsProc }, - // { "PremoveProc", PremoveProc }, - // { "QuietPlayProc", QuietPlayProc }, - // { "ShowThinkingProc", ShowThinkingProc }, - // { "HideThinkingProc", HideThinkingProc }, - // { "TestLegalityProc", TestLegalityProc }, - { "SaveSettingsProc", SaveSettingsProc }, - { "SaveOnExitProc", SaveOnExitProc }, -// { "InfoProc", InfoProc }, -// { "ManProc", ManProc }, -// { "HintProc", HintProc }, -// { "BookProc", BookProc }, - { "AboutGameProc", AboutGameProc }, - { "DebugProc", DebugProc }, - { "NothingProc", NothingProc }, - { "CommentPopDown", (XtActionProc) CommentPopDown }, - { "EditCommentPopDown", (XtActionProc) EditCommentPopDown }, - { "TagsPopDown", (XtActionProc) TagsPopDown }, - { "ErrorPopDown", (XtActionProc) ErrorPopDown }, - { "ICSInputBoxPopDown", (XtActionProc) ICSInputBoxPopDown }, - // { "FileNamePopDown", (XtActionProc) FileNamePopDown }, - { "AskQuestionPopDown", (XtActionProc) AskQuestionPopDown }, - { "GameListPopDown", (XtActionProc) GameListPopDown }, - { "PromotionPopDown", (XtActionProc) PromotionPopDown }, - // { "HistoryPopDown", (XtActionProc) HistoryPopDown }, - { "EngineOutputPopDown", (XtActionProc) EngineOutputPopDown }, - { "EvalGraphPopDown", (XtActionProc) EvalGraphPopDown }, - { "ShufflePopDown", (XtActionProc) ShufflePopDown }, - { "EnginePopDown", (XtActionProc) EnginePopDown }, - { "UciPopDown", (XtActionProc) UciPopDown }, - { "TimeControlPopDown", (XtActionProc) TimeControlPopDown }, - { "NewVariantPopDown", (XtActionProc) NewVariantPopDown }, - { "SettingsPopDown", (XtActionProc) SettingsPopDown }, + // { "HighlightLastMoveProc", HighlightLastMoveProc }, + // { "IcsAlarmProc", IcsAlarmProc }, + // { "MoveSoundProc", MoveSoundProc }, + // { "OldSaveStyleProc", OldSaveStyleProc }, + // { "PeriodicUpdatesProc", PeriodicUpdatesProc }, + // { "PonderNextMoveProc", PonderNextMoveProc }, + // { "PopupExitMessageProc", PopupExitMessageProc }, + // { "PopupMoveErrorsProc", PopupMoveErrorsProc }, + // { "PremoveProc", PremoveProc }, + // { "QuietPlayProc", QuietPlayProc }, + // { "ShowThinkingProc", ShowThinkingProc }, + // { "HideThinkingProc", HideThinkingProc }, + // { "TestLegalityProc", TestLegalityProc }, + { "SaveSettingsProc", SaveSettingsProc }, + { "SaveOnExitProc", SaveOnExitProc }, + // { "InfoProc", InfoProc }, + // { "ManProc", ManProc }, + // { "HintProc", HintProc }, + // { "BookProc", BookProc }, + { "AboutGameProc", AboutGameProc }, + { "DebugProc", DebugProc }, + { "NothingProc", NothingProc }, + { "CommentPopDown", (XtActionProc) CommentPopDown }, + { "EditCommentPopDown", (XtActionProc) EditCommentPopDown }, + { "TagsPopDown", (XtActionProc) TagsPopDown }, + { "ErrorPopDown", (XtActionProc) ErrorPopDown }, + { "ICSInputBoxPopDown", (XtActionProc) ICSInputBoxPopDown }, + // { "FileNamePopDown", (XtActionProc) FileNamePopDown }, + { "AskQuestionPopDown", (XtActionProc) AskQuestionPopDown }, + { "GameListPopDown", (XtActionProc) GameListPopDown }, + { "GameListOptionsPopDown", (XtActionProc) GameListOptionsPopDown }, + { "PromotionPopDown", (XtActionProc) PromotionPopDown }, + // { "HistoryPopDown", (XtActionProc) HistoryPopDown }, + { "EngineOutputPopDown", (XtActionProc) EngineOutputPopDown }, + { "EvalGraphPopDown", (XtActionProc) EvalGraphPopDown }, + { "ShufflePopDown", (XtActionProc) ShufflePopDown }, + { "EnginePopDown", (XtActionProc) EnginePopDown }, + { "UciPopDown", (XtActionProc) UciPopDown }, + { "TimeControlPopDown", (XtActionProc) TimeControlPopDown }, + { "NewVariantPopDown", (XtActionProc) NewVariantPopDown }, + { "SettingsPopDown", (XtActionProc) SettingsPopDown }, + { "CopyMemoProc", (XtActionProc) CopyMemoProc }, }; +//char globalTranslations[] = +// ":R: ResignProc() \n \ +// :r: ResetProc() \n \ +// :g: LoadGameProc() \n \ +// :N: LoadNextGameProc() \n \ +// :P: LoadPrevGameProc() \n \ +// :Q: QuitProc() \n \ +// :F: ToEndProc() \n \ +// :f: ForwardProc() \n \ +// :B: ToStartProc() \n \ +// :b: BackwardProc() \n \ +// :p: PauseProc() \n \ +// :d: DrawProc() \n \ +// :t: CallFlagProc() \n \ +// :i: Iconify() \n \ +// :c: Iconify() \n \ +// :v: FlipViewProc() \n \ +// Control_L: BackwardProc() \n \ +// Control_L: ForwardProc() \n \ +// Control_R: BackwardProc() \n \ +// Control_R: ForwardProc() \n \ +// Shift1: AskQuestionProc(\"Direct command\", \ +// \"Send to chess program:\",,1) \n \ +// Shift2: AskQuestionProc(\"Direct command\", \ +// \"Send to second chess program:\",,2) \n"; +// +//char boardTranslations[] = +// ": HandleUserMove() \n \ +// : HandleUserMove() \n \ +// : AnimateUserMove() \n \ +// : HandlePV() \n \ +// : UnLoadPV() \n \ +// Shift: XawPositionSimpleMenu(menuB) XawPositionSimpleMenu(menuD) \ +// PieceMenuPopup(menuB) \n \ +// Any: XawPositionSimpleMenu(menuW) XawPositionSimpleMenu(menuD) \ +// PieceMenuPopup(menuW) \n \ +// Shift: XawPositionSimpleMenu(menuW) XawPositionSimpleMenu(menuD) \ +// PieceMenuPopup(menuW) \n \ +// Any: XawPositionSimpleMenu(menuB) XawPositionSimpleMenu(menuD) \ +// PieceMenuPopup(menuB) \n"; +// +//char whiteTranslations[] = ": WhiteClock()\n"; +//char blackTranslations[] = ": BlackClock()\n"; char ICSInputTranslations[] = - "Return: EnterKeyProc() \n"; + "Return: EnterKeyProc() \n"; String xboardResources[] = { // "*fileName*value.translations: #override\\n Return: FileNameAction()", - "*question*value.translations: #override\\n Return: AskQuestionReplyAction()", - "*errorpopup*translations: #override\\n Return: ErrorPopDown()", - NULL - }; + "*question*value.translations: #override\\n Return: AskQuestionReplyAction()", + "*errorpopup*translations: #override\\n Return: ErrorPopDown()", + NULL +}; static char *cnames[9] = { "black", "red", "green", "yellow", "blue", - "magenta", "cyan", "white" }; + "magenta", "cyan", "white" }; typedef struct { - int attr, bg, fg; + int attr, bg, fg; } TextColors; TextColors textColors[(int)NColorClasses]; @@ -916,47 +967,47 @@ parse_color(str, which) char *str; int which; { - char *p, buf[100], *d; - int i; - - if (strlen(str) > 99) /* watch bounds on buf */ + char *p, buf[100], *d; + int i; + + if (strlen(str) > 99) /* watch bounds on buf */ + return -1; + + p = str; + d = buf; + for (i=0; iWM_PROTOCOLS: %s() \n", procname); - XtAugmentTranslations(w, XtParseTranslationTable(buf)); -} - void BoardToTop() { @@ -1004,13 +1044,13 @@ BoardToTop() #define JAWS_ARGS #define CW_USEDEFAULT (1<<31) #define ICS_TEXT_MENU_SIZE 90 +#define DEBUG_FILE "xboard.debug" #define SetCurrentDirectory chdir #define GetCurrentDirectory(SIZE, NAME) getcwd(NAME, SIZE) #define OPTCHAR "-" #define SEPCHAR " " // these two must some day move to frontend.h, when they are implemented -Boolean MoveHistoryIsUp(); Boolean GameListIsUp(); // The option definition and parsing code common to XBoard and WinBoard is collected in this file @@ -1029,7 +1069,7 @@ colorVariable[] = { &appData.darkSquareColor, &appData.highlightSquareColor, &appData.premoveHighlightColor, - NULL, + &appData.lowTimeWarningColor, NULL, NULL, NULL, @@ -1040,22 +1080,39 @@ colorVariable[] = { NULL }; +// [HGM] font: keep a font for each square size, even non-stndard ones +#define NUM_SIZES 18 +#define MAX_SIZE 130 +Boolean fontSet[NUM_FONTS], fontValid[NUM_FONTS][MAX_SIZE]; +char *fontTable[NUM_FONTS][MAX_SIZE]; + void ParseFont(char *name, int number) { // in XBoard, only 2 of the fonts are currently implemented, and we just copy their name + int size; + if(sscanf(name, "size%d:", &size)) { + // [HGM] font: font is meant for specific boardSize (likely from settings file); + // defer processing it until we know if it matches our board size + if(size >= 0 && sizeargLoc) { - case 0: // CLOCK_FONT - name = appData.clockFont; - break; - case 1: // MESSAGE_FONT - name = appData.font; - break; - case 2: // COORD_FONT - name = appData.coordFont; - break; - default: - return; + char *name, buf[MSG_SIZ]; + int i, n = (int)ad->argLoc; + switch(n) { + case 0: // CLOCK_FONT + name = appData.clockFont; + break; + case 1: // MESSAGE_FONT + name = appData.font; + break; + case 2: // COORD_FONT + name = appData.coordFont; + break; + default: + return; } - fprintf(f, OPTCHAR "%s" SEPCHAR "%s\n", ad->argName, name); + for(i=0; iargName, i, fontTable[n][i]); } void @@ -1128,14 +1193,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)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)ad->argLoc]) + fprintf(f, OPTCHAR "%s" SEPCHAR "%s\n", ad->argName, *(char**)colorVariable[(int)ad->argLoc]); } void @@ -1151,6 +1216,7 @@ ParseCommPortSettings(char *s) extern Widget engineOutputShell; extern Widget tagsShell, editTagsShell; + void GetActualPlacement(Widget wg, WindowPlacement *wp) { @@ -1158,29 +1224,30 @@ GetActualPlacement(Widget wg, WindowPlacement *wp) Dimension w, h; Position x, y; int i; - + if(!wg) return; - i = 0; - XtSetArg(args[i], XtNx, &x); i++; - XtSetArg(args[i], XtNy, &y); i++; - XtSetArg(args[i], XtNwidth, &w); i++; - XtSetArg(args[i], XtNheight, &h); i++; - XtGetValues(wg, args, i); - wp->x = x - 4; - wp->y = y - 23; - wp->height = h; - wp->width = w; + i = 0; + XtSetArg(args[i], XtNx, &x); i++; + XtSetArg(args[i], XtNy, &y); i++; + XtSetArg(args[i], XtNwidth, &w); i++; + XtSetArg(args[i], XtNheight, &h); i++; + XtGetValues(wg, args, i); + wp->x = x - 4; + wp->y = y - 23; + wp->height = h; + wp->width = w; } void GetWindowCoords() { // wrapper to shield use of window handles from back-end (make addressible by number?) // In XBoard this will have to wait until awareness of window parameters is implemented - GetActualPlacement(shellWidget, &wpMain); + + // GetActualPlacement(shellWidget, &wpMain); if(EngineOutputIsUp()) GetActualPlacement(engineOutputShell, &wpEngineOutput); else - if(MoveHistoryIsUp()) GetActualPlacement(historyShell, &wpMoveHistory); - if(EvalGraphIsUp()) GetActualPlacement(evalGraphShell, &wpEvalGraph); + // if(MoveHistoryIsUp()) GetActualPlacement(historyShell, &wpMoveHistory); + if(EvalGraphIsUp()) GetActualPlacement(evalGraphShell, &wpEvalGraph); if(GameListIsUp()) GetActualPlacement(gameListShell, &wpGameList); if(commentShell) GetActualPlacement(commentShell, &wpComment); else GetActualPlacement(editShell, &wpComment); @@ -1232,130 +1299,131 @@ ConvertToLine(int argc, char **argv) { static char line[128*1024], buf[1024]; int i; - + line[0] = NULLCHAR; for(i=1; i= 1000-2) { printf(_("too many arguments\n")); exit(-1); } - //fprintf(stderr, "arg %s\n", argv[i]); - if(argv[i][0] != '@') argvCopy[j++] = argv[i]; else { - char c; - FILE *f = fopen(argv[i]+1, "rb"); - if(f == NULL) { fprintf(stderr, _("ignore %s\n"), argv[i]); continue; } // do not expand non-existing - argvCopy[j++] = newArgs + k; // get ready for first argument from file - while((c = fgetc(f)) != EOF) { // each line of file inserts 1 argument in the list - if(c == '\n') { - if(j >= 1000-2) { printf(_("too many arguments\n")); exit(-1); } - newArgs[k++] = 0; // terminate current arg - if(k >= 10000-1) { printf(_("too long arguments\n")); exit(-1); } - argvCopy[j++] = newArgs + k; // get ready for next - } else { - if(k >= 10000-1) { printf(_("too long arguments\n")); exit(-1); } - newArgs[k++] = c; - } - } - newArgs[k] = 0; - j--; - fclose(f); - } - } - argvCopy[j] = NULL; - argv = argvCopy; - argc = j; -#endif - - setbuf(stdout, NULL); - setbuf(stderr, NULL); - debugFP = stderr; - - programName = strrchr(argv[0], '/'); - if (programName == NULL) - programName = argv[0]; - else - programName++; - + int i, j, clockFontPxlSize, coordFontPxlSize, fontPxlSize; + XSetWindowAttributes window_attributes; + Arg args[16]; + Dimension timerWidth, boardWidth, boardHeight, w, h, sep, bor, wr, hr; + XrmValue vFrom, vTo; + XtGeometryResult gres; + char *p; + XrmDatabase xdb; + int forceMono = False; + + srandom(time(0)); // [HGM] book: make random truly random + + setbuf(stdout, NULL); + setbuf(stderr, NULL); + debugFP = stderr; + + if(argc > 1 && (!strcmp(argv[1], "-v" ) || !strcmp(argv[1], "--version" ))) { + printf("%s version %s\n", PACKAGE_NAME, PACKAGE_VERSION); + exit(0); + } + + programName = strrchr(argv[0], '/'); + if (programName == NULL) + programName = argv[0]; + else + programName++; + #ifdef ENABLE_NLS - XtSetLanguageProc(NULL, NULL, NULL); - bindtextdomain(PACKAGE, LOCALEDIR); - textdomain(PACKAGE); + XtSetLanguageProc(NULL, NULL, NULL); + bindtextdomain(PACKAGE, LOCALEDIR); + textdomain(PACKAGE); #endif - - shellWidget = - XtAppInitialize(&appContext, "XBoard", shellOptions, - XtNumber(shellOptions), - &argc, argv, xboardResources, NULL, 0); - - /* set up GTK */ - gtk_init (&argc, &argv); - - /* parse glade file to build widgets */ - - builder = gtk_builder_new (); - gtk_builder_add_from_file (builder, "gtk-interface.xml", NULL); - - /* test if everything worked ok */ - - GUI_Window = GTK_WIDGET (gtk_builder_get_object (builder, "MainWindow")); - if(!GUI_Window) printf("Error: gtk_builder didn't work!\n"); - - GUI_Aspect = GTK_WIDGET (gtk_builder_get_object (builder, "Aspectframe")); - if(!GUI_Aspect) printf("Error: gtk_builder didn't work!\n"); - - GUI_History = GTK_WIDGET (gtk_builder_get_object (builder, "MoveHistory")); - if(!GUI_History) printf("Error: gtk_builder didn't work!\n"); - - GUI_Menubar = GTK_WIDGET (gtk_builder_get_object (builder, "MenuBar")); - if(!GUI_Menubar) printf("Error: gtk_builder didn't work!\n"); - GUI_Timer = GTK_WIDGET (gtk_builder_get_object (builder, "Timer")); - if(!GUI_Timer) printf("Error: gtk_builder didn't work!\n"); - GUI_Buttonbar = GTK_WIDGET (gtk_builder_get_object (builder, "ButtonBar")); - if(!GUI_Buttonbar) printf("Error: gtk_builder didn't work!\n"); - GUI_Board = GTK_WIDGET (gtk_builder_get_object (builder, "Board")); - if(!GUI_Board) printf("Error: gtk_builder didn't work!\n"); - - GUI_Whiteclock = GTK_WIDGET (gtk_builder_get_object (builder, "WhiteClock")); - if(!GUI_Whiteclock) printf("Error: gtk_builder didn't work!\n"); - - GUI_Blackclock = GTK_WIDGET (gtk_builder_get_object (builder, "BlackClock")); - if(!GUI_Blackclock) printf("Error: gtk_builder didn't work!\n"); - - LIST_MoveHistory = GTK_LIST_STORE (gtk_builder_get_object (builder, "MoveHistoryStore")); - if(!LIST_MoveHistory) printf("Error: gtk_builder didn't work!\n"); - - /* EditTags window */ - GUI_EditTags = GTK_WIDGET (gtk_builder_get_object (builder, "EditTags")); - if(!GUI_EditTags) printf("Error: gtk_builder didn't work!\n"); - - GUI_EditTagsTextArea = GTK_WIDGET (gtk_builder_get_object (builder, "EditTagsTextArea")); - if(!GUI_EditTagsTextArea) printf("Error: gtk_builder didn't work!\n"); - - - gtk_builder_connect_signals (builder, NULL); - - // don't unref the builder, since we use it to get references to widgets - // g_object_unref (G_OBJECT (builder)); - - /* end parse glade file */ - - appData.boardSize = ""; - InitAppData(ConvertToLine(argc, argv)); - - if (argc > 1) - { - fprintf(stderr, _("%s: unrecognized argument %s\n"), - programName, argv[1]); - - fprintf(stderr, "Recognized options:\n"); - for(i = 0; i < XtNumber(shellOptions); i++) - { - /* print first column */ - j = fprintf(stderr, " %s%s", shellOptions[i].option, - (shellOptions[i].argKind == XrmoptionSepArg - ? " ARG" : "")); - /* print second column and end line */ - if (++i < XtNumber(shellOptions)) - { - fprintf(stderr, "%*c%s%s\n", 40 - j, ' ', - shellOptions[i].option, - (shellOptions[i].argKind == XrmoptionSepArg - ? " ARG" : "")); - } - else - { - fprintf(stderr, "\n"); - }; - }; - exit(2); - }; - - p = getenv("HOME"); - if (p == NULL) p = "/tmp"; - i = strlen(p) + strlen("/.xboardXXXXXx.pgn") + 1; - gameCopyFilename = (char*) malloc(i); - gamePasteFilename = (char*) malloc(i); - snprintf(gameCopyFilename,i, "%s/.xboard%05uc.pgn", p, getpid()); - snprintf(gamePasteFilename,i, "%s/.xboard%05up.pgn", p, getpid()); - - XtGetApplicationResources(shellWidget, (XtPointer) &appData, - clientResources, XtNumber(clientResources), - NULL, 0); - - { // [HGM] initstring: kludge to fix bad bug. expand '\n' characters in init string and computer string. - static char buf[MSG_SIZ]; - EscapeExpand(buf, appData.initString); - appData.initString = strdup(buf); - EscapeExpand(buf, appData.secondInitString); - appData.secondInitString = strdup(buf); - EscapeExpand(buf, appData.firstComputerString); - appData.firstComputerString = strdup(buf); - EscapeExpand(buf, appData.secondComputerString); - appData.secondComputerString = strdup(buf); + + /* set up GTK */ + gtk_init (&argc, &argv); + + /* parse glade file to build widgets */ + + builder = gtk_builder_new (); + GError *gtkerror=NULL; + if(!gtk_builder_add_from_file (builder, "gtk-interface.xml", >kerror)) + { + if(gtkerror) + printf ("Error: %d %s\n",gtkerror->code,gtkerror->message); } - - if ((chessDir = (char *) getenv("CHESSDIR")) == NULL) { - chessDir = "."; - } else { - if (chdir(chessDir) != 0) { - fprintf(stderr, _("%s: can't cd to CHESSDIR: "), programName); - perror(chessDir); - exit(1); - } + + /* test if everything worked ok */ + + GUI_Window = GTK_WIDGET (gtk_builder_get_object (builder, "MainWindow")); + if(!GUI_Window) printf("Error: gtk_builder didn't work (MainWindow)!\n"); + + GUI_Aspect = GTK_WIDGET (gtk_builder_get_object (builder, "Aspectframe")); + if(!GUI_Aspect) printf("Error: gtk_builder didn't work (Aspectframe)!\n"); + + GUI_Menubar = GTK_WIDGET (gtk_builder_get_object (builder, "MenuBar")); + if(!GUI_Menubar) printf("Error: gtk_builder didn't work (MenuBar)!\n"); + GUI_Timer = GTK_WIDGET (gtk_builder_get_object (builder, "Timer")); + if(!GUI_Timer) printf("Error: gtk_builder didn't work (Timer)!\n"); + GUI_Buttonbar = GTK_WIDGET (gtk_builder_get_object (builder, "ButtonBar")); + if(!GUI_Buttonbar) printf("Error: gtk_builder didn't work (ButtonBar)!\n"); + GUI_Board = GTK_WIDGET (gtk_builder_get_object (builder, "Board")); + if(!GUI_Board) printf("Error: gtk_builder didn't work (Board)!\n"); + + GUI_Whiteclock = GTK_WIDGET (gtk_builder_get_object (builder, "WhiteClock")); + if(!GUI_Whiteclock) printf("Error: gtk_builder didn't work (WhiteClock)!\n"); + + GUI_Blackclock = GTK_WIDGET (gtk_builder_get_object (builder, "BlackClock")); + if(!GUI_Blackclock) printf("Error: gtk_builder didn't work (BlackClock)!\n"); + + /* GTK lists stores*/ + LIST_MoveHistory = GTK_LIST_STORE (gtk_builder_get_object (builder, "MoveHistoryStore")); + if(!LIST_MoveHistory) printf("Error: gtk_builder didn't work (MoveHistoryStore)!\n"); + + LIST_GameList = GTK_LIST_STORE (gtk_builder_get_object (builder, "GameListStore")); + if(!LIST_GameList) printf("Error: gtk_builder didn't work (GameListStore)!\n"); + + /* EditTags window */ + GUI_EditTags = GTK_WIDGET (gtk_builder_get_object (builder, "EditTags")); + if(!GUI_EditTags) printf("Error: gtk_builder didn't work (EditTags)!\n"); + + GUI_EditTagsTextArea = GTK_WIDGET (gtk_builder_get_object (builder, "EditTagsTextArea")); + if(!GUI_EditTagsTextArea) printf("Error: gtk_builder didn't work(EditTagsTextArea)!\n"); + + /* move history and game list windows */ + GUI_History = GTK_WIDGET (gtk_builder_get_object (builder, "MoveHistory")); + if(!GUI_History) printf("Error: gtk_builder didn't work (MoveHistory)!\n"); + + TREE_History = GTK_TREE_VIEW (gtk_builder_get_object (builder, "MoveHistoryView")); + if(!TREE_History) printf("Error: gtk_builder didn't work (MoveHistoryView)!\n"); + + GUI_GameList = GTK_WIDGET (gtk_builder_get_object (builder, "GameList")); + if(!GUI_GameList) printf("Error: gtk_builder didn't work (GameList)!\n"); + + TREE_Game = GTK_TREE_VIEW (gtk_builder_get_object (builder, "GameListView")); + if(!TREE_Game) printf("Error: gtk_builder didn't work (GameListView)!\n"); + + + /* connect lists to views */ + gtk_tree_view_set_model(TREE_History, GTK_TREE_MODEL(LIST_MoveHistory)); + gtk_tree_view_set_model(TREE_Game, GTK_TREE_MODEL(LIST_GameList)); + + gtk_builder_connect_signals (builder, NULL); + + // don't unref the builder, since we use it to get references to widgets + // g_object_unref (G_OBJECT (builder)); + + /* end parse glade file */ + + appData.boardSize = ""; + InitAppData(ConvertToLine(argc, argv)); + + p = getenv("HOME"); + if (p == NULL) p = "/tmp"; + i = strlen(p) + strlen("/.xboardXXXXXx.pgn") + 1; + gameCopyFilename = (char*) malloc(i); + gamePasteFilename = (char*) malloc(i); + snprintf(gameCopyFilename,i, "%s/.xboard%05uc.pgn", p, getpid()); + snprintf(gamePasteFilename,i, "%s/.xboard%05up.pgn", p, getpid()); + + // XtGetApplicationResources(shellWidget, (XtPointer) &appData, + // clientResources, XtNumber(clientResources), + // NULL, 0); + + { // [HGM] initstring: kludge to fix bad bug. expand '\n' characters in init string and computer string. + static char buf[MSG_SIZ]; + EscapeExpand(buf, appData.initString); + appData.initString = strdup(buf); + EscapeExpand(buf, appData.secondInitString); + appData.secondInitString = strdup(buf); + EscapeExpand(buf, appData.firstComputerString); + appData.firstComputerString = strdup(buf); + EscapeExpand(buf, appData.secondComputerString); + appData.secondComputerString = strdup(buf); + } + + if ((chessDir = (char *) getenv("CHESSDIR")) == NULL) { + chessDir = "."; + } else { + if (chdir(chessDir) != 0) { + fprintf(stderr, _("%s: can't cd to CHESSDIR: "), programName); + perror(chessDir); + exit(1); } - - if (appData.debugMode && appData.nameOfDebugFile && strcmp(appData.nameOfDebugFile, "stderr")) { - /* [DM] debug info to file [HGM] make the filename a command-line option, and allow it to remain stderr */ - if ((debugFP = fopen(appData.nameOfDebugFile, "w")) == NULL) { - printf(_("Failed to open file '%s'\n"), appData.nameOfDebugFile); - exit(errno); - } - setbuf(debugFP, NULL); + } + + if (appData.debugMode && appData.nameOfDebugFile && strcmp(appData.nameOfDebugFile, "stderr")) { + /* [DM] debug info to file [HGM] make the filename a command-line option, and allow it to remain stderr */ + if ((debugFP = fopen(appData.nameOfDebugFile, "w")) == NULL) { + printf(_("Failed to open file '%s'\n"), appData.nameOfDebugFile); + exit(errno); } - - /* [HGM,HR] make sure board size is acceptable */ - if(appData.NrFiles > BOARD_FILES || - appData.NrRanks > BOARD_RANKS ) - DisplayFatalError(_("Recompile with larger BOARD_RANKS or BOARD_FILES to support this size"), 0, 2); - + setbuf(debugFP, NULL); + } + + #if !HIGHDRAG - /* This feature does not work; animation needs a rewrite */ - appData.highlightDragging = FALSE; + /* This feature does not work; animation needs a rewrite */ + appData.highlightDragging = FALSE; #endif - InitBackEnd1(); - - xDisplay = XtDisplay(shellWidget); - xScreen = DefaultScreen(xDisplay); - wm_delete_window = XInternAtom(xDisplay, "WM_DELETE_WINDOW", True); - - gameInfo.variant = StringToVariant(appData.variant); - InitPosition(FALSE); - - /* calc board size */ - if (isdigit(appData.boardSize[0])) - { - i = sscanf(appData.boardSize, "%d,%d,%d,%d,%d,%d,%d", &squareSize, - &lineGap, &clockFontPxlSize, &coordFontPxlSize, - &fontPxlSize, &smallLayout, &tinyLayout); - if (i == 0) - { - fprintf(stderr, _("%s: bad boardSize syntax %s\n"), - programName, appData.boardSize); - exit(2); - } - if (i < 7) - { - /* Find some defaults; use the nearest known size */ - SizeDefaults *szd, *nearest; - int distance = 99999; - nearest = szd = sizeDefaults; - while (szd->name != NULL) - { - if (abs(szd->squareSize - squareSize) < distance) - { - nearest = szd; - distance = abs(szd->squareSize - squareSize); - if (distance == 0) break; - } - szd++; - }; - if (i < 2) lineGap = nearest->lineGap; - if (i < 3) clockFontPxlSize = nearest->clockFontPxlSize; - if (i < 4) coordFontPxlSize = nearest->coordFontPxlSize; - if (i < 5) fontPxlSize = nearest->fontPxlSize; - if (i < 6) smallLayout = nearest->smallLayout; - if (i < 7) tinyLayout = nearest->tinyLayout; - } - } - else - { - SizeDefaults *szd = sizeDefaults; - if (*appData.boardSize == NULLCHAR) - { - while (DisplayWidth(xDisplay, xScreen) < szd->minScreenSize - || DisplayHeight(xDisplay, xScreen) < szd->minScreenSize) - { - szd++; - } - if (szd->name == NULL) szd--; - appData.boardSize = strdup(szd->name); // [HGM] settings: remember name for saving settings - } - else - { - while (szd->name != NULL - && StrCaseCmp(szd->name, appData.boardSize) != 0) - szd++; - if (szd->name == NULL) - { - fprintf(stderr, _("%s: unrecognized boardSize name %s\n"), - programName, appData.boardSize); - exit(2); - } - } - squareSize = szd->squareSize; - lineGap = szd->lineGap; - clockFontPxlSize = szd->clockFontPxlSize; - coordFontPxlSize = szd->coordFontPxlSize; - fontPxlSize = szd->fontPxlSize; - smallLayout = szd->smallLayout; - tinyLayout = szd->tinyLayout; - } - /* end figuring out what size to use */ - - boardWidth = lineGap + BOARD_WIDTH * (squareSize + lineGap); - boardHeight = lineGap + BOARD_HEIGHT * (squareSize + lineGap); - - /* - * Determine what fonts to use. - */ - appData.clockFont = FindFont(appData.clockFont, clockFontPxlSize); - clockFontID = XLoadFont(xDisplay, appData.clockFont); - clockFontStruct = XQueryFont(xDisplay, clockFontID); - appData.coordFont = FindFont(appData.coordFont, coordFontPxlSize); - coordFontID = XLoadFont(xDisplay, appData.coordFont); - coordFontStruct = XQueryFont(xDisplay, coordFontID); - appData.font = FindFont(appData.font, fontPxlSize); - countFontID = XLoadFont(xDisplay, appData.coordFont); // [HGM] holdings - countFontStruct = XQueryFont(xDisplay, countFontID); -// appData.font = FindFont(appData.font, fontPxlSize); - - xdb = XtDatabase(xDisplay); - XrmPutStringResource(&xdb, "*font", appData.font); - - /* - * Detect if there are not enough colors available and adapt. - */ - if (DefaultDepth(xDisplay, xScreen) <= 2) { + InitBackEnd1(); + + gameInfo.variant = StringToVariant(appData.variant); + InitPosition(FALSE); + + + squareSize = 40; + lineGap = 1; + clockFontPxlSize = 20; + coordFontPxlSize = 20; + fontPxlSize = 20; + smallLayout = 16; + tinyLayout = 10; + + + boardWidth = lineGap + BOARD_WIDTH * (squareSize + lineGap); + boardHeight = lineGap + BOARD_HEIGHT * (squareSize + lineGap); + + /* + * Determine what fonts to use. + */ + // appData.clockFont = FindFont(appData.clockFont, clockFontPxlSize); + // clockFontID = XLoadFont(xDisplay, appData.clockFont); + // clockFontStruct = XQueryFont(xDisplay, clockFontID); + // appData.coordFont = FindFont(appData.coordFont, coordFontPxlSize); + // coordFontID = XLoadFont(xDisplay, appData.coordFont); + // coordFontStruct = XQueryFont(xDisplay, coordFontID); + // appData.font = FindFont(appData.font, fontPxlSize); + // countFontID = XLoadFont(xDisplay, appData.coordFont); // [HGM] holdings + // countFontStruct = XQueryFont(xDisplay, countFontID); + // appData.font = FindFont(appData.font, fontPxlSize); + + // xdb = XtDatabase(xDisplay); + // XrmPutStringResource(&xdb, "*font", appData.font); + + /* + * Detect if there are not enough colors available and adapt. + */ + // if (DefaultDepth(xDisplay, xScreen) <= 2) { + // 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.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.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.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; - } + } + 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 (forceMono) { - fprintf(stderr, _("%s: too few colors available; trying monochrome mode\n"), - programName); - - if (appData.bitmapDirectory == NULL || - appData.bitmapDirectory[0] == NULLCHAR) - appData.bitmapDirectory = DEF_BITMAP_DIR; + } + 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.lowTimeWarning && !appData.monoMode) { - vFrom.addr = (caddr_t) appData.lowTimeWarningColor; - vFrom.size = strlen(appData.lowTimeWarningColor); - XtConvert(shellWidget, XtRString, &vFrom, XtRPixel, &vTo); - if (vTo.addr == NULL) - appData.monoMode = True; - else - lowTimeWarningColor = *(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 && appData.debugMode) { - fprintf(stderr, _("white pixel = 0x%lx, black pixel = 0x%lx\n"), - (unsigned long) XWhitePixel(xDisplay, xScreen), - (unsigned long) XBlackPixel(xDisplay, xScreen)); + } + + 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; } - - 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; + } + + if (forceMono) { + fprintf(stderr, _("%s: too few colors available; trying monochrome mode\n"), + programName); + + if (appData.bitmapDirectory == NULL || + appData.bitmapDirectory[0] == NULLCHAR) + appData.bitmapDirectory = DEF_BITMAP_DIR; + } + + if (appData.lowTimeWarning && !appData.monoMode) { + vFrom.addr = (caddr_t) appData.lowTimeWarningColor; + vFrom.size = strlen(appData.lowTimeWarningColor); + // XtConvert(shellWidget, XtRString, &vFrom, XtRPixel, &vTo); + if (vTo.addr == NULL) + appData.monoMode = True; + else + lowTimeWarningColor = *(Pixel *) vTo.addr; + } + + 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); } - textColors[ColorNone].fg = textColors[ColorNone].bg = -1; - textColors[ColorNone].attr = 0; - - // XtAppAddActions(appContext, boardActions, XtNumber(boardActions)); - - /* - * widget hierarchy - */ - if (tinyLayout) { - layoutName = "tinyLayout"; - } else if (smallLayout) { - layoutName = "smallLayout"; - } else { - layoutName = "normalLayout"; + appData.colorize = FALSE; } + textColors[ColorNone].fg = textColors[ColorNone].bg = -1; + textColors[ColorNone].attr = 0; + + // XtAppAddActions(appContext, boardActions, XtNumber(boardActions)); + + /* + * widget hierarchy + */ + if (tinyLayout) { + layoutName = "tinyLayout"; + } else if (smallLayout) { + layoutName = "smallLayout"; + } else { + layoutName = "normalLayout"; + } + + if (appData.titleInWindow) { + /* todo check what this appdata does */ + } + + if (appData.showButtonBar) { + /* TODO hide button bar if requested */ + } - if (appData.titleInWindow) { - /* todo check what this appdata does */ + + if (appData.titleInWindow) + { + if (smallLayout) + { + /* make it small */ + if (appData.showButtonBar) + { + + } + } + else + { + if (appData.showButtonBar) + { + } + } } - - if (appData.showButtonBar) { - /* TODO hide button bar if requested */ + else + { } - - - if (appData.titleInWindow) - { - if (smallLayout) - { - /* make it small */ - if (appData.showButtonBar) - { - - } - } - else - { - if (appData.showButtonBar) - { - } - } - } - else - { - } - - - /* set some checkboxes in the menu according to appData */ - - if (appData.alwaysPromoteToQueen) - gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (gtk_builder_get_object (builder, "menuOptions.Always Queen")),TRUE); - - if (appData.animateDragging) - gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (gtk_builder_get_object (builder, "menuOptions.Animate Dragging")),TRUE); - - if (appData.animate) - gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (gtk_builder_get_object (builder, "menuOptions.Animate Moving")),TRUE); - - if (appData.autoComment) - gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (gtk_builder_get_object (builder, "menuOptions.Auto Comment")),TRUE); - - if (appData.autoCallFlag) - gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (gtk_builder_get_object (builder, "menuOptions.Auto Flag")),TRUE); - - if (appData.autoFlipView) - gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (gtk_builder_get_object (builder, "menuOptions.Auto Flip View")),TRUE); - - if (appData.autoObserve) - gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (gtk_builder_get_object (builder, "menuOptions.Auto Observe")),TRUE); - - if (appData.autoRaiseBoard) - gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (gtk_builder_get_object (builder, "menuOptions.Auto Raise Board")),TRUE); - - if (appData.autoSaveGames) + + + /* set some checkboxes in the menu according to appData */ + + if (appData.alwaysPromoteToQueen) + gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (gtk_builder_get_object (builder, "menuOptions.Always Queen")),TRUE); + + if (appData.animateDragging) + gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (gtk_builder_get_object (builder, "menuOptions.Animate Dragging")),TRUE); + + if (appData.animate) + gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (gtk_builder_get_object (builder, "menuOptions.Animate Moving")),TRUE); + + if (appData.autoComment) + gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (gtk_builder_get_object (builder, "menuOptions.Auto Comment")),TRUE); + + if (appData.autoCallFlag) + gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (gtk_builder_get_object (builder, "menuOptions.Auto Flag")),TRUE); + + if (appData.autoFlipView) + gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (gtk_builder_get_object (builder, "menuOptions.Auto Flip View")),TRUE); + + if (appData.autoObserve) + gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (gtk_builder_get_object (builder, "menuOptions.Auto Observe")),TRUE); + + if (appData.autoRaiseBoard) + gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (gtk_builder_get_object (builder, "menuOptions.Auto Raise Board")),TRUE); + + if (appData.autoSaveGames) + gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (gtk_builder_get_object (builder, "menuOptions.Auto Save")),TRUE); + + if (appData.saveGameFile[0] != NULLCHAR) + { + /* Can't turn this off from menu */ gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (gtk_builder_get_object (builder, "menuOptions.Auto Save")),TRUE); - - if (appData.saveGameFile[0] != NULLCHAR) - { - /* Can't turn this off from menu */ - gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (gtk_builder_get_object (builder, "menuOptions.Auto Save")),TRUE); - gtk_action_set_sensitive(GTK_ACTION (gtk_builder_get_object (builder, "menuOptions.Auto Save")),FALSE); - } - - if (appData.blindfold) + gtk_action_set_sensitive(GTK_ACTION (gtk_builder_get_object (builder, "menuOptions.Auto Save")),FALSE); + } + + if (appData.blindfold) gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (gtk_builder_get_object (builder, "menuOptions.Blindfold")),TRUE); - - if (appData.flashCount > 0) - gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (gtk_builder_get_object (builder, "menuOptions.Flash Moves")),TRUE); - - if (appData.getMoveList) - gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (gtk_builder_get_object (builder, "menuOptions.Get Move List")),TRUE); - + + if (appData.flashCount > 0) + gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (gtk_builder_get_object (builder, "menuOptions.Flash Moves")),TRUE); + + if (appData.getMoveList) + gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (gtk_builder_get_object (builder, "menuOptions.Get Move List")),TRUE); + #if HIGHDRAG - if (appData.highlightDragging) - gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (gtk_builder_get_object (builder, "menuOptions.Highlight Dragging")),TRUE); + if (appData.highlightDragging) + gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (gtk_builder_get_object (builder, "menuOptions.Highlight Dragging")),TRUE); #endif - - if (appData.highlightLastMove) - gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (gtk_builder_get_object (builder, "menuOptions.Highlight Last Move")),TRUE); - - if (appData.icsAlarm) - gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (gtk_builder_get_object (builder, "menuOptions.ICS Alarm")),TRUE); - - if (appData.ringBellAfterMoves) - gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (gtk_builder_get_object (builder, "menuOptions.Move Sound")),TRUE); - - if (appData.oldSaveStyle) - gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (gtk_builder_get_object (builder, "menuOptions.Old Save Style")),TRUE); - - if (appData.periodicUpdates) - gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (gtk_builder_get_object (builder, "menuOptions.Periodic Updates")),TRUE); - - if (appData.ponderNextMove) - gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (gtk_builder_get_object (builder, "menuOptions.Ponder Next Move")),TRUE); - - if (appData.popupExitMessage) - gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (gtk_builder_get_object (builder, "menuOptions.Popup Exit Message")),TRUE); - - if (appData.popupMoveErrors) - gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (gtk_builder_get_object (builder, "menuOptions.Popup Move Errors")),TRUE); - - if (appData.premove) - gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (gtk_builder_get_object (builder, "menuOptions.Premove")),TRUE); - - if (appData.quietPlay) - gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (gtk_builder_get_object (builder, "menuOptions.Quit Play")),TRUE); - - if (appData.showCoords) - gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (gtk_builder_get_object (builder, "menuOptions.Show Coords")),TRUE); - - if (appData.showThinking) - gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (gtk_builder_get_object (builder, "menuOptions.Hide Thinking")),TRUE); - - if (appData.testLegality) - gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (gtk_builder_get_object (builder, "menuOptions.Test Legality")),TRUE); - - // TODO: add - // if (saveSettingsOnExit) { - // XtSetValues(XtNameToWidget(menuBarWidget,"menuOptions.Save Settings on Exit"), - // args, 1); - // } - - - /* end setting check boxes */ - - /* load square colors */ - SVGLightSquare = load_pixbuf("svg/LightSquare.svg",squareSize); - SVGDarkSquare = load_pixbuf("svg/DarkSquare.svg",squareSize); - SVGNeutralSquare = load_pixbuf("svg/NeutralSquare.svg",squareSize); - - /* use two icons to indicate if it is white's or black's turn */ - WhiteIcon = load_pixbuf("svg/icon_white.svg",0); - BlackIcon = load_pixbuf("svg/icon_black.svg",0); - WindowIcon = WhiteIcon; - gtk_window_set_icon(GTK_WINDOW(GUI_Window),WindowIcon); - - - /* realize window */ - gtk_widget_show (GUI_Window); - - /* recalc boardsize */ - CreateGCs(); - CreatePieces(); - CreatePieceMenus(); - - if (appData.animate || appData.animateDragging) - CreateAnimVars(); - - InitBackEnd2(); - - if (errorExitStatus == -1) { - if (appData.icsActive) { - /* We now wait until we see "login:" from the ICS before - sending the logon script (problems with timestamp otherwise) */ - /*ICSInitScript();*/ - if (appData.icsInputBox) ICSInputBoxPopUp(); - } - - #ifdef SIGWINCH + + if (appData.highlightLastMove) + gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (gtk_builder_get_object (builder, "menuOptions.Highlight Last Move")),TRUE); + + if (appData.icsAlarm) + gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (gtk_builder_get_object (builder, "menuOptions.ICS Alarm")),TRUE); + + if (appData.ringBellAfterMoves) + gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (gtk_builder_get_object (builder, "menuOptions.Move Sound")),TRUE); + + if (appData.oldSaveStyle) + gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (gtk_builder_get_object (builder, "menuOptions.Old Save Style")),TRUE); + + if (appData.periodicUpdates) + gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (gtk_builder_get_object (builder, "menuOptions.Periodic Updates")),TRUE); + + if (appData.ponderNextMove) + gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (gtk_builder_get_object (builder, "menuOptions.Ponder Next Move")),TRUE); + + if (appData.popupExitMessage) + gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (gtk_builder_get_object (builder, "menuOptions.Popup Exit Message")),TRUE); + + if (appData.popupMoveErrors) + gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (gtk_builder_get_object (builder, "menuOptions.Popup Move Errors")),TRUE); + + if (appData.premove) + gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (gtk_builder_get_object (builder, "menuOptions.Premove")),TRUE); + + if (appData.quietPlay) + gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (gtk_builder_get_object (builder, "menuOptions.Quit Play")),TRUE); + + if (appData.showCoords) + gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (gtk_builder_get_object (builder, "menuOptions.Show Coords")),TRUE); + + if (appData.showThinking) + gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (gtk_builder_get_object (builder, "menuOptions.Hide Thinking")),TRUE); + + if (appData.testLegality) + gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (gtk_builder_get_object (builder, "menuOptions.Test Legality")),TRUE); + + // TODO: add + // if (saveSettingsOnExit) { + // XtSetValues(XtNameToWidget(menuBarWidget,"menuOptions.Save Settings on Exit"), + // args, 1); + // } + + + /* end setting check boxes */ + + /* load square colors */ + SVGLightSquare = load_pixbuf("svg/LightSquare.svg",squareSize); + SVGDarkSquare = load_pixbuf("svg/DarkSquare.svg",squareSize); + SVGNeutralSquare = load_pixbuf("svg/NeutralSquare.svg",squareSize); + + /* use two icons to indicate if it is white's or black's turn */ + WhiteIcon = load_pixbuf("svg/icon_white.svg",0); + BlackIcon = load_pixbuf("svg/icon_black.svg",0); + WindowIcon = WhiteIcon; + gtk_window_set_icon(GTK_WINDOW(GUI_Window),WindowIcon); + + + /* realize window */ + gtk_widget_show (GUI_Window); + + /* recalc boardsize */ + CreateGCs(); + CreatePieces(); + CreatePieceMenus(); + + if (appData.animate || appData.animateDragging) + CreateAnimVars(); + + /* [AS] Restore layout */ + if( wpMoveHistory.visible ) { + HistoryPopUp(); + } + + if( wpEvalGraph.visible ) + { + EvalGraphPopUp(); + }; + + if( wpEngineOutput.visible ) { + EngineOutputPopUp(); + } + + InitBackEnd2(); + + if (errorExitStatus == -1) { + if (appData.icsActive) { + /* We now wait until we see "login:" from the ICS before + sending the logon script (problems with timestamp otherwise) */ + /*ICSInitScript();*/ + if (appData.icsInputBox) ICSInputBoxPopUp(); + } + +#ifdef SIGWINCH signal(SIGWINCH, TermSizeSigHandler); - #endif - signal(SIGINT, IntSigHandler); - signal(SIGTERM, IntSigHandler); - if (*appData.cmailGameName != NULLCHAR) { - signal(SIGUSR1, CmailSigHandler); - } +#endif + signal(SIGINT, IntSigHandler); + signal(SIGTERM, IntSigHandler); + if (*appData.cmailGameName != NULLCHAR) { + signal(SIGUSR1, CmailSigHandler); } - gameInfo.boardWidth = 0; // [HGM] pieces: kludge to ensure InitPosition() calls InitDrawingSizes() - InitPosition(TRUE); - - /* - * Create a cursor for the board widget. - * (This needs to be called after the window has been created to have access to board-window) - */ - - BoardCursor = gdk_cursor_new(GDK_HAND2); - gdk_window_set_cursor(GUI_Board->window, BoardCursor); - gdk_cursor_destroy(BoardCursor); - - /* end cursor */ - gtk_main (); - - if (appData.debugMode) fclose(debugFP); // [DM] debug - return 0; + } + gameInfo.boardWidth = 0; // [HGM] pieces: kludge to ensure InitPosition() calls InitDrawingSizes() + InitPosition(TRUE); + + /* + * Create a cursor for the board widget. + * (This needs to be called after the window has been created to have access to board-window) + */ + + BoardCursor = gdk_cursor_new(GDK_HAND2); + gdk_window_set_cursor(GUI_Board->window, BoardCursor); + gdk_cursor_destroy(BoardCursor); + + /* end cursor */ + gtk_main (); + + if (appData.debugMode) fclose(debugFP); // [DM] debug + return 0; } void ShutDownFrontEnd() { - if (appData.icsActive && oldICSInteractionTitle != NULL) { - DisplayIcsInteractionTitle(oldICSInteractionTitle); - } - if (saveSettingsOnExit) SaveSettings(settingsFileName); - unlink(gameCopyFilename); - unlink(gamePasteFilename); + if (appData.icsActive && oldICSInteractionTitle != NULL) { + DisplayIcsInteractionTitle(oldICSInteractionTitle); + } + if (saveSettingsOnExit) SaveSettings(settingsFileName); + unlink(gameCopyFilename); + unlink(gamePasteFilename); } RETSIGTYPE TermSizeSigHandler(int sig) { - update_ics_width(); + update_ics_width(); } RETSIGTYPE IntSigHandler(sig) int sig; { - ExitEvent(sig); + ExitEvent(sig); } RETSIGTYPE CmailSigHandler(sig) int sig; { - int dummy = 0; - int error; - - signal(SIGUSR1, SIG_IGN); /* suspend handler */ - - /* Activate call-back function CmailSigHandlerCallBack() */ - OutputToProcess(cmailPR, (char *)(&dummy), sizeof(int), &error); - - signal(SIGUSR1, CmailSigHandler); /* re-activate handler */ + int dummy = 0; + int error; + + signal(SIGUSR1, SIG_IGN); /* suspend handler */ + + /* Activate call-back function CmailSigHandlerCallBack() */ + OutputToProcess(cmailPR, (char *)(&dummy), sizeof(int), &error); + + signal(SIGUSR1, CmailSigHandler); /* re-activate handler */ } void @@ -2040,8 +2004,8 @@ CmailSigHandlerCallBack(isr, closure, message, count, error) int count; int error; { - BoardToTop(); - ReloadCmailMsgEvent(TRUE); /* Reload cmail msg */ + BoardToTop(); + ReloadCmailMsgEvent(TRUE); /* Reload cmail msg */ } /**** end signal code ****/ @@ -2049,45 +2013,45 @@ CmailSigHandlerCallBack(isr, closure, message, count, error) void ICSInitScript() { - FILE *f; - char buf[MSG_SIZ]; - char *p; - - f = fopen(appData.icsLogon, "r"); - if (f == NULL) { - p = getenv("HOME"); - if (p != NULL) { - strcpy(buf, p); - strcat(buf, "/"); - strcat(buf, appData.icsLogon); - f = fopen(buf, "r"); - } + FILE *f; + char buf[MSG_SIZ]; + char *p; + + f = fopen(appData.icsLogon, "r"); + if (f == NULL) { + p = getenv("HOME"); + if (p != NULL) { + strcpy(buf, p); + strcat(buf, "/"); + strcat(buf, appData.icsLogon); + f = fopen(buf, "r"); } - if (f != NULL) - ProcessICSInitScript(f); + } + if (f != NULL) + ProcessICSInitScript(f); } void ResetFrontEnd() { - CommentPopDown(); - EditCommentPopDown(); - TagsPopDown(); - return; + CommentPopDown(); + EditCommentPopDown(); + TagsPopDown(); + return; } void GreyRevert(grey) Boolean grey; { - Widget w; - if (!menuBarWidget) return; - w = XtNameToWidget(menuBarWidget, "menuStep.Revert"); - if (w == NULL) { - DisplayError("menuStep.Revert", 0); - } else { - XtSetSensitive(w, !grey); - } + Widget w; + if (!menuBarWidget) return; + w = XtNameToWidget(menuBarWidget, "menuStep.Revert"); + if (w == NULL) { + DisplayError("menuStep.Revert", 0); + } else { + XtSetSensitive(w, !grey); + } } void @@ -2095,7 +2059,7 @@ SetMenuEnables(enab) Enables *enab; { GObject *o; - + if (!builder) return; while (enab->name != NULL) { o = gtk_builder_get_object(builder, enab->name); @@ -2115,7 +2079,7 @@ SetMenuEnables(enab) void SetICSMode() { SetMenuEnables(icsEnables); - + #ifdef ZIPPY if (appData.zippyPlay && !appData.noChessProgram) /* [DM] icsEngineAnalyze */ {}; // XtSetSensitive(XtNameToWidget(menuBarWidget, "menuMode.Analysis Mode"), True); @@ -2175,8 +2139,8 @@ SetMachineThinkingEnables() case MachinePlaysBlack: case MachinePlaysWhite: case TwoMachinesPlay: -// XtSetSensitive(XtNameToWidget(menuBarWidget, -// ModeToWidgetName(gameMode)), True); + // XtSetSensitive(XtNameToWidget(menuBarWidget, + // ModeToWidgetName(gameMode)), True); break; default: break; @@ -2198,214 +2162,138 @@ char *FindFont(pattern, targetPxlSize) char *pattern; int targetPxlSize; { - char **fonts, *p, *best, *scalable, *scalableTail; - int i, j, nfonts, minerr, err, pxlSize; - + char **fonts, *p, *best, *scalable, *scalableTail; + int i, j, nfonts, minerr, err, pxlSize; + #ifdef ENABLE_NLS - char **missing_list; - int missing_count; - char *def_string, *base_fnt_lst, strInt[3]; - XFontSet fntSet; - XFontStruct **fnt_list; - - base_fnt_lst = calloc(1, strlen(pattern) + 3); - sprintf(strInt, "%d", targetPxlSize); - p = strstr(pattern, "--"); - strncpy(base_fnt_lst, pattern, p - pattern + 2); - strcat(base_fnt_lst, strInt); - strcat(base_fnt_lst, strchr(p + 2, '-')); - - if ((fntSet = XCreateFontSet(xDisplay, - base_fnt_lst, - &missing_list, - &missing_count, - &def_string)) == NULL) { - - fprintf(stderr, _("Unable to create font set.\n")); - exit (2); - } - - nfonts = XFontsOfFontSet(fntSet, &fnt_list, &fonts); + char **missing_list; + int missing_count; + char *def_string, *base_fnt_lst, strInt[3]; + XFontSet fntSet; + XFontStruct **fnt_list; + + base_fnt_lst = calloc(1, strlen(pattern) + 3); + sprintf(strInt, "%d", targetPxlSize); + p = strstr(pattern, "--"); + strncpy(base_fnt_lst, pattern, p - pattern + 2); + strcat(base_fnt_lst, strInt); + strcat(base_fnt_lst, strchr(p + 2, '-')); + + if ((fntSet = XCreateFontSet(xDisplay, + base_fnt_lst, + &missing_list, + &missing_count, + &def_string)) == NULL) { + + fprintf(stderr, _("Unable to create font set.\n")); + exit (2); + } + + nfonts = XFontsOfFontSet(fntSet, &fnt_list, &fonts); #else - fonts = XListFonts(xDisplay, pattern, 999999, &nfonts); - if (nfonts < 1) { - fprintf(stderr, _("%s: no fonts match pattern %s\n"), - programName, pattern); - exit(2); - } + // fonts = XListFonts(xDisplay, pattern, 999999, &nfonts); + // if (nfonts < 1) { + // fprintf(stderr, _("%s: no fonts match pattern %s\n"), + // programName, pattern); + // exit(2); + // } #endif - - best = fonts[0]; - scalable = NULL; - minerr = 999999; - for (i=0; i 0 && err < 0 && -err == minerr)) { - best = fonts[i]; - minerr = err; - } - } + + best = fonts[0]; + scalable = NULL; + minerr = 999999; + for (i=0; i appData.fontSizeTolerance) { - /* If the error is too big and there is a scalable font, - use the scalable font. */ - int headlen = scalableTail - scalable; - p = (char *) XtMalloc(strlen(scalable) + 10); - while (isdigit(*scalableTail)) scalableTail++; - sprintf(p, "%.*s%d%s", headlen, scalable, targetPxlSize, scalableTail); + if (j < 7) continue; + pxlSize = atoi(p); + if (pxlSize == 0) { + scalable = fonts[i]; + scalableTail = p; } else { - p = (char *) XtMalloc(strlen(best) + 1); - strcpy(p, best); - } - if (appData.debugMode) { - fprintf(debugFP, _("resolved %s at pixel size %d\n to %s\n"), - pattern, targetPxlSize, p); + err = pxlSize - targetPxlSize; + if (Abs(err) < Abs(minerr) || + (minerr > 0 && err < 0 && -err == minerr)) { + best = fonts[i]; + minerr = err; + } } + } + if (scalable && Abs(minerr) > appData.fontSizeTolerance) { + /* If the error is too big and there is a scalable font, + use the scalable font. */ + int headlen = scalableTail - scalable; + p = (char *) XtMalloc(strlen(scalable) + 10); + while (isdigit(*scalableTail)) scalableTail++; + sprintf(p, "%.*s%d%s", headlen, scalable, targetPxlSize, scalableTail); + } else { + p = (char *) XtMalloc(strlen(best) + 1); + strcpy(p, best); + } + if (appData.debugMode) { + fprintf(debugFP, _("resolved %s at pixel size %d\n to %s\n"), + pattern, targetPxlSize, p); + } #ifdef ENABLE_NLS - if (missing_count > 0) - XFreeStringList(missing_list); - XFreeFontSet(xDisplay, fntSet); + if (missing_count > 0) + XFreeStringList(missing_list); + // XFreeFontSet(xDisplay, fntSet); #else - XFreeFontNames(fonts); + XFreeFontNames(fonts); #endif - return p; + return p; } void CreateGCs() { /* GCs are not needed anymore for GTK just left them in here for the moment, since there is a lot of X-code still around that's wants them*/ - - XtGCMask value_mask = GCLineWidth | GCLineStyle | GCForeground - | GCBackground | GCFunction | GCPlaneMask; - XGCValues gc_values; - GC copyInvertedGC; - - gc_values.plane_mask = AllPlanes; - gc_values.line_width = lineGap; - gc_values.line_style = LineSolid; - gc_values.function = GXcopy; - - gc_values.foreground = XBlackPixel(xDisplay, xScreen); - gc_values.background = XWhitePixel(xDisplay, xScreen); - coordGC = XtGetGC(shellWidget, value_mask, &gc_values); - XSetFont(xDisplay, coordGC, coordFontID); - - if (appData.monoMode) { - gc_values.foreground = XWhitePixel(xDisplay, xScreen); - gc_values.background = XBlackPixel(xDisplay, xScreen); - lightSquareGC = wbPieceGC - = XtGetGC(shellWidget, value_mask, &gc_values); - - gc_values.foreground = XBlackPixel(xDisplay, xScreen); - gc_values.background = XWhitePixel(xDisplay, xScreen); - darkSquareGC = bwPieceGC - = XtGetGC(shellWidget, value_mask, &gc_values); - - if (DefaultDepth(xDisplay, xScreen) == 1) { - /* Avoid XCopyPlane on 1-bit screens to work around Sun bug */ - gc_values.function = GXcopyInverted; - copyInvertedGC = XtGetGC(shellWidget, value_mask, &gc_values); - gc_values.function = GXcopy; - if (XBlackPixel(xDisplay, xScreen) == 1) { - bwPieceGC = darkSquareGC; - wbPieceGC = copyInvertedGC; - } else { - bwPieceGC = copyInvertedGC; - wbPieceGC = lightSquareGC; - } - } - } else { - gc_values.foreground = lightSquareColor; - gc_values.background = darkSquareColor; - lightSquareGC = XtGetGC(shellWidget, value_mask, &gc_values); - - gc_values.foreground = darkSquareColor; - gc_values.background = lightSquareColor; - darkSquareGC = XtGetGC(shellWidget, value_mask, &gc_values); - - gc_values.foreground = jailSquareColor; - gc_values.background = jailSquareColor; - jailSquareGC = XtGetGC(shellWidget, value_mask, &gc_values); - - gc_values.foreground = whitePieceColor; - gc_values.background = darkSquareColor; - wdPieceGC = XtGetGC(shellWidget, value_mask, &gc_values); - - gc_values.foreground = whitePieceColor; - gc_values.background = lightSquareColor; - wlPieceGC = XtGetGC(shellWidget, value_mask, &gc_values); - - gc_values.foreground = whitePieceColor; - gc_values.background = jailSquareColor; - wjPieceGC = XtGetGC(shellWidget, value_mask, &gc_values); - - gc_values.foreground = blackPieceColor; - gc_values.background = darkSquareColor; - bdPieceGC = XtGetGC(shellWidget, value_mask, &gc_values); - - gc_values.foreground = blackPieceColor; - gc_values.background = lightSquareColor; - blPieceGC = XtGetGC(shellWidget, value_mask, &gc_values); - - gc_values.foreground = blackPieceColor; - gc_values.background = jailSquareColor; - bjPieceGC = XtGetGC(shellWidget, value_mask, &gc_values); - } + return; } void CreatePieces() { int i; - + /* free if used - for(i=0;imi; - while (mi->string != NULL) { - if (strcmp(mi->string, "----") == 0) { - entry = XtCreateManagedWidget(mi->string, smeLineObjectClass, - menu, args, j); - } else { - XtSetArg(args[j], XtNlabel, XtNewString(_(mi->string))); - entry = XtCreateManagedWidget(mi->string, smeBSBObjectClass, - menu, args, j+1); - XtAddCallback(entry, XtNcallback, - (XtCallbackProc) MenuBarSelect, - (caddr_t) mi->proc); + int j; + Widget menu, entry; + MenuItem *mi; + Arg args[16]; + + menu = XtCreatePopupShell(name, simpleMenuWidgetClass, + parent, NULL, 0); + j = 0; + XtSetArg(args[j], XtNleftMargin, 20); j++; + XtSetArg(args[j], XtNrightMargin, 20); j++; + mi = mb->mi; + while (mi->string != NULL) { + if (strcmp(mi->string, "----") == 0) { + entry = XtCreateManagedWidget(mi->string, smeLineObjectClass, + menu, args, j); + } else { + XtSetArg(args[j], XtNlabel, XtNewString(_(mi->string))); + entry = XtCreateManagedWidget(mi->string, smeBSBObjectClass, + menu, args, j+1); + XtAddCallback(entry, XtNcallback, + (XtCallbackProc) MenuBarSelect, + (caddr_t) mi->proc); } - mi++; - } + mi++; + } } -Widget CreateMenuBar(mb) +Widget +CreateMenuBar(mb) Menu *mb; { - int j; - Widget anchor, menuBar; - Arg args[16]; - char menuName[MSG_SIZ]; - + int j; + Widget anchor, menuBar; + Arg args[16]; + char menuName[MSG_SIZ]; + + j = 0; + XtSetArg(args[j], XtNorientation, XtorientHorizontal); j++; + XtSetArg(args[j], XtNvSpace, 0); j++; + XtSetArg(args[j], XtNborderWidth, 0); j++; + menuBar = XtCreateWidget("menuBar", boxWidgetClass, + formWidget, args, j); + + while (mb->name != NULL) { + strcpy(menuName, "menu"); + strcat(menuName, mb->name); j = 0; - XtSetArg(args[j], XtNorientation, XtorientHorizontal); j++; - XtSetArg(args[j], XtNvSpace, 0); j++; - XtSetArg(args[j], XtNborderWidth, 0); j++; - menuBar = XtCreateWidget("menuBar", boxWidgetClass, - formWidget, args, j); - - while (mb->name != NULL) { - strcpy(menuName, "menu"); - strcat(menuName, mb->name); - j = 0; - XtSetArg(args[j], XtNmenuName, XtNewString(menuName)); j++; - if (tinyLayout) { - char shortName[2]; - 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], XtNborderWidth, 0); j++; - anchor = XtCreateManagedWidget(mb->name, menuButtonWidgetClass, - menuBar, args, j); - CreateMenuBarPopup(menuBar, menuName, mb); - mb++; + XtSetArg(args[j], XtNmenuName, XtNewString(menuName)); j++; + if (tinyLayout) { + char shortName[2]; + shortName[0] = _(mb->name)[0]; + shortName[1] = NULLCHAR; + XtSetArg(args[j], XtNlabel, XtNewString(shortName)); j++; } - return menuBar; + else { + XtSetArg(args[j], XtNlabel, XtNewString(_(mb->name))); j++; + } + + XtSetArg(args[j], XtNborderWidth, 0); j++; + anchor = XtCreateManagedWidget(mb->name, menuButtonWidgetClass, + menuBar, args, j); + CreateMenuBarPopup(menuBar, menuName, mb); + mb++; + } + return menuBar; } @@ -2497,235 +2386,221 @@ CreatePieceMenu(name, color) char *name; int color; { - int i; - Widget entry, menu; - Arg args[16]; - ChessSquare selection; - - menu = XtCreatePopupShell(name, simpleMenuWidgetClass, - boardWidget, args, 0); - - for (i = 0; i < PIECE_MENU_SIZE; i++) { - String item = pieceMenuStrings[color][i]; - - if (strcmp(item, "----") == 0) { - entry = XtCreateManagedWidget(item, smeLineObjectClass, - menu, NULL, 0); - } else { - XtSetArg(args[0], XtNlabel, XtNewString(_(item))); - entry = XtCreateManagedWidget(item, smeBSBObjectClass, - menu, args, 1); - selection = pieceMenuTranslation[color][i]; - XtAddCallback(entry, XtNcallback, - (XtCallbackProc) PieceMenuSelect, - (caddr_t) selection); - if (selection == WhitePawn || selection == BlackPawn) { - XtSetArg(args[0], XtNpopupOnEntry, entry); - XtSetValues(menu, args, 1); - } - } + int i; + Widget entry, menu; + Arg args[16]; + ChessSquare selection; + + menu = XtCreatePopupShell(name, simpleMenuWidgetClass, + boardWidget, args, 0); + + for (i = 0; i < PIECE_MENU_SIZE; i++) { + String item = pieceMenuStrings[color][i]; + + if (strcmp(item, "----") == 0) { + entry = XtCreateManagedWidget(item, smeLineObjectClass, + menu, NULL, 0); + } else { + XtSetArg(args[0], XtNlabel, XtNewString(_(item))); + entry = XtCreateManagedWidget(item, smeBSBObjectClass, + menu, args, 1); + selection = pieceMenuTranslation[color][i]; + XtAddCallback(entry, XtNcallback, + (XtCallbackProc) PieceMenuSelect, + (caddr_t) selection); + if (selection == WhitePawn || selection == BlackPawn) { + XtSetArg(args[0], XtNpopupOnEntry, entry); + XtSetValues(menu, args, 1); + } } - return menu; + } + return menu; } void CreatePieceMenus() { - int i; - Widget entry; - Arg args[16]; - ChessSquare selection; - -// whitePieceMenu = CreatePieceMenu("menuW", 0); -// blackPieceMenu = CreatePieceMenu("menuB", 1); -// -// XtRegisterGrabAction(PieceMenuPopup, True, -// (unsigned)(ButtonPressMask|ButtonReleaseMask), -// GrabModeAsync, GrabModeAsync); -// -// XtSetArg(args[0], XtNlabel, _("Drop")); -// dropMenu = XtCreatePopupShell("menuD", simpleMenuWidgetClass, -// boardWidget, args, 1); -// for (i = 0; i < DROP_MENU_SIZE; i++) { -// String item = dropMenuStrings[i]; -// -// if (strcmp(item, "----") == 0) { -// entry = XtCreateManagedWidget(item, smeLineObjectClass, -// dropMenu, NULL, 0); -// } else { -// XtSetArg(args[0], XtNlabel, XtNewString(_(item))); -// entry = XtCreateManagedWidget(item, smeBSBObjectClass, -// dropMenu, args, 1); -// selection = dropMenuTranslation[i]; -// XtAddCallback(entry, XtNcallback, -// (XtCallbackProc) DropMenuSelect, -// (caddr_t) selection); -// } -// } -} - -void SetupDropMenu() -{ - int i, j, count; - char label[32]; - Arg args[16]; - Widget entry; - char* p; - - for (i=0; itype != ButtonPress) return; - if (errorUp) ErrorPopDown(); - switch (gameMode) { - case EditPosition: - case IcsExamining: - whichMenu = params[0]; - break; - case IcsPlayingWhite: - case IcsPlayingBlack: - case EditGame: - case MachinePlaysWhite: - case MachinePlaysBlack: - if (appData.testLegality && - gameInfo.variant != VariantBughouse && - gameInfo.variant != VariantCrazyhouse) return; - SetupDropMenu(); - whichMenu = "menuD"; - break; - default: - return; - } - - if (((pmFromX = EventToSquare(event->xbutton.x, BOARD_WIDTH)) < 0) || - ((pmFromY = EventToSquare(event->xbutton.y, BOARD_HEIGHT)) < 0)) { - pmFromX = pmFromY = -1; - return; - } - if (flipView) - pmFromX = BOARD_WIDTH - 1 - pmFromX; - else - pmFromY = BOARD_HEIGHT - 1 - pmFromY; - - XtPopupSpringLoaded(XtNameToWidget(boardWidget, whichMenu)); + String whichMenu; int menuNr; + if (event->type == ButtonRelease) + menuNr = RightClick(Release, event->xbutton.x, event->xbutton.y, &pmFromX, &pmFromY); + else if (event->type == ButtonPress) + menuNr = RightClick(Press, event->xbutton.x, event->xbutton.y, &pmFromX, &pmFromY); + switch(menuNr) { + case 0: whichMenu = params[0]; break; + case 1: SetupDropMenu(); whichMenu = "menuD"; break; + case 2: + case -1: if (errorUp) ErrorPopDown(); + default: return; + } + XtPopupSpringLoaded(XtNameToWidget(boardWidget, whichMenu)); } -static void PieceMenuSelect(w, piece, junk) +static void +PieceMenuSelect(w, piece, junk) Widget w; ChessSquare piece; caddr_t junk; { - if (pmFromX < 0 || pmFromY < 0) return; - EditPositionMenuEvent(piece, pmFromX, pmFromY); + if (pmFromX < 0 || pmFromY < 0) return; + EditPositionMenuEvent(piece, pmFromX, pmFromY); } -static void DropMenuSelect(w, piece, junk) +static void +DropMenuSelect(w, piece, junk) Widget w; ChessSquare piece; caddr_t junk; { - if (pmFromX < 0 || pmFromY < 0) return; - DropMenuEvent(piece, pmFromX, pmFromY); + if (pmFromX < 0 || pmFromY < 0) return; + DropMenuEvent(piece, pmFromX, pmFromY); } /* * If the user selects on a border boundary, return -1; if off the board, * return -2. Otherwise map the event coordinate to the square. */ -int EventToSquare(x, limit) +int +EventToSquare(x, limit) int x; { - if (x <= 0) - return -2; - if (x < lineGap) - return -1; - x -= lineGap; - if ((x % (squareSize + lineGap)) >= squareSize) - return -1; - x /= (squareSize + lineGap); - if (x >= limit) - return -2; - return x; + if (x <= 0) + return -2; + if (x < lineGap) + return -1; + x -= lineGap; + if ((x % (squareSize + lineGap)) >= squareSize) + return -1; + x /= (squareSize + lineGap); + if (x >= limit) + return -2; + return x; } -static void do_flash_delay(msec) +static void +do_flash_delay(msec) unsigned long msec; { - TimeDelay(msec); + TimeDelay(msec); } -static void drawHighlight(file, rank, line_type) +static void +drawHighlight(file, rank, line_type) int file, rank, line_type; { - int x, y; - cairo_t *cr; - - if (lineGap == 0 || appData.blindfold) return; - - if (flipView) - { - x = lineGap/2 + ((BOARD_WIDTH-1)-file) * - (squareSize + lineGap); - y = lineGap/2 + rank * (squareSize + lineGap); - } - else - { - x = lineGap/2 + file * (squareSize + lineGap); - y = lineGap/2 + ((BOARD_HEIGHT-1)-rank) * - (squareSize + lineGap); - } - - /* get a cairo_t */ - cr = gdk_cairo_create (GDK_WINDOW(GUI_Board->window)); - - /* draw the highlight */ - cairo_move_to (cr, x, y); - cairo_rel_line_to (cr, 0,squareSize+lineGap); - cairo_rel_line_to (cr, squareSize+lineGap,0); - cairo_rel_line_to (cr, 0,-squareSize-lineGap); - cairo_close_path (cr); - - cairo_set_line_width (cr, lineGap); - switch(line_type) - { - /* TODO: use appdata colors */ - case LINE_TYPE_HIGHLIGHT: - cairo_set_source_rgba (cr, 1, 1, 0, 1.0); - break; - case LINE_TYPE_PRE: - cairo_set_source_rgba (cr, 1, 0, 0, 1.0); - break; - case LINE_TYPE_NORMAL: - default: - cairo_set_source_rgba (cr, 0, 1, 0, 1.0); - } - - cairo_stroke (cr); - - /* free memory */ - cairo_destroy (cr); - - return; + int x, y; + cairo_t *cr; + + if (lineGap == 0 || appData.blindfold) return; + + if (flipView) + { + x = lineGap/2 + ((BOARD_WIDTH-1)-file) * + (squareSize + lineGap); + y = lineGap/2 + rank * (squareSize + lineGap); + } + else + { + x = lineGap/2 + file * (squareSize + lineGap); + y = lineGap/2 + ((BOARD_HEIGHT-1)-rank) * + (squareSize + lineGap); + } + + /* get a cairo_t */ + cr = gdk_cairo_create (GDK_WINDOW(GUI_Board->window)); + + /* draw the highlight */ + cairo_move_to (cr, x, y); + cairo_rel_line_to (cr, 0,squareSize+lineGap); + cairo_rel_line_to (cr, squareSize+lineGap,0); + cairo_rel_line_to (cr, 0,-squareSize-lineGap); + cairo_close_path (cr); + + cairo_set_line_width (cr, lineGap); + switch(line_type) + { + /* TODO: use appdata colors */ + case LINE_TYPE_HIGHLIGHT: + cairo_set_source_rgba (cr, 1, 1, 0, 1.0); + break; + case LINE_TYPE_PRE: + cairo_set_source_rgba (cr, 1, 0, 0, 1.0); + break; + case LINE_TYPE_NORMAL: + default: + cairo_set_source_rgba (cr, 0, 1, 0, 1.0); + } + + cairo_stroke (cr); + + /* free memory */ + cairo_destroy (cr); + + return; } int hi1X = -1, hi1Y = -1, hi2X = -1, hi2Y = -1; @@ -2735,34 +2610,40 @@ void SetHighlights(fromX, fromY, toX, toY) int fromX, fromY, toX, toY; { - if (hi1X != fromX || hi1Y != fromY) - { - if (hi1X >= 0 && hi1Y >= 0) - { - drawHighlight(hi1X, hi1Y, LINE_TYPE_NORMAL); - } - if (fromX >= 0 && fromY >= 0) - { - drawHighlight(fromX, fromY, LINE_TYPE_HIGHLIGHT); - } - } - if (hi2X != toX || hi2Y != toY) - { - if (hi2X >= 0 && hi2Y >= 0) - { - drawHighlight(hi2X, hi2Y, LINE_TYPE_NORMAL); - } - if (toX >= 0 && toY >= 0) - { - drawHighlight(toX, toY, LINE_TYPE_HIGHLIGHT); - } - } - hi1X = fromX; - hi1Y = fromY; - hi2X = toX; - hi2Y = toY; - - return; + if (hi1X != fromX || hi1Y != fromY) + { + if (hi1X >= 0 && hi1Y >= 0) + { + drawHighlight(hi1X, hi1Y, LINE_TYPE_NORMAL); + } + } + if (hi2X != toX || hi2Y != toY) + { + if (hi2X >= 0 && hi2Y >= 0) + { + drawHighlight(hi2X, hi2Y, LINE_TYPE_NORMAL); + } + } + if (hi1X != fromX || hi1Y != fromY) + { + if (fromX >= 0 && fromY >= 0) + { + drawHighlight(fromX, fromY, LINE_TYPE_HIGHLIGHT); + } + } + if (hi2X != toX || hi2Y != toY) + { + if (toX >= 0 && toY >= 0) + { + drawHighlight(toX, toY, LINE_TYPE_HIGHLIGHT); + } + } + hi1X = fromX; + hi1Y = fromY; + hi2X = toX; + hi2Y = toY; + + return; } void @@ -2813,34 +2694,35 @@ ClearPremoveHighlights() SetPremoveHighlights(-1, -1, -1, -1); } -static void BlankSquare(x, y, color, piece, dest) +void BlankSquare(x, y, color, piece, dest) int x, y, color; ChessSquare piece; Drawable dest; { - GdkPixbuf *pb; - - switch (color) - { - case 0: /* dark */ - pb = SVGDarkSquare; - break; - case 1: /* light */ - pb = SVGLightSquare; - break; - case 2: /* neutral */ - default: - pb = SVGNeutralSquare; - break; - } - gdk_draw_pixbuf(GDK_WINDOW(GUI_Board->window),NULL,pb,0,0,x,y,-1,-1, GDK_RGB_DITHER_NORMAL, 0, 0); - return; + GdkPixbuf *pb; + + switch (color) + { + case 0: /* dark */ + pb = SVGDarkSquare; + break; + case 1: /* light */ + pb = SVGLightSquare; + break; + case 2: /* neutral */ + default: + pb = SVGNeutralSquare; + break; + } + gdk_draw_pixbuf(GDK_WINDOW(GUI_Board->window),NULL,pb,0,0,x,y,-1,-1, GDK_RGB_DITHER_NORMAL, 0, 0); + return; } - -static void DrawPiece(piece, square_color, x, y, dest) - ChessSquare piece; - int square_color, x, y; - Drawable dest; + +void +DrawPiece(piece, square_color, x, y, dest) + ChessSquare piece; + int square_color, x, y; + Drawable dest; { /* redraw background, since piece might be transparent in some areas */ BlankSquare(x,y,square_color,piece,dest); @@ -2930,6 +2812,19 @@ void DrawSquare(row, column, piece, do_flash) cairo_select_font_face (cr, "Sans", CAIRO_FONT_SLANT_NORMAL, CAIRO_FONT_WEIGHT_NORMAL); + //TODO +// switch (event->type) { +// case Expose: +// if (event->xexpose.count > 0) return; /* no clipping is done */ +// XDrawPosition(widget, True, NULL); +// break; +// case MotionNotify: +// if(SeekGraphClick(Press, event->xbutton.x, event->xbutton.y, 1)) break; +// default: +// return; +// } +//} +/* end why */ cairo_set_font_size (cr, 12.0); cairo_text_extents (cr, string, &extents); @@ -3125,6 +3020,40 @@ static int check_castle_draw(newb, oldb, rrow, rcol) return 0; } +// [HGM] seekgraph: some low-level drawing routines cloned from xevalgraph +void +DrawSeekAxis( int x, int y, int xTo, int yTo ) +{ + // XDrawLine(xDisplay, xBoardWindow, lineGC, x, y, xTo, yTo); +} + +void +DrawSeekBackground( int left, int top, int right, int bottom ) +{ + // XFillRectangle(xDisplay, xBoardWindow, lightSquareGC, left, top, right-left, bottom-top); +} + +void +DrawSeekText(char *buf, int x, int y) +{ + // XDrawString(xDisplay, xBoardWindow, coordGC, x, y+4, buf, strlen(buf)); +} + +void +DrawSeekDot(int x, int y, int colorNr) +{ + int square = colorNr & 0x80; + GC color; + colorNr &= 0x7F; + // color = colorNr == 0 ? prelineGC : colorNr == 1 ? darkSquareGC : highlineGC; + // if(square) + // XFillRectangle(xDisplay, xBoardWindow, color, + // x-squareSize/9, y-squareSize/9, 2*squareSize/9, 2*squareSize/9); + // else + // XFillArc(xDisplay, xBoardWindow, color, + // x-squareSize/8, y-squareSize/8, squareSize/4, squareSize/4, 0, 64*360); +} + static int damage[BOARD_RANKS][BOARD_FILES]; /* @@ -3140,6 +3069,8 @@ void DrawPosition( repaint, board) static Board lastBoard; int rrow, rcol; + if(DrawSeekGraph()) return; // [HGM] seekgraph: suppress any drawing if seek graph up + if (board == NULL) { if (!lastBoardValid) return; board = lastBoard; @@ -3280,6 +3211,12 @@ void AnimateUserMove (Widget w, XEvent * event, DragPieceMove(event->xmotion.x, event->xmotion.y); } +void HandlePV (Widget w, XEvent * event, + String * params, Cardinal * nParams) +{ // [HGM] pv: walk PV + 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; @@ -3298,13 +3235,13 @@ Widget CommentCreate(name, text, mutable, callback, lines) j = 0; XtSetArg(args[j], XtNresizable, True); j++; #if TOPLEVEL - shell = - XtCreatePopupShell(name, topLevelShellWidgetClass, - shellWidget, args, j); +// shell = +// XtCreatePopupShell(name, topLevelShellWidgetClass, +// shellWidget, args, j); #else - shell = - XtCreatePopupShell(name, transientShellWidgetClass, - shellWidget, args, j); +// shell = +// XtCreatePopupShell(name, transientShellWidgetClass, +// shellWidget, args, j); #endif layout = XtCreateManagedWidget(layoutName, formWidgetClass, shell, @@ -3405,20 +3342,20 @@ Widget CommentCreate(name, text, mutable, callback, lines) commentH = pw_height + (lines - 1) * ew_height; commentW = bw_width - 16; - XSync(xDisplay, False); + // 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); +// 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); +// XTranslateCoordinates(xDisplay, XtWindow(shellWidget), +// RootWindowOfScreen(XtScreen(shellWidget)), +// (bw_width - commentW) / 2, 0 - commentH / 2, +// &xx, &yy, &junk); commentX = xx; commentY = yy; #endif /*!NOTDEF*/ @@ -3461,13 +3398,13 @@ Widget MiscCreate(name, text, mutable, callback, lines) j = 0; XtSetArg(args[j], XtNresizable, True); j++; #if TOPLEVEL - shell = - XtCreatePopupShell(name, topLevelShellWidgetClass, - shellWidget, args, j); +// shell = +// XtCreatePopupShell(name, topLevelShellWidgetClass, +// shellWidget, args, j); #else - shell = - XtCreatePopupShell(name, transientShellWidgetClass, - shellWidget, args, j); +// shell = +// XtCreatePopupShell(name, transientShellWidgetClass, +// shellWidget, args, j); #endif layout = XtCreateManagedWidget(layoutName, formWidgetClass, shell, @@ -3510,17 +3447,17 @@ Widget MiscCreate(name, text, mutable, callback, lines) h = pw_height + (lines - 1) * ew_height; w = bw_width - 16; - XSync(xDisplay, False); + // 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); +// 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); +// XTranslateCoordinates(xDisplay, XtWindow(shellWidget), +// RootWindowOfScreen(XtScreen(shellWidget)), +// (bw_width - w) / 2, 0 - h / 2, &xx, &yy, &junk); #endif /*!NOTDEF*/ x = xx; y = yy; @@ -3554,7 +3491,7 @@ void EditCommentPopUp(index, title, text) editShell = CommentCreate(title, text, True, EditCommentCallback, 4); XtRealizeWidget(editShell); - CatchDeleteWindow(editShell, "EditCommentPopDown"); + // CatchDeleteWindow(editShell, "EditCommentPopDown"); } else { edit = XtNameToWidget(editShell, "*form.text"); j = 0; @@ -3638,7 +3575,7 @@ void ICSInputBoxPopUp() edit = XtNameToWidget(ICSInputShell, "*form.text"); XtOverrideTranslations(edit, tr); XtRealizeWidget(ICSInputShell); - CatchDeleteWindow(ICSInputShell, "ICSInputBoxPopDown"); + // CatchDeleteWindow(ICSInputShell, "ICSInputBoxPopDown"); } else { edit = XtNameToWidget(ICSInputShell, "*form.text"); @@ -3703,7 +3640,7 @@ void CommentPopUp(title, text) commentShell = CommentCreate(title, text, False, CommentCallback, 4); XtRealizeWidget(commentShell); - CatchDeleteWindow(commentShell, "CommentPopDown"); + // CatchDeleteWindow(commentShell, "CommentPopDown"); } else { edit = XtNameToWidget(commentShell, "*form.text"); j = 0; @@ -3716,7 +3653,7 @@ void CommentPopUp(title, text) } XtPopup(commentShell, XtGrabNone); - XSync(xDisplay, False); + // XSync(xDisplay, False); commentUp = True; } @@ -3755,7 +3692,7 @@ void CommentPopDown() XtSetArg(args[j], XtNheight, &commentH); j++; XtGetValues(commentShell, args, j); XtPopdown(commentShell); - XSync(xDisplay, False); + // XSync(xDisplay, False); commentUp = False; } @@ -3774,13 +3711,13 @@ void PromotionPopUp() j = 0; XtSetArg(args[j], XtNresizable, True); j++; XtSetArg(args[j], XtNtitle, XtNewString(_("Promotion"))); j++; - promotionShell = - XtCreatePopupShell("Promotion", transientShellWidgetClass, - shellWidget, args, j); - layout = - XtCreateManagedWidget(layoutName, formWidgetClass, promotionShell, - layoutArgs, XtNumber(layoutArgs)); - +// promotionShell = +// XtCreatePopupShell("Promotion", transientShellWidgetClass, +// shellWidget, args, j); +// layout = +// XtCreateManagedWidget(layoutName, formWidgetClass, promotionShell, +// layoutArgs, XtNumber(layoutArgs)); +// j = 0; XtSetArg(args[j], XtNlabel, _("Promote to what?")); j++; XtSetArg(args[j], XtNborderWidth, 0); j++; @@ -3820,7 +3757,7 @@ void PromotionPopUp() (XtPointer) dialog); XtRealizeWidget(promotionShell); - CatchDeleteWindow(promotionShell, "PromotionPopDown"); + // CatchDeleteWindow(promotionShell, "PromotionPopDown"); j = 0; XtSetArg(args[j], XtNwidth, &pw_width); j++; @@ -4022,9 +3959,10 @@ void ModeHighlight() } } - wname = ModeToWidgetName(oldmode); - if(wname) - gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (gtk_builder_get_object (builder, wname)),True); + // probably not needed anymore +// wname = ModeToWidgetName(oldmode); +// if(wname) +// gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (gtk_builder_get_object (builder, wname)),True); oldmode = gameMode; @@ -4056,8 +3994,11 @@ int LoadGamePopUp(f, gameNumber, title) else if (!ListEmpty(&gameList) && ((ListGame *) gameList.tailPred)->number > 1) { - // TODO convert to GTK - // GameListPopUp(f, title); + /* we need an answer which game to load, so let's make it modal for a while*/ + gtk_window_set_modal(GTK_WINDOW(GUI_GameList) , TRUE); + GameListPopUp(f, title); + gtk_window_set_modal(GTK_WINDOW(GUI_GameList) , FALSE); + return TRUE; }; @@ -4087,9 +4028,9 @@ void MailMoveProc(w, event, prms, nprms) } /* this variable is shared between CopyPositionProc and SendPositionSelection */ -static char *selected_fen_position=NULL; +char *selected_fen_position=NULL; -static Boolean +Boolean SendPositionSelection(Widget w, Atom *selection, Atom *target, Atom *type_return, XtPointer *value_return, unsigned long *length_return, int *format_return) @@ -4097,34 +4038,34 @@ SendPositionSelection(Widget w, Atom *selection, Atom *target, char *selection_tmp; if (!selected_fen_position) return False; /* should never happen */ - if (*target == XA_STRING || *target == XA_UTF8_STRING(xDisplay)){ - /* note: since no XtSelectionDoneProc was registered, Xt will - * automatically call XtFree on the value returned. So have to - * make a copy of it allocated with XtMalloc */ - selection_tmp= XtMalloc(strlen(selected_fen_position)+16); - strcpy(selection_tmp, selected_fen_position); - - *value_return=selection_tmp; - *length_return=strlen(selection_tmp); - *type_return=*target; - *format_return = 8; /* bits per byte */ - return True; - } else if (*target == XA_TARGETS(xDisplay)) { - Atom *targets_tmp = (Atom *) XtMalloc(2 * sizeof(Atom)); - targets_tmp[0] = XA_UTF8_STRING(xDisplay); - targets_tmp[1] = XA_STRING; - *value_return = targets_tmp; - *type_return = XA_ATOM; - *length_return = 2; - *format_return = 8 * sizeof(Atom); - if (*format_return > 32) { - *length_return *= *format_return / 32; - *format_return = 32; - } - return True; - } else { - return False; - } +// if (*target == XA_STRING || *target == XA_UTF8_STRING(xDisplay)){ +// /* note: since no XtSelectionDoneProc was registered, Xt will +// * automatically call XtFree on the value returned. So have to +// * make a copy of it allocated with XtMalloc */ +// selection_tmp= XtMalloc(strlen(selected_fen_position)+16); +// strcpy(selection_tmp, selected_fen_position); +// +// *value_return=selection_tmp; +// *length_return=strlen(selection_tmp); +// *type_return=*target; +// *format_return = 8; /* bits per byte */ +// return True; +// } else if (*target == XA_TARGETS(xDisplay)) { +// Atom *targets_tmp = (Atom *) XtMalloc(2 * sizeof(Atom)); +// targets_tmp[0] = XA_UTF8_STRING(xDisplay); +// targets_tmp[1] = XA_STRING; +// *value_return = targets_tmp; +// *type_return = XA_ATOM; +// *length_return = 2; +// *format_return = 8 * sizeof(Atom); +// if (*format_return > 32) { +// *length_return *= *format_return / 32; +// *format_return = 32; +// } +// return True; +// } else { +// return False; +// } } /* note: when called from menu all parameters are NULL, so no clue what the @@ -4145,16 +4086,16 @@ void CopyPositionProc(w, event, prms, nprms) if (selected_fen_position) free(selected_fen_position); selected_fen_position = (char *)PositionToFEN(currentMove, NULL); if (!selected_fen_position) return; - XtOwnSelection(menuBarWidget, XA_PRIMARY, - CurrentTime, - SendPositionSelection, - NULL/* lose_ownership_proc */ , - NULL/* transfer_done_proc */); - XtOwnSelection(menuBarWidget, XA_CLIPBOARD(xDisplay), - CurrentTime, - SendPositionSelection, - NULL/* lose_ownership_proc */ , - NULL/* transfer_done_proc */); +// XtOwnSelection(menuBarWidget, XA_PRIMARY, +// CurrentTime, +// SendPositionSelection, +// NULL/* lose_ownership_proc */ , +// NULL/* transfer_done_proc */); +// XtOwnSelection(menuBarWidget, XA_CLIPBOARD(xDisplay), +// CurrentTime, +// SendPositionSelection, +// NULL/* lose_ownership_proc */ , +// NULL/* transfer_done_proc */); } /* function called when the data to Paste is ready */ @@ -4177,16 +4118,16 @@ void PastePositionProc(w, event, prms, nprms) String *prms; Cardinal *nprms; { - XtGetSelectionValue(menuBarWidget, - appData.pasteSelection ? XA_PRIMARY: XA_CLIPBOARD(xDisplay), XA_STRING, - /* (XtSelectionCallbackProc) */ PastePositionCB, - NULL, /* client_data passed to PastePositionCB */ - - /* better to use the time field from the event that triggered the - * call to this function, but that isn't trivial to get - */ - CurrentTime - ); +// XtGetSelectionValue(menuBarWidget, +// appData.pasteSelection ? XA_PRIMARY: XA_CLIPBOARD(xDisplay), XA_STRING, +// /* (XtSelectionCallbackProc) */ PastePositionCB, +// NULL, /* client_data passed to PastePositionCB */ +// +// /* better to use the time field from the event that triggered the +// * call to this function, but that isn't trivial to get +// */ +// CurrentTime +// ); return; } @@ -4197,42 +4138,42 @@ SendGameSelection(Widget w, Atom *selection, Atom *target, { char *selection_tmp; - if (*target == XA_STRING || *target == XA_UTF8_STRING(xDisplay)){ - FILE* f = fopen(gameCopyFilename, "r"); - long len; - size_t count; - if (f == NULL) return False; - fseek(f, 0, 2); - len = ftell(f); - rewind(f); - selection_tmp = XtMalloc(len + 1); - count = fread(selection_tmp, 1, len, f); - if (len != count) { - XtFree(selection_tmp); - return False; - } - selection_tmp[len] = NULLCHAR; - *value_return = selection_tmp; - *length_return = len; - *type_return = *target; - *format_return = 8; /* bits per byte */ - return True; - } else if (*target == XA_TARGETS(xDisplay)) { - Atom *targets_tmp = (Atom *) XtMalloc(2 * sizeof(Atom)); - targets_tmp[0] = XA_UTF8_STRING(xDisplay); - targets_tmp[1] = XA_STRING; - *value_return = targets_tmp; - *type_return = XA_ATOM; - *length_return = 2; - *format_return = 8 * sizeof(Atom); - if (*format_return > 32) { - *length_return *= *format_return / 32; - *format_return = 32; - } - return True; - } else { - return False; - } +// if (*target == XA_STRING || *target == XA_UTF8_STRING(xDisplay)){ +// FILE* f = fopen(gameCopyFilename, "r"); +// long len; +// size_t count; +// if (f == NULL) return False; +// fseek(f, 0, 2); +// len = ftell(f); +// rewind(f); +// selection_tmp = XtMalloc(len + 1); +// count = fread(selection_tmp, 1, len, f); +// if (len != count) { +// XtFree(selection_tmp); +// return False; +// } +// selection_tmp[len] = NULLCHAR; +// *value_return = selection_tmp; +// *length_return = len; +// *type_return = *target; +// *format_return = 8; /* bits per byte */ +// return True; +// } else if (*target == XA_TARGETS(xDisplay)) { +// Atom *targets_tmp = (Atom *) XtMalloc(2 * sizeof(Atom)); +// targets_tmp[0] = XA_UTF8_STRING(xDisplay); +// targets_tmp[1] = XA_STRING; +// *value_return = targets_tmp; +// *type_return = XA_ATOM; +// *length_return = 2; +// *format_return = 8 * sizeof(Atom); +// if (*format_return > 32) { +// *length_return *= *format_return / 32; +// *format_return = 32; +// } +// return True; +// } else { +// return False; +// } } /* note: when called from menu all parameters are NULL, so no clue what the @@ -4254,16 +4195,16 @@ void CopyGameProc(w, event, prms, nprms) * have a notion of a game that is selected but not copied. * See http://www.freedesktop.org/wiki/Specifications/ClipboardsWiki */ - XtOwnSelection(menuBarWidget, XA_PRIMARY, - CurrentTime, - SendGameSelection, - NULL/* lose_ownership_proc */ , - NULL/* transfer_done_proc */); - XtOwnSelection(menuBarWidget, XA_CLIPBOARD(xDisplay), - CurrentTime, - SendGameSelection, - NULL/* lose_ownership_proc */ , - NULL/* transfer_done_proc */); +// XtOwnSelection(menuBarWidget, XA_PRIMARY, +// CurrentTime, +// SendGameSelection, +// NULL/* lose_ownership_proc */ , +// NULL/* transfer_done_proc */); +// XtOwnSelection(menuBarWidget, XA_CLIPBOARD(xDisplay), +// CurrentTime, +// SendGameSelection, +// NULL/* lose_ownership_proc */ , +// NULL/* transfer_done_proc */); } /* function called when the data to Paste is ready */ @@ -4294,17 +4235,17 @@ void PasteGameProc(w, event, prms, nprms) String *prms; Cardinal *nprms; { - XtGetSelectionValue(menuBarWidget, - appData.pasteSelection ? XA_PRIMARY: XA_CLIPBOARD(xDisplay), XA_STRING, - /* (XtSelectionCallbackProc) */ PasteGameCB, - NULL, /* client_data passed to PasteGameCB */ - - /* better to use the time field from the event that triggered the - * call to this function, but that isn't trivial to get - */ - CurrentTime - ); - return; +// XtGetSelectionValue(menuBarWidget, +// appData.pasteSelection ? XA_PRIMARY: XA_CLIPBOARD(xDisplay), XA_STRING, +// /* (XtSelectionCallbackProc) */ PasteGameCB, +// NULL, /* client_data passed to PasteGameCB */ +// +// /* better to use the time field from the event that triggered the +// * call to this function, but that isn't trivial to get +// */ +// CurrentTime +// ); +// return; } void SaveOnExitProc(w, event, prms, nprms) @@ -4416,9 +4357,9 @@ void Iconify(w, event, prms, nprms) { Arg args[16]; - fromX = fromY = -1; - XtSetArg(args[0], XtNiconic, True); - XtSetValues(shellWidget, args, 1); +// fromX = fromY = -1; +// XtSetArg(args[0], XtNiconic, True); +// XtSetValues(shellWidget, args, 1); } void DisplayMessage(message, extMessage) @@ -4585,14 +4526,14 @@ void DisplayIcsInteractionTitle(message) Window root, parent, *children; unsigned int nchildren; int (*oldHandler)() = XSetErrorHandler(NullXErrorCheck); - for (;;) { - if (XFetchName(xDisplay, win, &oldICSInteractionTitle)) break; - if (!XQueryTree(xDisplay, win, &root, &parent, - &children, &nchildren)) break; - if (children) XFree((void *)children); - if (parent == root || parent == 0) break; - win = parent; - } +// for (;;) { +// if (XFetchName(xDisplay, win, &oldICSInteractionTitle)) break; +// if (!XQueryTree(xDisplay, win, &root, &parent, +// &children, &nchildren)) break; +// if (children) XFree((void *)children); +// if (parent == root || parent == 0) break; +// win = parent; +// } XSetErrorHandler(oldHandler); } if (oldICSInteractionTitle == NULL) { @@ -4683,14 +4624,14 @@ void AskQuestion(title, question, replyPrefix, pr) i = 0; XtSetArg(args[i], XtNresizable, True); i++; XtSetArg(args[i], XtNwidth, DIALOG_SIZE); i++; - askQuestionShell = popup = - XtCreatePopupShell(title, transientShellWidgetClass, - shellWidget, args, i); - - layout = - XtCreateManagedWidget(layoutName, formWidgetClass, popup, - layoutArgs, XtNumber(layoutArgs)); - +// askQuestionShell = popup = +// XtCreatePopupShell(title, transientShellWidgetClass, +// shellWidget, args, i); +// +// layout = +// XtCreateManagedWidget(layoutName, formWidgetClass, popup, +// layoutArgs, XtNumber(layoutArgs)); +// i = 0; XtSetArg(args[i], XtNlabel, question); i++; XtSetArg(args[i], XtNvalue, ""); i++; @@ -4704,20 +4645,20 @@ void AskQuestion(title, question, replyPrefix, pr) (XtPointer) dialog); XtRealizeWidget(popup); - CatchDeleteWindow(popup, "AskQuestionPopDown"); - - XQueryPointer(xDisplay, xBoardWindow, &root, &child, - &x, &y, &win_x, &win_y, &mask); + // CatchDeleteWindow(popup, "AskQuestionPopDown"); - XtSetArg(args[0], XtNx, x - 10); - XtSetArg(args[1], XtNy, y - 30); - XtSetValues(popup, args, 2); - - XtPopup(popup, XtGrabExclusive); - askQuestionUp = True; - - edit = XtNameToWidget(dialog, "*value"); - XtSetKeyboardFocus(popup, edit); +// XQueryPointer(xDisplay, xBoardWindow, &root, &child, +// &x, &y, &win_x, &win_y, &mask); +// +// XtSetArg(args[0], XtNx, x - 10); +// XtSetArg(args[1], XtNy, y - 30); +// XtSetValues(popup, args, 2); +// +// XtPopup(popup, XtGrabExclusive); +// askQuestionUp = True; +// +// edit = XtNameToWidget(dialog, "*value"); +// XtSetKeyboardFocus(popup, edit); } @@ -5519,7 +5460,6 @@ InputSourceRef AddInputSource(pr, lineByLine, func, closure) // /* TODO: will this work on windows?*/ - printf("DEBUG: fd=%d %d\n",is->fd,is); channel = g_io_channel_unix_new(is->fd); g_io_channel_set_close_on_unref (channel, TRUE); @@ -5649,71 +5589,71 @@ CreateAnimMasks (pieceDepth) return; /* Need a bitmap just to get a GC with right depth */ - buf = XCreatePixmap(xDisplay, xBoardWindow, - 8, 8, 1); +// buf = XCreatePixmap(xDisplay, xBoardWindow, +// 8, 8, 1); values.foreground = 1; values.background = 0; /* Don't use XtGetGC, not read only */ - maskGC = XCreateGC(xDisplay, buf, - GCForeground | GCBackground, &values); - XFreePixmap(xDisplay, buf); - - buf = XCreatePixmap(xDisplay, xBoardWindow, - squareSize, squareSize, pieceDepth); - values.foreground = XBlackPixel(xDisplay, xScreen); - values.background = XWhitePixel(xDisplay, xScreen); - bufGC = XCreateGC(xDisplay, buf, - GCForeground | GCBackground, &values); - +// maskGC = XCreateGC(xDisplay, buf, +// GCForeground | GCBackground, &values); +// XFreePixmap(xDisplay, buf); +// +// buf = XCreatePixmap(xDisplay, xBoardWindow, +// squareSize, squareSize, pieceDepth); +// values.foreground = XBlackPixel(xDisplay, xScreen); +// values.background = XWhitePixel(xDisplay, xScreen); +// bufGC = XCreateGC(xDisplay, buf, +// GCForeground | GCBackground, &values); +// for (piece = WhitePawn; piece <= BlackKing; piece++) { /* Begin with empty mask */ - if(!xpmDone) // [HGM] pieces: keep using existing - xpmMask[piece] = XCreatePixmap(xDisplay, xBoardWindow, - squareSize, squareSize, 1); - XSetFunction(xDisplay, maskGC, GXclear); - XFillRectangle(xDisplay, xpmMask[piece], maskGC, - 0, 0, squareSize, squareSize); - +// if(!xpmDone) // [HGM] pieces: keep using existing +// xpmMask[piece] = XCreatePixmap(xDisplay, xBoardWindow, +// squareSize, squareSize, 1); +// XSetFunction(xDisplay, maskGC, GXclear); +// XFillRectangle(xDisplay, xpmMask[piece], maskGC, +// 0, 0, squareSize, squareSize); +// /* Take a copy of the piece */ if (White(piece)) kind = 0; else kind = 2; - XSetFunction(xDisplay, bufGC, GXcopy); - XCopyArea(xDisplay, xpmPieceBitmap[kind][((int)piece) % (int)BlackPawn], - buf, bufGC, - 0, 0, squareSize, squareSize, 0, 0); +// XSetFunction(xDisplay, bufGC, GXcopy); +// XCopyArea(xDisplay, xpmPieceBitmap[kind][((int)piece) % (int)BlackPawn], +// buf, bufGC, +// 0, 0, squareSize, squareSize, 0, 0); /* XOR the background (light) over the piece */ - XSetFunction(xDisplay, bufGC, GXxor); - if (useImageSqs) - XCopyArea(xDisplay, xpmLightSquare, buf, bufGC, - 0, 0, squareSize, squareSize, 0, 0); - else { - XSetForeground(xDisplay, bufGC, lightSquareColor); - XFillRectangle(xDisplay, buf, bufGC, 0, 0, squareSize, squareSize); - } +// XSetFunction(xDisplay, bufGC, GXxor); +// if (useImageSqs) +// XCopyArea(xDisplay, xpmLightSquare, buf, bufGC, +// 0, 0, squareSize, squareSize, 0, 0); +// else { +// XSetForeground(xDisplay, bufGC, lightSquareColor); +// XFillRectangle(xDisplay, buf, bufGC, 0, 0, squareSize, squareSize); +// } /* We now have an inverted piece image with the background erased. Construct mask by just selecting all the non-zero pixels - no need to reconstruct the original image. */ - XSetFunction(xDisplay, maskGC, GXor); + // XSetFunction(xDisplay, maskGC, GXor); plane = 1; /* Might be quicker to download an XImage and create bitmap data from it rather than this N copies per piece, but it only takes a fraction of a second and there is a much longer delay for loading the pieces. */ - for (n = 0; n < pieceDepth; n ++) { - XCopyPlane(xDisplay, buf, xpmMask[piece], maskGC, - 0, 0, squareSize, squareSize, - 0, 0, plane); - plane = plane << 1; - } +// for (n = 0; n < pieceDepth; n ++) { +// XCopyPlane(xDisplay, buf, xpmMask[piece], maskGC, +// 0, 0, squareSize, squareSize, +// 0, 0, plane); +// plane = plane << 1; +// } } /* Clean up */ - XFreePixmap(xDisplay, buf); - XFreeGC(xDisplay, bufGC); - XFreeGC(xDisplay, maskGC); +// XFreePixmap(xDisplay, buf); +// XFreeGC(xDisplay, bufGC); +// XFreeGC(xDisplay, maskGC); } static void @@ -6293,7 +6233,7 @@ DragPieceMove(x, y) corner.x = x - player.mouseDelta.x; corner.y = y - player.mouseDelta.y; AnimationFrame(&player, &corner, player.dragPiece); -#if HIGHDRAG +#if HIGHDRAG*0 if (appData.highlightDragging) { int boardX, boardY; BoardSquare(x, y, &boardX, &boardY);