\r
extern int whiteFlag, blackFlag;\r
Boolean flipClock = FALSE;\r
+extern HANDLE chatHandle[];\r
+extern int ics_type;\r
\r
void DisplayHoldingsCount(HDC hdc, int x, int y, int align, int copyNumber);\r
VOID NewVariantPopup(HWND hwnd);\r
void AnimateAtomicCapture(int fromX, int fromY, int toX, int toY, int nFrames);\r
void DisplayMove P((int moveNumber));\r
Boolean ParseFEN P((Board board, int *blackPlaysFirst, char *fen));\r
+void ChatPopUp P(());\r
typedef struct {\r
ChessSquare piece; \r
POINT pos; /* window coordinates of current pos */\r
#if __GNUC__ && !defined(_winmajor)\r
#define oldDialog 0 /* cygwin doesn't define _winmajor; mingw does */\r
#else\r
+#if defined(_winmajor)\r
#define oldDialog (_winmajor < 4)\r
+#else\r
+#define oldDialog 0\r
+#endif\r
#endif\r
\r
char *defaultTextAttribs[] = \r
BOOL EngineOutputIsUp();\r
VOID EngineOutputUpdate( FrontEndProgramStats * stats );\r
\r
+VOID EngineOptionsPopup(); // [HGM] settings\r
+\r
VOID GothicPopUp(char *title, VariantClass variant);\r
/*\r
* Setting "frozen" should disable all user input other than deleting\r
DrawMenuBar(hwndMain);\r
}\r
\r
-static int fromX = -1, fromY = -1, toX, toY; // [HGM] moved upstream, so JAWS can use them\r
+/*static*/ int fromX = -1, fromY = -1, toX, toY; // [HGM] moved upstream, so JAWS can use them\r
\r
/* JAWS preparation patch (WinBoard for the sight impaired). Define required insertions as empty */\r
#ifdef JAWS\r
#include "jaws.c"\r
#else\r
#define JAWS_INIT\r
+#define JAWS_ARGS\r
#define JAWS_ALT_INTERCEPT\r
#define JAWS_KB_NAVIGATION\r
#define JAWS_MENU_ITEMS\r
if(msg.hwnd == e2) currentElement = 3; else\r
if(msg.hwnd == moveHistoryDialog) currentElement = 4; else\r
if(msg.hwnd == mh) currentElement = 4; else\r
- if(msg.hwnd == evalGraphDialog) currentElement = 7; else\r
+ if(msg.hwnd == evalGraphDialog) currentElement = 6; else\r
if(msg.hwnd == hText) currentElement = 5; else\r
if(msg.hwnd == hInput) currentElement = 6; else\r
for (i = 0; i < N_BUTTONS; i++) {\r
case 4:\r
if(!MoveHistoryIsUp()) continue;\r
h = mh; break;\r
-// case 5: // input to eval graph does not seem to get here!\r
+// case 6: // input to eval graph does not seem to get here!\r
// if(!EvalGraphIsUp()) continue;\r
// h = evalGraphDialog; break;\r
case 5:\r
!(!frozen && TranslateAccelerator(hwndMain, hAccelMain, &msg)) && JAWS_ACCEL\r
!(!hwndConsole && TranslateAccelerator(hwndMain, hAccelNoICS, &msg)) &&\r
!(!hwndConsole && TranslateAccelerator(hwndMain, hAccelNoAlt, &msg))) {\r
+ int done = 0, i; // [HGM] chat: dispatch cat-box messages\r
+ for(i=0; i<MAX_CHAT; i++) \r
+ if(chatHandle[i] && IsDialogMessage(chatHandle[i], &msg)) {\r
+ done = 1; break;\r
+ }\r
+ if(done) continue; // [HGM] chat: end patch\r
TranslateMessage(&msg); /* Translates virtual key codes */\r
DispatchMessage(&msg); /* Dispatches message to window */\r
}\r
ShowWindow(hwndConsole, nCmdShow);\r
}\r
if(!appData.noGUI) UpdateWindow(hwnd); else ShowWindow(hwnd, SW_MINIMIZE);\r
+ if(gameListDialog) SetFocus(gameListDialog); // [HGM] jaws: for if we clicked multi-game game file\r
\r
return TRUE;\r
\r
{ "loadGameFile", ArgFilename, (LPVOID) &appData.loadGameFile, FALSE },\r
{ "", ArgNone, NULL },\r
/* keyword arguments */\r
+ JAWS_ARGS\r
{ "whitePieceColor", ArgColor, (LPVOID) &whitePieceColor, TRUE },\r
{ "wpc", ArgColor, (LPVOID) &whitePieceColor, FALSE },\r
{ "blackPieceColor", ArgColor, (LPVOID) &blackPieceColor, TRUE },\r
{ "autoraise", ArgTrue, (LPVOID) &appData.autoRaiseBoard, FALSE },\r
{ "xautoraise", ArgFalse, (LPVOID) &appData.autoRaiseBoard, FALSE },\r
{ "-autoraise", ArgFalse, (LPVOID) &appData.autoRaiseBoard, FALSE },\r
-#if 0\r
- { "cmailGameName", ArgString, (LPVOID) &appData.cmailGameName, FALSE },\r
- { "cmail", ArgString, (LPVOID) &appData.cmailGameName, FALSE },\r
-#endif\r
{ "alwaysPromoteToQueen", ArgBoolean, (LPVOID) &appData.alwaysPromoteToQueen, TRUE },\r
{ "queen", ArgTrue, (LPVOID) &appData.alwaysPromoteToQueen, FALSE },\r
{ "xqueen", ArgFalse, (LPVOID) &appData.alwaysPromoteToQueen, FALSE },\r
{ "secondOptions", ArgString, (LPVOID) &appData.secondOptions, FALSE },\r
{ "firstNeedsNoncompliantFEN", ArgString, (LPVOID) &appData.fenOverride1, FALSE },\r
{ "secondNeedsNoncompliantFEN", ArgString, (LPVOID) &appData.fenOverride2, FALSE },\r
+ { "keepAlive", ArgInt, (LPVOID) &appData.keepAlive, FALSE },\r
+ { "icstype", ArgInt, (LPVOID) &ics_type, FALSE },\r
+ { "forceIllegalMoves", ArgTrue, (LPVOID) &appData.forceIllegal, FALSE },\r
\r
#ifdef ZIPPY\r
{ "zippyTalk", ArgBoolean, (LPVOID) &appData.zippyTalk, FALSE },\r
{ "firstNPS", ArgInt, (LPVOID) &appData.firstNPS, FALSE },\r
{ "secondNPS", ArgInt, (LPVOID) &appData.secondNPS, FALSE },\r
{ "noGUI", ArgTrue, (LPVOID) &appData.noGUI, FALSE },\r
+ { "keepLineBreaksICS", ArgBoolean, (LPVOID) &appData.noJoin, TRUE },\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
\r
/* Create bitmaps */\r
hfont_old = SelectObject( hdc, hPieceFont );\r
-#if 0\r
- CreatePieceMaskFromFont( hdc_window, hdc, PM_WP );\r
- CreatePieceMaskFromFont( hdc_window, hdc, PM_WN );\r
- CreatePieceMaskFromFont( hdc_window, hdc, PM_WB );\r
- CreatePieceMaskFromFont( hdc_window, hdc, PM_WR );\r
- CreatePieceMaskFromFont( hdc_window, hdc, PM_WQ );\r
- CreatePieceMaskFromFont( hdc_window, hdc, PM_WK );\r
- CreatePieceMaskFromFont( hdc_window, hdc, PM_BP );\r
- CreatePieceMaskFromFont( hdc_window, hdc, PM_BN );\r
- CreatePieceMaskFromFont( hdc_window, hdc, PM_BB );\r
- CreatePieceMaskFromFont( hdc_window, hdc, PM_BR );\r
- CreatePieceMaskFromFont( hdc_window, hdc, PM_BQ );\r
- CreatePieceMaskFromFont( hdc_window, hdc, PM_BK );\r
-\r
- CreatePieceMaskFromFont( hdc_window, hdc, PM_WA );\r
- CreatePieceMaskFromFont( hdc_window, hdc, PM_WC );\r
- CreatePieceMaskFromFont( hdc_window, hdc, PM_WF );\r
- CreatePieceMaskFromFont( hdc_window, hdc, PM_WH );\r
- CreatePieceMaskFromFont( hdc_window, hdc, PM_WE );\r
- CreatePieceMaskFromFont( hdc_window, hdc, PM_WW );\r
- CreatePieceMaskFromFont( hdc_window, hdc, PM_WU );\r
- CreatePieceMaskFromFont( hdc_window, hdc, PM_WO );\r
- CreatePieceMaskFromFont( hdc_window, hdc, PM_WG );\r
- CreatePieceMaskFromFont( hdc_window, hdc, PM_WM );\r
- CreatePieceMaskFromFont( hdc_window, hdc, PM_WSG );\r
- CreatePieceMaskFromFont( hdc_window, hdc, PM_WV );\r
- CreatePieceMaskFromFont( hdc_window, hdc, PM_WAB );\r
- CreatePieceMaskFromFont( hdc_window, hdc, PM_WD );\r
- CreatePieceMaskFromFont( hdc_window, hdc, PM_WL );\r
- CreatePieceMaskFromFont( hdc_window, hdc, PM_WS );\r
- CreatePieceMaskFromFont( hdc_window, hdc, PM_BA );\r
- CreatePieceMaskFromFont( hdc_window, hdc, PM_BC );\r
- CreatePieceMaskFromFont( hdc_window, hdc, PM_BF );\r
- CreatePieceMaskFromFont( hdc_window, hdc, PM_BH );\r
- CreatePieceMaskFromFont( hdc_window, hdc, PM_BE );\r
- CreatePieceMaskFromFont( hdc_window, hdc, PM_BW );\r
- CreatePieceMaskFromFont( hdc_window, hdc, PM_BU );\r
- CreatePieceMaskFromFont( hdc_window, hdc, PM_BO );\r
- CreatePieceMaskFromFont( hdc_window, hdc, PM_BG );\r
- CreatePieceMaskFromFont( hdc_window, hdc, PM_BM );\r
- CreatePieceMaskFromFont( hdc_window, hdc, PM_BSG );\r
- CreatePieceMaskFromFont( hdc_window, hdc, PM_BV );\r
- CreatePieceMaskFromFont( hdc_window, hdc, PM_BAB );\r
- CreatePieceMaskFromFont( hdc_window, hdc, PM_BD );\r
- CreatePieceMaskFromFont( hdc_window, hdc, PM_BL );\r
- CreatePieceMaskFromFont( hdc_window, hdc, PM_BS );\r
-#else\r
for(i=(int)WhitePawn; i<(int)EmptySquare; i++) /* [HGM] made a loop for this */\r
if(PieceToChar((ChessSquare)i) != '.') /* skip unused pieces */\r
CreatePieceMaskFromFont( hdc_window, hdc, i );\r
-#endif\r
+\r
SelectObject( hdc, hfont_old );\r
\r
fontBitmapSquareSize = squareSize;\r
StretchBlt(hdc, x+tmpSize, y+tmpSize, -tmpSize, -tmpSize, tmphdc, 0, 0, tmpSize, tmpSize, 0x00B8074A);\r
else\r
BitBlt(hdc, x, y, tmpSize, tmpSize, tmphdc, 0, 0, 0x00B8074A);\r
-#if 0\r
- /* Use black piece color for outline of white pieces */\r
- /* Not sure this looks really good (though xboard does it).\r
- Maybe better to have another selectable color, default black */\r
- SelectObject(hdc, blackPieceBrush); /* could have own brush */\r
- SelectObject(tmphdc, PieceBitmap(piece, OUTLINE_PIECE));\r
- BitBlt(hdc, x, y, tmpSize, tmpSize, tmphdc, 0, 0, 0x00B8074A);\r
-#else\r
/* Use black for outline of white pieces */\r
SelectObject(tmphdc, PieceBitmap(piece, OUTLINE_PIECE));\r
if(appData.upsideDown && color==flipView)\r
StretchBlt(hdc, x+tmpSize, y+tmpSize, -tmpSize, -tmpSize, tmphdc, 0, 0, tmpSize, tmpSize, SRCAND);\r
else\r
BitBlt(hdc, x, y, tmpSize, tmpSize, tmphdc, 0, 0, SRCAND);\r
-#endif\r
} else {\r
-#if 0\r
- /* Use white piece color for details of black pieces */\r
- /* Requires filled-in solid bitmaps (BLACK_PIECE class); the\r
- WHITE_PIECE ones aren't always the right shape. */\r
- /* Not sure this looks really good (though xboard does it).\r
- Maybe better to have another selectable color, default medium gray? */\r
- oldBitmap = SelectObject(tmphdc, PieceBitmap(piece, BLACK_PIECE));\r
- oldBrush = SelectObject(hdc, whitePieceBrush); /* could have own brush */\r
- BitBlt(hdc, x, y, tmpSize, tmpSize, tmphdc, 0, 0, 0x00B8074A);\r
- SelectObject(tmphdc, PieceBitmap(piece, SOLID_PIECE));\r
- SelectObject(hdc, blackPieceBrush);\r
- BitBlt(hdc, x, y, tmpSize, tmpSize, tmphdc, 0, 0, 0x00B8074A);\r
-#else\r
/* Use square color for details of black pieces */\r
oldBitmap = SelectObject(tmphdc, PieceBitmap(piece, SOLID_PIECE));\r
oldBrush = SelectObject(hdc, blackPieceBrush);\r
StretchBlt(hdc, x+tmpSize, y+tmpSize, -tmpSize, -tmpSize, tmphdc, 0, 0, tmpSize, tmpSize, 0x00B8074A);\r
else\r
BitBlt(hdc, x, y, tmpSize, tmpSize, tmphdc, 0, 0, 0x00B8074A);\r
-#endif\r
}\r
SelectObject(hdc, oldBrush);\r
SelectObject(tmphdc, oldBitmap);\r
fullrepaint = TRUE;\r
}\r
\r
-#if 0\r
- if( fullrepaint ) {\r
- static int repaint_count = 0;\r
- char buf[128];\r
-\r
- repaint_count++;\r
- sprintf( buf, "FULL repaint: %d\n", repaint_count );\r
- OutputDebugString( buf );\r
- }\r
-#endif\r
-\r
if (board == NULL) {\r
if (!lastReqValid) {\r
return;\r
releaseDC = FALSE;\r
}\r
\r
-#if 0\r
- fprintf(debugFP, "*******************************\n"\r
- "repaint = %s\n"\r
- "dragInfo.from (%d,%d)\n"\r
- "dragInfo.start (%d,%d)\n"\r
- "dragInfo.pos (%d,%d)\n"\r
- "dragInfo.lastpos (%d,%d)\n", \r
- repaint ? "TRUE" : "FALSE",\r
- dragInfo.from.x, dragInfo.from.y, \r
- dragInfo.start.x, dragInfo.start.y,\r
- dragInfo.pos.x, dragInfo.pos.y,\r
- dragInfo.lastpos.x, dragInfo.lastpos.y);\r
- fprintf(debugFP, "prev: ");\r
- for (row = 0; row < BOARD_HEIGHT; row++) {\r
- for (column = 0; column < BOARD_WIDTH; column++) {\r
- fprintf(debugFP, "%d ", lastDrawn[row][column]);\r
- }\r
- }\r
- fprintf(debugFP, "\n");\r
- fprintf(debugFP, "board: ");\r
- for (row = 0; row < BOARD_HEIGHT; row++) {\r
- for (column = 0; column < BOARD_WIDTH; column++) {\r
- fprintf(debugFP, "%d ", board[row][column]);\r
- }\r
- }\r
- fprintf(debugFP, "\n");\r
- fflush(debugFP);\r
-#endif\r
-\r
/* Create some work-DCs */\r
hdcmem = CreateCompatibleDC(hdc);\r
tmphdc = CreateCompatibleDC(hdc);\r
GetDIBits(tmphdc,bufferBitmap,0,b.bmHeight,pData,(BITMAPINFO*)&bih,DIB_RGB_COLORS);\r
// fprintf(diagFile, "%8x\n", (int) pData);\r
\r
-#if 1\r
wb = b.bmWidthBytes;\r
// count colors\r
for(i=0; i<wb*(b.bmHeight - boardRect.top + OUTER_MARGIN)>>2; i++) {\r
// write bitmap data\r
for(i=0; i<wb*(b.bmHeight - boardRect.top + OUTER_MARGIN); i++) \r
fputc(pData[i], diagFile);\r
-#endif\r
}\r
}\r
\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
+ /* [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);\r
+ moveType = UserMoveTest(fromX, fromY, toX, toY, NULLCHAR, FALSE);\r
if(moveType == AmbiguousMove) { /* [HGM] Edit-Position move executed */\r
fromX = fromY = -1; \r
ClearHighlights();\r
DrawPosition(FALSE, boards[currentMove]);\r
break; \r
} else \r
- if(moveType != ImpossibleMove) {\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
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, wthout promotng yet\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
- } else { /* not a promotion */\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
}\r
}\r
fromX = fromY = -1;\r
+ noClear:\r
break;\r
}\r
- if (gotPremove) {\r
+ if (gotPremove && moveType != Comment) {\r
SetPremoveHighlights(fromX, fromY, toX, toY);\r
- DrawPosition(forceFullRepaint || FALSE, NULL);\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
toY = y;\r
saveAnimate = appData.animate; /* sorry, Hawk :) */\r
appData.animate = appData.animate && !appData.animateDragging;\r
- moveType = UserMoveTest(fromX, fromY, toX, toY, NULLCHAR);\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
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
MenuPopup(hwnd, pt, LoadMenu(hInst, "WhitePieceMenu"), -1);\r
} else { /* message == WM_RBUTTONDOWN */\r
-#if 0\r
- if (buttonCount == 3) {\r
- if (wParam & MK_SHIFT) \r
- MenuPopup(hwnd, pt, LoadMenu(hInst, "WhitePieceMenu"), -1);\r
- else\r
- MenuPopup(hwnd, pt, LoadMenu(hInst, "BlackPieceMenu"), -1);\r
- } else {\r
- MenuPopup(hwnd, pt, LoadMenu(hInst, "PieceMenu"), -1);\r
- }\r
-#else\r
/* Just have one menu, on the right button. Windows users don't\r
think to try the middle one, and sometimes other software steals\r
it, or it doesn't really exist. */\r
MenuPopup(hwnd, pt, LoadMenu(hInst, "PieceMenu"), -1);\r
else\r
MenuPopup(hwnd, pt, LoadMenu(hInst, "ShogiPieceMenu"), -1);\r
-#endif\r
}\r
break;\r
case IcsPlayingWhite:\r
}\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
+}\r
+\r
VOID\r
ChangedConsoleFont()\r
{\r
paraf.dxOffset = WRAP_INDENT;\r
SendMessage(hText, EM_SETPARAFORMAT, 0, (LPARAM) ¶f);\r
SendMessage(hText, EM_EXSETSEL, 0, (LPARAM)&sel);\r
+ UpdateICSWidth(hText);\r
}\r
\r
/*---------------------------------------------------------------------------*\\r
\r
JAWS_ALT_INTERCEPT\r
\r
- if (appData.icsActive && (isalpha((char)wParam) || wParam == '0')) { \r
+ if (appData.icsActive && (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
nnew = RealizePalette(hdc);\r
if (nnew > 0) {\r
paletteChanged = TRUE;\r
-#if 0\r
- UpdateColors(hdc);\r
-#else\r
- InvalidateRect(hwnd, &boardRect, FALSE);/*faster!*/\r
-#endif\r
+ InvalidateRect(hwnd, &boardRect, FALSE);\r
}\r
ReleaseDC(hwnd, hdc);\r
}\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
GameListOptions();\r
break;\r
\r
+ case IDM_NewChat:\r
+ ChatPopUp();\r
+ break;\r
+\r
case IDM_CopyPosition:\r
CopyFENToClipboard();\r
break;\r
DrawPosition(FALSE, NULL);\r
break;\r
\r
+ case IDM_MuteSounds:\r
+ mute = !mute; // [HGM] mute: keep track of global muting variable\r
+ CheckMenuItem(GetMenu(hwndMain),IDM_MuteSounds, \r
+ MF_BYCOMMAND|(mute?MF_CHECKED:MF_UNCHECKED));\r
+ break;\r
+\r
case IDM_GeneralOptions:\r
GeneralOptionsPopup(hwnd);\r
DrawPosition(TRUE, NULL);\r
{\r
BOOLEAN ok = FALSE;\r
\r
+ if(mute) return TRUE; // [HGM] mute: suppress all sound play when muted\r
switch (ms->name[0]) {\r
case NULLCHAR:\r
if(appData.debugMode) fprintf(debugFP, "silence\n");\r
/* Don't print an error: this can happen innocently if the sound driver\r
is busy; for instance, if another instance of WinBoard is playing\r
a sound at about the same time. */\r
-#if 0\r
- if (!ok) {\r
- char buf[MSG_SIZ];\r
- sprintf(buf, "Error playing sound %s", ms->name);\r
- DisplayError(buf, GetLastError());\r
- }\r
-#endif\r
return ok;\r
}\r
\r
ConsoleWndProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)\r
{\r
static SnapData sd;\r
- static HWND hText, hInput /*, hFocus*/;\r
-// InputSource *is = consoleInputSource;\r
+ HWND hText, hInput;\r
RECT rect;\r
static int sizeX, sizeY;\r
int newSizeX, newSizeY;\r
MINMAXINFO *mmi;\r
+ WORD wMask;\r
+\r
+ hText = GetDlgItem(hDlg, OPT_ConsoleText);\r
+ hInput = GetDlgItem(hDlg, OPT_ConsoleInput);\r
\r
switch (message) {\r
+ case WM_NOTIFY:\r
+ if (((NMHDR*)lParam)->code == EN_LINK)\r
+ {\r
+ ENLINK *pLink = (ENLINK*)lParam;\r
+ if (pLink->msg == WM_LBUTTONUP)\r
+ {\r
+ TEXTRANGE tr;\r
+\r
+ tr.chrg = pLink->chrg;\r
+ tr.lpstrText = malloc(1+tr.chrg.cpMax-tr.chrg.cpMin);\r
+ SendMessage(hText, EM_GETTEXTRANGE, 0, (LPARAM)&tr);\r
+ ShellExecute(NULL, "open", tr.lpstrText, NULL, NULL, SW_SHOW);\r
+ free(tr.lpstrText);\r
+ }\r
+ }\r
+ break;\r
case WM_INITDIALOG: /* message: initialize dialog box */\r
hwndConsole = hDlg;\r
- hText = GetDlgItem(hDlg, OPT_ConsoleText);\r
- hInput = GetDlgItem(hDlg, OPT_ConsoleInput);\r
SetFocus(hInput);\r
consoleTextWindowProc = (WNDPROC)\r
SetWindowLong(hText, GWL_WNDPROC, (LONG) ConsoleTextSubclass);\r
wp.rcNormalPosition.bottom = wpConsole.y + wpConsole.height;\r
SetWindowPlacement(hDlg, &wp);\r
}\r
-#if 1\r
+\r
// [HGM] Chessknight's change 2004-07-13\r
else { /* Determine Defaults */\r
WINDOWPLACEMENT wp;\r
wp.rcNormalPosition.bottom = wpConsole.y + wpConsole.height;\r
SetWindowPlacement(hDlg, &wp);\r
}\r
-#endif\r
+\r
+ // Allow hText to highlight URLs and send notifications on them\r
+ wMask = 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
+\r
return FALSE;\r
\r
case WM_SETFOCUS:\r
return OnMoving( &sd, hDlg, wParam, lParam );\r
\r
case WM_EXITSIZEMOVE:\r
+ UpdateICSWidth(hText);\r
return OnExitSizeMove( &sd, hDlg, wParam, lParam );\r
}\r
\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
{ GLT_TIME_CONTROL,"Time Control" },\r
{ GLT_VARIANT, "Variant" },\r
{ GLT_OUT_OF_BOOK,PGN_OUT_OF_BOOK },\r
+ { GLT_RESULT_COMMENT, "Result Comment" }, // [HGM] rescom\r
{ 0, 0 }\r
};\r
\r
HDCDrawPosition(NULL, (BOOLEAN) fullRedraw, board); \r
}\r
\r
+void NotifyFrontendLogin()\r
+{\r
+ if (hwndConsole)\r
+ UpdateICSWidth(GetDlgItem(hwndConsole, OPT_ConsoleText));\r
+}\r
\r
VOID\r
ResetFrontEnd()\r
{\r
HWND hwnd = GetActiveWindow();\r
EitherCommentPopUp(0, title, str, FALSE);\r
+ SAY(str);\r
SetActiveWindow(hwnd);\r
}\r
\r
ScheduleDelayedEvent(DelayedEventCallback cb, long millisec)\r
{\r
if (delayedTimerEvent != 0) {\r
- if (appData.debugMode) {\r
+ if (appData.debugMode && cb != delayedTimerCallback) { // [HGM] alive: not too much debug\r
fprintf(debugFP, "ScheduleDelayedEvent: event already scheduled\n");\r
}\r
KillTimer(hwndMain, delayedTimerEvent);\r
delayedTimerEvent = 0;\r
+ if(delayedTimerCallback != cb) // [HGM] alive: do not "flush" same event, just postpone it\r
delayedTimerCallback();\r
}\r
delayedTimerCallback = cb;\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
void\r
HistorySet( char movelist[][2*MOVE_LEN], int first, int last, int current )\r
{\r
-#if 0\r
- char buf[256];\r
-\r
- sprintf( buf, "HistorySet: first=%d, last=%d, current=%d (%s)\n",\r
- first, last, current, current >= 0 ? movelist[current] : "n/a" );\r
-\r
- OutputDebugString( buf );\r
-#endif\r
-\r
MoveHistorySet( movelist, first, last, current, pvInfoList );\r
\r
EvalGraphSet( first, last, current, pvInfoList );\r
\r
void SetProgramStats( FrontEndProgramStats * stats )\r
{\r
-#if 0\r
- char buf[1024];\r
-\r
- sprintf( buf, "SetStats for %d: depth=%d, nodes=%lu, score=%5.2f, time=%5.2f, pv=%s\n",\r
- stats->which, stats->depth, stats->nodes, stats->score / 100.0, stats->time / 100.0, stats->pv == 0 ? "n/a" : stats->pv );\r
-\r
- OutputDebugString( buf );\r
-#endif\r
-\r
EngineOutputUpdate( stats );\r
}\r