#endif\r
\r
#include "common.h"\r
-#include "winboard.h"\r
#include "frontend.h"\r
#include "backend.h"\r
+#include "winboard.h"\r
#include "moves.h"\r
#include "wclipbrd.h"\r
-#include "wgamelist.h"\r
-#include "wedittags.h"\r
#include "woptions.h"\r
#include "wsockerr.h"\r
#include "defaults.h"\r
\r
BoardSize boardSize;\r
BOOLEAN chessProgram;\r
-static int boardX, boardY;\r
+//static int boardX, boardY;\r
int minX, minY; // [HGM] placement: volatile limits on upper-left corner\r
static int squareSize, lineGap, minorSize;\r
-static int winWidth, winHeight, winW, winH;\r
+static int winW, winH;\r
static RECT messageRect, whiteRect, blackRect, leftLogoRect, rightLogoRect; // [HGM] logo\r
static int logoHeight = 0;\r
static char messageText[MESSAGE_TEXT_MAX];\r
#define PALETTESIZE 256\r
\r
HINSTANCE hInst; /* current instance */\r
-HWND hwndMain = NULL; /* root window*/\r
-HWND hwndConsole = NULL;\r
BOOLEAN alwaysOnTop = FALSE;\r
RECT boardRect;\r
COLORREF lightSquareColor, darkSquareColor, whitePieceColor, \r
blackSquareBrush, /* [HGM] for band between board and holdings */\r
explodeBrush, /* [HGM] atomic */\r
whitePieceBrush, blackPieceBrush, iconBkgndBrush /*, outlineBrush*/;\r
-static POINT gridEndpoints[(BOARD_SIZE + 1) * 4];\r
-static DWORD gridVertexCounts[(BOARD_SIZE + 1) * 2];\r
+static POINT gridEndpoints[(BOARD_RANKS + BOARD_FILES + 2) * 2];\r
+static DWORD gridVertexCounts[BOARD_RANKS + BOARD_FILES + 2];\r
static HPEN gridPen = NULL;\r
static HPEN highlightPen = NULL;\r
static HPEN premovePen = NULL;\r
static int liteBackTextureMode = BACK_TEXTURE_MODE_PLAIN;\r
static int darkBackTextureMode = BACK_TEXTURE_MODE_PLAIN;\r
static int backTextureSquareSize = 0;\r
-static struct { int x; int y; int mode; } backTextureSquareInfo[BOARD_SIZE][BOARD_SIZE];\r
+static struct { int x; int y; int mode; } backTextureSquareInfo[BOARD_RANKS][BOARD_FILES];\r
\r
#if __GNUC__ && !defined(_winmajor)\r
#define oldDialog 0 /* cygwin doesn't define _winmajor; mingw does */\r
static char *commentText;\r
static int commentIndex;\r
static Boolean editComment = FALSE;\r
-HWND commentDialog = NULL;\r
-BOOLEAN commentDialogUp = FALSE;\r
-static int commentX, commentY, commentH, commentW;\r
\r
-static char *analysisTitle;\r
-static char *analysisText;\r
-HWND analysisDialog = NULL;\r
-BOOLEAN analysisDialogUp = FALSE;\r
-static int analysisX, analysisY, analysisH, analysisW;\r
\r
char errorTitle[MSG_SIZ];\r
char errorMessage[2*MSG_SIZ];\r
int NewGameFRC();\r
int GameListOptions();\r
\r
-HWND moveHistoryDialog = NULL;\r
-BOOLEAN moveHistoryDialogUp = FALSE;\r
-\r
-WindowPlacement wpMoveHistory;\r
+int dummy; // [HGM] for obsolete args\r
\r
+HWND hwndMain = NULL; /* root window*/\r
+HWND hwndConsole = NULL;\r
+HWND commentDialog = NULL;\r
+HWND moveHistoryDialog = NULL;\r
HWND evalGraphDialog = NULL;\r
-BOOLEAN evalGraphDialogUp = FALSE;\r
-\r
-WindowPlacement wpEvalGraph;\r
-\r
HWND engineOutputDialog = NULL;\r
-BOOLEAN engineOutputDialogUp = FALSE;\r
+HWND gameListDialog = NULL;\r
+HWND editTagsDialog = NULL;\r
+\r
+int commentUp = FALSE;\r
\r
+WindowPlacement wpMain;\r
+WindowPlacement wpConsole;\r
+WindowPlacement wpComment;\r
+WindowPlacement wpMoveHistory;\r
+WindowPlacement wpEvalGraph;\r
WindowPlacement wpEngineOutput;\r
WindowPlacement wpGameList;\r
-WindowPlacement wpConsole;\r
-\r
-VOID MoveHistoryPopUp();\r
-VOID MoveHistoryPopDown();\r
-VOID MoveHistorySet( char movelist[][2*MOVE_LEN], int first, int last, int current, ChessProgramStats_Move * pvInfo );\r
-BOOL MoveHistoryIsUp();\r
-\r
-VOID EvalGraphSet( int first, int last, int current, ChessProgramStats_Move * pvInfo );\r
-VOID EvalGraphPopUp();\r
-VOID EvalGraphPopDown();\r
-BOOL EvalGraphIsUp();\r
-\r
-VOID EngineOutputPopUp();\r
-VOID EngineOutputPopDown();\r
-BOOL EngineOutputIsUp();\r
-VOID EngineOutputUpdate( FrontEndProgramStats * stats );\r
+WindowPlacement wpTags;\r
\r
VOID EngineOptionsPopup(); // [HGM] settings\r
\r
InitBackEnd2();\r
\r
/* Make the window visible; update its client area; and return "success" */\r
- EnsureOnScreen(&boardX, &boardY, minX, minY);\r
+ EnsureOnScreen(&wpMain.x, &wpMain.y, minX, minY);\r
wp.length = sizeof(WINDOWPLACEMENT);\r
wp.flags = 0;\r
wp.showCmd = nCmdShow;\r
wp.ptMaxPosition.x = wp.ptMaxPosition.y = 0;\r
- wp.rcNormalPosition.left = boardX;\r
- wp.rcNormalPosition.right = boardX + winWidth;\r
- wp.rcNormalPosition.top = boardY;\r
- wp.rcNormalPosition.bottom = boardY + winHeight;\r
+ wp.rcNormalPosition.left = wpMain.x;\r
+ wp.rcNormalPosition.right = wpMain.x + wpMain.width;\r
+ wp.rcNormalPosition.top = wpMain.y;\r
+ wp.rcNormalPosition.bottom = wpMain.y + wpMain.height;\r
SetWindowPlacement(hwndMain, &wp);\r
\r
if(!appData.noGUI) SetWindowPos(hwndMain, alwaysOnTop ? HWND_TOPMOST : HWND_NOTOPMOST,\r
{ "secondNPS", ArgInt, (LPVOID) &appData.secondNPS, FALSE },\r
{ "noGUI", ArgTrue, (LPVOID) &appData.noGUI, FALSE },\r
{ "keepLineBreaksICS", ArgBoolean, (LPVOID) &appData.noJoin, TRUE },\r
-\r
+ { "wrapContinuationSequence", ArgString, (LPVOID) &appData.wrapContSeq, FALSE },\r
+ { "useInternalWrap", ArgTrue, (LPVOID) &appData.useInternalWrap, FALSE }, /* noJoin usurps this if set */\r
+ \r
// [HGM] placement: put all window layouts last in ini file, but man X,Y before all others\r
{ "minX", ArgZ, (LPVOID) &minX, FALSE }, // [HGM] placement: to make suer auxialary windows can be placed\r
{ "minY", ArgZ, (LPVOID) &minY, FALSE },\r
- { "winWidth", ArgInt, (LPVOID) &winWidth, TRUE }, // [HGM] placement: dummies to remember right & bottom\r
- { "winHeight", ArgInt, (LPVOID) &winHeight, TRUE }, // for attaching auxiliary windows to them\r
- { "x", ArgInt, (LPVOID) &boardX, TRUE },\r
- { "y", ArgInt, (LPVOID) &boardY, TRUE },\r
+ { "winWidth", ArgInt, (LPVOID) &wpMain.width, TRUE }, // [HGM] placement: dummies to remember right & bottom\r
+ { "winHeight", ArgInt, (LPVOID) &wpMain.height, TRUE }, // for attaching auxiliary windows to them\r
+ { "x", ArgInt, (LPVOID) &wpMain.x, TRUE },\r
+ { "y", ArgInt, (LPVOID) &wpMain.y, TRUE },\r
{ "icsX", ArgX, (LPVOID) &wpConsole.x, TRUE },\r
{ "icsY", ArgY, (LPVOID) &wpConsole.y, TRUE },\r
{ "icsW", ArgInt, (LPVOID) &wpConsole.width, TRUE },\r
{ "icsH", ArgInt, (LPVOID) &wpConsole.height, TRUE },\r
- { "analysisX", ArgX, (LPVOID) &analysisX, FALSE }, // [HGM] placement: analysis window no longer exists\r
- { "analysisY", ArgY, (LPVOID) &analysisY, FALSE }, // provided for compatibility with old ini files\r
- { "analysisW", ArgInt, (LPVOID) &analysisW, FALSE },\r
- { "analysisH", ArgInt, (LPVOID) &analysisH, FALSE },\r
- { "commentX", ArgX, (LPVOID) &commentX, TRUE },\r
- { "commentY", ArgY, (LPVOID) &commentY, TRUE },\r
- { "commentW", ArgInt, (LPVOID) &commentW, TRUE },\r
- { "commentH", ArgInt, (LPVOID) &commentH, TRUE },\r
- { "tagsX", ArgX, (LPVOID) &editTagsX, TRUE },\r
- { "tagsY", ArgY, (LPVOID) &editTagsY, TRUE },\r
- { "tagsW", ArgInt, (LPVOID) &editTagsW, TRUE },\r
- { "tagsH", ArgInt, (LPVOID) &editTagsH, TRUE },\r
+ { "analysisX", ArgX, (LPVOID) &dummy, FALSE }, // [HGM] placement: analysis window no longer exists\r
+ { "analysisY", ArgY, (LPVOID) &dummy, FALSE }, // provided for compatibility with old ini files\r
+ { "analysisW", ArgInt, (LPVOID) &dummy, FALSE },\r
+ { "analysisH", ArgInt, (LPVOID) &dummy, FALSE },\r
+ { "commentX", ArgX, (LPVOID) &wpComment.x, TRUE },\r
+ { "commentY", ArgY, (LPVOID) &wpComment.y, TRUE },\r
+ { "commentW", ArgInt, (LPVOID) &wpComment.width, TRUE },\r
+ { "commentH", ArgInt, (LPVOID) &wpComment.height, TRUE },\r
+ { "tagsX", ArgX, (LPVOID) &wpTags.x, TRUE },\r
+ { "tagsY", ArgY, (LPVOID) &wpTags.y, TRUE },\r
+ { "tagsW", ArgInt, (LPVOID) &wpTags.width, TRUE },\r
+ { "tagsH", ArgInt, (LPVOID) &wpTags.height, TRUE },\r
{ "gameListX", ArgX, (LPVOID) &wpGameList.x, TRUE },\r
{ "gameListY", ArgY, (LPVOID) &wpGameList.y, TRUE },\r
{ "gameListW", ArgInt, (LPVOID) &wpGameList.width, TRUE },\r
mfp->italic = (strchr(p, 'i') != NULL);\r
mfp->underline = (strchr(p, 'u') != NULL);\r
mfp->strikeout = (strchr(p, 's') != NULL);\r
+ mfp->charset = DEFAULT_CHARSET;\r
+ q = strchr(p, 'c');\r
+ if (q)\r
+ mfp->charset = (BYTE) atoi(q+1);\r
}\r
\r
/* Color name parser.\r
break;\r
\r
case ArgX:\r
- *(int *) ad->argLoc = atoi(argValue) + boardX; // [HGM] placement: translate stored relative to absolute \r
+ *(int *) ad->argLoc = atoi(argValue) + wpMain.x; // [HGM] placement: translate stored relative to absolute \r
break;\r
\r
case ArgY:\r
- *(int *) ad->argLoc = atoi(argValue) + boardY; // (this is really kludgey, it should be done where used...)\r
+ *(int *) ad->argLoc = atoi(argValue) + wpMain.y; // (this is really kludgey, it should be done where used...)\r
break;\r
\r
case ArgZ:\r
*(int *) ad->argLoc = atoi(argValue);\r
- EnsureOnScreen(&boardX, &boardY, minX, minY); \r
+ EnsureOnScreen(&wpMain.x, &wpMain.y, minX, minY); \r
break;\r
\r
case ArgFloat:\r
lf->lfItalic = mfp->italic;\r
lf->lfUnderline = mfp->underline;\r
lf->lfStrikeOut = mfp->strikeout;\r
- lf->lfCharSet = DEFAULT_CHARSET;\r
+ lf->lfCharSet = mfp->charset;\r
lf->lfOutPrecision = OUT_DEFAULT_PRECIS;\r
lf->lfClipPrecision = CLIP_DEFAULT_PRECIS;\r
lf->lfQuality = DEFAULT_QUALITY;\r
dcb.StopBits = ONESTOPBIT;\r
settingsFileName = SETTINGS_FILE;\r
saveSettingsOnExit = TRUE;\r
- boardX = CW_USEDEFAULT;\r
- boardY = CW_USEDEFAULT;\r
- analysisX = CW_USEDEFAULT; \r
- analysisY = CW_USEDEFAULT; \r
- analysisW = CW_USEDEFAULT;\r
- analysisH = CW_USEDEFAULT;\r
- commentX = CW_USEDEFAULT; \r
- commentY = CW_USEDEFAULT; \r
- commentW = CW_USEDEFAULT;\r
- commentH = CW_USEDEFAULT;\r
- editTagsX = CW_USEDEFAULT; \r
- editTagsY = CW_USEDEFAULT; \r
- editTagsW = CW_USEDEFAULT;\r
- editTagsH = CW_USEDEFAULT;\r
+ wpMain.x = CW_USEDEFAULT;\r
+ wpMain.y = CW_USEDEFAULT;\r
+ wpComment.x = CW_USEDEFAULT; \r
+ wpComment.y = CW_USEDEFAULT; \r
+ wpComment.width = CW_USEDEFAULT;\r
+ wpComment.height = CW_USEDEFAULT;\r
+ wpTags.x = CW_USEDEFAULT; \r
+ wpTags.y = CW_USEDEFAULT; \r
+ wpTags.width = CW_USEDEFAULT;\r
+ wpTags.height = CW_USEDEFAULT;\r
icsTextMenuString = ICS_TEXT_MENU_DEFAULT;\r
icsNames = ICS_NAMES;\r
firstChessProgramNames = FCP_NAMES;\r
ParseArgs(StringGet, &lpCmdLine);\r
\r
/* [HGM] make sure board size is acceptable */\r
- if(appData.NrFiles > BOARD_SIZE ||\r
- appData.NrRanks > BOARD_SIZE )\r
- DisplayFatalError("Recompile with BOARD_SIZE > 12, to support this size", 0, 2);\r
+ if(appData.NrFiles > BOARD_FILES ||\r
+ appData.NrRanks > BOARD_RANKS )\r
+ DisplayFatalError("Recompile with BOARD_RANKS or BOARD_FILES, to support this size", 0, 2);\r
\r
/* [HGM] After parsing the options from the .ini file, and overruling them\r
* with options from the command line, we now make an even higher priority\r
MF_CHECKED : MF_UNCHECKED));\r
}\r
\r
+// [HGM] args: these two cases taken out to stay in front-end\r
+ void SaveFontArg(FILE *f, ArgDescriptor *ad)\r
+ {\r
+ int bs;\r
+ for (bs=0; bs<NUM_SIZES; bs++) {\r
+ MyFontParams *mfp = &font[bs][(int) ad->argLoc]->mfp;\r
+ fprintf(f, "/size=%s ", sizeInfo[bs].name);\r
+ fprintf(f, "/%s=\"%s:%g%s%s%s%s%sc%d\"\n",\r
+ ad->argName, mfp->faceName, mfp->pointSize,\r
+ mfp->bold || mfp->italic || mfp->underline || mfp->strikeout ? " " : "",\r
+ mfp->bold ? "b" : "",\r
+ mfp->italic ? "i" : "",\r
+ mfp->underline ? "u" : "",\r
+ mfp->strikeout ? "s" : "",\r
+ (int)mfp->charset);\r
+ }\r
+ }\r
+\r
+ void SaveAttribsArg(FILE *f, ArgDescriptor *ad)\r
+ {\r
+ MyTextAttribs* ta = &textAttribs[(ColorClass)ad->argLoc];\r
+ fprintf(f, "/%s=\"%s%s%s%s%s#%02lx%02lx%02lx\"\n", ad->argName,\r
+ (ta->effects & CFE_BOLD) ? "b" : "",\r
+ (ta->effects & CFE_ITALIC) ? "i" : "",\r
+ (ta->effects & CFE_UNDERLINE) ? "u" : "",\r
+ (ta->effects & CFE_STRIKEOUT) ? "s" : "",\r
+ (ta->effects) ? " " : "",\r
+ ta->color&0xff, (ta->color >> 8)&0xff, (ta->color >> 16)&0xff);\r
+ }\r
+\r
+int MainWindowUp()\r
+{ // [HGM] args: allows testing if main window is realized from back-end\r
+ return hwndMain != NULL;\r
+}\r
\r
VOID\r
SaveSettings(char* name)\r
{\r
FILE *f;\r
ArgDescriptor *ad;\r
- WINDOWPLACEMENT wp;\r
char dir[MSG_SIZ];\r
\r
- if (!hwndMain) return;\r
+ if (!MainWindowUp()) return;\r
\r
GetCurrentDirectory(MSG_SIZ, dir);\r
SetCurrentDirectory(installDir);\r
fprintf(f, "; Use a shortcut, an @indirection file, or a .bat file instead.\n");\r
fprintf(f, ";\n");\r
\r
- wp.length = sizeof(WINDOWPLACEMENT);\r
- GetWindowPlacement(hwndMain, &wp);\r
- boardX = wp.rcNormalPosition.left;\r
- boardY = wp.rcNormalPosition.top;\r
-\r
- if (hwndConsole) {\r
- GetWindowPlacement(hwndConsole, &wp);\r
- wpConsole.x = wp.rcNormalPosition.left;\r
- wpConsole.y = wp.rcNormalPosition.top;\r
- wpConsole.width = wp.rcNormalPosition.right - wp.rcNormalPosition.left;\r
- wpConsole.height = wp.rcNormalPosition.bottom - wp.rcNormalPosition.top;\r
- }\r
-\r
- if (analysisDialog) {\r
- GetWindowPlacement(analysisDialog, &wp);\r
- analysisX = wp.rcNormalPosition.left;\r
- analysisY = wp.rcNormalPosition.top;\r
- analysisW = wp.rcNormalPosition.right - wp.rcNormalPosition.left;\r
- analysisH = wp.rcNormalPosition.bottom - wp.rcNormalPosition.top;\r
- }\r
-\r
- if (commentDialog) {\r
- GetWindowPlacement(commentDialog, &wp);\r
- commentX = wp.rcNormalPosition.left;\r
- commentY = wp.rcNormalPosition.top;\r
- commentW = wp.rcNormalPosition.right - wp.rcNormalPosition.left;\r
- commentH = wp.rcNormalPosition.bottom - wp.rcNormalPosition.top;\r
- }\r
-\r
- if (editTagsDialog) {\r
- GetWindowPlacement(editTagsDialog, &wp);\r
- editTagsX = wp.rcNormalPosition.left;\r
- editTagsY = wp.rcNormalPosition.top;\r
- editTagsW = wp.rcNormalPosition.right - wp.rcNormalPosition.left;\r
- editTagsH = wp.rcNormalPosition.bottom - wp.rcNormalPosition.top;\r
- }\r
-\r
- if (gameListDialog) {\r
- GetWindowPlacement(gameListDialog, &wp);\r
- wpGameList.x = wp.rcNormalPosition.left;\r
- wpGameList.y = wp.rcNormalPosition.top;\r
- wpGameList.width = wp.rcNormalPosition.right - wp.rcNormalPosition.left;\r
- wpGameList.height = wp.rcNormalPosition.bottom - wp.rcNormalPosition.top;\r
- }\r
+ GetActualPlacement(hwndMain, &wpMain);\r
+ GetActualPlacement(hwndConsole, &wpConsole);\r
+ GetActualPlacement(commentDialog, &wpComment);\r
+ GetActualPlacement(editTagsDialog, &wpTags);\r
+ GetActualPlacement(gameListDialog, &wpGameList);\r
\r
/* [AS] Move history */\r
wpMoveHistory.visible = MoveHistoryIsUp();\r
- \r
- if( moveHistoryDialog ) {\r
- GetWindowPlacement(moveHistoryDialog, &wp);\r
- wpMoveHistory.x = wp.rcNormalPosition.left;\r
- wpMoveHistory.y = wp.rcNormalPosition.top;\r
- wpMoveHistory.width = wp.rcNormalPosition.right - wp.rcNormalPosition.left;\r
- wpMoveHistory.height = wp.rcNormalPosition.bottom - wp.rcNormalPosition.top;\r
- }\r
+ GetActualPlacement(moveHistoryDialog, &wpMoveHistory);\r
\r
/* [AS] Eval graph */\r
wpEvalGraph.visible = EvalGraphIsUp();\r
-\r
- if( evalGraphDialog ) {\r
- GetWindowPlacement(evalGraphDialog, &wp);\r
- wpEvalGraph.x = wp.rcNormalPosition.left;\r
- wpEvalGraph.y = wp.rcNormalPosition.top;\r
- wpEvalGraph.width = wp.rcNormalPosition.right - wp.rcNormalPosition.left;\r
- wpEvalGraph.height = wp.rcNormalPosition.bottom - wp.rcNormalPosition.top;\r
- }\r
+ GetActualPlacement(evalGraphDialog, &wpEvalGraph);\r
\r
/* [AS] Engine output */\r
wpEngineOutput.visible = EngineOutputIsUp();\r
-\r
- if( engineOutputDialog ) {\r
- GetWindowPlacement(engineOutputDialog, &wp);\r
- wpEngineOutput.x = wp.rcNormalPosition.left;\r
- wpEngineOutput.y = wp.rcNormalPosition.top;\r
- wpEngineOutput.width = wp.rcNormalPosition.right - wp.rcNormalPosition.left;\r
- wpEngineOutput.height = wp.rcNormalPosition.bottom - wp.rcNormalPosition.top;\r
- }\r
+ GetActualPlacement(engineOutputDialog, &wpEngineOutput);\r
\r
for (ad = argDescriptors; ad->argName != NULL; ad++) {\r
if (!ad->save) continue;\r
fprintf(f, "/%s=%d\n", ad->argName, *(int *)ad->argLoc);\r
break;\r
case ArgX:\r
- fprintf(f, "/%s=%d\n", ad->argName, *(int *)ad->argLoc - boardX); // [HGM] placement: stor relative value\r
+ fprintf(f, "/%s=%d\n", ad->argName, *(int *)ad->argLoc - wpMain.x); // [HGM] placement: stor relative value\r
break;\r
case ArgY:\r
- fprintf(f, "/%s=%d\n", ad->argName, *(int *)ad->argLoc - boardY);\r
+ fprintf(f, "/%s=%d\n", ad->argName, *(int *)ad->argLoc - wpMain.y);\r
break;\r
case ArgFloat:\r
fprintf(f, "/%s=%g\n", ad->argName, *(float *)ad->argLoc);\r
}\r
break;\r
case ArgAttribs:\r
- {\r
- MyTextAttribs* ta = &textAttribs[(ColorClass)ad->argLoc];\r
- fprintf(f, "/%s=\"%s%s%s%s%s#%02lx%02lx%02lx\"\n", ad->argName,\r
- (ta->effects & CFE_BOLD) ? "b" : "",\r
- (ta->effects & CFE_ITALIC) ? "i" : "",\r
- (ta->effects & CFE_UNDERLINE) ? "u" : "",\r
- (ta->effects & CFE_STRIKEOUT) ? "s" : "",\r
- (ta->effects) ? " " : "",\r
- ta->color&0xff, (ta->color >> 8)&0xff, (ta->color >> 16)&0xff);\r
- }\r
+ SaveAttribsArg(f, ad);\r
break;\r
case ArgFilename:\r
if (strchr(*(char **)ad->argLoc, '\"')) {\r
sizeInfo[*(BoardSize *)ad->argLoc].name);\r
break;\r
case ArgFont:\r
- {\r
- int bs;\r
- for (bs=0; bs<NUM_SIZES; bs++) {\r
- MyFontParams *mfp = &font[bs][(int) ad->argLoc]->mfp;\r
- fprintf(f, "/size=%s ", sizeInfo[bs].name);\r
- fprintf(f, "/%s=\"%s:%g%s%s%s%s%s\"\n",\r
- ad->argName, mfp->faceName, mfp->pointSize,\r
- mfp->bold || mfp->italic || mfp->underline || mfp->strikeout ? " " : "",\r
- mfp->bold ? "b" : "",\r
- mfp->italic ? "i" : "",\r
- mfp->underline ? "u" : "",\r
- mfp->strikeout ? "s" : "");\r
- }\r
- }\r
+ SaveFontArg(f, ad);\r
break;\r
case ArgCommSettings:\r
PrintCommSettings(f, ad->argName, (DCB *)ad->argLoc);\r
}\r
else if( strstr(lf.lfFaceName,"GC2004D") != NULL ) {\r
/* Good Companion (Some characters get warped as literal :-( */\r
- char s[] = "1cmWG0ñueOS¯®oYI23wgQU";\r
+ char s[] = "1cmWG0??S??oYI23wgQU";\r
s[0]=0xB9; s[1]=0xA9; s[6]=0xB1; s[11]=0xBB; s[12]=0xAB; s[17]=0xB3;\r
SetCharTable(pieceToFontChar, s);\r
}\r
/* [HGM] call with -2 uses old size (for if nr of files, ranks changes) */\r
if(boardSize == (BoardSize)(-2) ) boardSize = oldBoardSize;\r
\r
- oldRect.left = boardX; //[HGM] placement: remember previous window params\r
- oldRect.top = boardY;\r
- oldRect.right = boardX + winWidth;\r
- oldRect.bottom = boardY + winHeight;\r
+ oldRect.left = wpMain.x; //[HGM] placement: remember previous window params\r
+ oldRect.top = wpMain.y;\r
+ oldRect.right = wpMain.x + wpMain.width;\r
+ oldRect.bottom = wpMain.y + wpMain.height;\r
\r
tinyLayout = sizeInfo[boardSize].tinyLayout;\r
smallLayout = sizeInfo[boardSize].smallLayout;\r
winH = 2 * GetSystemMetrics(SM_CYFRAME) + GetSystemMetrics(SM_CYMENU) +\r
GetSystemMetrics(SM_CYCAPTION) + boardRect.bottom + OUTER_MARGIN;\r
if(suppressVisibleEffects) return; // [HGM] when called for filling sizeInfo only\r
- winWidth = winW; // [HGM] placement: set through temporary which can used by initial sizing choice\r
- winHeight = winH; // without disturbing window attachments\r
+ wpMain.width = winW; // [HGM] placement: set through temporary which can used by initial sizing choice\r
+ wpMain.height = winH; // without disturbing window attachments\r
GetWindowRect(hwndMain, &wrect);\r
- SetWindowPos(hwndMain, NULL, 0, 0, winWidth, winHeight,\r
+ SetWindowPos(hwndMain, NULL, 0, 0, wpMain.width, wpMain.height,\r
SWP_NOCOPYBITS|SWP_NOZORDER|SWP_NOMOVE);\r
\r
// [HGM] placement: let attached windows follow size change.\r
- ReattachAfterSize( &oldRect, winWidth, winHeight, moveHistoryDialog, &wpMoveHistory );\r
- ReattachAfterSize( &oldRect, winWidth, winHeight, evalGraphDialog, &wpEvalGraph );\r
- ReattachAfterSize( &oldRect, winWidth, winHeight, engineOutputDialog, &wpEngineOutput );\r
- ReattachAfterSize( &oldRect, winWidth, winHeight, gameListDialog, &wpGameList );\r
- ReattachAfterSize( &oldRect, winWidth, winHeight, hwndConsole, &wpConsole );\r
+ ReattachAfterSize( &oldRect, wpMain.width, wpMain.height, moveHistoryDialog, &wpMoveHistory );\r
+ ReattachAfterSize( &oldRect, wpMain.width, wpMain.height, evalGraphDialog, &wpEvalGraph );\r
+ ReattachAfterSize( &oldRect, wpMain.width, wpMain.height, engineOutputDialog, &wpEngineOutput );\r
+ ReattachAfterSize( &oldRect, wpMain.width, wpMain.height, gameListDialog, &wpGameList );\r
+ ReattachAfterSize( &oldRect, wpMain.width, wpMain.height, hwndConsole, &wpConsole );\r
\r
/* compensate if menu bar wrapped */\r
GetClientRect(hwndMain, &crect);\r
offby = boardRect.bottom + OUTER_MARGIN - crect.bottom;\r
- winHeight += offby;\r
+ wpMain.height += offby;\r
switch (flags) {\r
case WMSZ_TOPLEFT:\r
SetWindowPos(hwndMain, NULL, \r
- wrect.right - winWidth, wrect.bottom - winHeight, \r
- winWidth, winHeight, SWP_NOCOPYBITS|SWP_NOZORDER);\r
+ wrect.right - wpMain.width, wrect.bottom - wpMain.height, \r
+ wpMain.width, wpMain.height, SWP_NOCOPYBITS|SWP_NOZORDER);\r
break;\r
\r
case WMSZ_TOPRIGHT:\r
case WMSZ_TOP:\r
SetWindowPos(hwndMain, NULL, \r
- wrect.left, wrect.bottom - winHeight, \r
- winWidth, winHeight, SWP_NOCOPYBITS|SWP_NOZORDER);\r
+ wrect.left, wrect.bottom - wpMain.height, \r
+ wpMain.width, wpMain.height, SWP_NOCOPYBITS|SWP_NOZORDER);\r
break;\r
\r
case WMSZ_BOTTOMLEFT:\r
case WMSZ_LEFT:\r
SetWindowPos(hwndMain, NULL, \r
- wrect.right - winWidth, wrect.top, \r
- winWidth, winHeight, SWP_NOCOPYBITS|SWP_NOZORDER);\r
+ wrect.right - wpMain.width, wrect.top, \r
+ wpMain.width, wpMain.height, SWP_NOCOPYBITS|SWP_NOZORDER);\r
break;\r
\r
case WMSZ_BOTTOMRIGHT:\r
case WMSZ_BOTTOM:\r
case WMSZ_RIGHT:\r
default:\r
- SetWindowPos(hwndMain, NULL, 0, 0, winWidth, winHeight,\r
+ SetWindowPos(hwndMain, NULL, 0, 0, wpMain.width, wpMain.height,\r
SWP_NOCOPYBITS|SWP_NOZORDER|SWP_NOMOVE);\r
break;\r
}\r
but animation is fast enough that it's difficult to notice.\r
*/\r
if( animInfo.piece == EmptySquare ) {\r
- if( (appData.highlightLastMove || appData.highlightDragging) && IsDrawArrowEnabled() && HasHighlightInfo() ) {\r
+ if( (appData.highlightLastMove || appData.highlightDragging) && IsDrawArrowEnabled() /*&& HasHighlightInfo()*/ ) {\r
result = TRUE;\r
}\r
}\r
if( liteBackTexture != NULL || darkBackTexture != NULL ) {\r
static int backTextureBoardSize; /* [HGM] boardsize: also new texture if board format changed */\r
if( backTextureSquareSize != squareSize \r
- || backTextureBoardSize != BOARD_WIDTH+BOARD_SIZE*BOARD_HEIGHT) {\r
- backTextureBoardSize = BOARD_WIDTH+BOARD_SIZE*BOARD_HEIGHT;\r
+ || backTextureBoardSize != BOARD_WIDTH+BOARD_FILES*BOARD_HEIGHT) {\r
+ backTextureBoardSize = BOARD_WIDTH+BOARD_FILES*BOARD_HEIGHT;\r
backTextureSquareSize = squareSize;\r
RebuildTextureSquareInfo();\r
}\r
* The offset boardRect.left or boardRect.top must already have been\r
* subtracted from x.\r
*/\r
-int\r
-EventToSquare(int x)\r
+int EventToSquare(x, limit)\r
+ int x, limit;\r
{\r
if (x <= 0)\r
return -2;\r
if ((x % (squareSize + lineGap)) >= squareSize)\r
return -1;\r
x /= (squareSize + lineGap);\r
- if (x >= BOARD_SIZE)\r
+ if (x >= limit)\r
return -2;\r
return x;\r
}\r
}\r
}\r
\r
+void DragPieceBegin(int x, int y)\r
+{\r
+ dragInfo.lastpos.x = boardRect.left + x;\r
+ dragInfo.lastpos.y = boardRect.top + y;\r
+ dragInfo.from.x = fromX;\r
+ dragInfo.from.y = fromY;\r
+ dragInfo.start = dragInfo.from;\r
+ SetCapture(hwndMain);\r
+}\r
+\r
+void DragPieceEnd(int x, int y)\r
+{\r
+ ReleaseCapture();\r
+ dragInfo.start.x = dragInfo.start.y = -1;\r
+ dragInfo.from = dragInfo.start;\r
+ dragInfo.pos = dragInfo.lastpos = dragInfo.start;\r
+}\r
+\r
/* Event handler for mouse messages */\r
VOID\r
MouseEvent(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)\r
POINT pt;\r
static int recursive = 0;\r
HMENU hmenu;\r
-// BOOLEAN needsRedraw = FALSE;\r
- BOOLEAN saveAnimate;\r
BOOLEAN forceFullRepaint = IsFullRepaintPreferrable(); /* [AS] */\r
- static BOOLEAN sameAgain = FALSE, promotionChoice = FALSE;\r
- ChessMove moveType;\r
\r
if (recursive) {\r
if (message == WM_MBUTTONUP) {\r
\r
pt.x = LOWORD(lParam);\r
pt.y = HIWORD(lParam);\r
- x = EventToSquare(pt.x - boardRect.left);\r
- y = EventToSquare(pt.y - boardRect.top);\r
+ x = EventToSquare(pt.x - boardRect.left, BOARD_WIDTH);\r
+ y = EventToSquare(pt.y - boardRect.top, BOARD_HEIGHT);\r
if (!flipView && y >= 0) {\r
y = BOARD_HEIGHT - 1 - y;\r
}\r
\r
switch (message) {\r
case WM_LBUTTONDOWN:\r
- if(promotionChoice) { // we are waiting for a click to indicate promotion piece\r
- promotionChoice = FALSE; // only one chance: if click not OK it is interpreted as cancel\r
- if(appData.debugMode) fprintf(debugFP, "promotion click, x=%d, y=%d\n", x, y);\r
- if(gameInfo.holdingsWidth && \r
- (WhiteOnMove(currentMove) \r
- ? x == BOARD_WIDTH-1 && y < gameInfo.holdingsSize && y > 0\r
- : x == 0 && y >= BOARD_HEIGHT - gameInfo.holdingsSize && y < BOARD_HEIGHT-1) ) {\r
- // click in right holdings, for determining promotion piece\r
- ChessSquare p = boards[currentMove][y][x];\r
- if(appData.debugMode) fprintf(debugFP, "square contains %d\n", (int)p);\r
- if(p != EmptySquare) {\r
- FinishMove(WhitePromotionQueen, fromX, fromY, toX, toY, ToLower(PieceToChar(p)));\r
- fromX = fromY = -1;\r
- break;\r
- }\r
- }\r
- DrawPosition(FALSE, boards[currentMove]);\r
- break;\r
- }\r
- ErrorPopDown();\r
- sameAgain = FALSE;\r
- if (y == -2) {\r
- /* Downclick vertically off board; check if on clock */\r
if (PtInRect((LPRECT) &whiteRect, pt)) {\r
if (gameMode == EditPosition) {\r
SetWhiteToPlayEvent();\r
AdjustClock(!flipClock, -1);\r
}\r
}\r
- if (!appData.highlightLastMove) {\r
- ClearHighlights();\r
- DrawPosition((int) (forceFullRepaint || FALSE), NULL);\r
- }\r
- fromX = fromY = -1;\r
dragInfo.start.x = dragInfo.start.y = -1;\r
dragInfo.from = dragInfo.start;\r
- break;\r
- } else if (x < 0 || y < 0\r
- /* [HGM] block clicks between board and holdings */\r
- || x == BOARD_LEFT-1 || x == BOARD_RGHT\r
- || (x == BOARD_LEFT-2 && y < BOARD_HEIGHT-gameInfo.holdingsSize)\r
- || (x == BOARD_RGHT+1 && y >= gameInfo.holdingsSize)\r
- /* EditPosition, empty square, or different color piece;\r
- click-click move is possible */\r
- ) {\r
- break;\r
- } else if (fromX == x && fromY == y) {\r
- /* Downclick on same square again */\r
- ClearHighlights();\r
- DrawPosition(forceFullRepaint || FALSE, NULL);\r
- sameAgain = TRUE; \r
- } else if (fromX != -1 &&\r
- x != BOARD_LEFT-2 && x != BOARD_RGHT+1 \r
- ) {\r
- /* Downclick on different square. */\r
- /* [HGM] if on holdings file, should count as new first click ! */\r
- /* [HGM] <sameColor> now always do UserMoveTest(), and check colors there */\r
- toX = x;\r
- toY = y;\r
- /* [HGM] <popupFix> UserMoveEvent requires two calls now,\r
- to make sure move is legal before showing promotion popup */\r
- moveType = UserMoveTest(fromX, fromY, toX, toY, NULLCHAR, FALSE);\r
- if(moveType == AmbiguousMove) { /* [HGM] Edit-Position move executed */\r
+ if(fromX == -1 && frozen) { // not sure where this is for\r
fromX = fromY = -1; \r
- ClearHighlights();\r
- DrawPosition(FALSE, boards[currentMove]);\r
- break; \r
- } else \r
- if(moveType != ImpossibleMove && moveType != Comment) {\r
- /* [HGM] We use PromotionToKnight in Shogi to indicate frorced promotion */\r
- if (moveType == WhitePromotionKnight || moveType == BlackPromotionKnight ||\r
- ((moveType == WhitePromotionQueen || moveType == BlackPromotionQueen) &&\r
- appData.alwaysPromoteToQueen)) {\r
- FinishMove(moveType, fromX, fromY, toX, toY, 'q');\r
- if (!appData.highlightLastMove) {\r
- ClearHighlights();\r
- DrawPosition(forceFullRepaint || FALSE, NULL);\r
- }\r
- } else\r
- if (moveType == WhitePromotionQueen || moveType == BlackPromotionQueen ) {\r
- SetHighlights(fromX, fromY, toX, toY);\r
- DrawPosition(forceFullRepaint || FALSE, NULL);\r
- /* [HGM] <popupFix> Popup calls FinishMove now.\r
- If promotion to Q is legal, all are legal! */\r
- if(gameInfo.variant == VariantSuper || gameInfo.variant == VariantGreat)\r
- { ChessSquare p = boards[currentMove][fromY][fromX], q = boards[currentMove][toY][toX];\r
- // kludge to temporarily execute move on display, without promoting yet\r
- promotionChoice = TRUE;\r
- boards[currentMove][fromY][fromX] = EmptySquare; // move Pawn to 8th rank\r
- boards[currentMove][toY][toX] = p;\r
- DrawPosition(FALSE, boards[currentMove]);\r
- boards[currentMove][fromY][fromX] = p; // take back, but display stays\r
- boards[currentMove][toY][toX] = q;\r
- DisplayMessage("Select piece from holdings", "");\r
- } else\r
- PromotionPopup(hwnd);\r
- goto noClear;\r
- } else { // not a promotion. Move can be illegal if testLegality off, and should be made then.\r
- if (appData.animate || appData.highlightLastMove) {\r
- SetHighlights(fromX, fromY, toX, toY);\r
- } else {\r
- ClearHighlights();\r
- }\r
- FinishMove(moveType, fromX, fromY, toX, toY, NULLCHAR);\r
- if (appData.animate && !appData.highlightLastMove) {\r
- ClearHighlights();\r
- DrawPosition(forceFullRepaint || FALSE, NULL);\r
- }\r
- }\r
- fromX = fromY = -1;\r
- noClear:\r
- break;\r
- }\r
- if (gotPremove && moveType != Comment) {\r
- SetPremoveHighlights(fromX, fromY, toX, toY);\r
-// DrawPosition(forceFullRepaint || FALSE, NULL);\r
- } else ClearHighlights();\r
- fromX = fromY = -1;\r
- DrawPosition(forceFullRepaint || FALSE, NULL);\r
- if(moveType != Comment) break;\r
- }\r
- /* First downclick, or restart on a square with same color piece */\r
- if (!frozen && OKToStartUserMove(x, y)) {\r
- fromX = x;\r
- fromY = y;\r
- dragInfo.lastpos = pt;\r
- dragInfo.from.x = fromX;\r
- dragInfo.from.y = fromY;\r
- dragInfo.start = dragInfo.from;\r
- SetCapture(hwndMain);\r
- } else {\r
- fromX = fromY = -1;\r
- dragInfo.start.x = dragInfo.start.y = -1;\r
- dragInfo.from = dragInfo.start;\r
DrawPosition(forceFullRepaint || FALSE, NULL); /* [AS] */\r
+ break;\r
}\r
+ LeftClick(Press, pt.x - boardRect.left, pt.y - boardRect.top);\r
+ DrawPosition(TRUE, NULL);\r
break;\r
\r
case WM_LBUTTONUP:\r
- ReleaseCapture();\r
- if (fromX == -1) break;\r
- if (x == fromX && y == fromY) {\r
- dragInfo.from.x = dragInfo.from.y = -1;\r
- /* Upclick on same square */\r
- if (sameAgain) {\r
- /* Clicked same square twice: abort click-click move */\r
- fromX = fromY = -1;\r
- gotPremove = 0;\r
- ClearPremoveHighlights();\r
- } else {\r
- /* First square clicked: start click-click move */\r
- SetHighlights(fromX, fromY, -1, -1);\r
- }\r
- DrawPosition(forceFullRepaint || FALSE, NULL);\r
- } else if (dragInfo.from.x < 0 || dragInfo.from.y < 0) {\r
- /* Errant click; ignore */\r
- break;\r
- } else {\r
- /* Finish drag move. */\r
- if (appData.debugMode) {\r
- fprintf(debugFP, "release\n");\r
- }\r
- dragInfo.from.x = dragInfo.from.y = -1;\r
- toX = x;\r
- toY = y;\r
- saveAnimate = appData.animate; /* sorry, Hawk :) */\r
- appData.animate = appData.animate && !appData.animateDragging;\r
- moveType = UserMoveTest(fromX, fromY, toX, toY, NULLCHAR, TRUE);\r
- if(moveType == AmbiguousMove) { /* [HGM] Edit-Position move executed */\r
- fromX = fromY = -1; \r
- ClearHighlights();\r
- DrawPosition(FALSE, boards[currentMove]);\r
- appData.animate = saveAnimate;\r
- break; \r
- } else \r
- if(moveType != ImpossibleMove) {\r
- /* [HGM] use move type to determine if move is promotion.\r
- Knight is Shogi kludge for mandatory promotion, Queen means choice */\r
- if (moveType == WhitePromotionKnight || moveType == BlackPromotionKnight ||\r
- ((moveType == WhitePromotionQueen || moveType == BlackPromotionQueen) &&\r
- appData.alwaysPromoteToQueen)) \r
- FinishMove(moveType, fromX, fromY, toX, toY, 'q');\r
- else \r
- if (moveType == WhitePromotionQueen || moveType == BlackPromotionQueen ) {\r
- DrawPosition(forceFullRepaint || FALSE, NULL);\r
- if(gameInfo.variant == VariantSuper || gameInfo.variant == VariantGreat)\r
- { ChessSquare p = boards[currentMove][fromY][fromX], q = boards[currentMove][toY][toX];\r
- // kludge to temporarily execute move on display, wthout promotng yet\r
- promotionChoice = TRUE;\r
- boards[currentMove][fromY][fromX] = EmptySquare; // move Pawn to 8th rank\r
- boards[currentMove][toY][toX] = p;\r
- DrawPosition(FALSE, boards[currentMove]);\r
- boards[currentMove][fromY][fromX] = p; // take back, but display stays\r
- boards[currentMove][toY][toX] = q;\r
- appData.animate = saveAnimate;\r
- DisplayMessage("Select piece from holdings", "");\r
- break;\r
- } else\r
- PromotionPopup(hwnd); /* [HGM] Popup now calls FinishMove */\r
- } else {\r
- if(saveAnimate /* ^$!%@#$!$ */ && gameInfo.variant == VariantAtomic \r
- && (boards[currentMove][toY][toX] != EmptySquare || \r
- moveType == WhiteCapturesEnPassant || \r
- moveType == BlackCapturesEnPassant ) )\r
- AnimateAtomicCapture(fromX, fromY, toX, toY, 20);\r
- FinishMove(moveType, fromX, fromY, toX, toY, NULLCHAR);\r
- }\r
- }\r
- if (gotPremove) SetPremoveHighlights(fromX, fromY, toX, toY);\r
- appData.animate = saveAnimate;\r
- fromX = fromY = -1;\r
- if (appData.highlightDragging && !appData.highlightLastMove) {\r
- ClearHighlights();\r
- }\r
- if (appData.animate || appData.animateDragging ||\r
- appData.highlightDragging || gotPremove) {\r
- DrawPosition(forceFullRepaint || FALSE, NULL);\r
- }\r
- }\r
- dragInfo.start.x = dragInfo.start.y = -1; \r
- dragInfo.pos = dragInfo.lastpos = dragInfo.start;\r
+ LeftClick(Release, pt.x - boardRect.left, pt.y - boardRect.top);\r
+ DrawPosition(TRUE, NULL);\r
break;\r
\r
case WM_MOUSEMOVE:\r
{\r
BOOL full_repaint = FALSE;\r
\r
- sameAgain = FALSE; /* [HGM] if we drag something around, do keep square selected */\r
if (appData.animateDragging) {\r
dragInfo.pos = pt;\r
}\r
only show the popup when we are already sure the move is valid or\r
legal. We pass a faulty move type, but the kludge is that FinishMove\r
will figure out it is a promotion from the promoChar. */\r
- FinishMove(NormalMove, fromX, fromY, toX, toY, promoChar);\r
+ UserMoveEvent(fromX, fromY, toX, toY, promoChar);\r
+ fromX = fromY = -1;\r
if (!appData.highlightLastMove) {\r
ClearHighlights();\r
DrawPosition(FALSE, NULL);\r
FreeProcInstance(lpProc);\r
}\r
\r
+void\r
+PromotionPopUp()\r
+{\r
+ DrawPosition(TRUE, NULL);\r
+ PromotionPopup(hwndMain);\r
+}\r
+\r
/* Toggle ShowThinking */\r
VOID\r
ToggleShowThinking()\r
}\r
}\r
\r
+int get_term_width()\r
+{\r
+ HDC hdc;\r
+ TEXTMETRIC tm;\r
+ RECT rc;\r
+ HFONT hfont, hold_font;\r
+ LOGFONT lf;\r
+ HWND hText;\r
+\r
+ if (hwndConsole)\r
+ hText = GetDlgItem(hwndConsole, OPT_ConsoleText);\r
+ else\r
+ return 79;\r
+\r
+ // get the text metrics\r
+ hdc = GetDC(hText);\r
+ lf = font[boardSize][CONSOLE_FONT]->lf;\r
+ if (consoleCF.dwEffects & CFE_BOLD)\r
+ lf.lfWeight = FW_BOLD;\r
+ if (consoleCF.dwEffects & CFE_ITALIC)\r
+ lf.lfItalic = TRUE;\r
+ if (consoleCF.dwEffects & CFE_STRIKEOUT)\r
+ lf.lfStrikeOut = TRUE;\r
+ if (consoleCF.dwEffects & CFE_UNDERLINE)\r
+ lf.lfUnderline = TRUE;\r
+ hfont = CreateFontIndirect(&lf);\r
+ hold_font = SelectObject(hdc, hfont);\r
+ GetTextMetrics(hdc, &tm);\r
+ SelectObject(hdc, hold_font);\r
+ DeleteObject(hfont);\r
+ ReleaseDC(hText, hdc);\r
+\r
+ // get the rectangle\r
+ SendMessage(hText, EM_GETRECT, 0, (LPARAM)&rc);\r
+\r
+ return (rc.right-rc.left) / tm.tmAveCharWidth;\r
+}\r
+\r
void UpdateICSWidth(HWND hText)\r
{\r
- HDC hdc;\r
- TEXTMETRIC tm;\r
- RECT rc;\r
- HFONT hfont, hold_font;\r
- LONG old_width, new_width;\r
- \r
- // get the text metrics\r
- hdc = GetDC(hText);\r
- hfont = CreateFontIndirect(&font[boardSize][CONSOLE_FONT]->lf);\r
- hold_font = SelectObject(hdc, hfont);\r
- GetTextMetrics(hdc, &tm);\r
- SelectObject(hdc, hold_font);\r
- DeleteObject(hfont);\r
- ReleaseDC(hText, hdc);\r
-\r
- // get the rectangle\r
- SendMessage(hText, EM_GETRECT, 0, (LPARAM)&rc);\r
-\r
- // update the width\r
- new_width = (rc.right-rc.left) / tm.tmAveCharWidth;\r
- old_width = GetWindowLong(hText, GWL_USERDATA);\r
- if (new_width != old_width)\r
- {\r
- ics_update_width(new_width);\r
- SetWindowLong(hText, GWL_USERDATA, new_width);\r
- }\r
+ LONG old_width, new_width;\r
+\r
+ new_width = get_term_width(hText, FALSE);\r
+ old_width = GetWindowLong(hText, GWL_USERDATA);\r
+ if (new_width != old_width)\r
+ {\r
+ ics_update_width(new_width);\r
+ SetWindowLong(hText, GWL_USERDATA, new_width);\r
+ }\r
}\r
\r
VOID\r
\r
JAWS_ALT_INTERCEPT\r
\r
- if (appData.icsActive && (char)wParam > ' ' && !((char)wParam >= '1' && (char)wParam <= '9')) { \r
+ if (appData.icsActive && ((char)wParam == '\r' || (char)wParam > ' ' && !((char)wParam >= '1' && (char)wParam <= '9'))) { \r
// [HGM] movenum: for non-zero digits we always do type-in dialog\r
HWND h = GetDlgItem(hwndConsole, OPT_ConsoleInput);\r
if (IsIconic(hwndConsole)) ShowWindow(hwndConsole, SW_RESTORE);\r
switch (wmId) {\r
case IDM_NewGame:\r
ResetGameEvent();\r
- AnalysisPopDown();\r
SAY("new game enter a move to play against the computer with white");\r
break;\r
\r
case IDM_NewGameFRC:\r
if( NewGameFRC() == 0 ) {\r
ResetGameEvent();\r
- AnalysisPopDown();\r
}\r
break;\r
\r
break;\r
\r
case IDM_EditComment:\r
- if (commentDialogUp && editComment) {\r
+ if (commentUp && editComment) {\r
CommentPopDown();\r
} else {\r
EditCommentEvent();\r
RECT rcMain;\r
\r
// GetWindowRect( hwnd, &rcMain ); //[HGM] sticky: in XP this returned new position, not old\r
- rcMain.left = boardX; // replace by these 4 lines to reconstruct old rect\r
- rcMain.right = boardX + winWidth;\r
- rcMain.top = boardY;\r
- rcMain.bottom = boardY + winHeight;\r
+ rcMain.left = wpMain.x; // replace by these 4 lines to reconstruct old rect\r
+ rcMain.right = wpMain.x + wpMain.width;\r
+ rcMain.top = wpMain.y;\r
+ rcMain.bottom = wpMain.y + wpMain.height;\r
\r
ReattachAfterMove( &rcMain, lpwp->x, lpwp->y, moveHistoryDialog, &wpMoveHistory );\r
ReattachAfterMove( &rcMain, lpwp->x, lpwp->y, evalGraphDialog, &wpEvalGraph );\r
ReattachAfterMove( &rcMain, lpwp->x, lpwp->y, engineOutputDialog, &wpEngineOutput );\r
ReattachAfterMove( &rcMain, lpwp->x, lpwp->y, gameListDialog, &wpGameList );\r
ReattachAfterMove( &rcMain, lpwp->x, lpwp->y, hwndConsole, &wpConsole );\r
- boardX = lpwp->x;\r
- boardY = lpwp->y;\r
+ wpMain.x = lpwp->x;\r
+ wpMain.y = lpwp->y;\r
}\r
}\r
break;\r
GetClientRect(hDlg, &rect);\r
sizeX = rect.right;\r
sizeY = rect.bottom;\r
- if (commentX != CW_USEDEFAULT && commentY != CW_USEDEFAULT &&\r
- commentW != CW_USEDEFAULT && commentH != CW_USEDEFAULT) {\r
+ if (wpComment.x != CW_USEDEFAULT && wpComment.y != CW_USEDEFAULT &&\r
+ wpComment.width != CW_USEDEFAULT && wpComment.height != CW_USEDEFAULT) {\r
WINDOWPLACEMENT wp;\r
- EnsureOnScreen(&commentX, &commentY, 0, 0);\r
+ EnsureOnScreen(&wpComment.x, &wpComment.y, 0, 0);\r
wp.length = sizeof(WINDOWPLACEMENT);\r
wp.flags = 0;\r
wp.showCmd = SW_SHOW;\r
wp.ptMaxPosition.x = wp.ptMaxPosition.y = 0;\r
- wp.rcNormalPosition.left = commentX;\r
- wp.rcNormalPosition.right = commentX + commentW;\r
- wp.rcNormalPosition.top = commentY;\r
- wp.rcNormalPosition.bottom = commentY + commentH;\r
+ wp.rcNormalPosition.left = wpComment.x;\r
+ wp.rcNormalPosition.right = wpComment.x + wpComment.width;\r
+ wp.rcNormalPosition.top = wpComment.y;\r
+ wp.rcNormalPosition.bottom = wpComment.y + wpComment.height;\r
SetWindowPlacement(hDlg, &wp);\r
\r
GetClientRect(hDlg, &rect);\r
\r
if (commentDialog) {\r
SendMessage(commentDialog, WM_INITDIALOG, 0, 0);\r
- if (!commentDialogUp) ShowWindow(commentDialog, SW_SHOW);\r
+ if (!commentUp) ShowWindow(commentDialog, SW_SHOW);\r
} else {\r
lpProc = MakeProcInstance((FARPROC)CommentDialog, hInst);\r
CreateDialog(hInst, MAKEINTRESOURCE(DLG_EditComment),\r
hwndMain, (DLGPROC)lpProc);\r
FreeProcInstance(lpProc);\r
}\r
- commentDialogUp = TRUE;\r
+ commentUp = TRUE;\r
}\r
\r
\r
}\r
// [HGM] movenum: allow move number to be typed in any mode\r
if(sscanf(move, "%d", &n) == 1 && n != 0 ) {\r
- currentMove = 2*n-1;\r
- if(currentMove > forwardMostMove) currentMove = forwardMostMove;\r
- if(currentMove < backwardMostMove) currentMove = backwardMostMove;\r
+ ToNrEvent(2*n-1);\r
EndDialog(hDlg, TRUE);\r
- DrawPosition(TRUE, boards[currentMove]);\r
- if(currentMove > backwardMostMove) DisplayMove(currentMove - 1);\r
- else DisplayMessage("", "");\r
return TRUE;\r
}\r
}\r
case WM_INITDIALOG:\r
GetWindowRect(hDlg, &rChild);\r
\r
- SetWindowPos(hDlg, NULL, boardX, boardY-height, winWidth, height,\r
+ SetWindowPos(hDlg, NULL, wpMain.x, wpMain.y-height, wpMain.width, height,\r
SWP_NOZORDER);\r
\r
/* \r
// [HGM] Chessknight's change 2004-07-13\r
else { /* Determine Defaults */\r
WINDOWPLACEMENT wp;\r
- wpConsole.x = winWidth + 1;\r
- wpConsole.y = boardY;\r
- wpConsole.width = screenWidth - winWidth;\r
- wpConsole.height = winHeight;\r
+ wpConsole.x = wpMain.width + 1;\r
+ wpConsole.y = wpMain.y;\r
+ wpConsole.width = screenWidth - wpMain.width;\r
+ wpConsole.height = wpMain.height;\r
EnsureOnScreen(&wpConsole.x, &wpConsole.y, 0, 0);\r
wp.length = sizeof(WINDOWPLACEMENT);\r
wp.flags = 0;\r
}\r
\r
// Allow hText to highlight URLs and send notifications on them\r
- wMask = SendMessage(hText, EM_GETEVENTMASK, 0, 0L);\r
+ wMask = (WORD) SendMessage(hText, EM_GETEVENTMASK, 0, 0L);\r
SendMessage(hText, EM_SETEVENTMASK, 0, wMask | ENM_LINK);\r
SendMessage(hText, EM_AUTOURLDETECT, TRUE, 0L);\r
SetWindowLong(hText, GWL_USERDATA, 79); // initialize the text window's width\r
} Enables;\r
\r
VOID\r
+GreyRevert(Boolean grey)\r
+{ // [HGM] vari: for retracting variations in local mode\r
+ HMENU hmenu = GetMenu(hwndMain);\r
+ EnableMenuItem(hmenu, IDM_Revert, MF_BYCOMMAND|(grey ? MF_GRAYED : MF_ENABLED));\r
+}\r
+\r
+VOID\r
SetMenuEnables(HMENU hmenu, Enables *enab)\r
{\r
while (enab->item > 0) {\r
{ IDM_StopExamining, MF_BYCOMMAND|MF_GRAYED },\r
{ IDM_StopObserving, MF_BYCOMMAND|MF_GRAYED },\r
{ IDM_Revert, MF_BYCOMMAND|MF_GRAYED },\r
+ { IDM_NewChat, MF_BYCOMMAND|MF_GRAYED },\r
{ -1, -1 }\r
};\r
\r
{ IDM_MachineWhite, MF_BYCOMMAND|MF_GRAYED },\r
{ IDM_MachineBlack, MF_BYCOMMAND|MF_GRAYED },\r
{ IDM_TwoMachines, MF_BYCOMMAND|MF_GRAYED },\r
+ { IDM_MachineBoth, MF_BYCOMMAND|MF_GRAYED },\r
{ IDM_AnalysisMode, MF_BYCOMMAND|MF_ENABLED },\r
{ IDM_AnalyzeFile, MF_BYCOMMAND|MF_GRAYED },\r
{ IDM_TimeControl, MF_BYCOMMAND|MF_GRAYED },\r
{ IDM_Hint, MF_BYCOMMAND|MF_GRAYED },\r
{ IDM_Book, MF_BYCOMMAND|MF_GRAYED },\r
{ IDM_IcsOptions, MF_BYCOMMAND|MF_ENABLED },\r
+ { IDM_Engine1Options, MF_BYCOMMAND|MF_GRAYED },\r
+ { IDM_Engine2Options, MF_BYCOMMAND|MF_GRAYED },\r
{ -1, -1 }\r
};\r
\r
{ IDM_MoveNow, MF_BYCOMMAND|MF_ENABLED },\r
{ IDM_Hint, MF_BYCOMMAND|MF_ENABLED },\r
{ IDM_Book, MF_BYCOMMAND|MF_ENABLED },\r
+ { IDM_Engine1Options, MF_BYCOMMAND|MF_ENABLED },\r
{ -1, -1 }\r
};\r
#endif\r
{ IDM_TimeControl, MF_BYCOMMAND|MF_GRAYED },\r
{ IDM_Hint, MF_BYCOMMAND|MF_GRAYED },\r
{ IDM_Book, MF_BYCOMMAND|MF_GRAYED },\r
+ { IDM_MachineBoth, MF_BYCOMMAND|MF_GRAYED },\r
+ { IDM_NewChat, MF_BYCOMMAND|MF_GRAYED },\r
+ { IDM_Engine1Options, MF_BYCOMMAND|MF_GRAYED },\r
+ { IDM_Engine2Options, MF_BYCOMMAND|MF_GRAYED },\r
{ -1, -1 }\r
};\r
\r
if (commentDialog) {\r
ShowWindow(commentDialog, SW_HIDE);\r
}\r
- commentDialogUp = FALSE;\r
+ commentUp = FALSE;\r
}\r
\r
VOID\r
}\r
}\r
\r
+int no_wrap(char *message, int count)\r
+{\r
+ ConsoleOutput(message, count, FALSE);\r
+ return count;\r
+}\r
\r
int\r
OutputToProcess(ProcRef pr, char *message, int count, int *outError)\r
int outCount = SOCKET_ERROR;\r
ChildProc *cp = (ChildProc *) pr;\r
static OVERLAPPED ovl;\r
+ static int line = 0;\r
\r
- if (pr == NoProc) {\r
- ConsoleOutput(message, count, FALSE);\r
- return count;\r
- } \r
+ if (pr == NoProc)\r
+ {\r
+ if (appData.noJoin || !appData.useInternalWrap)\r
+ return no_wrap(message, count);\r
+ else\r
+ {\r
+ int width = get_term_width();\r
+ int len = wrap(NULL, message, count, width, &line);\r
+ char *msg = malloc(len);\r
+ int dbgchk;\r
+\r
+ if (!msg)\r
+ return no_wrap(message, count);\r
+ else\r
+ {\r
+ dbgchk = wrap(msg, message, count, width, &line);\r
+ if (dbgchk != len && appData.debugMode)\r
+ fprintf(debugFP, "wrap(): dbgchk(%d) != len(%d)\n", dbgchk, len);\r
+ ConsoleOutput(msg, len, FALSE);\r
+ free(msg);\r
+ return len;\r
+ }\r
+ }\r
+ }\r
\r
if (ovl.hEvent == NULL) {\r
ovl.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);\r
(UINT) 2000, NULL);\r
}\r
\r
-LRESULT CALLBACK\r
-AnalysisDialog(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)\r
-{\r
- static HANDLE hwndText;\r
- RECT rect;\r
- static int sizeX, sizeY;\r
- int newSizeX, newSizeY, flags;\r
- MINMAXINFO *mmi;\r
-\r
- switch (message) {\r
- case WM_INITDIALOG: /* message: initialize dialog box */\r
- /* Initialize the dialog items */\r
- hwndText = GetDlgItem(hDlg, OPT_AnalysisText);\r
- SetWindowText(hDlg, analysisTitle);\r
- SetDlgItemText(hDlg, OPT_AnalysisText, analysisText);\r
- /* Size and position the dialog */\r
- if (!analysisDialog) {\r
- analysisDialog = hDlg;\r
- flags = SWP_NOZORDER;\r
- GetClientRect(hDlg, &rect);\r
- sizeX = rect.right;\r
- sizeY = rect.bottom;\r
- if (analysisX != CW_USEDEFAULT && analysisY != CW_USEDEFAULT &&\r
- analysisW != CW_USEDEFAULT && analysisH != CW_USEDEFAULT) {\r
- WINDOWPLACEMENT wp;\r
- EnsureOnScreen(&analysisX, &analysisY, 0, 0);\r
- wp.length = sizeof(WINDOWPLACEMENT);\r
- wp.flags = 0;\r
- wp.showCmd = SW_SHOW;\r
- wp.ptMaxPosition.x = wp.ptMaxPosition.y = 0;\r
- wp.rcNormalPosition.left = analysisX;\r
- wp.rcNormalPosition.right = analysisX + analysisW;\r
- wp.rcNormalPosition.top = analysisY;\r
- wp.rcNormalPosition.bottom = analysisY + analysisH;\r
- SetWindowPlacement(hDlg, &wp);\r
-\r
- GetClientRect(hDlg, &rect);\r
- newSizeX = rect.right;\r
- newSizeY = rect.bottom;\r
- ResizeEditPlusButtons(hDlg, hwndText, sizeX, sizeY,\r
- newSizeX, newSizeY);\r
- sizeX = newSizeX;\r
- sizeY = newSizeY;\r
- }\r
- }\r
- return FALSE;\r
-\r
- case WM_COMMAND: /* message: received a command */\r
- switch (LOWORD(wParam)) {\r
- case IDCANCEL:\r
- if (appData.icsActive && appData.icsEngineAnalyze) { /* [DM] icsEngineAnalyze */\r
- ExitAnalyzeMode();\r
- ModeHighlight();\r
- return TRUE;\r
- }\r
- EditGameEvent();\r
- return TRUE;\r
- default:\r
- break;\r
- }\r
- break;\r
-\r
- case WM_SIZE:\r
- newSizeX = LOWORD(lParam);\r
- newSizeY = HIWORD(lParam);\r
- ResizeEditPlusButtons(hDlg, hwndText, sizeX, sizeY, newSizeX, newSizeY);\r
- sizeX = newSizeX;\r
- sizeY = newSizeY;\r
- break;\r
-\r
- case WM_GETMINMAXINFO:\r
- /* Prevent resizing window too small */\r
- mmi = (MINMAXINFO *) lParam;\r
- mmi->ptMinTrackSize.x = 100;\r
- mmi->ptMinTrackSize.y = 100;\r
- break;\r
- }\r
- return FALSE;\r
-}\r
-\r
-VOID\r
-AnalysisPopUp(char* title, char* str)\r
-{\r
- FARPROC lpProc;\r
- char *p, *q;\r
-\r
- /* [AS] */\r
- EngineOutputPopUp();\r
- return;\r
-\r
- if (str == NULL) str = "";\r
- p = (char *) malloc(2 * strlen(str) + 2);\r
- q = p;\r
- while (*str) {\r
- if (*str == '\n') *q++ = '\r';\r
- *q++ = *str++;\r
- }\r
- *q = NULLCHAR;\r
- if (analysisText != NULL) free(analysisText);\r
- analysisText = p;\r
-\r
- if (analysisDialog) {\r
- SetWindowText(analysisDialog, title);\r
- SetDlgItemText(analysisDialog, OPT_AnalysisText, analysisText);\r
- ShowWindow(analysisDialog, SW_SHOW);\r
- } else {\r
- analysisTitle = title;\r
- lpProc = MakeProcInstance((FARPROC)AnalysisDialog, hInst);\r
- CreateDialog(hInst, MAKEINTRESOURCE(DLG_Analysis),\r
- hwndMain, (DLGPROC)lpProc);\r
- FreeProcInstance(lpProc);\r
- }\r
- analysisDialogUp = TRUE; \r
-}\r
-\r
-VOID\r
-AnalysisPopDown()\r
-{\r
- if (analysisDialog) {\r
- ShowWindow(analysisDialog, SW_HIDE);\r
- }\r
- analysisDialogUp = FALSE; \r
-}\r
-\r
-\r
VOID\r
SetHighlights(int fromX, int fromY, int toX, int toY)\r
{\r
\r
EvalGraphSet( first, last, current, pvInfoList );\r
}\r
-\r
-void SetProgramStats( FrontEndProgramStats * stats )\r
-{\r
- EngineOutputUpdate( stats );\r
-}\r