* Massachusetts. \r
*\r
* Enhancements Copyright 1992-2001, 2002, 2003, 2004, 2005, 2006,\r
- * 2007, 2008, 2009 Free Software Foundation, Inc.\r
+ * 2007, 2008, 2009, 2010 Free Software Foundation, Inc.\r
*\r
* Enhancements Copyright 2005 Alessandro Scotti\r
*\r
static int commentIndex;\r
static Boolean editComment = FALSE;\r
HWND commentDialog = NULL;\r
-BOOLEAN commentDialogUp = FALSE;\r
+int commentUp = FALSE;\r
static int commentX, commentY, commentH, commentW;\r
\r
static char *analysisTitle;\r
WindowPlacement wpEvalGraph;\r
\r
HWND engineOutputDialog = NULL;\r
-BOOLEAN engineOutputDialogUp = FALSE;\r
+int engineOutputDialogUp = FALSE;\r
\r
WindowPlacement wpEngineOutput;\r
WindowPlacement wpGameList;\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
exit(2);\r
}\r
\r
+int\r
+ValidateInt(char *s)\r
+{\r
+ char *p = s;\r
+ if(*p == '-' || *p == '+') p++;\r
+ while(*p) if(!isdigit(*p++)) ExitArgError("Bad integer value", s);\r
+ return atoi(s);\r
+}\r
+\r
/* Command line font name parser. NULL name means do nothing.\r
Syntax like "Courier New:10.0 bi" or "Arial:10" or "Arial:10b"\r
For backward compatibility, syntax without the colon is also\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
\r
switch (ad->argType) {\r
case ArgInt:\r
- *(int *) ad->argLoc = atoi(argValue);\r
+ *(int *) ad->argLoc = ValidateInt(argValue);\r
break;\r
\r
case ArgX:\r
- *(int *) ad->argLoc = atoi(argValue) + boardX; // [HGM] placement: translate stored relative to absolute \r
+ *(int *) ad->argLoc = ValidateInt(argValue) + boardX; // [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 = ValidateInt(argValue) + boardY; // (this is really kludgey, it should be done where used...)\r
break;\r
\r
case ArgZ:\r
- *(int *) ad->argLoc = atoi(argValue);\r
+ *(int *) ad->argLoc = ValidateInt(argValue);\r
EnsureOnScreen(&boardX, &boardY, minX, minY); \r
break;\r
\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
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
+ 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
+ mfp->strikeout ? "s" : "",\r
+ (int)mfp->charset);\r
}\r
}\r
break;\r
blackRect.right = blackRect.left + boardWidth/2 - 1;\r
blackRect.top = whiteRect.top;\r
blackRect.bottom = whiteRect.bottom;\r
+\r
+ logoHeight = 0; // [HGM] logo: suppress logo after change to tiny layout!\r
}\r
\r
messageRect.left = OUTER_MARGIN + MESSAGE_LINE_LEFTMARGIN;\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
* 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
\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
}\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
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
}\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
highlightInfo.sq[0].x = fromX;\r