X-Git-Url: http://winboard.nl/cgi-bin?a=blobdiff_plain;f=winboard%2Fwinboard.c;h=03b1fc2538c58836a97f88803560a67e942a0772;hb=5cd55bddca592918f38deff675d05b650a71412e;hp=252e9b032fa681cc99a23ab182d00a5949e8d127;hpb=46491b331dd7c853879132374e4ee30c1e758606;p=xboard.git diff --git a/winboard/winboard.c b/winboard/winboard.c index 252e9b0..03b1fc2 100644 --- a/winboard/winboard.c +++ b/winboard/winboard.c @@ -2,10 +2,10 @@ * WinBoard.c -- Windows NT front end to XBoard * * Copyright 1991 by Digital Equipment Corporation, Maynard, - * Massachusetts. + * Massachusetts. * * Enhancements Copyright 1992-2001, 2002, 2003, 2004, 2005, 2006, - * 2007, 2008, 2009 Free Software Foundation, Inc. + * 2007, 2008, 2009, 2010 Free Software Foundation, Inc. * * Enhancements Copyright 2005 Alessandro Scotti * @@ -80,13 +80,11 @@ #endif #include "common.h" -#include "winboard.h" #include "frontend.h" #include "backend.h" +#include "winboard.h" #include "moves.h" #include "wclipbrd.h" -#include "wgamelist.h" -#include "wedittags.h" #include "woptions.h" #include "wsockerr.h" #include "defaults.h" @@ -106,13 +104,13 @@ extern int ics_type; void DisplayHoldingsCount(HDC hdc, int x, int y, int align, int copyNumber); VOID NewVariantPopup(HWND hwnd); int FinishMove P((ChessMove moveType, int fromX, int fromY, int toX, int toY, - /*char*/int promoChar)); + /*char*/int promoChar)); void AnimateAtomicCapture(int fromX, int fromY, int toX, int toY, int nFrames); void DisplayMove P((int moveNumber)); Boolean ParseFEN P((Board board, int *blackPlaysFirst, char *fen)); void ChatPopUp P(()); typedef struct { - ChessSquare piece; + ChessSquare piece; POINT pos; /* window coordinates of current pos */ POINT lastpos; /* window coordinates of last pos - used for clipping */ POINT from; /* board coordinates of the piece's orig pos */ @@ -131,7 +129,7 @@ typedef struct { static DragInfo dragInfo = { {-1,-1}, {-1,-1}, {-1,-1}, {-1,-1} }; typedef struct { - POINT sq[2]; /* board coordinates of from, to squares */ + POINT sq[2]; /* board coordinates of from, to squares */ } HighlightInfo; static HighlightInfo highlightInfo = { {{-1, -1}, {-1, -1}} }; @@ -153,15 +151,16 @@ char szConsoleTitle[] = "I C S Interaction"; char *programName; char *settingsFileName; -BOOLEAN saveSettingsOnExit; +Boolean saveSettingsOnExit; char installDir[MSG_SIZ]; +int errorExitStatus; BoardSize boardSize; -BOOLEAN chessProgram; -static int boardX, boardY; +Boolean chessProgram; +//static int boardX, boardY; int minX, minY; // [HGM] placement: volatile limits on upper-left corner -static int squareSize, lineGap, minorSize; -static int winWidth, winHeight, winW, winH; +int squareSize, lineGap, minorSize; +static int winW, winH; static RECT messageRect, whiteRect, blackRect, leftLogoRect, rightLogoRect; // [HGM] logo static int logoHeight = 0; static char messageText[MESSAGE_TEXT_MAX]; @@ -176,16 +175,12 @@ char *icsNames; char *firstChessProgramNames; char *secondChessProgramNames; -#define ARG_MAX 128*1024 /* [AS] For Roger Brown's very long list! */ - #define PALETTESIZE 256 HINSTANCE hInst; /* current instance */ -HWND hwndMain = NULL; /* root window*/ -HWND hwndConsole = NULL; -BOOLEAN alwaysOnTop = FALSE; +Boolean alwaysOnTop = FALSE; RECT boardRect; -COLORREF lightSquareColor, darkSquareColor, whitePieceColor, +COLORREF lightSquareColor, darkSquareColor, whitePieceColor, blackPieceColor, highlightSquareColor, premoveHighlightColor; HPALETTE hPal; ColorClass currentColorClass; @@ -196,9 +191,10 @@ static HBITMAP pieceBitmap[3][(int) BlackPawn]; /* [HGM] nr of bitmaps referred static HBRUSH lightSquareBrush, darkSquareBrush, blackSquareBrush, /* [HGM] for band between board and holdings */ explodeBrush, /* [HGM] atomic */ + markerBrush, /* [HGM] markers */ whitePieceBrush, blackPieceBrush, iconBkgndBrush /*, outlineBrush*/; -static POINT gridEndpoints[(BOARD_SIZE + 1) * 4]; -static DWORD gridVertexCounts[(BOARD_SIZE + 1) * 2]; +static POINT gridEndpoints[(BOARD_RANKS + BOARD_FILES + 2) * 2]; +static DWORD gridVertexCounts[BOARD_RANKS + BOARD_FILES + 2]; static HPEN gridPen = NULL; static HPEN highlightPen = NULL; static HPEN premovePen = NULL; @@ -210,17 +206,12 @@ static int lastSizing = 0; static int prevStderrPort; static HBITMAP userLogo; -/* [AS] Support for background textures */ -#define BACK_TEXTURE_MODE_DISABLED 0 -#define BACK_TEXTURE_MODE_PLAIN 1 -#define BACK_TEXTURE_MODE_FULL_RANDOM 2 - static HBITMAP liteBackTexture = NULL; static HBITMAP darkBackTexture = NULL; static int liteBackTextureMode = BACK_TEXTURE_MODE_PLAIN; static int darkBackTextureMode = BACK_TEXTURE_MODE_PLAIN; static int backTextureSquareSize = 0; -static struct { int x; int y; int mode; } backTextureSquareInfo[BOARD_SIZE][BOARD_SIZE]; +static struct { int x; int y; int mode; } backTextureSquareInfo[BOARD_RANKS][BOARD_FILES]; #if __GNUC__ && !defined(_winmajor) #define oldDialog 0 /* cygwin doesn't define _winmajor; mingw does */ @@ -232,13 +223,6 @@ static struct { int x; int y; int mode; } backTextureSquareInfo[BOARD_SIZE][BOAR #endif #endif -char *defaultTextAttribs[] = -{ - COLOR_SHOUT, COLOR_SSHOUT, COLOR_CHANNEL1, COLOR_CHANNEL, COLOR_KIBITZ, - COLOR_TELL, COLOR_CHALLENGE, COLOR_REQUEST, COLOR_SEEK, COLOR_NORMAL, - COLOR_NONE -}; - typedef struct { char *name; int squareSize; @@ -248,7 +232,7 @@ typedef struct { int cliWidth, cliHeight; } SizeInfo; -SizeInfo sizeInfo[] = +SizeInfo sizeInfo[] = { { "tiny", 21, 0, 1, 1, 0, 0 }, { "teeny", 25, 1, 1, 1, 0, 0 }, @@ -346,15 +330,7 @@ static char *commentTitle; static char *commentText; static int commentIndex; static Boolean editComment = FALSE; -HWND commentDialog = NULL; -BOOLEAN commentDialogUp = FALSE; -static int commentX, commentY, commentH, commentW; -static char *analysisTitle; -static char *analysisText; -HWND analysisDialog = NULL; -BOOLEAN analysisDialogUp = FALSE; -static int analysisX, analysisY, analysisH, analysisW; char errorTitle[MSG_SIZ]; char errorMessage[2*MSG_SIZ]; @@ -424,37 +400,27 @@ VOID UpdateSampleText(HWND hDlg, int id, MyColorizeAttribs *mca); int NewGameFRC(); int GameListOptions(); -HWND moveHistoryDialog = NULL; -BOOLEAN moveHistoryDialogUp = FALSE; - -WindowPlacement wpMoveHistory; +int dummy; // [HGM] for obsolete args +HWND hwndMain = NULL; /* root window*/ +HWND hwndConsole = NULL; +HWND commentDialog = NULL; +HWND moveHistoryDialog = NULL; HWND evalGraphDialog = NULL; -BOOLEAN evalGraphDialogUp = FALSE; - -WindowPlacement wpEvalGraph; - HWND engineOutputDialog = NULL; -BOOLEAN engineOutputDialogUp = FALSE; +HWND gameListDialog = NULL; +HWND editTagsDialog = NULL; + +int commentUp = FALSE; +WindowPlacement wpMain; +WindowPlacement wpConsole; +WindowPlacement wpComment; +WindowPlacement wpMoveHistory; +WindowPlacement wpEvalGraph; WindowPlacement wpEngineOutput; WindowPlacement wpGameList; -WindowPlacement wpConsole; - -VOID MoveHistoryPopUp(); -VOID MoveHistoryPopDown(); -VOID MoveHistorySet( char movelist[][2*MOVE_LEN], int first, int last, int current, ChessProgramStats_Move * pvInfo ); -BOOL MoveHistoryIsUp(); - -VOID EvalGraphSet( int first, int last, int current, ChessProgramStats_Move * pvInfo ); -VOID EvalGraphPopUp(); -VOID EvalGraphPopDown(); -BOOL EvalGraphIsUp(); - -VOID EngineOutputPopUp(); -VOID EngineOutputPopDown(); -BOOL EngineOutputIsUp(); -VOID EngineOutputUpdate( FrontEndProgramStats * stats ); +WindowPlacement wpTags; VOID EngineOptionsPopup(); // [HGM] settings @@ -522,7 +488,7 @@ void ThawUI() int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, - LPSTR lpCmdLine, int nCmdShow) + LPSTR lpCmdLine, int nCmdShow) { MSG msg; HANDLE hAccelMain, hAccelNoAlt, hAccelNoICS; @@ -552,104 +518,104 @@ WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, /* Acquire and dispatch messages until a WM_QUIT message is received. */ while (GetMessage(&msg, /* message structure */ - NULL, /* handle of window receiving the message */ - 0, /* lowest message to examine */ - 0)) /* highest message to examine */ + NULL, /* handle of window receiving the message */ + 0, /* lowest message to examine */ + 0)) /* highest message to examine */ { if(msg.message == WM_CHAR && msg.wParam == '\t') { - // [HGM] navigate: switch between all windows with tab - HWND e1 = NULL, e2 = NULL, mh = NULL, hInput = NULL, hText = NULL; - int i, currentElement = 0; - - // first determine what element of the chain we come from (if any) - if(appData.icsActive) { - hInput = GetDlgItem(hwndConsole, OPT_ConsoleInput); - hText = GetDlgItem(hwndConsole, OPT_ConsoleText); - } - if(engineOutputDialog && EngineOutputIsUp()) { - e1 = GetDlgItem(engineOutputDialog, IDC_EngineMemo1); - e2 = GetDlgItem(engineOutputDialog, IDC_EngineMemo2); - } - if(moveHistoryDialog && MoveHistoryIsUp()) { - mh = GetDlgItem(moveHistoryDialog, IDC_MoveHistory); - } - if(msg.hwnd == hwndMain) currentElement = 7 ; else - if(msg.hwnd == engineOutputDialog) currentElement = 2; else - if(msg.hwnd == e1) currentElement = 2; else - if(msg.hwnd == e2) currentElement = 3; else - if(msg.hwnd == moveHistoryDialog) currentElement = 4; else - if(msg.hwnd == mh) currentElement = 4; else - if(msg.hwnd == evalGraphDialog) currentElement = 6; else - if(msg.hwnd == hText) currentElement = 5; else - if(msg.hwnd == hInput) currentElement = 6; else - for (i = 0; i < N_BUTTONS; i++) { - if (buttonDesc[i].hwnd == msg.hwnd) { currentElement = 1; break; } - } - - // determine where to go to - if(currentElement) { HWND h = NULL; int direction = GetKeyState(VK_SHIFT) < 0 ? -1 : 1; - do { - currentElement = (currentElement + direction) % 7; - switch(currentElement) { - case 0: - h = hwndMain; break; // passing this case always makes the loop exit - case 1: - h = buttonDesc[0].hwnd; break; // could be NULL - case 2: - if(!EngineOutputIsUp()) continue; // skip closed auxiliary windows - h = e1; break; - case 3: - if(!EngineOutputIsUp()) continue; - h = e2; break; - case 4: - if(!MoveHistoryIsUp()) continue; - h = mh; break; -// case 6: // input to eval graph does not seem to get here! -// if(!EvalGraphIsUp()) continue; -// h = evalGraphDialog; break; - case 5: - if(!appData.icsActive) continue; - SAY("display"); - h = hText; break; - case 6: - if(!appData.icsActive) continue; - SAY("input"); - h = hInput; break; - } - } while(h == 0); - - if(currentElement > 4 && IsIconic(hwndConsole)) ShowWindow(hwndConsole, SW_RESTORE); - if(currentElement < 5 && IsIconic(hwndMain)) ShowWindow(hwndMain, SW_RESTORE); // all open together - SetFocus(h); - - continue; // this message now has been processed - } + // [HGM] navigate: switch between all windows with tab + HWND e1 = NULL, e2 = NULL, mh = NULL, hInput = NULL, hText = NULL; + int i, currentElement = 0; + + // first determine what element of the chain we come from (if any) + if(appData.icsActive) { + hInput = GetDlgItem(hwndConsole, OPT_ConsoleInput); + hText = GetDlgItem(hwndConsole, OPT_ConsoleText); + } + if(engineOutputDialog && EngineOutputIsUp()) { + e1 = GetDlgItem(engineOutputDialog, IDC_EngineMemo1); + e2 = GetDlgItem(engineOutputDialog, IDC_EngineMemo2); + } + if(moveHistoryDialog && MoveHistoryIsUp()) { + mh = GetDlgItem(moveHistoryDialog, IDC_MoveHistory); + } + if(msg.hwnd == hwndMain) currentElement = 7 ; else + if(msg.hwnd == engineOutputDialog) currentElement = 2; else + if(msg.hwnd == e1) currentElement = 2; else + if(msg.hwnd == e2) currentElement = 3; else + if(msg.hwnd == moveHistoryDialog) currentElement = 4; else + if(msg.hwnd == mh) currentElement = 4; else + if(msg.hwnd == evalGraphDialog) currentElement = 6; else + if(msg.hwnd == hText) currentElement = 5; else + if(msg.hwnd == hInput) currentElement = 6; else + for (i = 0; i < N_BUTTONS; i++) { + if (buttonDesc[i].hwnd == msg.hwnd) { currentElement = 1; break; } + } + + // determine where to go to + if(currentElement) { HWND h = NULL; int direction = GetKeyState(VK_SHIFT) < 0 ? -1 : 1; + do { + currentElement = (currentElement + direction) % 7; + switch(currentElement) { + case 0: + h = hwndMain; break; // passing this case always makes the loop exit + case 1: + h = buttonDesc[0].hwnd; break; // could be NULL + case 2: + if(!EngineOutputIsUp()) continue; // skip closed auxiliary windows + h = e1; break; + case 3: + if(!EngineOutputIsUp()) continue; + h = e2; break; + case 4: + if(!MoveHistoryIsUp()) continue; + h = mh; break; +// case 6: // input to eval graph does not seem to get here! +// if(!EvalGraphIsUp()) continue; +// h = evalGraphDialog; break; + case 5: + if(!appData.icsActive) continue; + SAY("display"); + h = hText; break; + case 6: + if(!appData.icsActive) continue; + SAY("input"); + h = hInput; break; + } + } while(h == 0); + + if(currentElement > 4 && IsIconic(hwndConsole)) ShowWindow(hwndConsole, SW_RESTORE); + if(currentElement < 5 && IsIconic(hwndMain)) ShowWindow(hwndMain, SW_RESTORE); // all open together + SetFocus(h); + + continue; // this message now has been processed + } } if (!(commentDialog && IsDialogMessage(commentDialog, &msg)) && !(moveHistoryDialog && IsDialogMessage(moveHistoryDialog, &msg)) && !(evalGraphDialog && IsDialogMessage(evalGraphDialog, &msg)) && !(engineOutputDialog && IsDialogMessage(engineOutputDialog, &msg)) && - !(editTagsDialog && IsDialogMessage(editTagsDialog, &msg)) && - !(gameListDialog && IsDialogMessage(gameListDialog, &msg)) && - !(errorDialog && IsDialogMessage(errorDialog, &msg)) && - !(!frozen && TranslateAccelerator(hwndMain, hAccelMain, &msg)) && JAWS_ACCEL + !(editTagsDialog && IsDialogMessage(editTagsDialog, &msg)) && + !(gameListDialog && IsDialogMessage(gameListDialog, &msg)) && + !(errorDialog && IsDialogMessage(errorDialog, &msg)) && + !(!frozen && TranslateAccelerator(hwndMain, hAccelMain, &msg)) && JAWS_ACCEL !(!hwndConsole && TranslateAccelerator(hwndMain, hAccelNoICS, &msg)) && - !(!hwndConsole && TranslateAccelerator(hwndMain, hAccelNoAlt, &msg))) { - int done = 0, i; // [HGM] chat: dispatch cat-box messages - for(i=0; ilfHeight = -(int)(mfp->pointSize * GetDeviceCaps(hdc, LOGPIXELSY) / 72.0 + 0.5); + DeleteDC(hdc); + lf->lfWidth = 0; + lf->lfEscapement = 0; + lf->lfOrientation = 0; + lf->lfWeight = mfp->bold ? FW_BOLD : FW_NORMAL; + lf->lfItalic = mfp->italic; + lf->lfUnderline = mfp->underline; + lf->lfStrikeOut = mfp->strikeout; + lf->lfCharSet = mfp->charset; + lf->lfOutPrecision = OUT_DEFAULT_PRECIS; + lf->lfClipPrecision = CLIP_DEFAULT_PRECIS; + lf->lfQuality = DEFAULT_QUALITY; + lf->lfPitchAndFamily = DEFAULT_PITCH|FF_DONTCARE; + strcpy(lf->lfFaceName, mfp->faceName); +} - sprintf(buf, "%s %s", msg, badArg); - DisplayFatalError(buf, 0, 2); - exit(2); +void +CreateFontInMF(MyFont *mf) +{ + LFfromMFP(&mf->lf, &mf->mfp); + if (mf->hf) DeleteObject(mf->hf); + mf->hf = CreateFontIndirect(&mf->lf); } +// [HGM] This platform-dependent table provides the location for storing the color info +void * +colorVariable[] = { + &whitePieceColor, + &blackPieceColor, + &lightSquareColor, + &darkSquareColor, + &highlightSquareColor, + &premoveHighlightColor, + NULL, + &consoleBackgroundColor, + &appData.fontForeColorWhite, + &appData.fontBackColorWhite, + &appData.fontForeColorBlack, + &appData.fontBackColorBlack, + &appData.evalHistColorWhite, + &appData.evalHistColorBlack, + &appData.highlightArrowColor, +}; + /* Command line font name parser. NULL name means do nothing. Syntax like "Courier New:10.0 bi" or "Arial:10" or "Arial:10b" For backward compatibility, syntax without the colon is also @@ -1486,7 +965,7 @@ ParseFontName(char *name, MyFontParams *mfp) while (*p && !isdigit(*p)) { *q++ = *p++; if (q - mfp->faceName >= sizeof(mfp->faceName)) - ExitArgError("Font name too long:", name); + ExitArgError("Font name too long:", name); } while (q > mfp->faceName && q[-1] == ' ') q--; *q = NULLCHAR; @@ -1497,8 +976,42 @@ ParseFontName(char *name, MyFontParams *mfp) mfp->italic = (strchr(p, 'i') != NULL); mfp->underline = (strchr(p, 'u') != NULL); mfp->strikeout = (strchr(p, 's') != NULL); + mfp->charset = DEFAULT_CHARSET; + q = strchr(p, 'c'); + if (q) + mfp->charset = (BYTE) atoi(q+1); } +void +ParseFont(char *name, int number) +{ // wrapper to shield back-end from 'font' + ParseFontName(name, &font[boardSize][number]->mfp); +} + +void +SetFontDefaults() +{ // in WB we have a 2D array of fonts; this initializes their description + int i, j; + /* Point font array elements to structures and + parse default font names */ + for (i=0; idef, &font[j][i]->mfp); + } + } +} + +void +CreateFonts() +{ // here we create the actual fonts from the selected descriptions + int i, j; + for (i=0; iargName != NULL; ad++) - if (strcmp(ad->argName, argName + 1) == 0) break; - - if (ad->argName == NULL) - ExitArgError("Unrecognized argument", argName); - - } else if (ch == '@') { - /* Indirection file */ - ad = &argDescriptorIndirection; - ch = get(cl); - } else { - /* Positional argument */ - ad = &argDescriptors[posarg++]; - strcpy(argName, ad->argName); - } - - if (ad->argType == ArgTrue) { - *(Boolean *) ad->argLoc = TRUE; - continue; - } - if (ad->argType == ArgFalse) { - *(Boolean *) ad->argLoc = FALSE; - continue; - } - - while (ch == ' ' || ch == '=' || ch == ':' || ch == '\t') ch = get(cl); - if (ch == NULLCHAR || ch == '\n') { - ExitArgError("No value provided for argument", argName); - } - q = argValue; - if (ch == '{') { - // Quoting with { }. No characters have to (or can) be escaped. - // Thus the string cannot contain a '}' character. - start = ch; - ch = get(cl); - while (start) { - switch (ch) { - case NULLCHAR: - start = NULLCHAR; - break; - - case '}': - ch = get(cl); - start = NULLCHAR; - break; - - default: - *q++ = ch; - ch = get(cl); - break; - } - } - } else if (ch == '\'' || ch == '"') { - // Quoting with ' ' or " ", with \ as escape character. - // Inconvenient for long strings that may contain Windows filenames. - start = ch; - ch = get(cl); - while (start) { - switch (ch) { - case NULLCHAR: - start = NULLCHAR; - break; - - default: - not_special: - *q++ = ch; - ch = get(cl); - break; - - case '\'': - case '\"': - if (ch == start) { - ch = get(cl); - start = NULLCHAR; - break; - } else { - goto not_special; - } - - case '\\': - if (ad->argType == ArgFilename - || ad->argType == ArgSettingsFilename) { - goto not_special; - } - ch = get(cl); - switch (ch) { - case NULLCHAR: - ExitArgError("Incomplete \\ escape in value for", argName); - break; - case 'n': - *q++ = '\n'; - ch = get(cl); - break; - case 'r': - *q++ = '\r'; - ch = get(cl); - break; - case 't': - *q++ = '\t'; - ch = get(cl); - break; - case 'b': - *q++ = '\b'; - ch = get(cl); - break; - case 'f': - *q++ = '\f'; - ch = get(cl); - break; - default: - octval = 0; - for (i = 0; i < 3; i++) { - if (ch >= '0' && ch <= '7') { - octval = octval*8 + (ch - '0'); - ch = get(cl); - } else { - break; - } - } - if (i > 0) { - *q++ = (char) octval; - } else { - *q++ = ch; - ch = get(cl); - } - break; - } - break; - } - } - } else { - while (ch != ' ' && ch != NULLCHAR && ch != '\t' && ch != '\n') { - *q++ = ch; - ch = get(cl); - } - } - *q = NULLCHAR; - - switch (ad->argType) { - case ArgInt: - *(int *) ad->argLoc = atoi(argValue); - break; - - case ArgX: - *(int *) ad->argLoc = atoi(argValue) + boardX; // [HGM] placement: translate stored relative to absolute - break; - - case ArgY: - *(int *) ad->argLoc = atoi(argValue) + boardY; // (this is really kludgey, it should be done where used...) - break; - - case ArgZ: - *(int *) ad->argLoc = atoi(argValue); - EnsureOnScreen(&boardX, &boardY, minX, minY); - break; - - case ArgFloat: - *(float *) ad->argLoc = (float) atof(argValue); - break; - - case ArgString: - case ArgFilename: - *(char **) ad->argLoc = strdup(argValue); - break; - - case ArgSettingsFilename: - { - char fullname[MSG_SIZ]; - if (ParseSettingsFile(argValue, fullname)) { - if (ad->argLoc != NULL) { - *(char **) ad->argLoc = strdup(fullname); - } - } else { - if (ad->argLoc != NULL) { - } else { - ExitArgError("Failed to open indirection file", argValue); - } - } - } - break; - - case ArgBoolean: - switch (argValue[0]) { - case 't': - case 'T': - *(Boolean *) ad->argLoc = TRUE; - break; - case 'f': - case 'F': - *(Boolean *) ad->argLoc = FALSE; - break; - default: - ExitArgError("Unrecognized boolean argument value", argValue); - break; - } - break; - - case ArgColor: - *(COLORREF *)ad->argLoc = ParseColorName(argValue); - break; - - case ArgAttribs: { - ColorClass cc = (ColorClass)ad->argLoc; - ParseAttribs(&textAttribs[cc].color, &textAttribs[cc].effects, argValue); - } - break; - - case ArgBoardSize: - *(BoardSize *)ad->argLoc = ParseBoardSize(argValue); - break; - - case ArgFont: - ParseFontName(argValue, &font[boardSize][(int)ad->argLoc]->mfp); - break; - - case ArgCommSettings: - ParseCommSettings(argValue, &dcb); - break; - - case ArgNone: - ExitArgError("Unrecognized argument", argValue); - break; - case ArgTrue: - case ArgFalse: ; - } - } -} - -VOID -LFfromMFP(LOGFONT* lf, MyFontParams *mfp) -{ - HDC hdc = CreateDC("DISPLAY", NULL, NULL, NULL); - lf->lfHeight = -(int)(mfp->pointSize * GetDeviceCaps(hdc, LOGPIXELSY) / 72.0 + 0.5); - DeleteDC(hdc); - lf->lfWidth = 0; - lf->lfEscapement = 0; - lf->lfOrientation = 0; - lf->lfWeight = mfp->bold ? FW_BOLD : FW_NORMAL; - lf->lfItalic = mfp->italic; - lf->lfUnderline = mfp->underline; - lf->lfStrikeOut = mfp->strikeout; - lf->lfCharSet = DEFAULT_CHARSET; - lf->lfOutPrecision = OUT_DEFAULT_PRECIS; - lf->lfClipPrecision = CLIP_DEFAULT_PRECIS; - lf->lfQuality = DEFAULT_QUALITY; - lf->lfPitchAndFamily = DEFAULT_PITCH|FF_DONTCARE; - strcpy(lf->lfFaceName, mfp->faceName); } -VOID -CreateFontInMF(MyFont *mf) -{ - LFfromMFP(&mf->lf, &mf->mfp); - if (mf->hf) DeleteObject(mf->hf); - mf->hf = CreateFontIndirect(&mf->lf); -} - -VOID -SetDefaultTextAttribs() -{ - ColorClass cc; - for (cc = (ColorClass)0; cc < NColorClasses; cc++) { - ParseAttribs(&textAttribs[cc].color, - &textAttribs[cc].effects, - defaultTextAttribs[cc]); - } -} - -VOID -SetDefaultSounds() -{ +void +LoadAllSounds() +{ // [HGM] import name from appData first ColorClass cc; SoundClass sc; - for (cc = (ColorClass)0; cc < NColorClasses; cc++) { + for (cc = (ColorClass)0; cc < ColorNormal; cc++) { + textAttribs[cc].sound.name = strdup((&appData.soundShout)[cc]); + textAttribs[cc].sound.data = NULL; + MyLoadSound(&textAttribs[cc].sound); + } + for (cc = ColorNormal; cc < NColorClasses; cc++) { textAttribs[cc].sound.name = strdup(""); textAttribs[cc].sound.data = NULL; } for (sc = (SoundClass)0; sc < NSoundClasses; sc++) { - sounds[sc].name = strdup(""); + sounds[sc].name = strdup((&appData.soundMove)[sc]); sounds[sc].data = NULL; - } - sounds[(int)SoundBell].name = strdup(SOUND_BELL); -} - -VOID -LoadAllSounds() -{ - ColorClass cc; - SoundClass sc; - for (cc = (ColorClass)0; cc < NColorClasses; cc++) { - MyLoadSound(&textAttribs[cc].sound); - } - for (sc = (SoundClass)0; sc < NSoundClasses; sc++) { MyLoadSound(&sounds[sc]); } } -VOID -InitAppData(LPSTR lpCmdLine) +void +SetCommPortDefaults() { - int i, j; - char buf[ARG_MAX], currDir[MSG_SIZ]; - char *dummy, *p; - - programName = szAppName; - - /* Initialize to defaults */ - lightSquareColor = ParseColorName(LIGHT_SQUARE_COLOR); - darkSquareColor = ParseColorName(DARK_SQUARE_COLOR); - whitePieceColor = ParseColorName(WHITE_PIECE_COLOR); - blackPieceColor = ParseColorName(BLACK_PIECE_COLOR); - highlightSquareColor = ParseColorName(HIGHLIGHT_SQUARE_COLOR); - premoveHighlightColor = ParseColorName(PREMOVE_HIGHLIGHT_COLOR); - consoleBackgroundColor = ParseColorName(COLOR_BKGD); - SetDefaultTextAttribs(); - SetDefaultSounds(); - appData.movesPerSession = MOVES_PER_SESSION; - appData.initString = INIT_STRING; - appData.secondInitString = INIT_STRING; - appData.firstComputerString = COMPUTER_STRING; - appData.secondComputerString = COMPUTER_STRING; - appData.firstChessProgram = FIRST_CHESS_PROGRAM; - appData.secondChessProgram = SECOND_CHESS_PROGRAM; - appData.firstPlaysBlack = FALSE; - appData.noChessProgram = FALSE; - chessProgram = FALSE; - appData.firstHost = FIRST_HOST; - appData.secondHost = SECOND_HOST; - appData.firstDirectory = FIRST_DIRECTORY; - appData.secondDirectory = SECOND_DIRECTORY; - appData.bitmapDirectory = ""; - appData.remoteShell = REMOTE_SHELL; - appData.remoteUser = ""; - appData.timeDelay = TIME_DELAY; - appData.timeControl = TIME_CONTROL; - appData.timeIncrement = TIME_INCREMENT; - appData.icsActive = FALSE; - appData.icsHost = ""; - appData.icsPort = ICS_PORT; - appData.icsCommPort = ICS_COMM_PORT; - appData.icsLogon = ICS_LOGON; - appData.icsHelper = ""; - appData.useTelnet = FALSE; - appData.telnetProgram = TELNET_PROGRAM; - appData.gateway = ""; - appData.loadGameFile = ""; - appData.loadGameIndex = 0; - appData.saveGameFile = ""; - appData.autoSaveGames = FALSE; - appData.loadPositionFile = ""; - appData.loadPositionIndex = 1; - appData.savePositionFile = ""; - appData.matchMode = FALSE; - appData.matchGames = 0; - appData.monoMode = FALSE; - appData.debugMode = FALSE; - appData.clockMode = TRUE; - boardSize = (BoardSize) -1; /* determine by screen size */ - appData.Iconic = FALSE; /*unused*/ - appData.searchTime = ""; - appData.searchDepth = 0; - appData.showCoords = FALSE; - appData.ringBellAfterMoves = TRUE; /*obsolete in WinBoard*/ - appData.autoCallFlag = FALSE; - appData.flipView = FALSE; - appData.autoFlipView = TRUE; - appData.cmailGameName = ""; - appData.alwaysPromoteToQueen = FALSE; - appData.oldSaveStyle = FALSE; - appData.quietPlay = FALSE; - appData.showThinking = FALSE; - appData.ponderNextMove = TRUE; - appData.periodicUpdates = TRUE; - appData.popupExitMessage = TRUE; - appData.popupMoveErrors = FALSE; - appData.autoObserve = FALSE; - appData.autoComment = FALSE; - appData.animate = TRUE; - appData.animSpeed = 10; - appData.animateDragging = TRUE; - appData.highlightLastMove = TRUE; - appData.getMoveList = TRUE; - appData.testLegality = TRUE; - appData.premove = TRUE; - appData.premoveWhite = FALSE; - appData.premoveWhiteText = ""; - appData.premoveBlack = FALSE; - appData.premoveBlackText = ""; - appData.icsAlarm = TRUE; - appData.icsAlarmTime = 5000; - appData.autoRaiseBoard = TRUE; - appData.localLineEditing = TRUE; - appData.colorize = TRUE; - appData.reuseFirst = TRUE; - appData.reuseSecond = TRUE; - appData.blindfold = FALSE; - appData.icsEngineAnalyze = FALSE; - memset(&dcb, 0, sizeof(DCB)); // required by VS 2002 + + memset(&dcb, 0, sizeof(DCB)); // required by VS 2002 + dcb.DCBlength = sizeof(DCB); dcb.BaudRate = 9600; dcb.fBinary = TRUE; @@ -2045,475 +1121,121 @@ InitAppData(LPSTR lpCmdLine) dcb.ByteSize = 7; dcb.Parity = SPACEPARITY; dcb.StopBits = ONESTOPBIT; - settingsFileName = SETTINGS_FILE; - saveSettingsOnExit = TRUE; - boardX = CW_USEDEFAULT; - boardY = CW_USEDEFAULT; - analysisX = CW_USEDEFAULT; - analysisY = CW_USEDEFAULT; - analysisW = CW_USEDEFAULT; - analysisH = CW_USEDEFAULT; - commentX = CW_USEDEFAULT; - commentY = CW_USEDEFAULT; - commentW = CW_USEDEFAULT; - commentH = CW_USEDEFAULT; - editTagsX = CW_USEDEFAULT; - editTagsY = CW_USEDEFAULT; - editTagsW = CW_USEDEFAULT; - editTagsH = CW_USEDEFAULT; - icsTextMenuString = ICS_TEXT_MENU_DEFAULT; - icsNames = ICS_NAMES; - firstChessProgramNames = FCP_NAMES; - secondChessProgramNames = SCP_NAMES; - appData.initialMode = ""; - appData.variant = "normal"; - appData.firstProtocolVersion = PROTOVER; - appData.secondProtocolVersion = PROTOVER; - appData.showButtonBar = TRUE; - - /* [AS] New properties (see comments in header file) */ - appData.firstScoreIsAbsolute = FALSE; - appData.secondScoreIsAbsolute = FALSE; - appData.saveExtendedInfoInPGN = FALSE; - appData.hideThinkingFromHuman = FALSE; - appData.liteBackTextureFile = ""; - appData.liteBackTextureMode = BACK_TEXTURE_MODE_PLAIN; - appData.darkBackTextureFile = ""; - appData.darkBackTextureMode = BACK_TEXTURE_MODE_PLAIN; - appData.renderPiecesWithFont = ""; - appData.fontToPieceTable = ""; - appData.fontBackColorWhite = 0; - appData.fontForeColorWhite = 0; - appData.fontBackColorBlack = 0; - appData.fontForeColorBlack = 0; - appData.fontPieceSize = 80; - appData.overrideLineGap = 1; - appData.adjudicateLossThreshold = 0; - appData.delayBeforeQuit = 0; - appData.delayAfterQuit = 0; - appData.nameOfDebugFile = "winboard.debug"; - appData.pgnEventHeader = "Computer Chess Game"; - appData.defaultFrcPosition = -1; - appData.gameListTags = GLT_DEFAULT_TAGS; - appData.saveOutOfBookInfo = TRUE; - appData.showEvalInMoveHistory = TRUE; - appData.evalHistColorWhite = ParseColorName( "#FFFFB0" ); - appData.evalHistColorBlack = ParseColorName( "#AD5D3D" ); - appData.highlightMoveWithArrow = FALSE; - appData.highlightArrowColor = ParseColorName( "#FFFF80" ); - appData.useStickyWindows = TRUE; - appData.adjudicateDrawMoves = 0; - appData.autoDisplayComment = TRUE; - appData.autoDisplayTags = TRUE; - appData.firstIsUCI = FALSE; - appData.secondIsUCI = FALSE; - appData.firstHasOwnBookUCI = TRUE; - appData.secondHasOwnBookUCI = TRUE; - appData.polyglotDir = ""; - appData.usePolyglotBook = FALSE; - appData.polyglotBook = ""; - appData.defaultHashSize = 64; - appData.defaultCacheSizeEGTB = 4; - appData.defaultPathEGTB = "c:\\egtb"; - appData.firstOptions = ""; - appData.secondOptions = ""; - - InitWindowPlacement( &wpGameList ); - InitWindowPlacement( &wpMoveHistory ); - InitWindowPlacement( &wpEvalGraph ); - InitWindowPlacement( &wpEngineOutput ); - InitWindowPlacement( &wpConsole ); - - /* [HGM] User-selectable board size, adjudication control, miscellaneous */ - appData.NrFiles = -1; - appData.NrRanks = -1; - appData.holdingsSize = -1; - appData.testClaims = FALSE; - appData.checkMates = FALSE; - appData.materialDraws= FALSE; - appData.trivialDraws = FALSE; - appData.ruleMoves = 51; - appData.drawRepeats = 6; - appData.matchPause = 10000; - appData.alphaRank = FALSE; - appData.allWhite = FALSE; - appData.upsideDown = FALSE; - appData.serverPause = 15; - appData.serverMovesName = NULL; - appData.suppressLoadMoves = FALSE; - appData.firstTimeOdds = 1; - appData.secondTimeOdds = 1; - appData.firstAccumulateTC = 1; // combine previous and current sessions - appData.secondAccumulateTC = 1; - appData.firstNPS = -1; // [HGM] nps: use wall-clock time - appData.secondNPS = -1; - appData.engineComments = 1; - appData.smpCores = 1; // [HGM] SMP: max nr of cores - appData.egtFormats = ""; - -#ifdef ZIPPY - appData.zippyTalk = ZIPPY_TALK; - appData.zippyPlay = ZIPPY_PLAY; - appData.zippyLines = ZIPPY_LINES; - appData.zippyPinhead = ZIPPY_PINHEAD; - appData.zippyPassword = ZIPPY_PASSWORD; - appData.zippyPassword2 = ZIPPY_PASSWORD2; - appData.zippyWrongPassword = ZIPPY_WRONG_PASSWORD; - appData.zippyAcceptOnly = ZIPPY_ACCEPT_ONLY; - appData.zippyUseI = ZIPPY_USE_I; - appData.zippyBughouse = ZIPPY_BUGHOUSE; - appData.zippyNoplayCrafty = ZIPPY_NOPLAY_CRAFTY; - appData.zippyGameEnd = ZIPPY_GAME_END; - appData.zippyGameStart = ZIPPY_GAME_START; - appData.zippyAdjourn = ZIPPY_ADJOURN; - appData.zippyAbort = ZIPPY_ABORT; - appData.zippyVariants = ZIPPY_VARIANTS; - appData.zippyMaxGames = ZIPPY_MAX_GAMES; - appData.zippyReplayTimeout = ZIPPY_REPLAY_TIMEOUT; -#endif - - /* Point font array elements to structures and - parse default font names */ - for (i=0; idef, &font[j][i]->mfp); - } - } - - /* Parse default settings file if any */ - if (ParseSettingsFile(settingsFileName, buf)) { - settingsFileName = strdup(buf); - } - - /* Parse command line */ - ParseArgs(StringGet, &lpCmdLine); - - /* [HGM] make sure board size is acceptable */ - if(appData.NrFiles > BOARD_SIZE || - appData.NrRanks > BOARD_SIZE ) - DisplayFatalError("Recompile with BOARD_SIZE > 12, to support this size", 0, 2); +} - /* [HGM] After parsing the options from the .ini file, and overruling them - * with options from the command line, we now make an even higher priority - * overrule by WB options attached to the engine command line. This so that - * tournament managers can use WB options (such as /timeOdds) that follow - * the engines. - */ - if(appData.firstChessProgram != NULL) { - char *p = StrStr(appData.firstChessProgram, "WBopt"); - static char *f = "first"; - char buf[MSG_SIZ], *q = buf; - if(p != NULL) { // engine command line contains WinBoard options - sprintf(buf, p+6, f, f, f, f, f, f, f, f, f, f); // replace %s in them by "first" - ParseArgs(StringGet, &q); - p[-1] = 0; // cut them offengine command line - } - } - // now do same for second chess program - if(appData.secondChessProgram != NULL) { - char *p = StrStr(appData.secondChessProgram, "WBopt"); - static char *s = "second"; - char buf[MSG_SIZ], *q = buf; - if(p != NULL) { // engine command line contains WinBoard options - sprintf(buf, p+6, s, s, s, s, s, s, s, s, s, s); // replace %s in them by "first" - ParseArgs(StringGet, &q); - p[-1] = 0; // cut them offengine command line +// [HGM] args: these three cases taken out to stay in front-end +void +SaveFontArg(FILE *f, ArgDescriptor *ad) +{ // in WinBoard every board size has its own font, and the "argLoc" identifies the table, + // while the curent board size determines the element. This system should be ported to XBoard. + // What the table contains pointers to, and how to print the font description, remains platform-dependent + int bs; + for (bs=0; bsargLoc]->mfp; + fprintf(f, "/size=%s ", sizeInfo[bs].name); + fprintf(f, "/%s=\"%s:%g%s%s%s%s%sc%d\"\n", + ad->argName, mfp->faceName, mfp->pointSize, + mfp->bold || mfp->italic || mfp->underline || mfp->strikeout ? " " : "", + mfp->bold ? "b" : "", + mfp->italic ? "i" : "", + mfp->underline ? "u" : "", + mfp->strikeout ? "s" : "", + (int)mfp->charset); + } } - } +void +ExportSounds() +{ // [HGM] copy the names from the internal WB variables to appData + ColorClass cc; + SoundClass sc; + for (cc = (ColorClass)0; cc < ColorNormal; cc++) + (&appData.soundShout)[cc] = textAttribs[cc].sound.name; + for (sc = (SoundClass)0; sc < NSoundClasses; sc++) + (&appData.soundMove)[sc] = sounds[sc].name; +} - /* Propagate options that affect others */ - if (appData.matchMode || appData.matchGames) chessProgram = TRUE; - if (appData.icsActive || appData.noChessProgram) { - chessProgram = FALSE; /* not local chess program mode */ - } - - /* Open startup dialog if needed */ - if ((!appData.noChessProgram && !chessProgram && !appData.icsActive) || - (appData.icsActive && *appData.icsHost == NULLCHAR) || - (chessProgram && (*appData.firstChessProgram == NULLCHAR || - *appData.secondChessProgram == NULLCHAR))) { - FARPROC lpProc; +void +SaveAttribsArg(FILE *f, ArgDescriptor *ad) +{ // here the "argLoc" defines a table index. It could have contained the 'ta' pointer itself, though + MyTextAttribs* ta = &textAttribs[(ColorClass)ad->argLoc]; + fprintf(f, "/%s=\"%s%s%s%s%s#%02lx%02lx%02lx\"\n", ad->argName, + (ta->effects & CFE_BOLD) ? "b" : "", + (ta->effects & CFE_ITALIC) ? "i" : "", + (ta->effects & CFE_UNDERLINE) ? "u" : "", + (ta->effects & CFE_STRIKEOUT) ? "s" : "", + (ta->effects) ? " " : "", + ta->color&0xff, (ta->color >> 8)&0xff, (ta->color >> 16)&0xff); + } - lpProc = MakeProcInstance((FARPROC)StartupDialog, hInst); - DialogBox(hInst, MAKEINTRESOURCE(DLG_Startup), NULL, (DLGPROC)lpProc); - FreeProcInstance(lpProc); - } +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? + COLORREF color = *(COLORREF *)colorVariable[(int)ad->argLoc]; + fprintf(f, "/%s=#%02lx%02lx%02lx\n", ad->argName, + color&0xff, (color>>8)&0xff, (color>>16)&0xff); +} - /* Make sure save files land in the right (?) directory */ - if (GetFullPathName(appData.saveGameFile, MSG_SIZ, buf, &dummy)) { - appData.saveGameFile = strdup(buf); - } - if (GetFullPathName(appData.savePositionFile, MSG_SIZ, buf, &dummy)) { - appData.savePositionFile = strdup(buf); - } +void +SaveBoardSize(FILE *f, char *name, void *addr) +{ // wrapper to shield back-end from BoardSize & sizeInfo + fprintf(f, "/%s=%s\n", name, sizeInfo[*(BoardSize *)addr].name); +} - /* Finish initialization for fonts and sounds */ - for (i=0; iargName != NULL; ad++) { - if (!ad->save) continue; - switch (ad->argType) { - case ArgString: - { - char *p = *(char **)ad->argLoc; - if ((strchr(p, '\\') || strchr(p, '\n')) && !strchr(p, '}')) { - /* Quote multiline values or \-containing values - with { } if possible */ - fprintf(f, "/%s={%s}\n", ad->argName, p); - } else { - /* Else quote with " " */ - fprintf(f, "/%s=\"", ad->argName); - while (*p) { - if (*p == '\n') fprintf(f, "\n"); - else if (*p == '\r') fprintf(f, "\\r"); - else if (*p == '\t') fprintf(f, "\\t"); - else if (*p == '\b') fprintf(f, "\\b"); - else if (*p == '\f') fprintf(f, "\\f"); - else if (*p < ' ') fprintf(f, "\\%03o", *p); - else if (*p == '\"') fprintf(f, "\\\""); - else if (*p == '\\') fprintf(f, "\\\\"); - else putc(*p, f); - p++; - } - fprintf(f, "\"\n"); - } - } - break; - case ArgInt: - case ArgZ: - fprintf(f, "/%s=%d\n", ad->argName, *(int *)ad->argLoc); - break; - case ArgX: - fprintf(f, "/%s=%d\n", ad->argName, *(int *)ad->argLoc - boardX); // [HGM] placement: stor relative value - break; - case ArgY: - fprintf(f, "/%s=%d\n", ad->argName, *(int *)ad->argLoc - boardY); - break; - case ArgFloat: - fprintf(f, "/%s=%g\n", ad->argName, *(float *)ad->argLoc); - break; - case ArgBoolean: - fprintf(f, "/%s=%s\n", ad->argName, - (*(Boolean *)ad->argLoc) ? "true" : "false"); - break; - case ArgTrue: - if (*(Boolean *)ad->argLoc) fprintf(f, "/%s\n", ad->argName); - break; - case ArgFalse: - if (!*(Boolean *)ad->argLoc) fprintf(f, "/%s\n", ad->argName); - break; - case ArgColor: - { - COLORREF color = *(COLORREF *)ad->argLoc; - fprintf(f, "/%s=#%02lx%02lx%02lx\n", ad->argName, - color&0xff, (color>>8)&0xff, (color>>16)&0xff); - } - break; - case ArgAttribs: - { - MyTextAttribs* ta = &textAttribs[(ColorClass)ad->argLoc]; - fprintf(f, "/%s=\"%s%s%s%s%s#%02lx%02lx%02lx\"\n", ad->argName, - (ta->effects & CFE_BOLD) ? "b" : "", - (ta->effects & CFE_ITALIC) ? "i" : "", - (ta->effects & CFE_UNDERLINE) ? "u" : "", - (ta->effects & CFE_STRIKEOUT) ? "s" : "", - (ta->effects) ? " " : "", - ta->color&0xff, (ta->color >> 8)&0xff, (ta->color >> 16)&0xff); - } - break; - case ArgFilename: - if (strchr(*(char **)ad->argLoc, '\"')) { - fprintf(f, "/%s='%s'\n", ad->argName, *(char **)ad->argLoc); - } else { - fprintf(f, "/%s=\"%s\"\n", ad->argName, *(char **)ad->argLoc); - } - break; - case ArgBoardSize: - fprintf(f, "/%s=%s\n", ad->argName, - sizeInfo[*(BoardSize *)ad->argLoc].name); - break; - case ArgFont: - { - int bs; - for (bs=0; bsargLoc]->mfp; - fprintf(f, "/size=%s ", sizeInfo[bs].name); - fprintf(f, "/%s=\"%s:%g%s%s%s%s%s\"\n", - ad->argName, mfp->faceName, mfp->pointSize, - mfp->bold || mfp->italic || mfp->underline || mfp->strikeout ? " " : "", - mfp->bold ? "b" : "", - mfp->italic ? "i" : "", - mfp->underline ? "u" : "", - mfp->strikeout ? "s" : ""); - } - } - break; - case ArgCommSettings: - PrintCommSettings(f, ad->argName, (DCB *)ad->argLoc); - case ArgNone: - case ArgSettingsFilename: ; - } - } - fclose(f); + char *dummy; + return (int) GetFullPathName(name, MSG_SIZ, fullname, &dummy); } +int +MainWindowUp() +{ // [HGM] args: allows testing if main window is realized from back-end + return hwndMain != NULL; +} +void +PopUpStartupDialog() +{ + FARPROC lpProc; + + lpProc = MakeProcInstance((FARPROC)StartupDialog, hInst); + DialogBox(hInst, MAKEINTRESOURCE(DLG_Startup), NULL, (DLGPROC)lpProc); + FreeProcInstance(lpProc); +} /*---------------------------------------------------------------------------*\ * @@ -2587,43 +1309,43 @@ static void DrawTile( int dx, int dy, int dw, int dh, HDC dst, HDC src, int mode /* [AS] [HGM] Make room for more piece types, so all pieces can be different */ enum { - PM_WP = (int) WhitePawn, - PM_WN = (int) WhiteKnight, - PM_WB = (int) WhiteBishop, - PM_WR = (int) WhiteRook, - PM_WQ = (int) WhiteQueen, - PM_WF = (int) WhiteFerz, - PM_WW = (int) WhiteWazir, - PM_WE = (int) WhiteAlfil, - PM_WM = (int) WhiteMan, - PM_WO = (int) WhiteCannon, - PM_WU = (int) WhiteUnicorn, - PM_WH = (int) WhiteNightrider, - PM_WA = (int) WhiteAngel, - PM_WC = (int) WhiteMarshall, - PM_WAB = (int) WhiteCardinal, - PM_WD = (int) WhiteDragon, - PM_WL = (int) WhiteLance, - PM_WS = (int) WhiteCobra, - PM_WV = (int) WhiteFalcon, - PM_WSG = (int) WhiteSilver, - PM_WG = (int) WhiteGrasshopper, + PM_WP = (int) WhitePawn, + PM_WN = (int) WhiteKnight, + PM_WB = (int) WhiteBishop, + PM_WR = (int) WhiteRook, + PM_WQ = (int) WhiteQueen, + PM_WF = (int) WhiteFerz, + PM_WW = (int) WhiteWazir, + PM_WE = (int) WhiteAlfil, + PM_WM = (int) WhiteMan, + PM_WO = (int) WhiteCannon, + PM_WU = (int) WhiteUnicorn, + PM_WH = (int) WhiteNightrider, + PM_WA = (int) WhiteAngel, + PM_WC = (int) WhiteMarshall, + PM_WAB = (int) WhiteCardinal, + PM_WD = (int) WhiteDragon, + PM_WL = (int) WhiteLance, + PM_WS = (int) WhiteCobra, + PM_WV = (int) WhiteFalcon, + PM_WSG = (int) WhiteSilver, + PM_WG = (int) WhiteGrasshopper, PM_WK = (int) WhiteKing, - PM_BP = (int) BlackPawn, - PM_BN = (int) BlackKnight, - PM_BB = (int) BlackBishop, - PM_BR = (int) BlackRook, - PM_BQ = (int) BlackQueen, - PM_BF = (int) BlackFerz, - PM_BW = (int) BlackWazir, - PM_BE = (int) BlackAlfil, + PM_BP = (int) BlackPawn, + PM_BN = (int) BlackKnight, + PM_BB = (int) BlackBishop, + PM_BR = (int) BlackRook, + PM_BQ = (int) BlackQueen, + PM_BF = (int) BlackFerz, + PM_BW = (int) BlackWazir, + PM_BE = (int) BlackAlfil, PM_BM = (int) BlackMan, - PM_BO = (int) BlackCannon, - PM_BU = (int) BlackUnicorn, - PM_BH = (int) BlackNightrider, - PM_BA = (int) BlackAngel, - PM_BC = (int) BlackMarshall, - PM_BG = (int) BlackGrasshopper, + PM_BO = (int) BlackCannon, + PM_BU = (int) BlackUnicorn, + PM_BH = (int) BlackNightrider, + PM_BA = (int) BlackAngel, + PM_BC = (int) BlackMarshall, + PM_BG = (int) BlackGrasshopper, PM_BAB = (int) BlackCardinal, PM_BD = (int) BlackDragon, PM_BL = (int) BlackLance, @@ -2638,9 +1360,9 @@ static HBITMAP hPieceMask[(int) EmptySquare]; static HBITMAP hPieceFace[(int) EmptySquare]; static int fontBitmapSquareSize = 0; static char pieceToFontChar[(int) EmptySquare] = - { 'p', 'n', 'b', 'r', 'q', + { 'p', 'n', 'b', 'r', 'q', 'n', 'b', 'p', 'n', 'b', 'r', 'b', 'r', 'q', 'k', - 'k', 'o', 'm', 'v', 't', 'w', + 'k', 'o', 'm', 'v', 't', 'w', 'v', 't', 'o', 'm', 'v', 't', 'v', 't', 'w', 'l', 'l' }; @@ -2663,7 +1385,7 @@ static void SetPieceBackground( HDC hdc, COLORREF color, int mode ) SetRect( &rc, 0, 0, squareSize, squareSize ); FillRect( hdc, &rc, hbrush ); DeleteObject( hbrush ); - + if( mode == 1 ) { /* Vertical gradient, good for pawn, knight and rook, less for queen and king */ int steps = squareSize / 2; @@ -2726,9 +1448,9 @@ static void CreatePieceMaskFromFont( HDC hdc_window, HDC hdc, int index ) RECT rc; SIZE sz; POINT pt; - int backColor = whitePieceColor; + int backColor = whitePieceColor; int foreColor = blackPieceColor; - + if( index < (int)BlackPawn && appData.fontBackColorWhite != appData.fontForeColorWhite ) { backColor = appData.fontBackColorWhite; foreColor = appData.fontForeColorWhite; @@ -2769,7 +1491,7 @@ static void CreatePieceMaskFromFont( HDC hdc_window, HDC hdc, int index ) ExtFloodFill( hdc, squareSize-1, 0, 0, FLOODFILLSURFACE ); ExtFloodFill( hdc, squareSize-1, squareSize-1, 0, FLOODFILLSURFACE ); SelectObject( hdc, GetStockObject(BLACK_BRUSH) ); - /* + /* Step 4: this is the tricky part, the area inside the piece is filled with black, but if the start point is not inside the piece we're lost! There should be a better way to do this... if we could create a region or path @@ -2794,7 +1516,7 @@ static void CreatePieceMaskFromFont( HDC hdc_window, HDC hdc, int index ) } SetTextColor( hdc, 0 ); - /* + /* Step 5: some fonts have "disconnected" areas that are skipped by the fill: draw the piece again in black for safety. */ @@ -2822,8 +1544,8 @@ static void CreatePieceMaskFromFont( HDC hdc_window, HDC hdc, int index ) SelectObject( dc2, bm2 ); FillRect( dc2, &rc, GetStockObject(WHITE_BRUSH) ); BitBlt( dc2, 0, 0, squareSize, squareSize, dc1, 0, 0, SRCINVERT ); - - /* + + /* Now dc2 contains the inverse of the piece mask, i.e. a mask that preserves the piece background and deletes (makes transparent) the rest. Thanks to that mask, we are free to paint the background with the greates @@ -3028,7 +1750,7 @@ void CreatePiecesFromFont() } else if( strstr(lf.lfFaceName,"GC2004D") != NULL ) { /* Good Companion (Some characters get warped as literal :-( */ - char s[] = "1cmWG0ñueOS¯®oYI23wgQU"; + char s[] = "1cmWG0??S??oYI23wgQU"; s[0]=0xB9; s[1]=0xA9; s[6]=0xB1; s[11]=0xBB; s[12]=0xAB; s[17]=0xB3; SetCharTable(pieceToFontChar, s); } @@ -3040,57 +1762,10 @@ void CreatePiecesFromFont() /* Create bitmaps */ hfont_old = SelectObject( hdc, hPieceFont ); -#if 0 - CreatePieceMaskFromFont( hdc_window, hdc, PM_WP ); - CreatePieceMaskFromFont( hdc_window, hdc, PM_WN ); - CreatePieceMaskFromFont( hdc_window, hdc, PM_WB ); - CreatePieceMaskFromFont( hdc_window, hdc, PM_WR ); - CreatePieceMaskFromFont( hdc_window, hdc, PM_WQ ); - CreatePieceMaskFromFont( hdc_window, hdc, PM_WK ); - CreatePieceMaskFromFont( hdc_window, hdc, PM_BP ); - CreatePieceMaskFromFont( hdc_window, hdc, PM_BN ); - CreatePieceMaskFromFont( hdc_window, hdc, PM_BB ); - CreatePieceMaskFromFont( hdc_window, hdc, PM_BR ); - CreatePieceMaskFromFont( hdc_window, hdc, PM_BQ ); - CreatePieceMaskFromFont( hdc_window, hdc, PM_BK ); - - CreatePieceMaskFromFont( hdc_window, hdc, PM_WA ); - CreatePieceMaskFromFont( hdc_window, hdc, PM_WC ); - CreatePieceMaskFromFont( hdc_window, hdc, PM_WF ); - CreatePieceMaskFromFont( hdc_window, hdc, PM_WH ); - CreatePieceMaskFromFont( hdc_window, hdc, PM_WE ); - CreatePieceMaskFromFont( hdc_window, hdc, PM_WW ); - CreatePieceMaskFromFont( hdc_window, hdc, PM_WU ); - CreatePieceMaskFromFont( hdc_window, hdc, PM_WO ); - CreatePieceMaskFromFont( hdc_window, hdc, PM_WG ); - CreatePieceMaskFromFont( hdc_window, hdc, PM_WM ); - CreatePieceMaskFromFont( hdc_window, hdc, PM_WSG ); - CreatePieceMaskFromFont( hdc_window, hdc, PM_WV ); - CreatePieceMaskFromFont( hdc_window, hdc, PM_WAB ); - CreatePieceMaskFromFont( hdc_window, hdc, PM_WD ); - CreatePieceMaskFromFont( hdc_window, hdc, PM_WL ); - CreatePieceMaskFromFont( hdc_window, hdc, PM_WS ); - CreatePieceMaskFromFont( hdc_window, hdc, PM_BA ); - CreatePieceMaskFromFont( hdc_window, hdc, PM_BC ); - CreatePieceMaskFromFont( hdc_window, hdc, PM_BF ); - CreatePieceMaskFromFont( hdc_window, hdc, PM_BH ); - CreatePieceMaskFromFont( hdc_window, hdc, PM_BE ); - CreatePieceMaskFromFont( hdc_window, hdc, PM_BW ); - CreatePieceMaskFromFont( hdc_window, hdc, PM_BU ); - CreatePieceMaskFromFont( hdc_window, hdc, PM_BO ); - CreatePieceMaskFromFont( hdc_window, hdc, PM_BG ); - CreatePieceMaskFromFont( hdc_window, hdc, PM_BM ); - CreatePieceMaskFromFont( hdc_window, hdc, PM_BSG ); - CreatePieceMaskFromFont( hdc_window, hdc, PM_BV ); - CreatePieceMaskFromFont( hdc_window, hdc, PM_BAB ); - CreatePieceMaskFromFont( hdc_window, hdc, PM_BD ); - CreatePieceMaskFromFont( hdc_window, hdc, PM_BL ); - CreatePieceMaskFromFont( hdc_window, hdc, PM_BS ); -#else - for(i=(int)WhitePawn; i<(int)EmptySquare; i++) /* [HGM] made a loop for this */ - if(PieceToChar((ChessSquare)i) != '.') /* skip unused pieces */ - CreatePieceMaskFromFont( hdc_window, hdc, i ); -#endif + for(i=(int)WhitePawn; i<(int)EmptySquare; i++) /* [HGM] made a loop for this */ + if(PieceToChar((ChessSquare)i) != '.') /* skip unused pieces */ + CreatePieceMaskFromFont( hdc_window, hdc, i ); + SelectObject( hdc, hfont_old ); fontBitmapSquareSize = squareSize; @@ -3155,7 +1830,7 @@ InitDrawingColors() */ pLogPal = (NPLOGPALETTE) LocalAlloc(LMEM_FIXED, (sizeof(LOGPALETTE) + - (sizeof(PALETTEENTRY) * (PALETTESIZE)))); + (sizeof(PALETTEENTRY) * (PALETTESIZE)))); pLogPal->palVersion = 0x300; } pLogPal->palNumEntries = 0; @@ -3179,6 +1854,7 @@ InitDrawingColors() blackPieceBrush = CreateSolidBrush(blackPieceColor); iconBkgndBrush = CreateSolidBrush(GetSysColor(COLOR_BACKGROUND)); explodeBrush = CreateSolidBrush(highlightSquareColor); // [HGM] atomic + markerBrush = CreateSolidBrush(premoveHighlightColor); // [HGM] markers /* [AS] Force rendering of the font-based pieces */ if( fontBitmapSquareSize > 0 ) { fontBitmapSquareSize = 0; @@ -3209,11 +1885,11 @@ ResizeBoard(int newSizeX, int newSizeY, int flags) if (recurse > 0) return; recurse++; while (newSize > 0) { - InitDrawingSizes(newSize+1000, 0); // [HGM] kludge to update sizeInfo without visible effects - if(newSizeX >= sizeInfo[newSize].cliWidth && - newSizeY >= sizeInfo[newSize].cliHeight) break; + InitDrawingSizes(newSize+1000, 0); // [HGM] kludge to update sizeInfo without visible effects + if(newSizeX >= sizeInfo[newSize].cliWidth && + newSizeY >= sizeInfo[newSize].cliHeight) break; newSize--; - } + } boardSize = newSize; InitDrawingSizes(boardSize, flags); recurse--; @@ -3243,10 +1919,10 @@ InitDrawingSizes(BoardSize boardSize, int flags) /* [HGM] call with -2 uses old size (for if nr of files, ranks changes) */ if(boardSize == (BoardSize)(-2) ) boardSize = oldBoardSize; - oldRect.left = boardX; //[HGM] placement: remember previous window params - oldRect.top = boardY; - oldRect.right = boardX + winWidth; - oldRect.bottom = boardY + winHeight; + oldRect.left = wpMain.x; //[HGM] placement: remember previous window params + oldRect.top = wpMain.y; + oldRect.right = wpMain.x + wpMain.width; + oldRect.bottom = wpMain.y + wpMain.height; tinyLayout = sizeInfo[boardSize].tinyLayout; smallLayout = sizeInfo[boardSize].smallLayout; @@ -3263,7 +1939,7 @@ InitDrawingSizes(BoardSize boardSize, int flags) if (tinyLayout) { style &= ~WS_SYSMENU; InsertMenu(hmenu, IDM_Exit, MF_BYCOMMAND, IDM_Minimize, - "&Minimize\tCtrl+F4"); + "&Minimize\tCtrl+F4"); } else { style |= WS_SYSMENU; RemoveMenu(hmenu, IDM_Minimize, MF_BYCOMMAND); @@ -3271,8 +1947,8 @@ InitDrawingSizes(BoardSize boardSize, int flags) SetWindowLong(hwndMain, GWL_STYLE, style); for (i=0; menuBarText[tinyLayout][i]; i++) { - ModifyMenu(hmenu, i, MF_STRING|MF_BYPOSITION|MF_POPUP, - (UINT)GetSubMenu(hmenu, i), menuBarText[tinyLayout][i]); + ModifyMenu(hmenu, i, MF_STRING|MF_BYPOSITION|MF_POPUP, + (UINT)GetSubMenu(hmenu, i), menuBarText[tinyLayout][i]); } DrawMenuBar(hwndMain); } @@ -3298,16 +1974,16 @@ InitDrawingSizes(BoardSize boardSize, int flags) /* Compute where everything goes */ if((first.programLogo || second.programLogo) && !tinyLayout) { /* [HGM] logo: if either logo is on, reserve space for it */ - logoHeight = 2*clockSize.cy; - leftLogoRect.left = OUTER_MARGIN; - leftLogoRect.right = leftLogoRect.left + 4*clockSize.cy; - leftLogoRect.top = OUTER_MARGIN; - leftLogoRect.bottom = OUTER_MARGIN + logoHeight; + logoHeight = 2*clockSize.cy; + leftLogoRect.left = OUTER_MARGIN; + leftLogoRect.right = leftLogoRect.left + 4*clockSize.cy; + leftLogoRect.top = OUTER_MARGIN; + leftLogoRect.bottom = OUTER_MARGIN + logoHeight; - rightLogoRect.right = OUTER_MARGIN + boardWidth; - rightLogoRect.left = rightLogoRect.right - 4*clockSize.cy; - rightLogoRect.top = OUTER_MARGIN; - rightLogoRect.bottom = OUTER_MARGIN + logoHeight; + rightLogoRect.right = OUTER_MARGIN + boardWidth; + rightLogoRect.left = rightLogoRect.right - 4*clockSize.cy; + rightLogoRect.top = OUTER_MARGIN; + rightLogoRect.bottom = OUTER_MARGIN + logoHeight; whiteRect.left = leftLogoRect.right; @@ -3329,6 +2005,8 @@ InitDrawingSizes(BoardSize boardSize, int flags) blackRect.right = blackRect.left + boardWidth/2 - 1; blackRect.top = whiteRect.top; blackRect.bottom = whiteRect.bottom; + + logoHeight = 0; // [HGM] logo: suppress logo after change to tiny layout! } messageRect.left = OUTER_MARGIN + MESSAGE_LINE_LEFTMARGIN; @@ -3354,49 +2032,49 @@ InitDrawingSizes(BoardSize boardSize, int flags) winH = 2 * GetSystemMetrics(SM_CYFRAME) + GetSystemMetrics(SM_CYMENU) + GetSystemMetrics(SM_CYCAPTION) + boardRect.bottom + OUTER_MARGIN; if(suppressVisibleEffects) return; // [HGM] when called for filling sizeInfo only - winWidth = winW; // [HGM] placement: set through temporary which can used by initial sizing choice - winHeight = winH; // without disturbing window attachments + wpMain.width = winW; // [HGM] placement: set through temporary which can used by initial sizing choice + wpMain.height = winH; // without disturbing window attachments GetWindowRect(hwndMain, &wrect); - SetWindowPos(hwndMain, NULL, 0, 0, winWidth, winHeight, - SWP_NOCOPYBITS|SWP_NOZORDER|SWP_NOMOVE); + SetWindowPos(hwndMain, NULL, 0, 0, wpMain.width, wpMain.height, + SWP_NOCOPYBITS|SWP_NOZORDER|SWP_NOMOVE); // [HGM] placement: let attached windows follow size change. - ReattachAfterSize( &oldRect, winWidth, winHeight, moveHistoryDialog, &wpMoveHistory ); - ReattachAfterSize( &oldRect, winWidth, winHeight, evalGraphDialog, &wpEvalGraph ); - ReattachAfterSize( &oldRect, winWidth, winHeight, engineOutputDialog, &wpEngineOutput ); - ReattachAfterSize( &oldRect, winWidth, winHeight, gameListDialog, &wpGameList ); - ReattachAfterSize( &oldRect, winWidth, winHeight, hwndConsole, &wpConsole ); + ReattachAfterSize( &oldRect, wpMain.width, wpMain.height, moveHistoryDialog, &wpMoveHistory ); + ReattachAfterSize( &oldRect, wpMain.width, wpMain.height, evalGraphDialog, &wpEvalGraph ); + ReattachAfterSize( &oldRect, wpMain.width, wpMain.height, engineOutputDialog, &wpEngineOutput ); + ReattachAfterSize( &oldRect, wpMain.width, wpMain.height, gameListDialog, &wpGameList ); + ReattachAfterSize( &oldRect, wpMain.width, wpMain.height, hwndConsole, &wpConsole ); /* compensate if menu bar wrapped */ GetClientRect(hwndMain, &crect); offby = boardRect.bottom + OUTER_MARGIN - crect.bottom; - winHeight += offby; + wpMain.height += offby; switch (flags) { case WMSZ_TOPLEFT: - SetWindowPos(hwndMain, NULL, - wrect.right - winWidth, wrect.bottom - winHeight, - winWidth, winHeight, SWP_NOCOPYBITS|SWP_NOZORDER); + SetWindowPos(hwndMain, NULL, + wrect.right - wpMain.width, wrect.bottom - wpMain.height, + wpMain.width, wpMain.height, SWP_NOCOPYBITS|SWP_NOZORDER); break; case WMSZ_TOPRIGHT: case WMSZ_TOP: - SetWindowPos(hwndMain, NULL, - wrect.left, wrect.bottom - winHeight, - winWidth, winHeight, SWP_NOCOPYBITS|SWP_NOZORDER); + SetWindowPos(hwndMain, NULL, + wrect.left, wrect.bottom - wpMain.height, + wpMain.width, wpMain.height, SWP_NOCOPYBITS|SWP_NOZORDER); break; case WMSZ_BOTTOMLEFT: case WMSZ_LEFT: - SetWindowPos(hwndMain, NULL, - wrect.right - winWidth, wrect.top, - winWidth, winHeight, SWP_NOCOPYBITS|SWP_NOZORDER); + SetWindowPos(hwndMain, NULL, + wrect.right - wpMain.width, wrect.top, + wpMain.width, wpMain.height, SWP_NOCOPYBITS|SWP_NOZORDER); break; case WMSZ_BOTTOMRIGHT: case WMSZ_BOTTOM: case WMSZ_RIGHT: default: - SetWindowPos(hwndMain, NULL, 0, 0, winWidth, winHeight, + SetWindowPos(hwndMain, NULL, 0, 0, wpMain.width, wpMain.height, SWP_NOCOPYBITS|SWP_NOZORDER|SWP_NOMOVE); break; } @@ -3409,21 +2087,21 @@ InitDrawingSizes(BoardSize boardSize, int flags) } if (appData.showButtonBar) { buttonDesc[i].hwnd = - CreateWindow("BUTTON", buttonDesc[i].label, - WS_VISIBLE | WS_CHILD | BS_PUSHBUTTON, - boardRect.right - BUTTON_WIDTH*(N_BUTTONS-i), - messageRect.top, BUTTON_WIDTH, messageSize.cy, hwndMain, - (HMENU) buttonDesc[i].id, - (HINSTANCE) GetWindowLong(hwndMain, GWL_HINSTANCE), NULL); + CreateWindow("BUTTON", buttonDesc[i].label, + WS_VISIBLE | WS_CHILD | BS_PUSHBUTTON, + boardRect.right - BUTTON_WIDTH*(N_BUTTONS-i), + messageRect.top, BUTTON_WIDTH, messageSize.cy, hwndMain, + (HMENU) buttonDesc[i].id, + (HINSTANCE) GetWindowLong(hwndMain, GWL_HINSTANCE), NULL); if (tinyLayout) { - SendMessage(buttonDesc[i].hwnd, WM_SETFONT, - (WPARAM)font[boardSize][MESSAGE_FONT]->hf, - MAKELPARAM(FALSE, 0)); + SendMessage(buttonDesc[i].hwnd, WM_SETFONT, + (WPARAM)font[boardSize][MESSAGE_FONT]->hf, + MAKELPARAM(FALSE, 0)); } if (buttonDesc[i].id == IDM_Pause) - hwndPause = buttonDesc[i].hwnd; + hwndPause = buttonDesc[i].hwnd; buttonDesc[i].wndproc = (WNDPROC) - SetWindowLong(buttonDesc[i].hwnd, GWL_WNDPROC, (LONG) ButtonProc); + SetWindowLong(buttonDesc[i].hwnd, GWL_WNDPROC, (LONG) ButtonProc); } } if (gridPen != NULL) DeleteObject(gridPen); @@ -3440,7 +2118,7 @@ InitDrawingSizes(BoardSize boardSize, int flags) ExtCreatePen(PS_GEOMETRIC|PS_SOLID|PS_ENDCAP_FLAT|PS_JOIN_MITER, lineGap, &logbrush, 0, NULL); - logbrush.lbColor = premoveHighlightColor; + logbrush.lbColor = premoveHighlightColor; premovePen = ExtCreatePen(PS_GEOMETRIC|PS_SOLID|PS_ENDCAP_FLAT|PS_JOIN_MITER, lineGap, &logbrush, 0, NULL); @@ -3449,7 +2127,7 @@ InitDrawingSizes(BoardSize boardSize, int flags) for (i = 0; i < BOARD_HEIGHT + 1; i++) { gridEndpoints[i*2].x = boardRect.left + lineGap / 2; gridEndpoints[i*2].y = gridEndpoints[i*2 + 1].y = - boardRect.top + lineGap / 2 + (i * (squareSize + lineGap)); + boardRect.top + lineGap / 2 + (i * (squareSize + lineGap)); gridEndpoints[i*2 + 1].x = boardRect.left + lineGap / 2 + BOARD_WIDTH * (squareSize + lineGap); gridVertexCounts[i*2] = gridVertexCounts[i*2 + 1] = 2; @@ -3458,7 +2136,7 @@ InitDrawingSizes(BoardSize boardSize, int flags) gridEndpoints[i*2 + BOARD_HEIGHT*2 + 2].y = boardRect.top + lineGap / 2; gridEndpoints[i*2 + BOARD_HEIGHT*2 + 2].x = gridEndpoints[i*2 + 1 + BOARD_HEIGHT*2 + 2].x = boardRect.left + - lineGap / 2 + (i * (squareSize + lineGap)); + lineGap / 2 + (i * (squareSize + lineGap)); gridEndpoints[i*2 + 1 + BOARD_HEIGHT*2 + 2].y = boardRect.top + BOARD_HEIGHT * (squareSize + lineGap); gridVertexCounts[i*2] = gridVertexCounts[i*2 + 1] = 2; @@ -3481,9 +2159,9 @@ InitDrawingSizes(BoardSize boardSize, int flags) for (i=0; i<=2; i++) { for (piece = WhitePawn; (int) piece < (int) BlackPawn; - piece = (ChessSquare) ((int) piece + 1)) { + piece = (ChessSquare) ((int) piece + 1)) { if (pieceBitmap[i][piece] != NULL) - DeleteObject(pieceBitmap[i][piece]); + DeleteObject(pieceBitmap[i][piece]); } } @@ -3515,7 +2193,7 @@ InitDrawingSizes(BoardSize boardSize, int flags) pieceBitmap[2][WhiteQueen] = DoLoadBitmap(hInst, "q", squareSize, "w"); } - if(squareSize <= 72 && squareSize >= 33) { + if(squareSize <= 72 && squareSize >= 33) { /* A & C are available in most sizes now */ if(squareSize != 49 && squareSize != 72 && squareSize != 33) { // Vortex-like pieceBitmap[0][WhiteAngel] = DoLoadBitmap(hInst, "a", squareSize, "s"); @@ -3748,7 +2426,7 @@ DrawCoordsOnDC(HDC hdc) str[0] = ranks[start + i]; ExtTextOut(hdc, x + squareSize - 2, y - 1, 0, NULL, str, 1, NULL); x += squareSize + lineGap; - } + } SelectObject(hdc, oldBrush); SetBkMode(hdc, oldMode); @@ -3760,7 +2438,7 @@ VOID DrawGridOnDC(HDC hdc) { HPEN oldPen; - + if (lineGap != 0) { oldPen = SelectObject(hdc, gridPen); PolyPolyline(hdc, gridEndpoints, gridVertexCounts, BOARD_WIDTH+BOARD_HEIGHT + 2); @@ -3803,18 +2481,18 @@ DrawHighlightsOnDC(HDC hdc) { int i; for (i=0; i<2; i++) { - if (highlightInfo.sq[i].x >= 0 && highlightInfo.sq[i].y >= 0) + if (highlightInfo.sq[i].x >= 0 && highlightInfo.sq[i].y >= 0) DrawHighlightOnDC(hdc, TRUE, - highlightInfo.sq[i].x, highlightInfo.sq[i].y, - HIGHLIGHT_PEN); + highlightInfo.sq[i].x, highlightInfo.sq[i].y, + HIGHLIGHT_PEN); } for (i=0; i<2; i++) { - if (premoveHighlightInfo.sq[i].x >= 0 && - premoveHighlightInfo.sq[i].y >= 0) { - DrawHighlightOnDC(hdc, TRUE, - premoveHighlightInfo.sq[i].x, - premoveHighlightInfo.sq[i].y, - PREMOVE_PEN); + if (premoveHighlightInfo.sq[i].x >= 0 && + premoveHighlightInfo.sq[i].y >= 0) { + DrawHighlightOnDC(hdc, TRUE, + premoveHighlightInfo.sq[i].x, + premoveHighlightInfo.sq[i].y, + PREMOVE_PEN); } } } @@ -3862,10 +2540,10 @@ DrawPieceOnDC(HDC hdc, ChessSquare piece, int color, int sqcolor, int x, int y, } if (appData.monoMode) { - SelectObject(tmphdc, PieceBitmap(piece, + SelectObject(tmphdc, PieceBitmap(piece, color == sqcolor ? OUTLINE_PIECE : SOLID_PIECE)); BitBlt(hdc, x, y, squareSize, squareSize, tmphdc, 0, 0, - sqcolor ? SRCCOPY : NOTSRCCOPY); + sqcolor ? SRCCOPY : NOTSRCCOPY); } else { tmpSize = squareSize; if(minorSize && @@ -3886,35 +2564,13 @@ DrawPieceOnDC(HDC hdc, ChessSquare piece, int color, int sqcolor, int x, int y, StretchBlt(hdc, x+tmpSize, y+tmpSize, -tmpSize, -tmpSize, tmphdc, 0, 0, tmpSize, tmpSize, 0x00B8074A); else BitBlt(hdc, x, y, tmpSize, tmpSize, tmphdc, 0, 0, 0x00B8074A); -#if 0 - /* Use black piece color for outline of white pieces */ - /* Not sure this looks really good (though xboard does it). - Maybe better to have another selectable color, default black */ - SelectObject(hdc, blackPieceBrush); /* could have own brush */ - SelectObject(tmphdc, PieceBitmap(piece, OUTLINE_PIECE)); - BitBlt(hdc, x, y, tmpSize, tmpSize, tmphdc, 0, 0, 0x00B8074A); -#else /* Use black for outline of white pieces */ SelectObject(tmphdc, PieceBitmap(piece, OUTLINE_PIECE)); if(appData.upsideDown && color==flipView) StretchBlt(hdc, x+tmpSize, y+tmpSize, -tmpSize, -tmpSize, tmphdc, 0, 0, tmpSize, tmpSize, SRCAND); else BitBlt(hdc, x, y, tmpSize, tmpSize, tmphdc, 0, 0, SRCAND); -#endif } else { -#if 0 - /* Use white piece color for details of black pieces */ - /* Requires filled-in solid bitmaps (BLACK_PIECE class); the - WHITE_PIECE ones aren't always the right shape. */ - /* Not sure this looks really good (though xboard does it). - Maybe better to have another selectable color, default medium gray? */ - oldBitmap = SelectObject(tmphdc, PieceBitmap(piece, BLACK_PIECE)); - oldBrush = SelectObject(hdc, whitePieceBrush); /* could have own brush */ - BitBlt(hdc, x, y, tmpSize, tmpSize, tmphdc, 0, 0, 0x00B8074A); - SelectObject(tmphdc, PieceBitmap(piece, SOLID_PIECE)); - SelectObject(hdc, blackPieceBrush); - BitBlt(hdc, x, y, tmpSize, tmpSize, tmphdc, 0, 0, 0x00B8074A); -#else /* Use square color for details of black pieces */ oldBitmap = SelectObject(tmphdc, PieceBitmap(piece, SOLID_PIECE)); oldBrush = SelectObject(hdc, blackPieceBrush); @@ -3922,7 +2578,6 @@ DrawPieceOnDC(HDC hdc, ChessSquare piece, int color, int sqcolor, int x, int y, StretchBlt(hdc, x+tmpSize, y+tmpSize, -tmpSize, -tmpSize, tmphdc, 0, 0, tmpSize, tmpSize, 0x00B8074A); else BitBlt(hdc, x, y, tmpSize, tmpSize, tmphdc, 0, 0, 0x00B8074A); -#endif } SelectObject(hdc, oldBrush); SelectObject(tmphdc, oldBitmap); @@ -3934,7 +2589,7 @@ int GetBackTextureMode( int algo ) { int result = BACK_TEXTURE_MODE_DISABLED; - switch( algo ) + switch( algo ) { case BACK_TEXTURE_MODE_PLAIN: result = 1; /* Always use identity map */ @@ -3947,7 +2602,7 @@ int GetBackTextureMode( int algo ) return result; } -/* +/* [AS] Compute and save texture drawing info, otherwise we may not be able to handle redraws cleanly (as random numbers would always be different). */ @@ -4074,7 +2729,7 @@ VOID DrawArrowBetweenPoints( HDC hdc, int s_x, int s_y, int d_x, int d_y ) /* [AS] Needed a lot of paper for this! :-) */ dy = (double) (d_y - s_y) / (double) (d_x - s_x); dx = (double) (s_x - d_x) / (double) (s_y - d_y); - + j = sqrt( Sqr(A_WIDTH) / (1.0 + Sqr(dx)) ); k = sqrt( Sqr(A_WIDTH*A_HEIGHT_FACTOR) / (1.0 + Sqr(dy)) ); @@ -4234,8 +2889,8 @@ HRGN GetArrowHighlightClipRegion( HDC hdc ) } /* - Warning: this function modifies the behavior of several other functions. - + Warning: this function modifies the behavior of several other functions. + Basically, Winboard is optimized to avoid drawing the whole board if not strictly needed. Unfortunately, the decision whether or not to perform a full or partial repaint is scattered all over the place, which is not good for features such as @@ -4247,7 +2902,7 @@ HRGN GetArrowHighlightClipRegion( HDC hdc ) In such patched places, I always try refer to this function so there is a single place to maintain knowledge. - + To restore the original behavior, just return FALSE unconditionally. */ BOOL IsFullRepaintPreferrable() @@ -4262,25 +2917,25 @@ BOOL IsFullRepaintPreferrable() return result; } -/* +/* This function is called by DrawPosition to know whether a full repaint must be forced or not. - Only DrawPosition may directly call this function, which makes use of - some state information. Other function should call DrawPosition specifying + Only DrawPosition may directly call this function, which makes use of + some state information. Other function should call DrawPosition specifying the repaint flag, and can use IsFullRepaintPreferrable if needed. */ BOOL DrawPositionNeedsFullRepaint() { BOOL result = FALSE; - /* + /* Probably a slightly better policy would be to trigger a full repaint when animInfo.piece changes state (i.e. empty -> non-empty and viceversa), but animation is fast enough that it's difficult to notice. */ if( animInfo.piece == EmptySquare ) { - if( (appData.highlightLastMove || appData.highlightDragging) && IsDrawArrowEnabled() && HasHighlightInfo() ) { + if( (appData.highlightLastMove || appData.highlightDragging) && IsDrawArrowEnabled() /*&& HasHighlightInfo()*/ ) { result = TRUE; } } @@ -4299,9 +2954,9 @@ DrawBoardOnDC(HDC hdc, Board board, HDC tmphdc) /* [AS] Initialize background textures if needed */ if( liteBackTexture != NULL || darkBackTexture != NULL ) { static int backTextureBoardSize; /* [HGM] boardsize: also new texture if board format changed */ - if( backTextureSquareSize != squareSize - || backTextureBoardSize != BOARD_WIDTH+BOARD_SIZE*BOARD_HEIGHT) { - backTextureBoardSize = BOARD_WIDTH+BOARD_SIZE*BOARD_HEIGHT; + if( backTextureSquareSize != squareSize + || backTextureBoardSize != BOARD_WIDTH+BOARD_FILES*BOARD_HEIGHT) { + backTextureBoardSize = BOARD_WIDTH+BOARD_FILES*BOARD_HEIGHT; backTextureSquareSize = squareSize; RebuildTextureSquareInfo(); } @@ -4311,7 +2966,7 @@ DrawBoardOnDC(HDC hdc, Board board, HDC tmphdc) for (row = 0; row < BOARD_HEIGHT; row++) { for (column = 0; column < BOARD_WIDTH; column++) { - + SquareToPos(row, column, &x, &y); piece = board[row][column]; @@ -4338,7 +2993,7 @@ DrawBoardOnDC(HDC hdc, Board board, HDC tmphdc) if( row < gameInfo.holdingsSize ) square_color = 1; else { - DisplayHoldingsCount(hdc, x, y, 0, 0); + DisplayHoldingsCount(hdc, x, y, 0, 0); continue; } } @@ -4350,20 +3005,20 @@ DrawBoardOnDC(HDC hdc, Board board, HDC tmphdc) if (appData.monoMode) { if (piece == EmptySquare) { BitBlt(hdc, x, y, squareSize, squareSize, 0, 0, 0, - square_color ? WHITENESS : BLACKNESS); + square_color ? WHITENESS : BLACKNESS); } else { DrawPieceOnDC(hdc, piece, piece_color, square_color, x, y, tmphdc); } - } + } else if( backTextureSquareInfo[row][column].mode > 0 ) { /* [AS] Draw the square using a texture bitmap */ HBITMAP hbm = SelectObject( texture_hdc, square_color ? liteBackTexture : darkBackTexture ); - int r = row, c = column; // [HGM] do not flip board in flipView - if(flipView) { r = BOARD_HEIGHT-1 - r; c = BOARD_WIDTH-1 - c; } + int r = row, c = column; // [HGM] do not flip board in flipView + if(flipView) { r = BOARD_HEIGHT-1 - r; c = BOARD_WIDTH-1 - c; } - DrawTile( x, y, - squareSize, squareSize, - hdc, + DrawTile( x, y, + squareSize, squareSize, + hdc, texture_hdc, backTextureSquareInfo[r][c].mode, backTextureSquareInfo[r][c].x, @@ -4395,10 +3050,10 @@ DrawBoardOnDC(HDC hdc, Board board, HDC tmphdc) int saveDiagFlag = 0; FILE *diagFile; // [HGM] diag void fputDW(FILE *f, int x) { - fputc(x & 255, f); - fputc(x>>8 & 255, f); - fputc(x>>16 & 255, f); - fputc(x>>24 & 255, f); + fputc(x & 255, f); + fputc(x>>8 & 255, f); + fputc(x>>16 & 255, f); + fputc(x>>24 & 255, f); } #define MAX_CLIPS 200 /* more than enough */ @@ -4416,19 +3071,75 @@ DrawLogoOnDC(HDC hdc, RECT logoRect, HBITMAP logo) if(logo == NULL) return; // GetClientRect(hwndMain, &Rect); // bufferBitmap = CreateCompatibleBitmap(hdc, Rect.right-Rect.left+1, -// Rect.bottom-Rect.top+1); +// Rect.bottom-Rect.top+1); tmphdc = CreateCompatibleDC(hdc); hbm = SelectObject(tmphdc, logo); if( GetObject( logo, sizeof(bi), &bi ) > 0 ) { w = bi.bmWidth; h = bi.bmHeight; } - StretchBlt(hdc, logoRect.left, logoRect.top, logoRect.right - logoRect.left, + StretchBlt(hdc, logoRect.left, logoRect.top, logoRect.right - logoRect.left, logoRect.bottom - logoRect.top, tmphdc, 0, 0, w, h, SRCCOPY); SelectObject(tmphdc, hbm); DeleteDC(tmphdc); } +static HDC hdcSeek; + +// [HGM] seekgraph +void DrawSeekAxis( int x, int y, int xTo, int yTo ) +{ + POINT stPt; + HPEN hp = SelectObject( hdcSeek, gridPen ); + MoveToEx( hdcSeek, boardRect.left+x, boardRect.top+y, &stPt ); + LineTo( hdcSeek, boardRect.left+xTo, boardRect.top+yTo ); + SelectObject( hdcSeek, hp ); +} + +// front-end wrapper for drawing functions to do rectangles +void DrawSeekBackground( int left, int top, int right, int bottom ) +{ + HPEN hp; + RECT rc; + + if (hdcSeek == NULL) { + hdcSeek = GetDC(hwndMain); + if (!appData.monoMode) { + SelectPalette(hdcSeek, hPal, FALSE); + RealizePalette(hdcSeek); + } + } + hp = SelectObject( hdcSeek, gridPen ); + rc.top = boardRect.top+top; rc.left = boardRect.left+left; + rc.bottom = boardRect.top+bottom; rc.right = boardRect.left+right; + FillRect( hdcSeek, &rc, lightSquareBrush ); + SelectObject( hdcSeek, hp ); +} + +// front-end wrapper for putting text in graph +void DrawSeekText(char *buf, int x, int y) +{ + SIZE stSize; + SetBkMode( hdcSeek, TRANSPARENT ); + GetTextExtentPoint32( hdcSeek, buf, strlen(buf), &stSize ); + TextOut( hdcSeek, boardRect.left+x-3, boardRect.top+y-stSize.cy/2, buf, strlen(buf) ); +} + +void DrawSeekDot(int x, int y, int color) +{ + int square = color & 0x80; + color &= 0x7F; + HBRUSH oldBrush = SelectObject(hdcSeek, + color == 0 ? markerBrush : color == 1 ? darkSquareBrush : explodeBrush); + if(square) + Rectangle(hdcSeek, boardRect.left+x - squareSize/9, boardRect.top+y - squareSize/9, + boardRect.left+x + squareSize/9, boardRect.top+y + squareSize/9); + else + Ellipse(hdcSeek, boardRect.left+x - squareSize/8, boardRect.top+y - squareSize/8, + boardRect.left+x + squareSize/8, boardRect.top+y + squareSize/8); + SelectObject(hdcSeek, oldBrush); +} + VOID HDCDrawPosition(HDC hdc, BOOLEAN repaint, Board board) { @@ -4450,26 +3161,17 @@ HDCDrawPosition(HDC hdc, BOOLEAN repaint, Board board) * caller tell it that. I think this can safely be set to FALSE - but * if we trust the callers not to request full repaints unnessesarily, then * we could skip some clipping work. In other words, only request a full - * redraw when the majority of pieces have changed positions (ie. flip, + * redraw when the majority of pieces have changed positions (ie. flip, * gamestart and similar) --Hawk */ Boolean fullrepaint = repaint; + if(DrawSeekGraph()) return; // [HG} seekgraph: suppress printing board if seek graph up + if( DrawPositionNeedsFullRepaint() ) { fullrepaint = TRUE; } -#if 0 - if( fullrepaint ) { - static int repaint_count = 0; - char buf[128]; - - repaint_count++; - sprintf( buf, "FULL repaint: %d\n", repaint_count ); - OutputDebugString( buf ); - } -#endif - if (board == NULL) { if (!lastReqValid) { return; @@ -4499,35 +3201,6 @@ HDCDrawPosition(HDC hdc, BOOLEAN repaint, Board board) releaseDC = FALSE; } -#if 0 - fprintf(debugFP, "*******************************\n" - "repaint = %s\n" - "dragInfo.from (%d,%d)\n" - "dragInfo.start (%d,%d)\n" - "dragInfo.pos (%d,%d)\n" - "dragInfo.lastpos (%d,%d)\n", - repaint ? "TRUE" : "FALSE", - dragInfo.from.x, dragInfo.from.y, - dragInfo.start.x, dragInfo.start.y, - dragInfo.pos.x, dragInfo.pos.y, - dragInfo.lastpos.x, dragInfo.lastpos.y); - fprintf(debugFP, "prev: "); - for (row = 0; row < BOARD_HEIGHT; row++) { - for (column = 0; column < BOARD_WIDTH; column++) { - fprintf(debugFP, "%d ", lastDrawn[row][column]); - } - } - fprintf(debugFP, "\n"); - fprintf(debugFP, "board: "); - for (row = 0; row < BOARD_HEIGHT; row++) { - for (column = 0; column < BOARD_WIDTH; column++) { - fprintf(debugFP, "%d ", board[row][column]); - } - } - fprintf(debugFP, "\n"); - fflush(debugFP); -#endif - /* Create some work-DCs */ hdcmem = CreateCompatibleDC(hdc); tmphdc = CreateCompatibleDC(hdc); @@ -4540,66 +3213,66 @@ HDCDrawPosition(HDC hdc, BOOLEAN repaint, Board board) if(dragInfo.from.x == BOARD_LEFT-2 ) { if(--board[dragInfo.from.y][dragInfo.from.x+1] == 0 ) board[dragInfo.from.y][dragInfo.from.x] = EmptySquare; - } else + } else if(dragInfo.from.x == BOARD_RGHT+1) { if(--board[dragInfo.from.y][dragInfo.from.x-1] == 0 ) board[dragInfo.from.y][dragInfo.from.x] = EmptySquare; - } else + } else board[dragInfo.from.y][dragInfo.from.x] = EmptySquare; } - /* Figure out which squares need updating by comparing the + /* Figure out which squares need updating by comparing the * newest board with the last drawn board and checking if * flipping has changed. */ if (!fullrepaint && lastDrawnValid && lastDrawnFlipView == flipView) { for (row = 0; row < BOARD_HEIGHT; row++) { /* [HGM] true size, not 8 */ for (column = 0; column < BOARD_WIDTH; column++) { - if (lastDrawn[row][column] != board[row][column]) { - SquareToPos(row, column, &x, &y); - clips[num_clips++] = - CreateRectRgn(x, y, x + squareSize, y + squareSize); - } + if (lastDrawn[row][column] != board[row][column]) { + SquareToPos(row, column, &x, &y); + clips[num_clips++] = + CreateRectRgn(x, y, x + squareSize, y + squareSize); + } } } for (i=0; i<2; i++) { if (lastDrawnHighlight.sq[i].x != highlightInfo.sq[i].x || - lastDrawnHighlight.sq[i].y != highlightInfo.sq[i].y) { - if (lastDrawnHighlight.sq[i].x >= 0 && - lastDrawnHighlight.sq[i].y >= 0) { - SquareToPos(lastDrawnHighlight.sq[i].y, - lastDrawnHighlight.sq[i].x, &x, &y); - clips[num_clips++] = - CreateRectRgn(x - lineGap, y - lineGap, - x + squareSize + lineGap, y + squareSize + lineGap); - } - if (highlightInfo.sq[i].x >= 0 && highlightInfo.sq[i].y >= 0) { - SquareToPos(highlightInfo.sq[i].y, highlightInfo.sq[i].x, &x, &y); - clips[num_clips++] = - CreateRectRgn(x - lineGap, y - lineGap, - x + squareSize + lineGap, y + squareSize + lineGap); - } + lastDrawnHighlight.sq[i].y != highlightInfo.sq[i].y) { + if (lastDrawnHighlight.sq[i].x >= 0 && + lastDrawnHighlight.sq[i].y >= 0) { + SquareToPos(lastDrawnHighlight.sq[i].y, + lastDrawnHighlight.sq[i].x, &x, &y); + clips[num_clips++] = + CreateRectRgn(x - lineGap, y - lineGap, + x + squareSize + lineGap, y + squareSize + lineGap); + } + if (highlightInfo.sq[i].x >= 0 && highlightInfo.sq[i].y >= 0) { + SquareToPos(highlightInfo.sq[i].y, highlightInfo.sq[i].x, &x, &y); + clips[num_clips++] = + CreateRectRgn(x - lineGap, y - lineGap, + x + squareSize + lineGap, y + squareSize + lineGap); + } } } for (i=0; i<2; i++) { if (lastDrawnPremove.sq[i].x != premoveHighlightInfo.sq[i].x || - lastDrawnPremove.sq[i].y != premoveHighlightInfo.sq[i].y) { - if (lastDrawnPremove.sq[i].x >= 0 && - lastDrawnPremove.sq[i].y >= 0) { - SquareToPos(lastDrawnPremove.sq[i].y, - lastDrawnPremove.sq[i].x, &x, &y); - clips[num_clips++] = - CreateRectRgn(x - lineGap, y - lineGap, - x + squareSize + lineGap, y + squareSize + lineGap); - } - if (premoveHighlightInfo.sq[i].x >= 0 && - premoveHighlightInfo.sq[i].y >= 0) { - SquareToPos(premoveHighlightInfo.sq[i].y, - premoveHighlightInfo.sq[i].x, &x, &y); - clips[num_clips++] = - CreateRectRgn(x - lineGap, y - lineGap, - x + squareSize + lineGap, y + squareSize + lineGap); - } + lastDrawnPremove.sq[i].y != premoveHighlightInfo.sq[i].y) { + if (lastDrawnPremove.sq[i].x >= 0 && + lastDrawnPremove.sq[i].y >= 0) { + SquareToPos(lastDrawnPremove.sq[i].y, + lastDrawnPremove.sq[i].x, &x, &y); + clips[num_clips++] = + CreateRectRgn(x - lineGap, y - lineGap, + x + squareSize + lineGap, y + squareSize + lineGap); + } + if (premoveHighlightInfo.sq[i].x >= 0 && + premoveHighlightInfo.sq[i].y >= 0) { + SquareToPos(premoveHighlightInfo.sq[i].y, + premoveHighlightInfo.sq[i].x, &x, &y); + clips[num_clips++] = + CreateRectRgn(x - lineGap, y - lineGap, + x + squareSize + lineGap, y + squareSize + lineGap); + } } } } else { @@ -4613,7 +3286,7 @@ HDCDrawPosition(HDC hdc, BOOLEAN repaint, Board board) */ GetClientRect(hwndMain, &Rect); bufferBitmap = CreateCompatibleBitmap(hdc, Rect.right-Rect.left+1, - Rect.bottom-Rect.top+1); + Rect.bottom-Rect.top+1); oldBitmap = SelectObject(hdcmem, bufferBitmap); if (!appData.monoMode) { SelectPalette(hdcmem, hPal, FALSE); @@ -4641,8 +3314,8 @@ HDCDrawPosition(HDC hdc, BOOLEAN repaint, Board board) } } - /* Are we animating a move? - * If so, + /* Are we animating a move? + * If so, * - remove the piece from the board (temporarely) * - calculate the clipping region */ @@ -4655,12 +3328,12 @@ HDCDrawPosition(HDC hdc, BOOLEAN repaint, Board board) y2 = boardRect.top + animInfo.pos.y; clips[num_clips++] = CreateRectRgn(MIN(x,x2), MIN(y,y2), MAX(x,x2)+squareSize, MAX(y,y2)+squareSize); /* Slight kludge. The real problem is that after AnimateMove is - done, the position on the screen does not match lastDrawn. - This currently causes trouble only on e.p. captures in - atomic, where the piece moves to an empty square and then - explodes. The old and new positions both had an empty square - at the destination, but animation has drawn a piece there and - we have to remember to erase it. [HGM] moved until after setting lastDrawn */ + done, the position on the screen does not match lastDrawn. + This currently causes trouble only on e.p. captures in + atomic, where the piece moves to an empty square and then + explodes. The old and new positions both had an empty square + at the destination, but animation has drawn a piece there and + we have to remember to erase it. [HGM] moved until after setting lastDrawn */ lastDrawn[animInfo.to.y][animInfo.to.x] = animInfo.piece; } } @@ -4680,61 +3353,73 @@ HDCDrawPosition(HDC hdc, BOOLEAN repaint, Board board) /* Do all the drawing to the memory DC */ if(explodeInfo.radius) { // [HGM] atomic - HBRUSH oldBrush; - int x, y, r=(explodeInfo.radius * squareSize)/100; + HBRUSH oldBrush; + int x, y, r=(explodeInfo.radius * squareSize)/100; board[explodeInfo.fromY][explodeInfo.fromX] = EmptySquare; // suppress display of capturer - SquareToPos(explodeInfo.toY, explodeInfo.toX, &x, &y); - x += squareSize/2; - y += squareSize/2; + SquareToPos(explodeInfo.toY, explodeInfo.toX, &x, &y); + x += squareSize/2; + y += squareSize/2; if(!fullrepaint) { - clips[num_clips] = CreateRectRgn(x-r, y-r, x+r, y+r); - ExtSelectClipRgn(hdcmem, clips[num_clips++], RGN_OR); - } - DrawGridOnDC(hdcmem); - DrawHighlightsOnDC(hdcmem); - DrawBoardOnDC(hdcmem, board, tmphdc); - oldBrush = SelectObject(hdcmem, explodeBrush); - Ellipse(hdcmem, x-r, y-r, x+r, y+r); - SelectObject(hdcmem, oldBrush); + clips[num_clips] = CreateRectRgn(x-r, y-r, x+r, y+r); + ExtSelectClipRgn(hdcmem, clips[num_clips++], RGN_OR); + } + DrawGridOnDC(hdcmem); + DrawHighlightsOnDC(hdcmem); + DrawBoardOnDC(hdcmem, board, tmphdc); + oldBrush = SelectObject(hdcmem, explodeBrush); + Ellipse(hdcmem, x-r, y-r, x+r, y+r); + SelectObject(hdcmem, oldBrush); } else { DrawGridOnDC(hdcmem); DrawHighlightsOnDC(hdcmem); DrawBoardOnDC(hdcmem, board, tmphdc); } - if(logoHeight) { - HBITMAP whiteLogo = (HBITMAP) first.programLogo, blackLogo = (HBITMAP) second.programLogo; - if(appData.autoLogo) { - - switch(gameMode) { // pick logos based on game mode - case IcsObserving: - whiteLogo = second.programLogo; // ICS logo - blackLogo = second.programLogo; - default: - break; - case IcsPlayingWhite: - if(!appData.zippyPlay) whiteLogo = userLogo; - blackLogo = second.programLogo; // ICS logo - break; - case IcsPlayingBlack: - whiteLogo = second.programLogo; // ICS logo - blackLogo = appData.zippyPlay ? first.programLogo : userLogo; - break; - case TwoMachinesPlay: - if(first.twoMachinesColor[0] == 'b') { - whiteLogo = second.programLogo; - blackLogo = first.programLogo; - } - break; - case MachinePlaysWhite: - blackLogo = userLogo; - break; - case MachinePlaysBlack: - whiteLogo = userLogo; - blackLogo = first.programLogo; - } + for (row = 0; row < BOARD_HEIGHT; row++) { + for (column = 0; column < BOARD_WIDTH; column++) { + if (marker[row][column]) { // marker changes only occur with full repaint! + HBRUSH oldBrush = SelectObject(hdcmem, + marker[row][column] == 2 ? markerBrush : explodeBrush); + SquareToPos(row, column, &x, &y); + Ellipse(hdcmem, x + squareSize/4, y + squareSize/4, + x + 3*squareSize/4, y + 3*squareSize/4); + SelectObject(hdcmem, oldBrush); + } } - DrawLogoOnDC(hdc, leftLogoRect, flipClock ? blackLogo : whiteLogo); - DrawLogoOnDC(hdc, rightLogoRect, flipClock ? whiteLogo : blackLogo); + } + if(logoHeight) { + HBITMAP whiteLogo = (HBITMAP) first.programLogo, blackLogo = (HBITMAP) second.programLogo; + if(appData.autoLogo) { + + switch(gameMode) { // pick logos based on game mode + case IcsObserving: + whiteLogo = second.programLogo; // ICS logo + blackLogo = second.programLogo; + default: + break; + case IcsPlayingWhite: + if(!appData.zippyPlay) whiteLogo = userLogo; + blackLogo = second.programLogo; // ICS logo + break; + case IcsPlayingBlack: + whiteLogo = second.programLogo; // ICS logo + blackLogo = appData.zippyPlay ? first.programLogo : userLogo; + break; + case TwoMachinesPlay: + if(first.twoMachinesColor[0] == 'b') { + whiteLogo = second.programLogo; + blackLogo = first.programLogo; + } + break; + case MachinePlaysWhite: + blackLogo = userLogo; + break; + case MachinePlaysBlack: + whiteLogo = userLogo; + blackLogo = first.programLogo; + } + } + DrawLogoOnDC(hdc, leftLogoRect, flipClock ? blackLogo : whiteLogo); + DrawLogoOnDC(hdc, rightLogoRect, flipClock ? whiteLogo : blackLogo); } if( appData.highlightMoveWithArrow ) { @@ -4758,21 +3443,21 @@ HDCDrawPosition(HDC hdc, BOOLEAN repaint, Board board) x = dragInfo.pos.x - squareSize / 2; y = dragInfo.pos.y - squareSize / 2; DrawPieceOnDC(hdcmem, dragged_piece, - ((int) dragged_piece < (int) BlackPawn), + ((int) dragged_piece < (int) BlackPawn), (dragInfo.from.y + dragInfo.from.x) % 2, x, y, tmphdc); - } - + } + /* Put the animated piece back into place and draw it */ if (animInfo.piece != EmptySquare) { board[animInfo.from.y][animInfo.from.x] = animInfo.piece; x = boardRect.left + animInfo.pos.x; y = boardRect.top + animInfo.pos.y; DrawPieceOnDC(hdcmem, animInfo.piece, - ((int) animInfo.piece < (int) BlackPawn), + ((int) animInfo.piece < (int) BlackPawn), (animInfo.from.y + animInfo.from.x) % 2, x, y, tmphdc); } - /* Release the bufferBitmap by selecting in the old bitmap + /* Release the bufferBitmap by selecting in the old bitmap * and delete the memory DC */ SelectObject(hdcmem, oldBitmap); @@ -4784,7 +3469,7 @@ HDCDrawPosition(HDC hdc, BOOLEAN repaint, Board board) for (x = 1; x < num_clips; x++) { if (ExtSelectClipRgn(hdc, clips[x], RGN_OR) == ERROR) abort(); // this should never ever happen! - } + } } /* Copy the new bitmap onto the screen in one go. @@ -4792,66 +3477,65 @@ HDCDrawPosition(HDC hdc, BOOLEAN repaint, Board board) */ oldBitmap = SelectObject(tmphdc, bufferBitmap); BitBlt(hdc, boardRect.left, boardRect.top, - boardRect.right - boardRect.left, - boardRect.bottom - boardRect.top, - tmphdc, boardRect.left, boardRect.top, SRCCOPY); - if(saveDiagFlag) { - BITMAP b; int i, j=0, m, w, wb, fac=0; char pData[1000000]; + boardRect.right - boardRect.left, + boardRect.bottom - boardRect.top, + tmphdc, boardRect.left, boardRect.top, SRCCOPY); + if(saveDiagFlag) { + BITMAP b; int i, j=0, m, w, wb, fac=0; char pData[1000000]; BITMAPINFOHEADER bih; int color[16], nrColors=0; GetObject(bufferBitmap, sizeof(b), &b); if(b.bmWidthBytes*b.bmHeight <= 990000) { - bih.biSize = sizeof(BITMAPINFOHEADER); - bih.biWidth = b.bmWidth; - bih.biHeight = b.bmHeight; - bih.biPlanes = 1; - bih.biBitCount = b.bmBitsPixel; - bih.biCompression = 0; - bih.biSizeImage = b.bmWidthBytes*b.bmHeight; - bih.biXPelsPerMeter = 0; - bih.biYPelsPerMeter = 0; - bih.biClrUsed = 0; - bih.biClrImportant = 0; -// fprintf(diagFile, "t=%d\nw=%d\nh=%d\nB=%d\nP=%d\nX=%d\n", -// b.bmType, b.bmWidth, b.bmHeight, b.bmWidthBytes, b.bmPlanes, b.bmBitsPixel); - GetDIBits(tmphdc,bufferBitmap,0,b.bmHeight,pData,(BITMAPINFO*)&bih,DIB_RGB_COLORS); -// fprintf(diagFile, "%8x\n", (int) pData); - -#if 1 - wb = b.bmWidthBytes; - // count colors - for(i=0; i>2; i++) { - int k = ((int*) pData)[i]; - for(j=0; j= 16) break; - color[j] = k; - if(j >= nrColors) nrColors = j+1; - } - if(j<16) { // 16 colors is enough. Compress to 4 bits per pixel - INT p = 0; - for(i=0; i>2); w+=2) { - int k = ((int*) pData)[(wb*i>>2) + w]; - for(j=0; j>2) + w + 1]; - for(m=0; m>5)<<2; - } - // write BITMAPFILEHEADER - fprintf(diagFile, "BM"); + bih.biSize = sizeof(BITMAPINFOHEADER); + bih.biWidth = b.bmWidth; + bih.biHeight = b.bmHeight; + bih.biPlanes = 1; + bih.biBitCount = b.bmBitsPixel; + bih.biCompression = 0; + bih.biSizeImage = b.bmWidthBytes*b.bmHeight; + bih.biXPelsPerMeter = 0; + bih.biYPelsPerMeter = 0; + bih.biClrUsed = 0; + bih.biClrImportant = 0; +// fprintf(diagFile, "t=%d\nw=%d\nh=%d\nB=%d\nP=%d\nX=%d\n", +// b.bmType, b.bmWidth, b.bmHeight, b.bmWidthBytes, b.bmPlanes, b.bmBitsPixel); + GetDIBits(tmphdc,bufferBitmap,0,b.bmHeight,pData,(BITMAPINFO*)&bih,DIB_RGB_COLORS); +// fprintf(diagFile, "%8x\n", (int) pData); + + wb = b.bmWidthBytes; + // count colors + for(i=0; i>2; i++) { + int k = ((int*) pData)[i]; + for(j=0; j= 16) break; + color[j] = k; + if(j >= nrColors) nrColors = j+1; + } + if(j<16) { // 16 colors is enough. Compress to 4 bits per pixel + INT p = 0; + for(i=0; i>2); w+=2) { + int k = ((int*) pData)[(wb*i>>2) + w]; + for(j=0; j>2) + w + 1]; + for(m=0; m>5)<<2; + } + // write BITMAPFILEHEADER + fprintf(diagFile, "BM"); fputDW(diagFile, wb*(b.bmHeight - boardRect.top + OUTER_MARGIN)+0x36 + (fac?64:0)); fputDW(diagFile, 0); fputDW(diagFile, 0x36 + (fac?64:0)); - // write BITMAPINFOHEADER + // write BITMAPINFOHEADER fputDW(diagFile, 40); fputDW(diagFile, b.bmWidth); fputDW(diagFile, b.bmHeight - boardRect.top + OUTER_MARGIN); - if(fac) fputDW(diagFile, 0x040001); // planes and bits/pixel + if(fac) fputDW(diagFile, 0x040001); // planes and bits/pixel else fputDW(diagFile, 0x200001); // planes and bits/pixel fputDW(diagFile, 0); fputDW(diagFile, 0); @@ -4859,13 +3543,12 @@ HDCDrawPosition(HDC hdc, BOOLEAN repaint, Board board) fputDW(diagFile, 0); fputDW(diagFile, 0); fputDW(diagFile, 0); - // write color table - if(fac) - for(i=0; i<16; i++) fputDW(diagFile, color[i]); - // write bitmap data - for(i=0; ihf); + SelectObject(hdc, font[boardSize][MESSAGE_FONT]->hf); ExtTextOut(hdc, messageRect.left, messageRect.top, - ETO_CLIPPED|ETO_OPAQUE, - &messageRect, messageText, strlen(messageText), NULL); + ETO_CLIPPED|ETO_OPAQUE, + &messageRect, messageText, strlen(messageText), NULL); SelectObject(hdc, oldFont); DisplayBothClocks(); } @@ -4954,8 +3637,8 @@ PaintProc(HWND hwnd) * The offset boardRect.left or boardRect.top must already have been * subtracted from x. */ -int -EventToSquare(int x) +int EventToSquare(x, limit) + int x, limit; { if (x <= 0) return -2; @@ -4965,7 +3648,7 @@ EventToSquare(int x) if ((x % (squareSize + lineGap)) >= squareSize) return -1; x /= (squareSize + lineGap); - if (x >= BOARD_SIZE) + if (x >= limit) return -2; return x; } @@ -4994,49 +3677,63 @@ SetupDropMenu(HMENU hmenu) for (i=0; i 0 || !appData.testLegality /*!!temp:*/ || (gameInfo.variant == VariantCrazyhouse - && !appData.icsActive); + && !appData.icsActive); ModifyMenu(hmenu, dropEnables[i].command, - MF_BYCOMMAND | (enable ? MF_ENABLED : MF_GRAYED) | MF_STRING, - dropEnables[i].command, item); + MF_BYCOMMAND | (enable ? MF_ENABLED : MF_GRAYED) | MF_STRING, + dropEnables[i].command, item); } } +void DragPieceBegin(int x, int y) +{ + dragInfo.lastpos.x = boardRect.left + x; + dragInfo.lastpos.y = boardRect.top + y; + dragInfo.from.x = fromX; + dragInfo.from.y = fromY; + dragInfo.start = dragInfo.from; + SetCapture(hwndMain); +} + +void DragPieceEnd(int x, int y) +{ + ReleaseCapture(); + dragInfo.start.x = dragInfo.start.y = -1; + dragInfo.from = dragInfo.start; + dragInfo.pos = dragInfo.lastpos = dragInfo.start; +} + /* Event handler for mouse messages */ VOID MouseEvent(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { - int x, y; + int x, y, menuNr; POINT pt; static int recursive = 0; HMENU hmenu; -// BOOLEAN needsRedraw = FALSE; - BOOLEAN saveAnimate; BOOLEAN forceFullRepaint = IsFullRepaintPreferrable(); /* [AS] */ - static BOOLEAN sameAgain = FALSE, promotionChoice = FALSE; - ChessMove moveType; if (recursive) { if (message == WM_MBUTTONUP) { /* Hideous kludge to fool TrackPopupMenu into paying attention - to the middle button: we simulate pressing the left button too! - */ + to the middle button: we simulate pressing the left button too! + */ PostMessage(hwnd, WM_LBUTTONDOWN, wParam, lParam); PostMessage(hwnd, WM_LBUTTONUP, wParam, lParam); } return; } recursive++; - + pt.x = LOWORD(lParam); pt.y = HIWORD(lParam); - x = EventToSquare(pt.x - boardRect.left); - y = EventToSquare(pt.y - boardRect.top); + x = EventToSquare(pt.x - boardRect.left, BOARD_WIDTH); + y = EventToSquare(pt.y - boardRect.top, BOARD_HEIGHT); if (!flipView && y >= 0) { y = BOARD_HEIGHT - 1 - y; } @@ -5046,262 +3743,62 @@ MouseEvent(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) switch (message) { case WM_LBUTTONDOWN: - if(promotionChoice) { // we are waiting for a click to indicate promotion piece - promotionChoice = FALSE; // only one chance: if click not OK it is interpreted as cancel - if(appData.debugMode) fprintf(debugFP, "promotion click, x=%d, y=%d\n", x, y); - if(gameInfo.holdingsWidth && - (WhiteOnMove(currentMove) - ? x == BOARD_WIDTH-1 && y < gameInfo.holdingsSize && y > 0 - : x == 0 && y >= BOARD_HEIGHT - gameInfo.holdingsSize && y < BOARD_HEIGHT-1) ) { - // click in right holdings, for determining promotion piece - ChessSquare p = boards[currentMove][y][x]; - if(appData.debugMode) fprintf(debugFP, "square contains %d\n", (int)p); - if(p != EmptySquare) { - FinishMove(WhitePromotionQueen, fromX, fromY, toX, toY, ToLower(PieceToChar(p))); - fromX = fromY = -1; - break; - } - } - DrawPosition(FALSE, boards[currentMove]); - break; - } - ErrorPopDown(); - sameAgain = FALSE; - if (y == -2) { - /* Downclick vertically off board; check if on clock */ if (PtInRect((LPRECT) &whiteRect, pt)) { if (gameMode == EditPosition) { - SetWhiteToPlayEvent(); - } else if (gameMode == IcsPlayingBlack || - gameMode == MachinePlaysWhite) { - CallFlagEvent(); + SetWhiteToPlayEvent(); + } else if (gameMode == IcsPlayingBlack || + gameMode == MachinePlaysWhite) { + CallFlagEvent(); } else if (gameMode == EditGame) { AdjustClock(flipClock, -1); } } else if (PtInRect((LPRECT) &blackRect, pt)) { - if (gameMode == EditPosition) { - SetBlackToPlayEvent(); - } else if (gameMode == IcsPlayingWhite || - gameMode == MachinePlaysBlack) { - CallFlagEvent(); + if (gameMode == EditPosition) { + SetBlackToPlayEvent(); + } else if (gameMode == IcsPlayingWhite || + gameMode == MachinePlaysBlack) { + CallFlagEvent(); } else if (gameMode == EditGame) { AdjustClock(!flipClock, -1); - } + } } - if (!appData.highlightLastMove) { - ClearHighlights(); - DrawPosition((int) (forceFullRepaint || FALSE), NULL); - } - fromX = fromY = -1; - dragInfo.start.x = dragInfo.start.y = -1; - dragInfo.from = dragInfo.start; - break; - } else if (x < 0 || y < 0 - /* [HGM] block clicks between board and holdings */ - || x == BOARD_LEFT-1 || x == BOARD_RGHT - || (x == BOARD_LEFT-2 && y < BOARD_HEIGHT-gameInfo.holdingsSize) - || (x == BOARD_RGHT+1 && y >= gameInfo.holdingsSize) - /* EditPosition, empty square, or different color piece; - click-click move is possible */ - ) { - break; - } else if (fromX == x && fromY == y) { - /* Downclick on same square again */ - ClearHighlights(); - DrawPosition(forceFullRepaint || FALSE, NULL); - sameAgain = TRUE; - } else if (fromX != -1 && - x != BOARD_LEFT-2 && x != BOARD_RGHT+1 - ) { - /* Downclick on different square. */ - /* [HGM] if on holdings file, should count as new first click ! */ - /* [HGM] now always do UserMoveTest(), and check colors there */ - toX = x; - toY = y; - /* [HGM] UserMoveEvent requires two calls now, - to make sure move is legal before showing promotion popup */ - moveType = UserMoveTest(fromX, fromY, toX, toY, NULLCHAR, FALSE); - if(moveType == AmbiguousMove) { /* [HGM] Edit-Position move executed */ - fromX = fromY = -1; - ClearHighlights(); - DrawPosition(FALSE, boards[currentMove]); - break; - } else - if(moveType != ImpossibleMove && moveType != Comment) { - /* [HGM] We use PromotionToKnight in Shogi to indicate frorced promotion */ - if (moveType == WhitePromotionKnight || moveType == BlackPromotionKnight || - ((moveType == WhitePromotionQueen || moveType == BlackPromotionQueen) && - appData.alwaysPromoteToQueen)) { - FinishMove(moveType, fromX, fromY, toX, toY, 'q'); - if (!appData.highlightLastMove) { - ClearHighlights(); - DrawPosition(forceFullRepaint || FALSE, NULL); - } - } else - if (moveType == WhitePromotionQueen || moveType == BlackPromotionQueen ) { - SetHighlights(fromX, fromY, toX, toY); - DrawPosition(forceFullRepaint || FALSE, NULL); - /* [HGM] Popup calls FinishMove now. - If promotion to Q is legal, all are legal! */ - if(gameInfo.variant == VariantSuper || gameInfo.variant == VariantGreat) - { ChessSquare p = boards[currentMove][fromY][fromX], q = boards[currentMove][toY][toX]; - // kludge to temporarily execute move on display, without promoting yet - promotionChoice = TRUE; - boards[currentMove][fromY][fromX] = EmptySquare; // move Pawn to 8th rank - boards[currentMove][toY][toX] = p; - DrawPosition(FALSE, boards[currentMove]); - boards[currentMove][fromY][fromX] = p; // take back, but display stays - boards[currentMove][toY][toX] = q; - DisplayMessage("Select piece from holdings", ""); - } else - PromotionPopup(hwnd); - goto noClear; - } else { // not a promotion. Move can be illegal if testLegality off, and should be made then. - if (appData.animate || appData.highlightLastMove) { - SetHighlights(fromX, fromY, toX, toY); - } else { - ClearHighlights(); - } - FinishMove(moveType, fromX, fromY, toX, toY, NULLCHAR); - if (appData.animate && !appData.highlightLastMove) { - ClearHighlights(); - DrawPosition(forceFullRepaint || FALSE, NULL); - } - } - fromX = fromY = -1; - noClear: - break; - } - if (gotPremove && moveType != Comment) { - SetPremoveHighlights(fromX, fromY, toX, toY); -// DrawPosition(forceFullRepaint || FALSE, NULL); - } else ClearHighlights(); - fromX = fromY = -1; - DrawPosition(forceFullRepaint || FALSE, NULL); - if(moveType != Comment) break; - } - /* First downclick, or restart on a square with same color piece */ - if (!frozen && OKToStartUserMove(x, y)) { - fromX = x; - fromY = y; - dragInfo.lastpos = pt; - dragInfo.from.x = fromX; - dragInfo.from.y = fromY; - dragInfo.start = dragInfo.from; - SetCapture(hwndMain); - } else { - fromX = fromY = -1; dragInfo.start.x = dragInfo.start.y = -1; dragInfo.from = dragInfo.start; + if(fromX == -1 && frozen) { // not sure where this is for + fromX = fromY = -1; DrawPosition(forceFullRepaint || FALSE, NULL); /* [AS] */ + break; } + LeftClick(Press, pt.x - boardRect.left, pt.y - boardRect.top); + DrawPosition(TRUE, NULL); break; case WM_LBUTTONUP: - ReleaseCapture(); - if (fromX == -1) break; - if (x == fromX && y == fromY) { - dragInfo.from.x = dragInfo.from.y = -1; - /* Upclick on same square */ - if (sameAgain) { - /* Clicked same square twice: abort click-click move */ - fromX = fromY = -1; - gotPremove = 0; - ClearPremoveHighlights(); - } else { - /* First square clicked: start click-click move */ - SetHighlights(fromX, fromY, -1, -1); - } - DrawPosition(forceFullRepaint || FALSE, NULL); - } else if (dragInfo.from.x < 0 || dragInfo.from.y < 0) { - /* Errant click; ignore */ - break; - } else { - /* Finish drag move. */ - if (appData.debugMode) { - fprintf(debugFP, "release\n"); - } - dragInfo.from.x = dragInfo.from.y = -1; - toX = x; - toY = y; - saveAnimate = appData.animate; /* sorry, Hawk :) */ - appData.animate = appData.animate && !appData.animateDragging; - moveType = UserMoveTest(fromX, fromY, toX, toY, NULLCHAR, TRUE); - if(moveType == AmbiguousMove) { /* [HGM] Edit-Position move executed */ - fromX = fromY = -1; - ClearHighlights(); - DrawPosition(FALSE, boards[currentMove]); - appData.animate = saveAnimate; - break; - } else - if(moveType != ImpossibleMove) { - /* [HGM] use move type to determine if move is promotion. - Knight is Shogi kludge for mandatory promotion, Queen means choice */ - if (moveType == WhitePromotionKnight || moveType == BlackPromotionKnight || - ((moveType == WhitePromotionQueen || moveType == BlackPromotionQueen) && - appData.alwaysPromoteToQueen)) - FinishMove(moveType, fromX, fromY, toX, toY, 'q'); - else - if (moveType == WhitePromotionQueen || moveType == BlackPromotionQueen ) { - DrawPosition(forceFullRepaint || FALSE, NULL); - if(gameInfo.variant == VariantSuper || gameInfo.variant == VariantGreat) - { ChessSquare p = boards[currentMove][fromY][fromX], q = boards[currentMove][toY][toX]; - // kludge to temporarily execute move on display, wthout promotng yet - promotionChoice = TRUE; - boards[currentMove][fromY][fromX] = EmptySquare; // move Pawn to 8th rank - boards[currentMove][toY][toX] = p; - DrawPosition(FALSE, boards[currentMove]); - boards[currentMove][fromY][fromX] = p; // take back, but display stays - boards[currentMove][toY][toX] = q; - appData.animate = saveAnimate; - DisplayMessage("Select piece from holdings", ""); - break; - } else - PromotionPopup(hwnd); /* [HGM] Popup now calls FinishMove */ - } else { - if(saveAnimate /* ^$!%@#$!$ */ && gameInfo.variant == VariantAtomic - && (boards[currentMove][toY][toX] != EmptySquare || - moveType == WhiteCapturesEnPassant || - moveType == BlackCapturesEnPassant ) ) - AnimateAtomicCapture(fromX, fromY, toX, toY, 20); - FinishMove(moveType, fromX, fromY, toX, toY, NULLCHAR); - } - } - if (gotPremove) SetPremoveHighlights(fromX, fromY, toX, toY); - appData.animate = saveAnimate; - fromX = fromY = -1; - if (appData.highlightDragging && !appData.highlightLastMove) { - ClearHighlights(); - } - if (appData.animate || appData.animateDragging || - appData.highlightDragging || gotPremove) { - DrawPosition(forceFullRepaint || FALSE, NULL); - } - } - dragInfo.start.x = dragInfo.start.y = -1; - dragInfo.pos = dragInfo.lastpos = dragInfo.start; + LeftClick(Release, pt.x - boardRect.left, pt.y - boardRect.top); + DrawPosition(TRUE, NULL); break; case WM_MOUSEMOVE: + if(SeekGraphClick(Press, pt.x - boardRect.left, pt.y - boardRect.top, 1)) break; + MovePV(pt.x - boardRect.left, pt.y - boardRect.top, boardRect.bottom - boardRect.top); if ((appData.animateDragging || appData.highlightDragging) - && (wParam & MK_LBUTTON) - && dragInfo.from.x >= 0) + && (wParam & MK_LBUTTON) + && dragInfo.from.x >= 0) { BOOL full_repaint = FALSE; - sameAgain = FALSE; /* [HGM] if we drag something around, do keep square selected */ if (appData.animateDragging) { - dragInfo.pos = pt; + dragInfo.pos = pt; } if (appData.highlightDragging) { - SetHighlights(fromX, fromY, x, y); + SetHighlights(fromX, fromY, x, y); if( IsDrawArrowEnabled() && (x < 0 || x >= BOARD_WIDTH || y < 0 || y >= BOARD_HEIGHT) ) { full_repaint = TRUE; } } - + DrawPosition( full_repaint, NULL); - + dragInfo.lastpos = dragInfo.pos; } break; @@ -5311,16 +3808,22 @@ MouseEvent(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) /* Mouse Wheel is being rolled forward * Play moves forward */ - if((short)HIWORD(wParam) > 0 && currentMove < forwardMostMove) - { if(lastDir == 1) ForwardEvent(); else lastDir = 1; } // [HGM] suppress first event in direction + if((short)HIWORD(wParam) > 0 && currentMove < forwardMostMove) + { if(lastDir == 1) ForwardEvent(); else lastDir = 1; } // [HGM] suppress first event in direction /* Mouse Wheel is being rolled backward * Play moves backward */ - if((short)HIWORD(wParam) < 0 && currentMove > backwardMostMove) - { if(lastDir == -1) BackwardEvent(); else lastDir = -1; } + if((short)HIWORD(wParam) < 0 && currentMove > backwardMostMove) + { if(lastDir == -1) BackwardEvent(); else lastDir = -1; } } break; + case WM_MBUTTONUP: + case WM_RBUTTONUP: + ReleaseCapture(); + RightClick(Release, pt.x - boardRect.left, pt.y - boardRect.top, &fromX, &fromY); + break; + case WM_MBUTTONDOWN: case WM_RBUTTONDOWN: ErrorPopDown(); @@ -5343,54 +3846,32 @@ MouseEvent(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) } DrawPosition(TRUE, NULL); - switch (gameMode) { - case EditPosition: - case IcsExamining: - if (x < 0 || y < 0) break; - fromX = x; - fromY = y; + menuNr = RightClick(Press, pt.x - boardRect.left, pt.y - boardRect.top, &fromX, &fromY); + switch (menuNr) { + case 0: if (message == WM_MBUTTONDOWN) { - buttonCount = 3; /* even if system didn't think so */ - if (wParam & MK_SHIFT) - MenuPopup(hwnd, pt, LoadMenu(hInst, "BlackPieceMenu"), -1); - else - MenuPopup(hwnd, pt, LoadMenu(hInst, "WhitePieceMenu"), -1); + buttonCount = 3; /* even if system didn't think so */ + if (wParam & MK_SHIFT) + MenuPopup(hwnd, pt, LoadMenu(hInst, "BlackPieceMenu"), -1); + else + MenuPopup(hwnd, pt, LoadMenu(hInst, "WhitePieceMenu"), -1); } else { /* message == WM_RBUTTONDOWN */ -#if 0 - if (buttonCount == 3) { - if (wParam & MK_SHIFT) - MenuPopup(hwnd, pt, LoadMenu(hInst, "WhitePieceMenu"), -1); - else - MenuPopup(hwnd, pt, LoadMenu(hInst, "BlackPieceMenu"), -1); - } else { - MenuPopup(hwnd, pt, LoadMenu(hInst, "PieceMenu"), -1); - } -#else - /* Just have one menu, on the right button. Windows users don't - think to try the middle one, and sometimes other software steals - it, or it doesn't really exist. */ + /* Just have one menu, on the right button. Windows users don't + think to try the middle one, and sometimes other software steals + it, or it doesn't really exist. */ if(gameInfo.variant != VariantShogi) MenuPopup(hwnd, pt, LoadMenu(hInst, "PieceMenu"), -1); else MenuPopup(hwnd, pt, LoadMenu(hInst, "ShogiPieceMenu"), -1); -#endif } break; - case IcsPlayingWhite: - case IcsPlayingBlack: - case EditGame: - case MachinePlaysWhite: - case MachinePlaysBlack: - if (appData.testLegality && - gameInfo.variant != VariantBughouse && - gameInfo.variant != VariantCrazyhouse) break; - if (x < 0 || y < 0) break; - fromX = x; - fromY = y; + case 2: + SetCapture(hwndMain); + break; + case 1: hmenu = LoadMenu(hInst, "DropPieceMenu"); SetupDropMenu(hmenu); MenuPopup(hwnd, pt, hmenu, -1); - break; default: break; } @@ -5428,14 +3909,14 @@ ButtonProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) return TRUE; default: if (appData.icsActive && (isalpha((char)wParam) || wParam == '0')) { - // [HGM] movenum: only letters or leading zero should go to ICS input + // [HGM] movenum: only letters or leading zero should go to ICS input HWND h = GetDlgItem(hwndConsole, OPT_ConsoleInput); - if (IsIconic(hwndConsole)) ShowWindow(hwndConsole, SW_RESTORE); - SetFocus(h); - SendMessage(h, WM_CHAR, wParam, lParam); - return TRUE; + if (IsIconic(hwndConsole)) ShowWindow(hwndConsole, SW_RESTORE); + SetFocus(h); + SendMessage(h, WM_CHAR, wParam, lParam); + return TRUE; } else if (isalpha((char)wParam) || isdigit((char)wParam)){ - PopUpMoveDialog((char)wParam); + PopUpMoveDialog((char)wParam); } break; } @@ -5454,39 +3935,39 @@ Promotion(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) case WM_INITDIALOG: /* message: initialize dialog box */ /* Center the dialog over the application window */ CenterWindow(hDlg, GetWindow(hDlg, GW_OWNER)); - ShowWindow(GetDlgItem(hDlg, PB_King), + ShowWindow(GetDlgItem(hDlg, PB_King), (!appData.testLegality || gameInfo.variant == VariantSuicide || gameInfo.variant == VariantGiveaway || gameInfo.variant == VariantSuper ) ? - SW_SHOW : SW_HIDE); + SW_SHOW : SW_HIDE); /* [HGM] Only allow C & A promotions if these pieces are defined */ ShowWindow(GetDlgItem(hDlg, PB_Archbishop), ((PieceToChar(WhiteAngel) >= 'A' && PieceToChar(WhiteAngel) != '~') || (PieceToChar(BlackAngel) >= 'A' && PieceToChar(BlackAngel) != '~') ) ? - SW_SHOW : SW_HIDE); - ShowWindow(GetDlgItem(hDlg, PB_Chancellor), + SW_SHOW : SW_HIDE); + ShowWindow(GetDlgItem(hDlg, PB_Chancellor), ((PieceToChar(WhiteMarshall) >= 'A' && PieceToChar(WhiteMarshall) != '~') || (PieceToChar(BlackMarshall) >= 'A' && PieceToChar(BlackMarshall) != '~') ) ? - SW_SHOW : SW_HIDE); + SW_SHOW : SW_HIDE); /* [HGM] Hide B & R button in Shogi, use Q as promote, N as defer */ ShowWindow(GetDlgItem(hDlg, PB_Rook), gameInfo.variant != VariantShogi ? - SW_SHOW : SW_HIDE); - ShowWindow(GetDlgItem(hDlg, PB_Bishop), + SW_SHOW : SW_HIDE); + ShowWindow(GetDlgItem(hDlg, PB_Bishop), gameInfo.variant != VariantShogi ? - SW_SHOW : SW_HIDE); - ShowWindow(GetDlgItem(hDlg, IDC_Yes), + SW_SHOW : SW_HIDE); + ShowWindow(GetDlgItem(hDlg, IDC_Yes), gameInfo.variant == VariantShogi ? - SW_SHOW : SW_HIDE); - ShowWindow(GetDlgItem(hDlg, IDC_No), + SW_SHOW : SW_HIDE); + ShowWindow(GetDlgItem(hDlg, IDC_No), gameInfo.variant == VariantShogi ? - SW_SHOW : SW_HIDE); - ShowWindow(GetDlgItem(hDlg, IDC_Centaur), + SW_SHOW : SW_HIDE); + ShowWindow(GetDlgItem(hDlg, IDC_Centaur), gameInfo.variant == VariantSuper ? - SW_SHOW : SW_HIDE); + SW_SHOW : SW_HIDE); return TRUE; case WM_COMMAND: /* message: received a command */ @@ -5525,7 +4006,8 @@ Promotion(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) only show the popup when we are already sure the move is valid or legal. We pass a faulty move type, but the kludge is that FinishMove will figure out it is a promotion from the promoChar. */ - FinishMove(NormalMove, fromX, fromY, toX, toY, promoChar); + UserMoveEvent(fromX, fromY, toX, toY, promoChar); + fromX = fromY = -1; if (!appData.highlightLastMove) { ClearHighlights(); DrawPosition(FALSE, NULL); @@ -5547,6 +4029,13 @@ PromotionPopup(HWND hwnd) FreeProcInstance(lpProc); } +void +PromotionPopUp() +{ + DrawPosition(TRUE, NULL); + PromotionPopup(hwndMain); +} + /* Toggle ShowThinking */ VOID ToggleShowThinking() @@ -5562,9 +4051,9 @@ LoadGameDialog(HWND hwnd, char* title) FILE *f; char fileTitle[MSG_SIZ]; f = OpenFileDialog(hwnd, "rb", "", - appData.oldSaveStyle ? "gam" : "pgn", - GAME_FILT, - title, &number, fileTitle, NULL); + appData.oldSaveStyle ? "gam" : "pgn", + GAME_FILT, + title, &number, fileTitle, NULL); if (f != NULL) { cmailMsgLoaded = FALSE; if (number == 0) { @@ -5573,7 +4062,7 @@ LoadGameDialog(HWND hwnd, char* title) DisplayError("Cannot build game list", error); } else if (!ListEmpty(&gameList) && ((ListGame *) gameList.tailPred)->number > 1) { - GameListPopUp(f, fileTitle); + GameListPopUp(f, fileTitle); return; } GameListDestroy(); @@ -5583,6 +4072,57 @@ LoadGameDialog(HWND hwnd, char* title) } } +int get_term_width() +{ + HDC hdc; + TEXTMETRIC tm; + RECT rc; + HFONT hfont, hold_font; + LOGFONT lf; + HWND hText; + + if (hwndConsole) + hText = GetDlgItem(hwndConsole, OPT_ConsoleText); + else + return 79; + + // get the text metrics + hdc = GetDC(hText); + lf = font[boardSize][CONSOLE_FONT]->lf; + if (consoleCF.dwEffects & CFE_BOLD) + lf.lfWeight = FW_BOLD; + if (consoleCF.dwEffects & CFE_ITALIC) + lf.lfItalic = TRUE; + if (consoleCF.dwEffects & CFE_STRIKEOUT) + lf.lfStrikeOut = TRUE; + if (consoleCF.dwEffects & CFE_UNDERLINE) + lf.lfUnderline = TRUE; + hfont = CreateFontIndirect(&lf); + hold_font = SelectObject(hdc, hfont); + GetTextMetrics(hdc, &tm); + SelectObject(hdc, hold_font); + DeleteObject(hfont); + ReleaseDC(hText, hdc); + + // get the rectangle + SendMessage(hText, EM_GETRECT, 0, (LPARAM)&rc); + + return (rc.right-rc.left) / tm.tmAveCharWidth; +} + +void UpdateICSWidth(HWND hText) +{ + LONG old_width, new_width; + + new_width = get_term_width(hText, FALSE); + old_width = GetWindowLong(hText, GWL_USERDATA); + if (new_width != old_width) + { + ics_update_width(new_width); + SetWindowLong(hText, GWL_USERDATA, new_width); + } +} + VOID ChangedConsoleFont() { @@ -5603,16 +4143,16 @@ ChangedConsoleFont() cfmt.yHeight = (int)(f->mfp.pointSize * 20.0 + 0.5); cfmt.bCharSet = f->lf.lfCharSet; cfmt.bPitchAndFamily = f->lf.lfPitchAndFamily; - SendMessage(hText, EM_SETCHARFORMAT, SCF_ALL, (LPARAM) &cfmt); - SendMessage(hInput, EM_SETCHARFORMAT, SCF_ALL, (LPARAM) &cfmt); + SendMessage(hText, EM_SETCHARFORMAT, SCF_ALL, (LPARAM) &cfmt); + SendMessage(hInput, EM_SETCHARFORMAT, SCF_ALL, (LPARAM) &cfmt); /* Why are the following seemingly needed too? */ - SendMessage(hText, EM_SETCHARFORMAT, SCF_DEFAULT, (LPARAM) &cfmt); - SendMessage(hInput, EM_SETCHARFORMAT, SCF_DEFAULT, (LPARAM) &cfmt); + SendMessage(hText, EM_SETCHARFORMAT, SCF_DEFAULT, (LPARAM) &cfmt); + SendMessage(hInput, EM_SETCHARFORMAT, SCF_DEFAULT, (LPARAM) &cfmt); SendMessage(hText, EM_EXGETSEL, 0, (LPARAM)&sel); tmpsel.cpMin = 0; tmpsel.cpMax = -1; /*999999?*/ SendMessage(hText, EM_EXSETSEL, 0, (LPARAM)&tmpsel); - SendMessage(hText, EM_SETCHARFORMAT, SCF_SELECTION, (LPARAM) &cfmt); + SendMessage(hText, EM_SETCHARFORMAT, SCF_SELECTION, (LPARAM) &cfmt); /* Trying putting this here too. It still seems to tickle a RichEdit * bug: sometimes RichEdit indents the first line of a paragraph too. */ @@ -5622,6 +4162,7 @@ ChangedConsoleFont() paraf.dxOffset = WRAP_INDENT; SendMessage(hText, EM_SETPARAFORMAT, 0, (LPARAM) ¶f); SendMessage(hText, EM_EXSETSEL, 0, (LPARAM)&sel); + UpdateICSWidth(hText); } /*---------------------------------------------------------------------------*\ @@ -5672,20 +4213,20 @@ WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) JAWS_KB_NAVIGATION case WM_CHAR: - + JAWS_ALT_INTERCEPT - if (appData.icsActive && (char)wParam > ' ' && !((char)wParam >= '1' && (char)wParam <= '9')) { - // [HGM] movenum: for non-zero digits we always do type-in dialog - HWND h = GetDlgItem(hwndConsole, OPT_ConsoleInput); - if (IsIconic(hwndConsole)) ShowWindow(hwndConsole, SW_RESTORE); - SetFocus(h); - SendMessage(h, message, wParam, lParam); + if (appData.icsActive && ((char)wParam == '\r' || (char)wParam > ' ' && !((char)wParam >= '1' && (char)wParam <= '9'))) { + // [HGM] movenum: for non-zero digits we always do type-in dialog + HWND h = GetDlgItem(hwndConsole, OPT_ConsoleInput); + if (IsIconic(hwndConsole)) ShowWindow(hwndConsole, SW_RESTORE); + SetFocus(h); + SendMessage(h, message, wParam, lParam); } else if(lParam != KF_REPEAT) { - if (isalpha((char)wParam) || isdigit((char)wParam)) { - PopUpMoveDialog((char)wParam); - } else if((char)wParam == 003) CopyGameToClipboard(); - else if((char)wParam == 026) PasteGameOrFENFromClipboard(); + if (isalpha((char)wParam) || isdigit((char)wParam)) { + PopUpMoveDialog((char)wParam); + } else if((char)wParam == 003) CopyGameToClipboard(); + else if((char)wParam == 026) PasteGameOrFENFromClipboard(); } break; @@ -5697,12 +4238,8 @@ WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) SelectPalette(hdc, hPal, TRUE); nnew = RealizePalette(hdc); if (nnew > 0) { - paletteChanged = TRUE; -#if 0 - UpdateColors(hdc); -#else - InvalidateRect(hwnd, &boardRect, FALSE);/*faster!*/ -#endif + paletteChanged = TRUE; + InvalidateRect(hwnd, &boardRect, FALSE); } ReleaseDC(hwnd, hdc); } @@ -5716,7 +4253,7 @@ WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) SelectPalette(hdc, hPal, FALSE); nnew = RealizePalette(hdc); if (nnew > 0) { - InvalidateRect(hwnd, &boardRect, FALSE); + InvalidateRect(hwnd, &boardRect, FALSE); } ReleaseDC(hwnd, hdc); return TRUE; @@ -5730,14 +4267,12 @@ WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) switch (wmId) { case IDM_NewGame: ResetGameEvent(); - AnalysisPopDown(); SAY("new game enter a move to play against the computer with white"); break; case IDM_NewGameFRC: if( NewGameFRC() == 0 ) { ResetGameEvent(); - AnalysisPopDown(); } break; @@ -5767,11 +4302,11 @@ WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) } number = 1; f = OpenFileDialog(hwnd, "rb", "", - appData.oldSaveStyle ? "pos" : "fen", - POSITION_FILT, - "Load Position from File", &number, fileTitle, NULL); + appData.oldSaveStyle ? "pos" : "fen", + POSITION_FILT, + "Load Position from File", &number, fileTitle, NULL); if (f != NULL) { - LoadPosition(f, number, fileTitle); + LoadPosition(f, number, fileTitle); } break; @@ -5790,33 +4325,33 @@ WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) case IDM_SaveGame: defName = DefaultFileName(appData.oldSaveStyle ? "gam" : "pgn"); f = OpenFileDialog(hwnd, "a", defName, - appData.oldSaveStyle ? "gam" : "pgn", - GAME_FILT, - "Save Game to File", NULL, fileTitle, NULL); + appData.oldSaveStyle ? "gam" : "pgn", + GAME_FILT, + "Save Game to File", NULL, fileTitle, NULL); if (f != NULL) { - SaveGame(f, 0, ""); + SaveGame(f, 0, ""); } break; case IDM_SavePosition: defName = DefaultFileName(appData.oldSaveStyle ? "pos" : "fen"); f = OpenFileDialog(hwnd, "a", defName, - appData.oldSaveStyle ? "pos" : "fen", - POSITION_FILT, - "Save Position to File", NULL, fileTitle, NULL); + appData.oldSaveStyle ? "pos" : "fen", + POSITION_FILT, + "Save Position to File", NULL, fileTitle, NULL); if (f != NULL) { - SavePosition(f, 0, ""); + SavePosition(f, 0, ""); } break; case IDM_SaveDiagram: defName = "diagram"; f = OpenFileDialog(hwnd, "wb", defName, - "bmp", - DIAGRAM_FILT, - "Save Diagram to File", NULL, fileTitle, NULL); + "bmp", + DIAGRAM_FILT, + "Save Diagram to File", NULL, fileTitle, NULL); if (f != NULL) { - SaveDiagram(f); + SaveDiagram(f); } break; @@ -5854,7 +4389,7 @@ WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) } else { EvalGraphPopUp(); - SetFocus(hwndMain); + SetFocus(hwndMain); } break; @@ -5921,10 +4456,10 @@ WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) * refresh the tags dialog only if it's visible */ if (gameMode == MachinePlaysWhite && IsWindowVisible(editTagsDialog)) { - char *tags; - tags = PGNTags(&gameInfo); - TagsPopUp(tags, CmailMsg()); - free(tags); + char *tags; + tags = PGNTags(&gameInfo); + TagsPopUp(tags, CmailMsg()); + free(tags); } SAY("computer starts playing white"); break; @@ -5935,10 +4470,10 @@ WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) * refresh the tags dialog only if it's visible */ if (gameMode == MachinePlaysBlack && IsWindowVisible(editTagsDialog)) { - char *tags; - tags = PGNTags(&gameInfo); - TagsPopUp(tags, CmailMsg()); - free(tags); + char *tags; + tags = PGNTags(&gameInfo); + TagsPopUp(tags, CmailMsg()); + free(tags); } SAY("computer starts playing black"); break; @@ -5949,10 +4484,10 @@ WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) * refresh the tags dialog only if it's visible */ if (gameMode == TwoMachinesPlay && IsWindowVisible(editTagsDialog)) { - char *tags; - tags = PGNTags(&gameInfo); - TagsPopUp(tags, CmailMsg()); - free(tags); + char *tags; + tags = PGNTags(&gameInfo); + TagsPopUp(tags, CmailMsg()); + free(tags); } SAY("programs start playing each other"); break; @@ -5962,7 +4497,7 @@ WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) sprintf(buf, "%s does not support analysis", first.tidy); DisplayError(buf, 0); } else { - SAY("analyzing current position"); + SAY("analyzing current position"); /* [DM] icsEngineAnlyze [HGM] Why is this front-end??? */ if (appData.icsActive) { if (gameMode != IcsObserving) { @@ -5970,7 +4505,7 @@ WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) DisplayError(buf, 0); /* secure check */ if (appData.icsEngineAnalyze) { - if (appData.debugMode) + if (appData.debugMode) fprintf(debugFP, "Found unexpected active ICS engine analyze \n"); ExitAnalyzeMode(); ModeHighlight(); @@ -5987,9 +4522,9 @@ WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) appData.icsEngineAnalyze = TRUE; if (appData.debugMode) fprintf(debugFP, "ICS engine analyze starting...\n"); } - } - if (!appData.showThinking) ToggleShowThinking(); - AnalyzeModeEvent(); + } + if (!appData.showThinking) ToggleShowThinking(); + AnalyzeModeEvent(); } break; @@ -5999,10 +4534,10 @@ WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) sprintf(buf, "%s does not support analysis", first.tidy); DisplayError(buf, 0); } else { - if (!appData.showThinking) ToggleShowThinking(); - AnalyzeFileEvent(); - LoadGameDialog(hwnd, "Analyze Game from File"); - AnalysisPeriodicEvent(1); + if (!appData.showThinking) ToggleShowThinking(); + AnalyzeFileEvent(); + LoadGameDialog(hwnd, "Analyze Game from File"); + AnalysisPeriodicEvent(1); } break; @@ -6033,10 +4568,10 @@ WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) break; case IDM_EditComment: - if (commentDialogUp && editComment) { - CommentPopDown(); + if (commentUp && editComment) { + CommentPopDown(); } else { - EditCommentEvent(); + EditCommentEvent(); } break; @@ -6143,8 +4678,8 @@ WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) case IDM_MuteSounds: mute = !mute; // [HGM] mute: keep track of global muting variable - CheckMenuItem(GetMenu(hwndMain),IDM_MuteSounds, - MF_BYCOMMAND|(mute?MF_CHECKED:MF_UNCHECKED)); + CheckMenuItem(GetMenu(hwndMain),IDM_MuteSounds, + MF_BYCOMMAND|(mute?MF_CHECKED:MF_UNCHECKED)); break; case IDM_GeneralOptions: @@ -6207,8 +4742,8 @@ WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) case IDM_SaveSettingsOnExit: saveSettingsOnExit = !saveSettingsOnExit; (void) CheckMenuItem(GetMenu(hwndMain), IDM_SaveSettingsOnExit, - MF_BYCOMMAND|(saveSettingsOnExit ? - MF_CHECKED : MF_UNCHECKED)); + MF_BYCOMMAND|(saveSettingsOnExit ? + MF_CHECKED : MF_UNCHECKED)); break; case IDM_Hint: @@ -6226,59 +4761,59 @@ WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) case IDM_Debug: appData.debugMode = !appData.debugMode; if (appData.debugMode) { - char dir[MSG_SIZ]; - GetCurrentDirectory(MSG_SIZ, dir); - SetCurrentDirectory(installDir); - debugFP = fopen(appData.nameOfDebugFile, "w"); + char dir[MSG_SIZ]; + GetCurrentDirectory(MSG_SIZ, dir); + SetCurrentDirectory(installDir); + debugFP = fopen(appData.nameOfDebugFile, "w"); SetCurrentDirectory(dir); setbuf(debugFP, NULL); } else { - fclose(debugFP); + fclose(debugFP); debugFP = NULL; } break; case IDM_HELPCONTENTS: if (!MyHelp (hwnd, "winboard.hlp", HELP_KEY,(DWORD)(LPSTR)"CONTENTS") && - !HtmlHelp(hwnd, "winboard.chm", 0, 0) ) { - MessageBox (GetFocus(), - "Unable to activate help", - szAppName, MB_SYSTEMMODAL|MB_OK|MB_ICONHAND); + !HtmlHelp(hwnd, "winboard.chm", 0, 0) ) { + MessageBox (GetFocus(), + "Unable to activate help", + szAppName, MB_SYSTEMMODAL|MB_OK|MB_ICONHAND); } break; case IDM_HELPSEARCH: if (!MyHelp (hwnd, "winboard.hlp", HELP_PARTIALKEY, (DWORD)(LPSTR)"") && - !HtmlHelp(hwnd, "winboard.chm", 0, 0) ) { - MessageBox (GetFocus(), - "Unable to activate help", - szAppName, MB_SYSTEMMODAL|MB_OK|MB_ICONHAND); + !HtmlHelp(hwnd, "winboard.chm", 0, 0) ) { + MessageBox (GetFocus(), + "Unable to activate help", + szAppName, MB_SYSTEMMODAL|MB_OK|MB_ICONHAND); } break; case IDM_HELPHELP: if(!WinHelp(hwnd, (LPSTR)NULL, HELP_HELPONHELP, 0)) { - MessageBox (GetFocus(), - "Unable to activate help", - szAppName, MB_SYSTEMMODAL|MB_OK|MB_ICONHAND); + MessageBox (GetFocus(), + "Unable to activate help", + szAppName, MB_SYSTEMMODAL|MB_OK|MB_ICONHAND); } break; case IDM_ABOUT: lpProc = MakeProcInstance((FARPROC)About, hInst); - DialogBox(hInst, - (gameInfo.event && strcmp(gameInfo.event, "Easter Egg Hunt") == 0) ? - "AboutBox2" : "AboutBox", hwnd, (DLGPROC)lpProc); + DialogBox(hInst, + (gameInfo.event && strcmp(gameInfo.event, "Easter Egg Hunt") == 0) ? + "AboutBox2" : "AboutBox", hwnd, (DLGPROC)lpProc); FreeProcInstance(lpProc); break; case IDM_DirectCommand1: AskQuestionEvent("Direct Command", - "Send to chess program:", "", "1"); + "Send to chess program:", "", "1"); break; case IDM_DirectCommand2: AskQuestionEvent("Direct Command", - "Send to second chess program:", "", "2"); + "Send to second chess program:", "", "2"); break; case EP_WhitePawn: @@ -6476,10 +5011,10 @@ WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) case ANALYSIS_TIMER_ID: if ((gameMode == AnalyzeMode || gameMode == AnalyzeFile || appData.icsEngineAnalyze) && appData.periodicUpdates) { - AnalysisPeriodicEvent(0); + AnalysisPeriodicEvent(0); } else { - KillTimer(hwnd, analysisTimerEvent); - analysisTimerEvent = 0; + KillTimer(hwnd, analysisTimerEvent); + analysisTimerEvent = 0; } break; case DELAYED_TIMER_ID: @@ -6505,18 +5040,18 @@ WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) RECT rcMain; // GetWindowRect( hwnd, &rcMain ); //[HGM] sticky: in XP this returned new position, not old - rcMain.left = boardX; // replace by these 4 lines to reconstruct old rect - rcMain.right = boardX + winWidth; - rcMain.top = boardY; - rcMain.bottom = boardY + winHeight; - + rcMain.left = wpMain.x; // replace by these 4 lines to reconstruct old rect + rcMain.right = wpMain.x + wpMain.width; + rcMain.top = wpMain.y; + rcMain.bottom = wpMain.y + wpMain.height; + ReattachAfterMove( &rcMain, lpwp->x, lpwp->y, moveHistoryDialog, &wpMoveHistory ); ReattachAfterMove( &rcMain, lpwp->x, lpwp->y, evalGraphDialog, &wpEvalGraph ); ReattachAfterMove( &rcMain, lpwp->x, lpwp->y, engineOutputDialog, &wpEngineOutput ); ReattachAfterMove( &rcMain, lpwp->x, lpwp->y, gameListDialog, &wpGameList ); ReattachAfterMove( &rcMain, lpwp->x, lpwp->y, hwndConsole, &wpConsole ); - boardX = lpwp->x; - boardY = lpwp->y; + wpMain.x = lpwp->x; + wpMain.y = lpwp->y; } } break; @@ -6566,7 +5101,7 @@ WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) } break; - default: /* Passes it on if unprocessed */ + default: /* Passes it on if unprocessed */ return (DefWindowProc(hwnd, message, wParam, lParam)); } return 0; @@ -6598,8 +5133,8 @@ mysrandom(unsigned int seed) } -/* - * returns TRUE if user selects a different color, FALSE otherwise +/* + * returns TRUE if user selects a different color, FALSE otherwise */ BOOL @@ -6709,7 +5244,7 @@ MyPlaySound(MySound *ms) if(mute) return TRUE; // [HGM] mute: suppress all sound play when muted switch (ms->name[0]) { case NULLCHAR: - if(appData.debugMode) fprintf(debugFP, "silence\n"); + if(appData.debugMode) fprintf(debugFP, "silence\n"); /* Silence */ ok = TRUE; break; @@ -6720,7 +5255,7 @@ MyPlaySound(MySound *ms) ok = PlaySound(ms->name + 1, NULL, SND_ALIAS|SND_ASYNC); } if (!ok) ok = MessageBeep(MB_OK); - break; + break; case '!': /* Builtin wave resource, or "!" alone for silence */ if (ms->name[1]) { @@ -6739,13 +5274,6 @@ MyPlaySound(MySound *ms) /* Don't print an error: this can happen innocently if the sound driver is busy; for instance, if another instance of WinBoard is playing a sound at about the same time. */ -#if 0 - if (!ok) { - char buf[MSG_SIZ]; - sprintf(buf, "Error playing sound %s", ms->name); - DisplayError(buf, GetLastError()); - } -#endif return ok; } @@ -6803,8 +5331,8 @@ OpenFileHook(HWND hdlg, UINT uiMsg, WPARAM wParam, LPARAM lParam) FILE * OpenFileDialog(HWND hwnd, char *write, char *defName, char *defExt, // [HGM] diag: type of 'write' now string - char *nameFilt, char *dlgTitle, UINT *number, - char fileTitle[MSG_SIZ], char fileName[MSG_SIZ]) + char *nameFilt, char *dlgTitle, UINT *number, + char fileTitle[MSG_SIZ], char fileName[MSG_SIZ]) { OPENFILENAME openFileName; char buf1[MSG_SIZ]; @@ -6833,8 +5361,8 @@ OpenFileDialog(HWND hwnd, char *write, char *defName, char *defExt, // [HGM] dia openFileName.nMaxFileTitle = fileTitle ? MSG_SIZ : 0; openFileName.lpstrInitialDir = NULL; openFileName.lpstrTitle = dlgTitle; - openFileName.Flags = OFN_PATHMUSTEXIST | OFN_HIDEREADONLY - | (write[0] != 'r' ? 0 : OFN_FILEMUSTEXIST) + openFileName.Flags = OFN_PATHMUSTEXIST | OFN_HIDEREADONLY + | (write[0] != 'r' ? 0 : OFN_FILEMUSTEXIST) | (number ? OFN_ENABLETEMPLATE | OFN_ENABLEHOOK: 0) | (oldDialog ? 0 : OFN_EXPLORER); openFileName.nFileOffset = 0; @@ -6845,13 +5373,13 @@ OpenFileDialog(HWND hwnd, char *write, char *defName, char *defExt, // [HGM] dia (LPOFNHOOKPROC) OldOpenFileHook : (LPOFNHOOKPROC) OpenFileHook; openFileName.lpTemplateName = (LPSTR)(oldDialog ? 1536 : DLG_IndexNumber); - if (write[0] != 'r' ? GetSaveFileName(&openFileName) : + if (write[0] != 'r' ? GetSaveFileName(&openFileName) : GetOpenFileName(&openFileName)) { /* open the file */ f = fopen(openFileName.lpstrFile, write); if (f == NULL) { MessageBox(hwnd, "File open failed", NULL, - MB_OK|MB_ICONEXCLAMATION); + MB_OK|MB_ICONEXCLAMATION); return NULL; } } else { @@ -6867,7 +5395,7 @@ OpenFileDialog(HWND hwnd, char *write, char *defName, char *defExt, // [HGM] dia VOID APIENTRY MenuPopup(HWND hwnd, POINT pt, HMENU hmenu, UINT def) { - HMENU hmenuTrackPopup; /* floating pop-up menu */ + HMENU hmenuTrackPopup; /* floating pop-up menu */ /* * Get the first pop-up menu in the menu template. This is the @@ -6885,12 +5413,12 @@ MenuPopup(HWND hwnd, POINT pt, HMENU hmenu, UINT def) /* Draw and track the floating pop-up menu. */ TrackPopupMenu(hmenuTrackPopup, TPM_CENTERALIGN | TPM_RIGHTBUTTON, - pt.x, pt.y, 0, hwnd, NULL); + pt.x, pt.y, 0, hwnd, NULL); /* Destroy the menu.*/ DestroyMenu(hmenu); } - + typedef struct { HWND hDlg, hText; int sizeX, sizeY, newSizeX, newSizeY; @@ -6909,7 +5437,7 @@ ResizeEditPlusButtonsCallback(HWND hChild, LPARAM lparam) pt.x = rect.left + (cl->newSizeX - cl->sizeX)/2; pt.y = rect.top + cl->newSizeY - cl->sizeY; ScreenToClient(cl->hDlg, &pt); - cl->hdwp = DeferWindowPos(cl->hdwp, hChild, NULL, + cl->hdwp = DeferWindowPos(cl->hdwp, hChild, NULL, pt.x, pt.y, rect.right - rect.left, rect.bottom - rect.top, SWP_NOZORDER); return TRUE; } @@ -6922,10 +5450,10 @@ ResizeEditPlusButtons(HWND hDlg, HWND hText, int sizeX, int sizeY, int newSizeX, RECT rectText; int newTextHeight, newTextWidth; ResizeEditPlusButtonsClosure cl; - + /*if (IsIconic(hDlg)) return;*/ if (newSizeX == sizeX && newSizeY == sizeY) return; - + cl.hdwp = BeginDeferWindowPos(8); GetWindowRect(hText, &rectText); /* gives screen coords */ @@ -6935,7 +5463,7 @@ ResizeEditPlusButtons(HWND hDlg, HWND hText, int sizeX, int sizeY, int newSizeX, newSizeY += -newTextHeight; newTextHeight = 0; } - cl.hdwp = DeferWindowPos(cl.hdwp, hText, NULL, 0, 0, + cl.hdwp = DeferWindowPos(cl.hdwp, hText, NULL, 0, 0, newTextWidth, newTextHeight, SWP_NOZORDER|SWP_NOMOVE); cl.hDlg = hDlg; @@ -6975,9 +5503,9 @@ BOOL CenterWindowEx(HWND hwndChild, HWND hwndParent, int mode) /* Calculate new X position, then adjust for screen */ xNew = rParent.left + ((wParent - wChild) /2); if (xNew < 0) { - xNew = 0; + xNew = 0; } else if ((xNew+wChild) > wScreen) { - xNew = wScreen - wChild; + xNew = wScreen - wChild; } /* Calculate new Y position, then adjust for screen */ @@ -6989,14 +5517,14 @@ BOOL CenterWindowEx(HWND hwndChild, HWND hwndParent, int mode) } if (yNew < 0) { - yNew = 0; + yNew = 0; } else if ((yNew+hChild) > hScreen) { - yNew = hScreen - hChild; + yNew = hScreen - hChild; } /* Set it, and return */ return SetWindowPos (hwndChild, NULL, - xNew, yNew, 0, 0, SWP_NOSIZE | SWP_NOZORDER); + xNew, yNew, 0, 0, SWP_NOSIZE | SWP_NOZORDER); } /* Center one window over another */ @@ -7024,7 +5552,7 @@ InitComboStrings(HANDLE hwndCombo, char **cd) void InitComboStringsFromOption(HANDLE hwndCombo, char *str) { - char buf1[ARG_MAX]; + char buf1[MAX_ARG_LEN]; int len; if (str[0] == '@') { @@ -7121,13 +5649,13 @@ StartupDialog(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) CenterWindow (hDlg, GetDesktopWindow()); /* Initialize the dialog items */ InitEngineBox(hDlg, GetDlgItem(hDlg, OPT_ChessEngineName), - appData.firstChessProgram, "fd", appData.firstDirectory, - firstChessProgramNames); + appData.firstChessProgram, "fd", appData.firstDirectory, + firstChessProgramNames); InitEngineBox(hDlg, GetDlgItem(hDlg, OPT_SecondChessEngineName), - appData.secondChessProgram, "sd", appData.secondDirectory, - secondChessProgramNames); + appData.secondChessProgram, "sd", appData.secondDirectory, + secondChessProgramNames); hwndCombo = GetDlgItem(hDlg, OPT_ChessServerName); - InitComboStringsFromOption(hwndCombo, icsNames); + InitComboStringsFromOption(hwndCombo, icsNames); sprintf(buf, "%s /icsport=%s", appData.icsHost, appData.icsPort); if (*appData.icsHelper != NULLCHAR) { char *q = QuoteForFilename(appData.icsHelper); @@ -7159,38 +5687,38 @@ StartupDialog(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) case IDOK: if (IsDlgButtonChecked(hDlg, OPT_ChessEngine)) { strcpy(buf, "/fcp="); - GetDlgItemText(hDlg, OPT_ChessEngineName, buf + strlen(buf), sizeof(buf) - strlen(buf)); + GetDlgItemText(hDlg, OPT_ChessEngineName, buf + strlen(buf), sizeof(buf) - strlen(buf)); p = buf; - ParseArgs(StringGet, &p); + ParseArgs(StringGet, &p); strcpy(buf, "/scp="); - GetDlgItemText(hDlg, OPT_SecondChessEngineName, buf + strlen(buf), sizeof(buf) - strlen(buf)); + GetDlgItemText(hDlg, OPT_SecondChessEngineName, buf + strlen(buf), sizeof(buf) - strlen(buf)); p = buf; - ParseArgs(StringGet, &p); - appData.noChessProgram = FALSE; - appData.icsActive = FALSE; + ParseArgs(StringGet, &p); + appData.noChessProgram = FALSE; + appData.icsActive = FALSE; } else if (IsDlgButtonChecked(hDlg, OPT_ChessServer)) { strcpy(buf, "/ics /icshost="); - GetDlgItemText(hDlg, OPT_ChessServerName, buf + strlen(buf), sizeof(buf) - strlen(buf)); + GetDlgItemText(hDlg, OPT_ChessServerName, buf + strlen(buf), sizeof(buf) - strlen(buf)); p = buf; - ParseArgs(StringGet, &p); - if (appData.zippyPlay) { - strcpy(buf, "/fcp="); - GetDlgItemText(hDlg, OPT_ChessEngineName, buf + strlen(buf), sizeof(buf) - strlen(buf)); - p = buf; - ParseArgs(StringGet, &p); - } + ParseArgs(StringGet, &p); + if (appData.zippyPlay) { + strcpy(buf, "/fcp="); + GetDlgItemText(hDlg, OPT_ChessEngineName, buf + strlen(buf), sizeof(buf) - strlen(buf)); + p = buf; + ParseArgs(StringGet, &p); + } } else if (IsDlgButtonChecked(hDlg, OPT_View)) { - appData.noChessProgram = TRUE; - appData.icsActive = FALSE; + appData.noChessProgram = TRUE; + appData.icsActive = FALSE; } else { - MessageBox(hDlg, "Choose an option, or cancel to exit", - "Option Error", MB_OK|MB_ICONEXCLAMATION); - return TRUE; + MessageBox(hDlg, "Choose an option, or cancel to exit", + "Option Error", MB_OK|MB_ICONEXCLAMATION); + return TRUE; } if (IsDlgButtonChecked(hDlg, OPT_AnyAdditional)) { - GetDlgItemText(hDlg, OPT_AdditionalOptions, buf, sizeof(buf)); - p = buf; - ParseArgs(StringGet, &p); + GetDlgItemText(hDlg, OPT_AdditionalOptions, buf, sizeof(buf)); + p = buf; + ParseArgs(StringGet, &p); } EndDialog(hDlg, TRUE); return TRUE; @@ -7201,9 +5729,9 @@ StartupDialog(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) case IDM_HELPCONTENTS: if (!WinHelp (hDlg, "winboard.hlp", HELP_KEY,(DWORD)(LPSTR)"CONTENTS")) { - MessageBox (GetFocus(), - "Unable to activate help", - szAppName, MB_SYSTEMMODAL|MB_OK|MB_ICONHAND); + MessageBox (GetFocus(), + "Unable to activate help", + szAppName, MB_SYSTEMMODAL|MB_OK|MB_ICONHAND); } break; @@ -7236,7 +5764,7 @@ About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) case WM_COMMAND: /* message: received a command */ if (LOWORD(wParam) == IDOK /* "OK" box selected? */ - || LOWORD(wParam) == IDCANCEL) { /* System menu close command? */ + || LOWORD(wParam) == IDCANCEL) { /* System menu close command? */ EndDialog(hDlg, TRUE); /* Exit the dialog */ return (TRUE); } @@ -7277,8 +5805,8 @@ CommentDialog(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) SetFocus(GetDlgItem(hDlg, IDOK)); } SendMessage(GetDlgItem(hDlg, OPT_CommentText), - WM_SETFONT, (WPARAM)font[boardSize][COMMENT_FONT]->hf, - MAKELPARAM(FALSE, 0)); + WM_SETFONT, (WPARAM)font[boardSize][COMMENT_FONT]->hf, + MAKELPARAM(FALSE, 0)); /* Size and position the dialog */ if (!commentDialog) { commentDialog = hDlg; @@ -7286,27 +5814,27 @@ CommentDialog(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) GetClientRect(hDlg, &rect); sizeX = rect.right; sizeY = rect.bottom; - if (commentX != CW_USEDEFAULT && commentY != CW_USEDEFAULT && - commentW != CW_USEDEFAULT && commentH != CW_USEDEFAULT) { - WINDOWPLACEMENT wp; - EnsureOnScreen(&commentX, &commentY, 0, 0); - wp.length = sizeof(WINDOWPLACEMENT); - wp.flags = 0; - wp.showCmd = SW_SHOW; - wp.ptMaxPosition.x = wp.ptMaxPosition.y = 0; - wp.rcNormalPosition.left = commentX; - wp.rcNormalPosition.right = commentX + commentW; - wp.rcNormalPosition.top = commentY; - wp.rcNormalPosition.bottom = commentY + commentH; - SetWindowPlacement(hDlg, &wp); - - GetClientRect(hDlg, &rect); - newSizeX = rect.right; - newSizeY = rect.bottom; + if (wpComment.x != CW_USEDEFAULT && wpComment.y != CW_USEDEFAULT && + wpComment.width != CW_USEDEFAULT && wpComment.height != CW_USEDEFAULT) { + WINDOWPLACEMENT wp; + EnsureOnScreen(&wpComment.x, &wpComment.y, 0, 0); + wp.length = sizeof(WINDOWPLACEMENT); + wp.flags = 0; + wp.showCmd = SW_SHOW; + wp.ptMaxPosition.x = wp.ptMaxPosition.y = 0; + wp.rcNormalPosition.left = wpComment.x; + wp.rcNormalPosition.right = wpComment.x + wpComment.width; + wp.rcNormalPosition.top = wpComment.y; + wp.rcNormalPosition.bottom = wpComment.y + wpComment.height; + SetWindowPlacement(hDlg, &wp); + + GetClientRect(hDlg, &rect); + newSizeX = rect.right; + newSizeY = rect.bottom; ResizeEditPlusButtons(hDlg, hwndText, sizeX, sizeY, - newSizeX, newSizeY); - sizeX = newSizeX; - sizeY = newSizeY; + newSizeX, newSizeY); + sizeX = newSizeX; + sizeY = newSizeY; } } return FALSE; @@ -7315,22 +5843,22 @@ CommentDialog(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) switch (LOWORD(wParam)) { case IDOK: if (editComment) { - char *p, *q; - /* Read changed options from the dialog box */ - hwndText = GetDlgItem(hDlg, OPT_CommentText); - len = GetWindowTextLength(hwndText); - str = (char *) malloc(len + 1); - GetWindowText(hwndText, str, len + 1); - p = q = str; - while (*q) { - if (*q == '\r') - q++; - else - *p++ = *q++; - } - *p = NULLCHAR; - ReplaceComment(commentIndex, str); - free(str); + char *p, *q; + /* Read changed options from the dialog box */ + hwndText = GetDlgItem(hDlg, OPT_CommentText); + len = GetWindowTextLength(hwndText); + str = (char *) malloc(len + 1); + GetWindowText(hwndText, str, len + 1); + p = q = str; + while (*q) { + if (*q == '\r') + q++; + else + *p++ = *q++; + } + *p = NULLCHAR; + ReplaceComment(commentIndex, str); + free(str); } CommentPopDown(); return TRUE; @@ -7396,21 +5924,21 @@ EitherCommentPopUp(int index, char *title, char *str, BOOLEAN edit) if (commentDialog) { SendMessage(commentDialog, WM_INITDIALOG, 0, 0); - if (!commentDialogUp) ShowWindow(commentDialog, SW_SHOW); + if (!commentUp) ShowWindow(commentDialog, SW_SHOW); } else { lpProc = MakeProcInstance((FARPROC)CommentDialog, hInst); CreateDialog(hInst, MAKEINTRESOURCE(DLG_EditComment), - hwndMain, (DLGPROC)lpProc); + hwndMain, (DLGPROC)lpProc); FreeProcInstance(lpProc); } - commentDialogUp = TRUE; + commentUp = TRUE; } /*---------------------------------------------------------------------------*\ * * Type-in move dialog functions - * + * \*---------------------------------------------------------------------------*/ LRESULT CALLBACK @@ -7438,40 +5966,35 @@ TypeInMoveDialog(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) case IDOK: GetDlgItemText(hDlg, OPT_Move, move, sizeof(move)); { int n; Board board; - // [HGM] FENedit - if(gameMode == EditPosition && ParseFEN(board, &n, move) ) { - EditPositionPasteFEN(move); - EndDialog(hDlg, TRUE); - return TRUE; - } - // [HGM] movenum: allow move number to be typed in any mode - if(sscanf(move, "%d", &n) == 1 && n != 0 ) { - currentMove = 2*n-1; - if(currentMove > forwardMostMove) currentMove = forwardMostMove; - if(currentMove < backwardMostMove) currentMove = backwardMostMove; - EndDialog(hDlg, TRUE); - DrawPosition(TRUE, boards[currentMove]); - if(currentMove > backwardMostMove) DisplayMove(currentMove - 1); - else DisplayMessage("", ""); - return TRUE; - } + // [HGM] FENedit + if(gameMode == EditPosition && ParseFEN(board, &n, move) ) { + EditPositionPasteFEN(move); + EndDialog(hDlg, TRUE); + return TRUE; + } + // [HGM] movenum: allow move number to be typed in any mode + if(sscanf(move, "%d", &n) == 1 && n != 0 ) { + ToNrEvent(2*n-1); + EndDialog(hDlg, TRUE); + return TRUE; + } } - if (gameMode != EditGame && currentMove != forwardMostMove && - gameMode != Training) { - DisplayMoveError("Displayed move is not current"); + if (gameMode != EditGame && currentMove != forwardMostMove && + gameMode != Training) { + DisplayMoveError("Displayed move is not current"); } else { -// GetDlgItemText(hDlg, OPT_Move, move, sizeof(move)); // moved upstream - int ok = ParseOneMove(move, gameMode == EditPosition ? blackPlaysFirst : currentMove, - &moveType, &fromX, &fromY, &toX, &toY, &promoChar); - if(!ok && move[0] >= 'a') { move[0] += 'A' - 'a'; ok = 2; } // [HGM] try also capitalized - if (ok==1 || ok && ParseOneMove(move, gameMode == EditPosition ? blackPlaysFirst : currentMove, - &moveType, &fromX, &fromY, &toX, &toY, &promoChar)) { - if (gameMode != Training) - forwardMostMove = currentMove; - UserMoveEvent(fromX, fromY, toX, toY, promoChar); - } else { - DisplayMoveError("Could not parse move"); - } +// GetDlgItemText(hDlg, OPT_Move, move, sizeof(move)); // moved upstream + int ok = ParseOneMove(move, gameMode == EditPosition ? blackPlaysFirst : currentMove, + &moveType, &fromX, &fromY, &toX, &toY, &promoChar); + if(!ok && move[0] >= 'a') { move[0] += 'A' - 'a'; ok = 2; } // [HGM] try also capitalized + if (ok==1 || ok && ParseOneMove(move, gameMode == EditPosition ? blackPlaysFirst : currentMove, + &moveType, &fromX, &fromY, &toX, &toY, &promoChar)) { + if (gameMode != Training) + forwardMostMove = currentMove; + UserMoveEvent(fromX, fromY, toX, toY, promoChar); + } else { + DisplayMoveError("Could not parse move"); + } } EndDialog(hDlg, TRUE); return TRUE; @@ -7490,19 +6013,19 @@ VOID PopUpMoveDialog(char firstchar) { FARPROC lpProc; - - if ((gameMode == BeginningOfGame && !appData.icsActive) || + + if ((gameMode == BeginningOfGame && !appData.icsActive) || gameMode == MachinePlaysWhite || gameMode == MachinePlaysBlack || - gameMode == AnalyzeMode || gameMode == EditGame || - gameMode == EditPosition || gameMode == IcsExamining || - gameMode == IcsPlayingWhite || gameMode == IcsPlayingBlack || - isdigit(firstchar) && // [HGM] movenum: allow typing in of move nr in 'passive' modes - ( gameMode == AnalyzeFile || gameMode == PlayFromGameFile || - gameMode == IcsObserving || gameMode == TwoMachinesPlay ) || - gameMode == Training) { + gameMode == AnalyzeMode || gameMode == EditGame || + gameMode == EditPosition || gameMode == IcsExamining || + gameMode == IcsPlayingWhite || gameMode == IcsPlayingBlack || + isdigit(firstchar) && // [HGM] movenum: allow typing in of move nr in 'passive' modes + ( gameMode == AnalyzeFile || gameMode == PlayFromGameFile || + gameMode == IcsObserving || gameMode == TwoMachinesPlay ) || + gameMode == Training) { lpProc = MakeProcInstance((FARPROC)TypeInMoveDialog, hInst); DialogBoxParam(hInst, MAKEINTRESOURCE(DLG_TypeInMove), - hwndMain, (DLGPROC)lpProc, (LPARAM)firstchar); + hwndMain, (DLGPROC)lpProc, (LPARAM)firstchar); FreeProcInstance(lpProc); } } @@ -7510,7 +6033,7 @@ PopUpMoveDialog(char firstchar) /*---------------------------------------------------------------------------*\ * * Type-in name dialog functions - * + * \*---------------------------------------------------------------------------*/ LRESULT CALLBACK @@ -7554,22 +6077,22 @@ VOID PopUpNameDialog(char firstchar) { FARPROC lpProc; - + lpProc = MakeProcInstance((FARPROC)TypeInNameDialog, hInst); DialogBoxParam(hInst, MAKEINTRESOURCE(DLG_TypeInName), - hwndMain, (DLGPROC)lpProc, (LPARAM)firstchar); + hwndMain, (DLGPROC)lpProc, (LPARAM)firstchar); FreeProcInstance(lpProc); } /*---------------------------------------------------------------------------*\ * * Error dialogs - * + * \*---------------------------------------------------------------------------*/ /* Nonmodal error box */ LRESULT CALLBACK ErrorDialog(HWND hDlg, UINT message, - WPARAM wParam, LPARAM lParam); + WPARAM wParam, LPARAM lParam); VOID ErrorPopUp(char *title, char *content) @@ -7583,11 +6106,11 @@ ErrorPopUp(char *title, char *content) while (*p) { if (*p == '\n') { if (modal) { - *q++ = ' '; - p++; + *q++ = ' '; + p++; } else { - *q++ = '\r'; - *q++ = *p++; + *q++ = '\r'; + *q++ = *p++; } } else { *q++ = *p++; @@ -7596,13 +6119,13 @@ ErrorPopUp(char *title, char *content) *q = NULLCHAR; strncpy(errorTitle, title, sizeof(errorTitle)); errorTitle[sizeof(errorTitle) - 1] = '\0'; - + if (modal) { MessageBox(NULL, errorMessage, errorTitle, MB_OK|MB_ICONEXCLAMATION); } else { lpProc = MakeProcInstance((FARPROC)ErrorDialog, hInst); CreateDialog(hInst, MAKEINTRESOURCE(DLG_Error), - hwndMain, (DLGPROC)lpProc); + hwndMain, (DLGPROC)lpProc); FreeProcInstance(lpProc); } } @@ -7614,6 +6137,7 @@ ErrorPopDown() if (errorDialog == NULL) return; DestroyWindow(errorDialog); errorDialog = NULL; + if(errorExitStatus) ExitEvent(errorExitStatus); } LRESULT CALLBACK @@ -7628,11 +6152,11 @@ ErrorDialog(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) /* SetWindowPos(hDlg, NULL, rChild.left, - rChild.top + boardRect.top - (rChild.bottom - rChild.top), + rChild.top + boardRect.top - (rChild.bottom - rChild.top), 0, 0, SWP_NOZORDER|SWP_NOSIZE); */ - /* + /* [AS] It seems that the above code wants to move the dialog up in the "caption area" of the main window, but it uses the dialog height as an hard-coded constant, and it doesn't work when you resize the dialog. @@ -7676,10 +6200,10 @@ GothicDialog(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) case WM_INITDIALOG: GetWindowRect(hDlg, &rChild); - SetWindowPos(hDlg, NULL, boardX, boardY-height, winWidth, height, + SetWindowPos(hDlg, NULL, wpMain.x, wpMain.y-height, wpMain.width, height, SWP_NOZORDER); - /* + /* [AS] It seems that the above code wants to move the dialog up in the "caption area" of the main window, but it uses the dialog height as an hard-coded constant, and it doesn't work when you resize the dialog. @@ -7724,7 +6248,7 @@ GothicPopUp(char *title, VariantClass variant) title = lastTitle; lpProc = MakeProcInstance((FARPROC)GothicDialog, hInst); CreateDialog(hInst, MAKEINTRESOURCE(DLG_Error), - hwndMain, (DLGPROC)lpProc); + hwndMain, (DLGPROC)lpProc); FreeProcInstance(lpProc); } } @@ -7776,76 +6300,7 @@ NextInHistory() { if (histP == histIn) return NULL; histP = (histP + 1) % HISTORY_SIZE; - return history[histP]; -} - -typedef struct { - char *item; - char *command; - BOOLEAN getname; - BOOLEAN immediate; -} IcsTextMenuEntry; -#define ICS_TEXT_MENU_SIZE (IDM_CommandXLast - IDM_CommandX + 1) -IcsTextMenuEntry icsTextMenuEntry[ICS_TEXT_MENU_SIZE]; - -void -ParseIcsTextMenu(char *icsTextMenuString) -{ -// int flags = 0; - IcsTextMenuEntry *e = icsTextMenuEntry; - char *p = icsTextMenuString; - while (e->item != NULL && e < icsTextMenuEntry + ICS_TEXT_MENU_SIZE) { - free(e->item); - e->item = NULL; - if (e->command != NULL) { - free(e->command); - e->command = NULL; - } - e++; - } - e = icsTextMenuEntry; - while (*p && e < icsTextMenuEntry + ICS_TEXT_MENU_SIZE) { - if (*p == ';' || *p == '\n') { - e->item = strdup("-"); - e->command = NULL; - p++; - } else if (*p == '-') { - e->item = strdup("-"); - e->command = NULL; - p++; - if (*p) p++; - } else { - char *q, *r, *s, *t; - char c; - q = strchr(p, ','); - if (q == NULL) break; - *q = NULLCHAR; - r = strchr(q + 1, ','); - if (r == NULL) break; - *r = NULLCHAR; - s = strchr(r + 1, ','); - if (s == NULL) break; - *s = NULLCHAR; - c = ';'; - t = strchr(s + 1, c); - if (t == NULL) { - c = '\n'; - t = strchr(s + 1, c); - } - if (t != NULL) *t = NULLCHAR; - e->item = strdup(p); - e->command = strdup(q + 1); - e->getname = *(r + 1) != '0'; - e->immediate = *(s + 1) != '0'; - *q = ','; - *r = ','; - *s = ','; - if (t == NULL) break; - *t = c; - p = t + 1; - } - e++; - } + return history[histP]; } HMENU @@ -7860,15 +6315,15 @@ LoadIcsTextMenu(IcsTextMenuEntry *e) AppendMenu(h, MF_SEPARATOR, 0, 0); } else { if (e->item[0] == '|') { - AppendMenu(h, MF_STRING|MF_MENUBARBREAK, - IDM_CommandX + i, &e->item[1]); + AppendMenu(h, MF_STRING|MF_MENUBARBREAK, + IDM_CommandX + i, &e->item[1]); } else { - AppendMenu(h, MF_STRING, IDM_CommandX + i, e->item); + AppendMenu(h, MF_STRING, IDM_CommandX + i, e->item); } } e++; i++; - } + } return hmenu; } @@ -7892,7 +6347,7 @@ CommandX(HWND hwnd, char *command, BOOLEAN getname, BOOLEAN immediate) SetFocus(hInput); } return; - } + } SendMessage(hwnd, EM_EXGETSEL, 0, (LPARAM)&sel); if (sel.cpMin == sel.cpMax) { /* Expand to surrounding word */ @@ -7942,7 +6397,7 @@ CommandX(HWND hwnd, char *command, BOOLEAN getname, BOOLEAN immediate) } } -LRESULT CALLBACK +LRESULT CALLBACK ConsoleTextSubclass(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { HWND hInput; @@ -7967,16 +6422,16 @@ ConsoleTextSubclass(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) if(wParam != '\022') { if (wParam == '\t') { if (GetKeyState(VK_SHIFT) < 0) { - /* shifted */ - if (IsIconic(hwndMain)) ShowWindow(hwndMain, SW_RESTORE); - if (buttonDesc[0].hwnd) { - SetFocus(buttonDesc[0].hwnd); - } else { - SetFocus(hwndMain); - } + /* shifted */ + if (IsIconic(hwndMain)) ShowWindow(hwndMain, SW_RESTORE); + if (buttonDesc[0].hwnd) { + SetFocus(buttonDesc[0].hwnd); + } else { + SetFocus(hwndMain); + } } else { - /* unshifted */ - SetFocus(GetDlgItem(hwndConsole, OPT_ConsoleInput)); + /* unshifted */ + SetFocus(GetDlgItem(hwndConsole, OPT_ConsoleInput)); } } else { hInput = GetDlgItem(hwndConsole, OPT_ConsoleInput); @@ -7987,7 +6442,7 @@ ConsoleTextSubclass(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) } // [HGM] navigate: for Ctrl+R, flow into nex case (moved up here) to summon up menu case WM_RBUTTONUP: if (GetKeyState(VK_SHIFT) & ~1) { - SendDlgItemMessage(hwndConsole, OPT_ConsoleText, + SendDlgItemMessage(hwndConsole, OPT_ConsoleText, WM_COMMAND, MAKEWPARAM(IDM_QuickPaste, 0), 0); } else { POINT pt; @@ -8020,8 +6475,8 @@ ConsoleTextSubclass(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) SendMessage(hwnd, EM_EXGETSEL, 0, (LPARAM)&sel); if (sel.cpMin == sel.cpMax) { sel.cpMin = SendMessage(hwnd, EM_CHARFROMPOS, 0, (LPARAM)&pt); /*doc is wrong*/ - sel.cpMax = sel.cpMin; - SendMessage(hwnd, EM_EXSETSEL, 0, (LPARAM)&sel); + sel.cpMax = sel.cpMin; + SendMessage(hwnd, EM_EXSETSEL, 0, (LPARAM)&sel); } SendMessage(hwnd, EM_HIDESELECTION, FALSE, FALSE); } @@ -8031,12 +6486,12 @@ ConsoleTextSubclass(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) case IDM_QuickPaste: { SendMessage(hwnd, EM_EXGETSEL, 0, (LPARAM)&sel); - if (sel.cpMin == sel.cpMax) { - MessageBeep(MB_ICONEXCLAMATION); + if (sel.cpMin == sel.cpMax) { + MessageBeep(MB_ICONEXCLAMATION); return 0; - } - SendMessage(hwnd, WM_COPY, 0, 0); - hInput = GetDlgItem(hwndConsole, OPT_ConsoleInput); + } + SendMessage(hwnd, WM_COPY, 0, 0); + hInput = GetDlgItem(hwndConsole, OPT_ConsoleInput); SendMessage(hInput, WM_PASTE, 0, 0); SetFocus(hInput); return 0; @@ -8052,14 +6507,14 @@ ConsoleTextSubclass(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) return 0; default: { - int i = LOWORD(wParam) - IDM_CommandX; - if (i >= 0 && i < ICS_TEXT_MENU_SIZE && - icsTextMenuEntry[i].command != NULL) { - CommandX(hwnd, icsTextMenuEntry[i].command, - icsTextMenuEntry[i].getname, - icsTextMenuEntry[i].immediate); - return 0; - } + int i = LOWORD(wParam) - IDM_CommandX; + if (i >= 0 && i < ICS_TEXT_MENU_SIZE && + icsTextMenuEntry[i].command != NULL) { + CommandX(hwnd, icsTextMenuEntry[i].command, + icsTextMenuEntry[i].getname, + icsTextMenuEntry[i].immediate); + return 0; + } } break; } @@ -8099,15 +6554,15 @@ ConsoleInputSubclass(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) } switch (wParam) { case '\r': /* Enter key */ - is->count = GetWindowText(hwnd, is->buf, INPUT_SOURCE_BUF_SIZE-1); + is->count = GetWindowText(hwnd, is->buf, INPUT_SOURCE_BUF_SIZE-1); if (consoleEcho) SaveInHistory(is->buf); is->buf[is->count++] = '\n'; is->buf[is->count] = NULLCHAR; SendMessage(hwndMain, WM_USER_Input, 0, (LPARAM) is); if (consoleEcho) { - ConsoleOutput(is->buf, is->count, TRUE); + ConsoleOutput(is->buf, is->count, TRUE); } else if (appData.localLineEditing) { - ConsoleOutput("\n", 1, TRUE); + ConsoleOutput("\n", 1, TRUE); } /* fall thru */ case '\033': /* Escape key */ @@ -8117,23 +6572,23 @@ ConsoleInputSubclass(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) if (consoleEcho) { cf.crTextColor = textAttribs[ColorNormal].color; } else { - cf.crTextColor = COLOR_ECHOOFF; + cf.crTextColor = COLOR_ECHOOFF; } cf.dwEffects = textAttribs[ColorNormal].effects; SendMessage(hwnd, EM_SETCHARFORMAT, SCF_ALL, (LPARAM)&cf); return 0; case '\t': /* Tab key */ if (GetKeyState(VK_SHIFT) < 0) { - /* shifted */ - SetFocus(GetDlgItem(hwndConsole, OPT_ConsoleText)); + /* shifted */ + SetFocus(GetDlgItem(hwndConsole, OPT_ConsoleText)); } else { - /* unshifted */ - if (IsIconic(hwndMain)) ShowWindow(hwndMain, SW_RESTORE); - if (buttonDesc[0].hwnd) { - SetFocus(buttonDesc[0].hwnd); - } else { - SetFocus(hwndMain); - } + /* unshifted */ + if (IsIconic(hwndMain)) ShowWindow(hwndMain, SW_RESTORE); + if (buttonDesc[0].hwnd) { + SetFocus(buttonDesc[0].hwnd); + } else { + SetFocus(hwndMain); + } } return 0; case '\023': /* Ctrl+S */ @@ -8153,20 +6608,20 @@ ConsoleInputSubclass(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) GetWindowText(hwnd, buf, MSG_SIZ); p = PrevInHistory(buf); if (p != NULL) { - SetWindowText(hwnd, p); - sel.cpMin = 999999; - sel.cpMax = 999999; - SendMessage(hwnd, EM_EXSETSEL, 0, (LPARAM)&sel); + SetWindowText(hwnd, p); + sel.cpMin = 999999; + sel.cpMax = 999999; + SendMessage(hwnd, EM_EXSETSEL, 0, (LPARAM)&sel); return 0; } break; case VK_DOWN: p = NextInHistory(); if (p != NULL) { - SetWindowText(hwnd, p); - sel.cpMin = 999999; - sel.cpMax = 999999; - SendMessage(hwnd, EM_EXSETSEL, 0, (LPARAM)&sel); + SetWindowText(hwnd, p); + sel.cpMin = 999999; + sel.cpMax = 999999; + SendMessage(hwnd, EM_EXSETSEL, 0, (LPARAM)&sel); return 0; } break; @@ -8181,12 +6636,12 @@ ConsoleInputSubclass(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) } break; case WM_MBUTTONDOWN: - SendDlgItemMessage(hwndConsole, OPT_ConsoleText, + SendDlgItemMessage(hwndConsole, OPT_ConsoleText, WM_COMMAND, MAKEWPARAM(IDM_QuickPaste, 0), 0); break; case WM_RBUTTONUP: if (GetKeyState(VK_SHIFT) & ~1) { - SendDlgItemMessage(hwndConsole, OPT_ConsoleText, + SendDlgItemMessage(hwndConsole, OPT_ConsoleText, WM_COMMAND, MAKEWPARAM(IDM_QuickPaste, 0), 0); } else { POINT pt; @@ -8206,7 +6661,7 @@ ConsoleInputSubclass(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) } return 0; case WM_COMMAND: - switch (LOWORD(wParam)) { + switch (LOWORD(wParam)) { case IDM_Undo: SendMessage(hwnd, EM_UNDO, 0, 0); return 0; @@ -8237,12 +6692,15 @@ LRESULT CALLBACK ConsoleWndProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) { static SnapData sd; - static HWND hText, hInput /*, hFocus*/; -// InputSource *is = consoleInputSource; + HWND hText, hInput; RECT rect; static int sizeX, sizeY; int newSizeX, newSizeY; MINMAXINFO *mmi; + WORD wMask; + + hText = GetDlgItem(hDlg, OPT_ConsoleText); + hInput = GetDlgItem(hDlg, OPT_ConsoleInput); switch (message) { case WM_NOTIFY: @@ -8251,21 +6709,18 @@ ConsoleWndProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) ENLINK *pLink = (ENLINK*)lParam; if (pLink->msg == WM_LBUTTONUP) { - TEXTRANGE tr; - - tr.chrg = pLink->chrg; - tr.lpstrText = malloc(1+tr.chrg.cpMax-tr.chrg.cpMin); - hText = GetDlgItem(hDlg, OPT_ConsoleText); - SendMessage(hText, EM_GETTEXTRANGE, 0, (LPARAM)&tr); - ShellExecute(NULL, "open", tr.lpstrText, NULL, NULL, SW_SHOW); - free(tr.lpstrText); + TEXTRANGE tr; + + tr.chrg = pLink->chrg; + tr.lpstrText = malloc(1+tr.chrg.cpMax-tr.chrg.cpMin); + SendMessage(hText, EM_GETTEXTRANGE, 0, (LPARAM)&tr); + ShellExecute(NULL, "open", tr.lpstrText, NULL, NULL, SW_SHOW); + free(tr.lpstrText); } } break; case WM_INITDIALOG: /* message: initialize dialog box */ hwndConsole = hDlg; - hText = GetDlgItem(hDlg, OPT_ConsoleText); - hInput = GetDlgItem(hDlg, OPT_ConsoleInput); SetFocus(hInput); consoleTextWindowProc = (WNDPROC) SetWindowLong(hText, GWL_WNDPROC, (LONG) ConsoleTextSubclass); @@ -8280,7 +6735,7 @@ ConsoleWndProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) sizeX = rect.right; sizeY = rect.bottom; if (wpConsole.x != CW_USEDEFAULT && wpConsole.y != CW_USEDEFAULT && - wpConsole.width != CW_USEDEFAULT && wpConsole.height != CW_USEDEFAULT) { + wpConsole.width != CW_USEDEFAULT && wpConsole.height != CW_USEDEFAULT) { WINDOWPLACEMENT wp; EnsureOnScreen(&wpConsole.x, &wpConsole.y, 0, 0); wp.length = sizeof(WINDOWPLACEMENT); @@ -8293,14 +6748,14 @@ ConsoleWndProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) wp.rcNormalPosition.bottom = wpConsole.y + wpConsole.height; SetWindowPlacement(hDlg, &wp); } -#if 1 + // [HGM] Chessknight's change 2004-07-13 else { /* Determine Defaults */ WINDOWPLACEMENT wp; - wpConsole.x = winWidth + 1; - wpConsole.y = boardY; - wpConsole.width = screenWidth - winWidth; - wpConsole.height = winHeight; + wpConsole.x = wpMain.width + 1; + wpConsole.y = wpMain.y; + wpConsole.width = screenWidth - wpMain.width; + wpConsole.height = wpMain.height; EnsureOnScreen(&wpConsole.x, &wpConsole.y, 0, 0); wp.length = sizeof(WINDOWPLACEMENT); wp.flags = 0; @@ -8312,7 +6767,13 @@ ConsoleWndProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) wp.rcNormalPosition.bottom = wpConsole.y + wpConsole.height; SetWindowPlacement(hDlg, &wp); } -#endif + + // Allow hText to highlight URLs and send notifications on them + wMask = (WORD) SendMessage(hText, EM_GETEVENTMASK, 0, 0L); + SendMessage(hText, EM_SETEVENTMASK, 0, wMask | ENM_LINK); + SendMessage(hText, EM_AUTOURLDETECT, TRUE, 0L); + SetWindowLong(hText, GWL_USERDATA, 79); // initialize the text window's width + return FALSE; case WM_SETFOCUS: @@ -8336,19 +6797,19 @@ ConsoleWndProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) newTextWidth = rectText.right - rectText.left + newSizeX - sizeX; newTextHeight = rectText.bottom - rectText.top + newSizeY - sizeY; if (newTextHeight < 0) { - newSizeY += -newTextHeight; + newSizeY += -newTextHeight; newTextHeight = 0; } SetWindowPos(hText, NULL, 0, 0, - newTextWidth, newTextHeight, SWP_NOZORDER|SWP_NOMOVE); + newTextWidth, newTextHeight, SWP_NOZORDER|SWP_NOMOVE); GetWindowRect(hInput, &rectInput); /* gives screen coords */ pt.x = rectInput.left; pt.y = rectInput.top + newSizeY - sizeY; ScreenToClient(hDlg, &pt); - SetWindowPos(hInput, NULL, - pt.x, pt.y, /* needs client coords */ - rectInput.right - rectInput.left + newSizeX - sizeX, - rectInput.bottom - rectInput.top, SWP_NOZORDER); + SetWindowPos(hInput, NULL, + pt.x, pt.y, /* needs client coords */ + rectInput.right - rectInput.left + newSizeX - sizeX, + rectInput.bottom - rectInput.top, SWP_NOZORDER); } sizeX = newSizeX; sizeY = newSizeY; @@ -8372,6 +6833,7 @@ ConsoleWndProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) return OnMoving( &sd, hDlg, wParam, lParam ); case WM_EXITSIZEMOVE: + UpdateICSWidth(hText); return OnExitSizeMove( &sd, hDlg, wParam, lParam ); } @@ -8382,17 +6844,10 @@ ConsoleWndProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) VOID ConsoleCreate() { - HWND hCons, hText; - WORD wMask; + HWND hCons; if (hwndConsole) return; hCons = CreateDialog(hInst, szConsoleName, 0, NULL); SendMessage(hCons, WM_INITDIALOG, 0, 0); - - // make the text item in the console do URL links - hText = GetDlgItem(hCons, OPT_ConsoleText); - wMask = SendMessage(hText, EM_GETEVENTMASK, 0, 0L); - SendMessage(hText, EM_SETEVENTMASK, 0, wMask | ENM_LINK); - SendMessage(hText, EM_AUTOURLDETECT, TRUE, 0L); } @@ -8419,10 +6874,10 @@ ConsoleOutput(char* data, int length, int forceVisible) while (length--) { if (*p == '\n') { if (*++p) { - *q++ = '\r'; - *q++ = '\n'; + *q++ = '\r'; + *q++ = '\n'; } else { - delayLF = 1; + delayLF = 1; } } else if (*p == '\007') { MyPlaySound(&sounds[(int)SoundBell]); @@ -8550,8 +7005,8 @@ DisplayAClock(HDC hdc, int timeRemaining, int highlight, JAWS_SILENCE ExtTextOut(hdc, rect->left + MESSAGE_LINE_LEFTMARGIN, - rect->top, ETO_CLIPPED|ETO_OPAQUE, - rect, str, strlen(str), NULL); + rect->top, ETO_CLIPPED|ETO_OPAQUE, + rect, str, strlen(str), NULL); if(logoHeight > 0 && appData.clockMode) { RECT r; sprintf(buf, "%s %s", buf+7, flagFell); @@ -8560,8 +7015,8 @@ DisplayAClock(HDC hdc, int timeRemaining, int highlight, r.right = rect->right; r.bottom = rect->bottom; ExtTextOut(hdc, rect->left + MESSAGE_LINE_LEFTMARGIN, - r.top, ETO_CLIPPED|ETO_OPAQUE, - &r, str, strlen(str), NULL); + r.top, ETO_CLIPPED|ETO_OPAQUE, + &r, str, strlen(str), NULL); } (void) SetTextColor(hdc, oldFg); (void) SetBkColor(hdc, oldBg); @@ -8571,7 +7026,7 @@ DisplayAClock(HDC hdc, int timeRemaining, int highlight, int DoReadFile(HANDLE hFile, char *buf, int count, DWORD *outCount, - OVERLAPPED *ovl) + OVERLAPPED *ovl) { int ok, err; @@ -8594,9 +7049,9 @@ DoReadFile(HANDLE hFile, char *buf, int count, DWORD *outCount, if (err == ERROR_IO_PENDING) { ok = GetOverlappedResult(hFile, ovl, outCount, TRUE); if (ok) - err = NO_ERROR; + err = NO_ERROR; else - err = GetLastError(); + err = GetLastError(); } } return err; @@ -8604,7 +7059,7 @@ DoReadFile(HANDLE hFile, char *buf, int count, DWORD *outCount, int DoWriteFile(HANDLE hFile, char *buf, int count, DWORD *outCount, - OVERLAPPED *ovl) + OVERLAPPED *ovl) { int ok, err; @@ -8618,9 +7073,9 @@ DoWriteFile(HANDLE hFile, char *buf, int count, DWORD *outCount, if (err == ERROR_IO_PENDING) { ok = GetOverlappedResult(hFile, ovl, outCount, TRUE); if (ok) - err = NO_ERROR; + err = NO_ERROR; else - err = GetLastError(); + err = GetLastError(); } } return err; @@ -8632,7 +7087,7 @@ void CheckForInputBufferFull( InputSource * is ) if( is->lineByLine && (is->next - is->buf) >= INPUT_SOURCE_BUF_SIZE ) { /* Look for end of line */ char * p = is->buf; - + while( p < is->next && *p != '\n' ) { p++; } @@ -8660,18 +7115,18 @@ InputThread(LPVOID arg) ovl.Internal = ovl.InternalHigh = ovl.Offset = ovl.OffsetHigh = 0; while (is->hThread != NULL) { is->error = DoReadFile(is->hFile, is->next, - INPUT_SOURCE_BUF_SIZE - (is->next - is->buf), - &is->count, &ovl); + INPUT_SOURCE_BUF_SIZE - (is->next - is->buf), + &is->count, &ovl); if (is->error == NO_ERROR) { is->next += is->count; } else { if (is->error == ERROR_BROKEN_PIPE) { - /* Correct for MS brain damage. EOF reading a pipe is not an error. */ - is->count = 0; + /* Correct for MS brain damage. EOF reading a pipe is not an error. */ + is->count = 0; } else { - is->count = (DWORD) -1; + is->count = (DWORD) -1; /* [AS] The (is->count <= 0) check below is not useful for unsigned values! */ - break; + break; } } @@ -8707,37 +7162,37 @@ NonOvlInputThread(LPVOID arg) is = (InputSource *) arg; while (is->hThread != NULL) { is->error = ReadFile(is->hFile, is->next, - INPUT_SOURCE_BUF_SIZE - (is->next - is->buf), - &is->count, NULL) ? NO_ERROR : GetLastError(); + INPUT_SOURCE_BUF_SIZE - (is->next - is->buf), + &is->count, NULL) ? NO_ERROR : GetLastError(); if (is->error == NO_ERROR) { /* Change CRLF to LF */ if (is->next > is->buf) { - p = is->next - 1; - i = is->count + 1; + p = is->next - 1; + i = is->count + 1; } else { - p = is->next; - i = is->count; + p = is->next; + i = is->count; } q = p; prev = NULLCHAR; while (i > 0) { - if (prev == '\r' && *p == '\n') { - *(q-1) = '\n'; - is->count--; - } else { - *q++ = *p; - } - prev = *p++; - i--; + if (prev == '\r' && *p == '\n') { + *(q-1) = '\n'; + is->count--; + } else { + *q++ = *p; + } + prev = *p++; + i--; } *q = NULLCHAR; is->next = q; } else { if (is->error == ERROR_BROKEN_PIPE) { - /* Correct for MS brain damage. EOF reading a pipe is not an error. */ - is->count = 0; + /* Correct for MS brain damage. EOF reading a pipe is not an error. */ + is->count = 0; } else { - is->count = (DWORD) -1; + is->count = (DWORD) -1; } } @@ -8768,8 +7223,8 @@ SocketInputThread(LPVOID arg) is->error = NO_ERROR; is->next += is->count; if (is->count == 0 && is->second == is) { - /* End of file on stderr; quit with no message */ - break; + /* End of file on stderr; quit with no message */ + break; } } SendMessage(hwndMain, WM_USER_Input, 0, (LPARAM) is); @@ -8793,11 +7248,11 @@ InputEvent(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) char *q = p; while (q < is->next) { if (*q++ == '\n') { - (is->func)(is, is->closure, p, q - p, NO_ERROR); - p = q; + (is->func)(is, is->closure, p, q - p, NO_ERROR); + p = q; } } - + /* Move any partial line to the start of the buffer */ q = is->buf; while (p < is->next) { @@ -8807,8 +7262,8 @@ InputEvent(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) if (is->error != NO_ERROR || is->count == 0) { /* Notify backend of the error. Note: If there was a partial - line at the end, it is not flushed through. */ - (is->func)(is, is->closure, is->buf, is->count, is->error); + line at the end, it is not flushed through. */ + (is->func)(is, is->closure, is->buf, is->count, is->error); } } else { /* Feed in the whole chunk of input at once */ @@ -8829,6 +7284,13 @@ typedef struct { } Enables; VOID +GreyRevert(Boolean grey) +{ // [HGM] vari: for retracting variations in local mode + HMENU hmenu = GetMenu(hwndMain); + EnableMenuItem(hmenu, IDM_Revert, MF_BYCOMMAND|(grey ? MF_GRAYED : MF_ENABLED)); +} + +VOID SetMenuEnables(HMENU hmenu, Enables *enab) { while (enab->item > 0) { @@ -8848,6 +7310,7 @@ Enables gnuEnables[] = { { IDM_StopExamining, MF_BYCOMMAND|MF_GRAYED }, { IDM_StopObserving, MF_BYCOMMAND|MF_GRAYED }, { IDM_Revert, MF_BYCOMMAND|MF_GRAYED }, + { IDM_NewChat, MF_BYCOMMAND|MF_GRAYED }, { -1, -1 } }; @@ -8857,6 +7320,7 @@ Enables icsEnables[] = { { IDM_MachineWhite, MF_BYCOMMAND|MF_GRAYED }, { IDM_MachineBlack, MF_BYCOMMAND|MF_GRAYED }, { IDM_TwoMachines, MF_BYCOMMAND|MF_GRAYED }, + { IDM_MachineBoth, MF_BYCOMMAND|MF_GRAYED }, { IDM_AnalysisMode, MF_BYCOMMAND|MF_ENABLED }, { IDM_AnalyzeFile, MF_BYCOMMAND|MF_GRAYED }, { IDM_TimeControl, MF_BYCOMMAND|MF_GRAYED }, @@ -8864,6 +7328,8 @@ Enables icsEnables[] = { { IDM_Hint, MF_BYCOMMAND|MF_GRAYED }, { IDM_Book, MF_BYCOMMAND|MF_GRAYED }, { IDM_IcsOptions, MF_BYCOMMAND|MF_ENABLED }, + { IDM_Engine1Options, MF_BYCOMMAND|MF_GRAYED }, + { IDM_Engine2Options, MF_BYCOMMAND|MF_GRAYED }, { -1, -1 } }; @@ -8872,6 +7338,7 @@ Enables zippyEnables[] = { { IDM_MoveNow, MF_BYCOMMAND|MF_ENABLED }, { IDM_Hint, MF_BYCOMMAND|MF_ENABLED }, { IDM_Book, MF_BYCOMMAND|MF_ENABLED }, + { IDM_Engine1Options, MF_BYCOMMAND|MF_ENABLED }, { -1, -1 } }; #endif @@ -8892,6 +7359,10 @@ Enables ncpEnables[] = { { IDM_TimeControl, MF_BYCOMMAND|MF_GRAYED }, { IDM_Hint, MF_BYCOMMAND|MF_GRAYED }, { IDM_Book, MF_BYCOMMAND|MF_GRAYED }, + { IDM_MachineBoth, MF_BYCOMMAND|MF_GRAYED }, + { IDM_NewChat, MF_BYCOMMAND|MF_GRAYED }, + { IDM_Engine1Options, MF_BYCOMMAND|MF_GRAYED }, + { IDM_Engine2Options, MF_BYCOMMAND|MF_GRAYED }, { -1, -1 } }; @@ -8973,7 +7444,7 @@ Enables userThinkingEnables[] = { * * Front-end interface functions exported by XBoard. * Functions appear in same order as prototypes in frontend.h. - * + * \*---------------------------------------------------------------------------*/ VOID ModeHighlight() @@ -8985,7 +7456,7 @@ ModeHighlight() if (pausing != prevPausing) { prevPausing = pausing; (void) CheckMenuItem(GetMenu(hwndMain), IDM_Pause, - MF_BYCOMMAND|(pausing ? MF_CHECKED : MF_UNCHECKED)); + MF_BYCOMMAND|(pausing ? MF_CHECKED : MF_UNCHECKED)); if (hwndPause) SetWindowText(hwndPause, pausing ? "C" : "P"); } @@ -9038,17 +7509,17 @@ ModeHighlight() } if (prevChecked != 0) (void) CheckMenuItem(GetMenu(hwndMain), - prevChecked, MF_BYCOMMAND|MF_UNCHECKED); + prevChecked, MF_BYCOMMAND|MF_UNCHECKED); if (nowChecked != 0) (void) CheckMenuItem(GetMenu(hwndMain), - nowChecked, MF_BYCOMMAND|MF_CHECKED); + nowChecked, MF_BYCOMMAND|MF_CHECKED); if (nowChecked == IDM_LoadGame || nowChecked == IDM_Training) { - (void) EnableMenuItem(GetMenu(hwndMain), IDM_Training, - MF_BYCOMMAND|MF_ENABLED); + (void) EnableMenuItem(GetMenu(hwndMain), IDM_Training, + MF_BYCOMMAND|MF_ENABLED); } else { - (void) EnableMenuItem(GetMenu(hwndMain), - IDM_Training, MF_BYCOMMAND|MF_GRAYED); + (void) EnableMenuItem(GetMenu(hwndMain), + IDM_Training, MF_BYCOMMAND|MF_GRAYED); } prevChecked = nowChecked; @@ -9104,7 +7575,7 @@ SetCmailMode() SetMenuEnables(GetMenu(hwndMain), cmailEnables); } -VOID +VOID SetTrainingModeOn() { int i; @@ -9160,7 +7631,7 @@ DisplayTitle(char *str) } else if (appData.icsActive) { if (appData.icsCommPort[0] != NULLCHAR) host = "ICS"; - else + else host = appData.icsHost; sprintf(title, "%s: %s", szTitle, host); } else if (appData.noChessProgram) { @@ -9209,7 +7680,7 @@ DisplayMessage(char *str1, char *str2) hdc = GetDC(hwndMain); oldFont = SelectObject(hdc, font[boardSize][MESSAGE_FONT]->hf); ExtTextOut(hdc, messageRect.left, messageRect.top, ETO_CLIPPED|ETO_OPAQUE, - &messageRect, messageText, strlen(messageText), NULL); + &messageRect, messageText, strlen(messageText), NULL); (void) SelectObject(hdc, oldFont); (void) ReleaseDC(hwndMain, hdc); } @@ -9224,21 +7695,21 @@ DisplayError(char *str, int error) strcpy(buf, str); } else { len = FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, - NULL, error, LANG_NEUTRAL, - (LPSTR) buf2, MSG_SIZ, NULL); + NULL, error, LANG_NEUTRAL, + (LPSTR) buf2, MSG_SIZ, NULL); if (len > 0) { sprintf(buf, "%s:\n%s", str, buf2); } else { ErrorMap *em = errmap; while (em->err != 0 && em->err != error) em++; if (em->err != 0) { - sprintf(buf, "%s:\n%s", str, em->msg); + sprintf(buf, "%s:\n%s", str, em->msg); } else { - sprintf(buf, "%s:\nError code %d", str, error); + sprintf(buf, "%s:\nError code %d", str, error); } } } - + ErrorPopUp("Error", buf); } @@ -9266,17 +7737,17 @@ DisplayFatalError(char *str, int error, int exitStatus) if (error != 0) { len = FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, - NULL, error, LANG_NEUTRAL, - (LPSTR) buf2, MSG_SIZ, NULL); + NULL, error, LANG_NEUTRAL, + (LPSTR) buf2, MSG_SIZ, NULL); if (len > 0) { sprintf(buf, "%s:\n%s", str, buf2); } else { ErrorMap *em = errmap; while (em->err != 0 && em->err != error) em++; if (em->err != 0) { - sprintf(buf, "%s:\n%s", str, em->msg); + sprintf(buf, "%s:\n%s", str, em->msg); } else { - sprintf(buf, "%s:\nError code %d", str, error); + sprintf(buf, "%s:\nError code %d", str, error); } } str = buf; @@ -9286,7 +7757,7 @@ DisplayFatalError(char *str, int error, int exitStatus) } if (appData.popupExitMessage) { (void) MessageBox(hwndMain, str, label, MB_OK| - (exitStatus ? MB_ICONSTOP : MB_ICONINFORMATION)); + (exitStatus ? MB_ICONSTOP : MB_ICONINFORMATION)); } ExitEvent(exitStatus); } @@ -9355,7 +7826,7 @@ AskQuestion(char* title, char *question, char *replyPrefix, ProcRef pr) { QuestionParams qp; FARPROC lpProc; - + qp.title = title; qp.question = question; qp.replyPrefix = replyPrefix; @@ -9392,10 +7863,10 @@ LRESULT CALLBACK NewGameFRC_Proc(HWND hDlg, UINT message, WPARAM wParam, LPARAM case IDOK: *lpIndexFRC = GetDlgItemInt(hDlg, IDC_NFG_Edit, &index_is_ok, TRUE ); EndDialog( hDlg, 0 ); - shuffleOpenings = TRUE; /* [HGM] shuffle: switch shuffling on for as long as we stay in current variant */ + shuffleOpenings = TRUE; /* [HGM] shuffle: switch shuffling on for as long as we stay in current variant */ return TRUE; case IDCANCEL: - EndDialog( hDlg, 1 ); + EndDialog( hDlg, 1 ); return TRUE; case IDC_NFG_Edit: if( HIWORD(wParam) == EN_CHANGE ) { @@ -9431,104 +7902,42 @@ int NewGameFRC() return result; } -/* [AS] Game list options */ -typedef struct { - char id; - char * name; -} GLT_Item; - -static GLT_Item GLT_ItemInfo[] = { - { GLT_EVENT, "Event" }, - { GLT_SITE, "Site" }, - { GLT_DATE, "Date" }, - { GLT_ROUND, "Round" }, - { GLT_PLAYERS, "Players" }, - { GLT_RESULT, "Result" }, - { GLT_WHITE_ELO, "White Rating" }, - { GLT_BLACK_ELO, "Black Rating" }, - { GLT_TIME_CONTROL,"Time Control" }, - { GLT_VARIANT, "Variant" }, - { GLT_OUT_OF_BOOK,PGN_OUT_OF_BOOK }, - { GLT_RESULT_COMMENT, "Result Comment" }, // [HGM] rescom - { 0, 0 } -}; +/* [AS] Game list options. Refactored by HGM */ -const char * GLT_FindItem( char id ) -{ - const char * result = 0; - - GLT_Item * list = GLT_ItemInfo; +HWND gameListOptionsDialog; - while( list->id != 0 ) { - if( list->id == id ) { - result = list->name; - break; - } - - list++; - } - - return result; +// low-level front-end: clear text edit / list widget +void +GLT_ClearList() +{ + SendDlgItemMessage( gameListOptionsDialog, IDC_GameListTags, LB_RESETCONTENT, 0, 0 ); } -void GLT_AddToList( HWND hDlg, int iDlgItem, char id, int index ) +// low-level front-end: clear text edit / list widget +void +GLT_DeSelectList() { - const char * name = GLT_FindItem( id ); - - if( name != 0 ) { - if( index >= 0 ) { - SendDlgItemMessage( hDlg, iDlgItem, LB_INSERTSTRING, index, (LPARAM) name ); - } - else { - SendDlgItemMessage( hDlg, iDlgItem, LB_ADDSTRING, 0, (LPARAM) name ); - } - } + SendDlgItemMessage( gameListOptionsDialog, IDC_GameListTags, LB_SETCURSEL, 0, 0 ); } -void GLT_TagsToList( HWND hDlg, char * tags ) +// low-level front-end: append line to text edit / list widget +void +GLT_AddToList( char *name ) { - char * pc = tags; - - SendDlgItemMessage( hDlg, IDC_GameListTags, LB_RESETCONTENT, 0, 0 ); - - while( *pc ) { - GLT_AddToList( hDlg, IDC_GameListTags, *pc, -1 ); - pc++; - } - - SendDlgItemMessage( hDlg, IDC_GameListTags, LB_ADDSTRING, 0, (LPARAM) "\t --- Hidden tags ---" ); - - pc = GLT_ALL_TAGS; - - while( *pc ) { - if( strchr( tags, *pc ) == 0 ) { - GLT_AddToList( hDlg, IDC_GameListTags, *pc, -1 ); - } - pc++; + if( name != 0 ) { + SendDlgItemMessage( gameListOptionsDialog, IDC_GameListTags, LB_ADDSTRING, 0, (LPARAM) name ); } - - SendDlgItemMessage( hDlg, IDC_GameListTags, LB_SETCURSEL, 0, 0 ); } -char GLT_ListItemToTag( HWND hDlg, int index ) +// low-level front-end: get line from text edit / list widget +Boolean +GLT_GetFromList( int index, char *name ) { - char result = '\0'; - char name[128]; - - GLT_Item * list = GLT_ItemInfo; - - if( SendDlgItemMessage( hDlg, IDC_GameListTags, LB_GETTEXT, index, (LPARAM) name ) != LB_ERR ) { - while( list->id != 0 ) { - if( strcmp( list->name, name ) == 0 ) { - result = list->id; - break; - } - - list++; - } + if( name != 0 ) { + if( SendDlgItemMessage( gameListOptionsDialog, IDC_GameListTags, LB_GETTEXT, index, (LPARAM) name ) != LB_ERR ) + return TRUE; } - - return result; + return FALSE; } void GLT_MoveSelection( HWND hDlg, int delta ) @@ -9549,20 +7958,15 @@ void GLT_MoveSelection( HWND hDlg, int delta ) LRESULT CALLBACK GameListOptions_Proc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) { - static char glt[64]; - static char * lpUserGLT; - switch( message ) { case WM_INITDIALOG: - lpUserGLT = (char *) lParam; - - strcpy( glt, lpUserGLT ); - + gameListOptionsDialog = hDlg; // [HGM] pass through global to keep out off back-end + CenterWindow(hDlg, GetWindow(hDlg, GW_OWNER)); /* Initialize list */ - GLT_TagsToList( hDlg, glt ); + GLT_TagsToList( lpUserGLT ); SetFocus( GetDlgItem(hDlg, IDC_GameListTags) ); @@ -9571,19 +7975,7 @@ LRESULT CALLBACK GameListOptions_Proc(HWND hDlg, UINT message, WPARAM wParam, LP case WM_COMMAND: switch( LOWORD(wParam) ) { case IDOK: - { - char * pc = lpUserGLT; - int idx = 0; -// int cnt = (int) SendDlgItemMessage( hDlg, IDC_GameListTags, LB_GETCOUNT, 0, 0 ); - char id; - - do { - id = GLT_ListItemToTag( hDlg, idx ); - - *pc++ = id; - idx++; - } while( id != '\0' ); - } + GLT_ParseList(); EndDialog( hDlg, 0 ); return TRUE; case IDCANCEL: @@ -9591,13 +7983,11 @@ LRESULT CALLBACK GameListOptions_Proc(HWND hDlg, UINT message, WPARAM wParam, LP return TRUE; case IDC_GLT_Default: - strcpy( glt, GLT_DEFAULT_TAGS ); - GLT_TagsToList( hDlg, glt ); + GLT_TagsToList( GLT_DEFAULT_TAGS ); return TRUE; case IDC_GLT_Restore: - strcpy( glt, lpUserGLT ); - GLT_TagsToList( hDlg, glt ); + GLT_TagsToList( appData.gameListTags ); return TRUE; case IDC_GLT_Up: @@ -9617,23 +8007,21 @@ LRESULT CALLBACK GameListOptions_Proc(HWND hDlg, UINT message, WPARAM wParam, LP int GameListOptions() { - char glt[64]; int result; FARPROC lpProc = MakeProcInstance( (FARPROC) GameListOptions_Proc, hInst ); - strcpy( glt, appData.gameListTags ); + strcpy( lpUserGLT, appData.gameListTags ); - result = DialogBoxParam( hInst, MAKEINTRESOURCE(DLG_GameListOptions), hwndMain, (DLGPROC)lpProc, (LPARAM)glt ); + result = DialogBoxParam( hInst, MAKEINTRESOURCE(DLG_GameListOptions), hwndMain, (DLGPROC)lpProc, (LPARAM)lpUserGLT ); if( result == 0 ) { /* [AS] Memory leak here! */ - appData.gameListTags = strdup( glt ); + appData.gameListTags = strdup( lpUserGLT ); } return result; } - VOID DisplayIcsInteractionTitle(char *str) { @@ -9646,9 +8034,14 @@ DisplayIcsInteractionTitle(char *str) void DrawPosition(int fullRedraw, Board board) { - HDCDrawPosition(NULL, (BOOLEAN) fullRedraw, board); + HDCDrawPosition(NULL, (BOOLEAN) fullRedraw, board); } +void NotifyFrontendLogin() +{ + if (hwndConsole) + UpdateICSWidth(GetDlgItem(hwndConsole, OPT_ConsoleText)); +} VOID ResetFrontEnd() @@ -9682,7 +8075,7 @@ CommentPopDown(void) if (commentDialog) { ShowWindow(commentDialog, SW_HIDE); } - commentDialogUp = FALSE; + commentUp = FALSE; } VOID @@ -9767,8 +8160,8 @@ UserName() static char buf[MSG_SIZ]; DWORD bufsiz = MSG_SIZ; - if(appData.userName != NULL && appData.userName[0] != 0) { - return appData.userName; /* [HGM] username: prefer name selected by user over his system login */ + if(appData.userName != NULL && appData.userName[0] != 0) { + return appData.userName; /* [HGM] username: prefer name selected by user over his system login */ } if (!GetUserName(buf, &bufsiz)) { /*DisplayError("Error getting user name", GetLastError());*/ @@ -9810,7 +8203,7 @@ void StartClockTimer(long millisec) { clockTimerEvent = SetTimer(hwndMain, (UINT) CLOCK_TIMER_ID, - (UINT) millisec, NULL); + (UINT) millisec, NULL); } void @@ -9822,8 +8215,8 @@ DisplayWhiteClock(long timeRemaining, int highlight) if(appData.noGUI) return; hdc = GetDC(hwndMain); if (!IsIconic(hwndMain)) { - DisplayAClock(hdc, timeRemaining, highlight, - flipClock ? &blackRect : &whiteRect, "White", flag); + DisplayAClock(hdc, timeRemaining, highlight, + flipClock ? &blackRect : &whiteRect, "White", flag); } if (highlight && iconCurrent == iconBlack) { iconCurrent = iconWhite; @@ -9846,8 +8239,8 @@ DisplayBlackClock(long timeRemaining, int highlight) if(appData.noGUI) return; hdc = GetDC(hwndMain); if (!IsIconic(hwndMain)) { - DisplayAClock(hdc, timeRemaining, highlight, - flipClock ? &whiteRect : &blackRect, "Black", flag); + DisplayAClock(hdc, timeRemaining, highlight, + flipClock ? &whiteRect : &blackRect, "Black", flag); } if (highlight && iconCurrent == iconWhite) { iconCurrent = iconBlack; @@ -9881,7 +8274,7 @@ void StartLoadGameTimer(long millisec) { loadGameTimerEvent = SetTimer(hwndMain, (UINT) LOAD_GAME_TIMER_ID, - (UINT) millisec, NULL); + (UINT) millisec, NULL); } void @@ -9893,9 +8286,9 @@ AutoSaveGame() defName = DefaultFileName(appData.oldSaveStyle ? "gam" : "pgn"); f = OpenFileDialog(hwndMain, "a", defName, - appData.oldSaveStyle ? "gam" : "pgn", - GAME_FILT, - "Save Game to File", NULL, fileTitle, NULL); + appData.oldSaveStyle ? "gam" : "pgn", + GAME_FILT, + "Save Game to File", NULL, fileTitle, NULL); if (f != NULL) { SaveGame(f, 0, ""); fclose(f); @@ -9917,7 +8310,7 @@ ScheduleDelayedEvent(DelayedEventCallback cb, long millisec) } delayedTimerCallback = cb; delayedTimerEvent = SetTimer(hwndMain, (UINT) DELAYED_TIMER_ID, - (UINT) millisec, NULL); + (UINT) millisec, NULL); } DelayedEventCallback @@ -10004,9 +8397,9 @@ StartChildProcess(char *cmdLine, char *dir, ProcRef *pr) /* Duplicate the read handle to the pipe, so it is not inherited. */ fSuccess = DuplicateHandle(GetCurrentProcess(), hChildStdoutRd, - GetCurrentProcess(), &hChildStdoutRdDup, 0, - FALSE, /* not inherited */ - DUPLICATE_SAME_ACCESS); + GetCurrentProcess(), &hChildStdoutRdDup, 0, + FALSE, /* not inherited */ + DUPLICATE_SAME_ACCESS); if (! fSuccess) { return GetLastError(); } @@ -10026,9 +8419,9 @@ StartChildProcess(char *cmdLine, char *dir, ProcRef *pr) /* Duplicate the write handle to the pipe, so it is not inherited. */ fSuccess = DuplicateHandle(GetCurrentProcess(), hChildStdinWr, - GetCurrentProcess(), &hChildStdinWrDup, 0, - FALSE, /* not inherited */ - DUPLICATE_SAME_ACCESS); + GetCurrentProcess(), &hChildStdinWrDup, 0, + FALSE, /* not inherited */ + DUPLICATE_SAME_ACCESS); if (! fSuccess) { return GetLastError(); } @@ -10055,15 +8448,15 @@ StartChildProcess(char *cmdLine, char *dir, ProcRef *pr) siStartInfo.hStdError = hChildStdoutWr; fSuccess = CreateProcess(NULL, - cmdLine, /* command line */ - NULL, /* process security attributes */ - NULL, /* primary thread security attrs */ - TRUE, /* handles are inherited */ - DETACHED_PROCESS|CREATE_NEW_PROCESS_GROUP, - NULL, /* use parent's environment */ - NULL, - &siStartInfo, /* STARTUPINFO pointer */ - &piProcInfo); /* receives PROCESS_INFORMATION */ + cmdLine, /* command line */ + NULL, /* process security attributes */ + NULL, /* primary thread security attrs */ + TRUE, /* handles are inherited */ + DETACHED_PROCESS|CREATE_NEW_PROCESS_GROUP, + NULL, /* use parent's environment */ + NULL, + &siStartInfo, /* STARTUPINFO pointer */ + &piProcInfo); /* receives PROCESS_INFORMATION */ err = GetLastError(); SetCurrentDirectory(buf); /* return to prev directory */ @@ -10123,7 +8516,7 @@ DestroyChildProcess(ProcRef pr, int/*boolean*/ signal) /*!!if (signal) GenerateConsoleCtrlEvent(CTRL_BREAK_EVENT, cp->pid);*/ /* [AS] Special termination modes for misbehaving programs... */ - if( signal == 9 ) { + if( signal == 9 ) { result = TerminateProcess( cp->hProcess, 0 ); if ( appData.debugMode) { @@ -10276,7 +8669,7 @@ OpenTCP(char *host, char *port, ProcRef *pr) /* Make connection */ if (connect(s, (struct sockaddr *) &sa, - sizeof(struct sockaddr_in)) == SOCKET_ERROR) { + sizeof(struct sockaddr_in)) == SOCKET_ERROR) { err = WSAGetLastError(); WSACleanup(); return err; @@ -10305,7 +8698,7 @@ OpenCommPort(char *name, ProcRef *pr) strcpy(fullname, name); h = CreateFile(name, GENERIC_READ | GENERIC_WRITE, - 0, NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL); + 0, NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL); if (h == (HANDLE) -1) { return GetLastError(); } @@ -10398,15 +8791,15 @@ OpenRcmd(char* host, char* user, char* cmd, ProcRef* pr) } if (s == INVALID_SOCKET) { if ((s = socket(PF_INET, SOCK_STREAM, 0)) == INVALID_SOCKET) { - err = WSAGetLastError(); - WSACleanup(); - return err; + err = WSAGetLastError(); + WSACleanup(); + return err; } } uport = (unsigned short) fromPort; mysa.sin_port = htons(uport); if (bind(s, (struct sockaddr *) &mysa, sizeof(struct sockaddr_in)) - == SOCKET_ERROR) { + == SOCKET_ERROR) { err = WSAGetLastError(); if (err == WSAEADDRINUSE) continue; WSACleanup(); @@ -10416,9 +8809,9 @@ OpenRcmd(char* host, char* user, char* cmd, ProcRef* pr) sizeof(struct sockaddr_in)) == SOCKET_ERROR) { err = WSAGetLastError(); if (err == WSAEADDRINUSE) { - closesocket(s); + closesocket(s); s = -1; - continue; + continue; } WSACleanup(); return err; @@ -10441,16 +8834,16 @@ OpenRcmd(char* host, char* user, char* cmd, ProcRef* pr) } if (s2 == INVALID_SOCKET) { if ((s2 = socket(PF_INET, SOCK_STREAM, 0)) == INVALID_SOCKET) { - err = WSAGetLastError(); - closesocket(s); - WSACleanup(); - return err; + err = WSAGetLastError(); + closesocket(s); + WSACleanup(); + return err; } } uport = (unsigned short) fromPort; mysa.sin_port = htons(uport); if (bind(s2, (struct sockaddr *) &mysa, sizeof(struct sockaddr_in)) - == SOCKET_ERROR) { + == SOCKET_ERROR) { err = WSAGetLastError(); if (err == WSAEADDRINUSE) continue; (void) closesocket(s); @@ -10460,9 +8853,9 @@ OpenRcmd(char* host, char* user, char* cmd, ProcRef* pr) if (listen(s2, 1) == SOCKET_ERROR) { err = WSAGetLastError(); if (err == WSAEADDRINUSE) { - closesocket(s2); - s2 = INVALID_SOCKET; - continue; + closesocket(s2); + s2 = INVALID_SOCKET; + continue; } (void) closesocket(s); (void) closesocket(s2); @@ -10527,7 +8920,7 @@ OpenRcmd(char* host, char* user, char* cmd, ProcRef* pr) InputSourceRef AddInputSource(ProcRef pr, int lineByLine, - InputCallback func, VOIDSTAR closure) + InputCallback func, VOIDSTAR closure) { InputSource *is, *is2 = NULL; ChildProc *cp = (ChildProc *) pr; @@ -10543,7 +8936,7 @@ AddInputSource(ProcRef pr, int lineByLine, consoleInputSource = is; } else { is->kind = cp->kind; - /* + /* [AS] Try to avoid a race condition if the thread is given control too early: we create all threads suspended so that the is->hThread variable can be safely assigned, then let the threads start with ResumeThread. @@ -10553,23 +8946,23 @@ AddInputSource(ProcRef pr, int lineByLine, is->hFile = cp->hFrom; cp->hFrom = NULL; /* now owned by InputThread */ is->hThread = - CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE) NonOvlInputThread, - (LPVOID) is, CREATE_SUSPENDED, &is->id); + CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE) NonOvlInputThread, + (LPVOID) is, CREATE_SUSPENDED, &is->id); break; case CPComm: is->hFile = cp->hFrom; cp->hFrom = NULL; /* now owned by InputThread */ is->hThread = - CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE) InputThread, - (LPVOID) is, CREATE_SUSPENDED, &is->id); + CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE) InputThread, + (LPVOID) is, CREATE_SUSPENDED, &is->id); break; case CPSock: is->sock = cp->sock; is->hThread = - CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE) SocketInputThread, - (LPVOID) is, CREATE_SUSPENDED, &is->id); + CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE) SocketInputThread, + (LPVOID) is, CREATE_SUSPENDED, &is->id); break; case CPRcmd: @@ -10580,11 +8973,11 @@ AddInputSource(ProcRef pr, int lineByLine, is2->sock = cp->sock2; is2->second = is2; is->hThread = - CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE) SocketInputThread, - (LPVOID) is, CREATE_SUSPENDED, &is->id); + CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE) SocketInputThread, + (LPVOID) is, CREATE_SUSPENDED, &is->id); is2->hThread = - CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE) SocketInputThread, - (LPVOID) is2, CREATE_SUSPENDED, &is2->id); + CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE) SocketInputThread, + (LPVOID) is2, CREATE_SUSPENDED, &is2->id); break; } @@ -10614,6 +9007,11 @@ RemoveInputSource(InputSourceRef isr) } } +int no_wrap(char *message, int count) +{ + ConsoleOutput(message, count, FALSE); + return count; +} int OutputToProcess(ProcRef pr, char *message, int count, int *outError) @@ -10622,10 +9020,31 @@ OutputToProcess(ProcRef pr, char *message, int count, int *outError) int outCount = SOCKET_ERROR; ChildProc *cp = (ChildProc *) pr; static OVERLAPPED ovl; + static int line = 0; - if (pr == NoProc) { - ConsoleOutput(message, count, FALSE); - return count; + if (pr == NoProc) + { + if (appData.noJoin || !appData.useInternalWrap) + return no_wrap(message, count); + else + { + int width = get_term_width(); + int len = wrap(NULL, message, count, width, &line); + char *msg = malloc(len); + int dbgchk; + + if (!msg) + return no_wrap(message, count); + else + { + dbgchk = wrap(msg, message, count, width, &line); + if (dbgchk != len && appData.debugMode) + fprintf(debugFP, "wrap(): dbgchk(%d) != len(%d)\n", dbgchk, len); + ConsoleOutput(msg, len, FALSE); + free(msg); + return len; + } + } } if (ovl.hEvent == NULL) { @@ -10646,7 +9065,7 @@ OutputToProcess(ProcRef pr, char *message, int count, int *outError) case CPReal: if (WriteFile(((ChildProc *)pr)->hTo, message, count, - &dOutCount, NULL)) { + &dOutCount, NULL)) { *outError = NO_ERROR; outCount = (int) dOutCount; } else { @@ -10656,7 +9075,7 @@ OutputToProcess(ProcRef pr, char *message, int count, int *outError) case CPComm: *outError = DoWriteFile(((ChildProc *)pr)->hTo, message, count, - &dOutCount, &ovl); + &dOutCount, &ovl); if (*outError == NO_ERROR) { outCount = (int) dOutCount; } @@ -10667,7 +9086,7 @@ OutputToProcess(ProcRef pr, char *message, int count, int *outError) int OutputToProcessDelayed(ProcRef pr, char *message, int count, int *outError, - long msdelay) + long msdelay) { /* Ignore delay, not implemented for WinBoard */ return OutputToProcess(pr, message, count, outError); @@ -10676,7 +9095,7 @@ OutputToProcessDelayed(ProcRef pr, char *message, int count, int *outError, void CmailSigHandlerCallBack(InputSourceRef isr, VOIDSTAR closure, - char *buf, int count, int error) + char *buf, int count, int error) { DisplayFatalError("Not implemented", 0, 1); } @@ -10707,135 +9126,10 @@ StartAnalysisClock() { if (analysisTimerEvent) return; analysisTimerEvent = SetTimer(hwndMain, (UINT) ANALYSIS_TIMER_ID, - (UINT) 2000, NULL); -} - -LRESULT CALLBACK -AnalysisDialog(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) -{ - static HANDLE hwndText; - RECT rect; - static int sizeX, sizeY; - int newSizeX, newSizeY, flags; - MINMAXINFO *mmi; - - switch (message) { - case WM_INITDIALOG: /* message: initialize dialog box */ - /* Initialize the dialog items */ - hwndText = GetDlgItem(hDlg, OPT_AnalysisText); - SetWindowText(hDlg, analysisTitle); - SetDlgItemText(hDlg, OPT_AnalysisText, analysisText); - /* Size and position the dialog */ - if (!analysisDialog) { - analysisDialog = hDlg; - flags = SWP_NOZORDER; - GetClientRect(hDlg, &rect); - sizeX = rect.right; - sizeY = rect.bottom; - if (analysisX != CW_USEDEFAULT && analysisY != CW_USEDEFAULT && - analysisW != CW_USEDEFAULT && analysisH != CW_USEDEFAULT) { - WINDOWPLACEMENT wp; - EnsureOnScreen(&analysisX, &analysisY, 0, 0); - wp.length = sizeof(WINDOWPLACEMENT); - wp.flags = 0; - wp.showCmd = SW_SHOW; - wp.ptMaxPosition.x = wp.ptMaxPosition.y = 0; - wp.rcNormalPosition.left = analysisX; - wp.rcNormalPosition.right = analysisX + analysisW; - wp.rcNormalPosition.top = analysisY; - wp.rcNormalPosition.bottom = analysisY + analysisH; - SetWindowPlacement(hDlg, &wp); - - GetClientRect(hDlg, &rect); - newSizeX = rect.right; - newSizeY = rect.bottom; - ResizeEditPlusButtons(hDlg, hwndText, sizeX, sizeY, - newSizeX, newSizeY); - sizeX = newSizeX; - sizeY = newSizeY; - } - } - return FALSE; - - case WM_COMMAND: /* message: received a command */ - switch (LOWORD(wParam)) { - case IDCANCEL: - if (appData.icsActive && appData.icsEngineAnalyze) { /* [DM] icsEngineAnalyze */ - ExitAnalyzeMode(); - ModeHighlight(); - return TRUE; - } - EditGameEvent(); - return TRUE; - default: - break; - } - break; - - case WM_SIZE: - newSizeX = LOWORD(lParam); - newSizeY = HIWORD(lParam); - ResizeEditPlusButtons(hDlg, hwndText, sizeX, sizeY, newSizeX, newSizeY); - sizeX = newSizeX; - sizeY = newSizeY; - break; - - case WM_GETMINMAXINFO: - /* Prevent resizing window too small */ - mmi = (MINMAXINFO *) lParam; - mmi->ptMinTrackSize.x = 100; - mmi->ptMinTrackSize.y = 100; - break; - } - return FALSE; + (UINT) 2000, NULL); } VOID -AnalysisPopUp(char* title, char* str) -{ - FARPROC lpProc; - char *p, *q; - - /* [AS] */ - EngineOutputPopUp(); - return; - - if (str == NULL) str = ""; - p = (char *) malloc(2 * strlen(str) + 2); - q = p; - while (*str) { - if (*str == '\n') *q++ = '\r'; - *q++ = *str++; - } - *q = NULLCHAR; - if (analysisText != NULL) free(analysisText); - analysisText = p; - - if (analysisDialog) { - SetWindowText(analysisDialog, title); - SetDlgItemText(analysisDialog, OPT_AnalysisText, analysisText); - ShowWindow(analysisDialog, SW_SHOW); - } else { - analysisTitle = title; - lpProc = MakeProcInstance((FARPROC)AnalysisDialog, hInst); - CreateDialog(hInst, MAKEINTRESOURCE(DLG_Analysis), - hwndMain, (DLGPROC)lpProc); - FreeProcInstance(lpProc); - } - analysisDialogUp = TRUE; -} - -VOID -AnalysisPopDown() -{ - if (analysisDialog) { - ShowWindow(analysisDialog, SW_HIDE); - } - analysisDialogUp = FALSE; -} - - -VOID SetHighlights(int fromX, int fromY, int toX, int toY) { highlightInfo.sq[0].x = fromX; @@ -10847,7 +9141,7 @@ SetHighlights(int fromX, int fromY, int toX, int toY) VOID ClearHighlights() { - highlightInfo.sq[0].x = highlightInfo.sq[0].y = + highlightInfo.sq[0].x = highlightInfo.sq[0].y = highlightInfo.sq[1].x = highlightInfo.sq[1].y = -1; } @@ -10863,7 +9157,7 @@ SetPremoveHighlights(int fromX, int fromY, int toX, int toY) VOID ClearPremoveHighlights() { - premoveHighlightInfo.sq[0].x = premoveHighlightInfo.sq[0].y = + premoveHighlightInfo.sq[0].x = premoveHighlightInfo.sq[0].y = premoveHighlightInfo.sq[1].x = premoveHighlightInfo.sq[1].y = -1; } @@ -10893,20 +9187,20 @@ static void Tween( POINT * start, POINT * mid, POINT * finish, int factor, void AnimateAtomicCapture(int fromX, int fromY, int toX, int toY, int nFrames) -{ // [HGM] atomic: animate blast wave - int i; +{ // [HGM] atomic: animate blast wave + int i; if(appData.debugMode) fprintf(debugFP, "exploding (%d,%d)\n", toX, toY); - explodeInfo.fromX = fromX; - explodeInfo.fromY = fromY; - explodeInfo.toX = toX; - explodeInfo.toY = toY; - for(i=1; i= 0 ? movelist[current] : "n/a" ); - - OutputDebugString( buf ); -#endif - MoveHistorySet( movelist, first, last, current, pvInfoList ); EvalGraphSet( first, last, current, pvInfoList ); } - -void SetProgramStats( FrontEndProgramStats * stats ) -{ -#if 0 - char buf[1024]; - - sprintf( buf, "SetStats for %d: depth=%d, nodes=%lu, score=%5.2f, time=%5.2f, pv=%s\n", - stats->which, stats->depth, stats->nodes, stats->score / 100.0, stats->time / 100.0, stats->pv == 0 ? "n/a" : stats->pv ); - - OutputDebugString( buf ); -#endif - - EngineOutputUpdate( stats ); -}