#include <richedit.h>\r
#include <mmsystem.h>\r
#include <ctype.h>\r
+#include <io.h>\r
\r
#if __GNUC__\r
#include <errno.h>\r
POINT pos; /* window coordinates of current pos */\r
POINT lastpos; /* window coordinates of last pos - used for clipping */\r
POINT from; /* board coordinates of the piece's orig pos */\r
+ ChessSquare piece;\r
} DragInfo;\r
\r
-static DragInfo dragInfo = { {-1,-1}, {-1,-1}, {-1,-1}, {-1,-1} };\r
+static DragInfo dragInfo = { {-1,-1}, {-1,-1}, {-1,-1}, {-1,-1}, EmptySquare };\r
\r
typedef struct {\r
POINT sq[2]; /* board coordinates of from, to squares */\r
\r
if(!name || name[0] == NULLCHAR) return;\r
snprintf(buf, MSG_SIZ, "%s%s", name, strchr(name, '.') ? "" : ".lng"); // auto-append lng extension\r
+ appData.language = oldLanguage;\r
if(!strcmp(buf, oldLanguage)) { barbaric = 1; return; } // this language already loaded; just switch on\r
if((f = fopen(buf, "r")) == NULL) return;\r
while((k = fgetc(f)) != EOF) {\r
int i;\r
WIN32_FIND_DATA fileData;\r
HANDLE hFind;\r
-#define IDM_English 1895\r
+#define IDM_English 1970\r
if(1) {\r
HMENU mainMenu = GetMenu(hwndMain);\r
for (i=GetMenuItemCount(mainMenu)-1; i>=0; i--) {\r
StartupDialog(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam);\r
VOID APIENTRY MenuPopup(HWND hwnd, POINT pt, HMENU hmenu, UINT def);\r
void ParseIcsTextMenu(char *icsTextMenuString);\r
-VOID PopUpMoveDialog(char firstchar);\r
VOID PopUpNameDialog(char firstchar);\r
VOID UpdateSampleText(HWND hDlg, int id, MyColorizeAttribs *mca);\r
\r
void\r
SetUserLogo()\r
{ // update user logo if necessary\r
- static char oldUserName[MSG_SIZ], *curName;\r
+ static char oldUserName[MSG_SIZ], dir[MSG_SIZ], *curName;\r
\r
if(appData.autoLogo) {\r
curName = UserName();\r
if(strcmp(curName, oldUserName)) {\r
- snprintf(oldUserName, MSG_SIZ, "logos\\%s.bmp", curName);\r
+ GetCurrentDirectory(MSG_SIZ, dir);\r
+ SetCurrentDirectory(installDir);\r
+ snprintf(oldUserName, MSG_SIZ, "logos\\%s.bmp", curName);\r
userLogo = LoadImage( 0, oldUserName, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE ); \r
safeStrCpy(oldUserName, curName, sizeof(oldUserName)/sizeof(oldUserName[0]) );\r
if(userLogo == NULL)\r
userLogo = LoadImage( 0, "logos\\dummy.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE ); \r
+ SetCurrentDirectory(dir); /* return to prev directory */\r
}\r
}\r
}\r
if (*y < minY) *y = minY;\r
}\r
\r
+VOID\r
+LoadLogo(ChessProgramState *cps, int n, Boolean ics)\r
+{\r
+ char buf[MSG_SIZ], dir[MSG_SIZ];\r
+ GetCurrentDirectory(MSG_SIZ, dir);\r
+ SetCurrentDirectory(installDir);\r
+ if( appData.logo[n] && appData.logo[n][0] != NULLCHAR) {\r
+ cps->programLogo = LoadImage( 0, appData.logo[n], IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE );\r
+\r
+ if (cps->programLogo == NULL && appData.debugMode) {\r
+ fprintf( debugFP, "Unable to load logo bitmap '%s'\n", appData.logo[n] );\r
+ }\r
+ } else if(appData.autoLogo) {\r
+ if(ics) { // [HGM] logo: in ICS mode second can be used for ICS\r
+ sprintf(buf, "logos\\%s.bmp", appData.icsHost);\r
+ cps->programLogo = LoadImage( 0, buf, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE );\r
+ } else\r
+ if(appData.directory[n] && appData.directory[n][0]) {\r
+ SetCurrentDirectory(appData.directory[n]);\r
+ cps->programLogo = LoadImage( 0, "logo.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE ); \r
+ }\r
+ }\r
+ SetCurrentDirectory(dir); /* return to prev directory */\r
+}\r
+\r
BOOL\r
InitInstance(HINSTANCE hInstance, int nCmdShow, LPSTR lpCmdLine)\r
{\r
}\r
\r
/* [HGM] logo: Load logos if specified (must be done before InitDrawingSizes) */\r
- if( appData.firstLogo && appData.firstLogo[0] != NULLCHAR) {\r
- first.programLogo = LoadImage( 0, appData.firstLogo, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE );\r
-\r
- if (first.programLogo == NULL && appData.debugMode) {\r
- fprintf( debugFP, "Unable to load logo bitmap '%s'\n", appData.firstLogo );\r
- }\r
- } else if(appData.autoLogo) {\r
- if(appData.firstDirectory && appData.firstDirectory[0]) {\r
- char buf[MSG_SIZ];\r
- snprintf(buf, MSG_SIZ, "%s/logo.bmp", appData.firstDirectory);\r
- first.programLogo = LoadImage( 0, buf, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE ); \r
- }\r
- }\r
-\r
- if( appData.secondLogo && appData.secondLogo[0] != NULLCHAR) {\r
- second.programLogo = LoadImage( 0, appData.secondLogo, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE );\r
-\r
- if (second.programLogo == NULL && appData.debugMode) {\r
- fprintf( debugFP, "Unable to load logo bitmap '%s'\n", appData.secondLogo );\r
- }\r
- } else if(appData.autoLogo) {\r
- char buf[MSG_SIZ];\r
- if(appData.icsActive) { // [HGM] logo: in ICS mode second can be used for ICS\r
- snprintf(buf, MSG_SIZ, "logos\\%s.bmp", appData.icsHost);\r
- second.programLogo = LoadImage( 0, buf, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE );\r
- } else\r
- if(appData.secondDirectory && appData.secondDirectory[0]) {\r
- snprintf(buf, MSG_SIZ, "%s\\logo.bmp", appData.secondDirectory);\r
- second.programLogo = LoadImage( 0, buf, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE ); \r
- }\r
- }\r
+ LoadLogo(&first, 0, FALSE);\r
+ LoadLogo(&second, 1, appData.icsActive);\r
\r
SetUserLogo();\r
\r
q = strchr(p, ':');\r
if (q) {\r
if (q - p >= sizeof(mfp->faceName))\r
- ExitArgError(_("Font name too long:"), name);\r
+ ExitArgError(_("Font name too long:"), name, TRUE);\r
memcpy(mfp->faceName, p, q - p);\r
mfp->faceName[q - p] = NULLCHAR;\r
p = q + 1;\r
while (*p && !isdigit(*p)) {\r
*q++ = *p++;\r
if (q - mfp->faceName >= sizeof(mfp->faceName))\r
- ExitArgError(_("Font name too long:"), name);\r
+ ExitArgError(_("Font name too long:"), name, TRUE);\r
}\r
while (q > mfp->faceName && q[-1] == ' ') q--;\r
*q = NULLCHAR;\r
}\r
- if (!*p) ExitArgError(_("Font point size missing:"), name);\r
+ if (!*p) ExitArgError(_("Font point size missing:"), name, TRUE);\r
mfp->pointSize = (float) atof(p);\r
mfp->bold = (strchr(p, 'b') != NULL);\r
mfp->italic = (strchr(p, 'i') != NULL);\r
}\r
bs++;\r
}\r
- ExitArgError(_("Unrecognized board size value"), name);\r
+ ExitArgError(_("Unrecognized board size value"), name, TRUE);\r
}\r
\r
void\r
}\r
\r
if (tinyLayout != oldTinyLayout) {\r
- long style = GetWindowLong(hwndMain, GWL_STYLE);\r
+ long style = GetWindowLongPtr(hwndMain, GWL_STYLE);\r
if (tinyLayout) {\r
style &= ~WS_SYSMENU;\r
InsertMenu(hmenu, IDM_Exit, MF_BYCOMMAND, IDM_Minimize,\r
style |= WS_SYSMENU;\r
RemoveMenu(hmenu, IDM_Minimize, MF_BYCOMMAND);\r
}\r
- SetWindowLong(hwndMain, GWL_STYLE, style);\r
+ SetWindowLongPtr(hwndMain, GWL_STYLE, style);\r
\r
for (i=0; menuBarText[tinyLayout][i]; i++) {\r
ModifyMenu(hmenu, i, MF_STRING|MF_BYPOSITION|MF_POPUP, \r
boardRect.right - BUTTON_WIDTH*(N_BUTTONS-i),\r
messageRect.top, BUTTON_WIDTH, messageSize.cy, hwndMain,\r
(HMENU) buttonDesc[i].id,\r
- (HINSTANCE) GetWindowLong(hwndMain, GWL_HINSTANCE), NULL);\r
+ (HINSTANCE) GetWindowLongPtr(hwndMain, GWLP_HINSTANCE), NULL);\r
if (tinyLayout) {\r
SendMessage(buttonDesc[i].hwnd, WM_SETFONT, \r
(WPARAM)font[boardSize][MESSAGE_FONT]->hf,\r
if (buttonDesc[i].id == IDM_Pause)\r
hwndPause = buttonDesc[i].hwnd;\r
buttonDesc[i].wndproc = (WNDPROC)\r
- SetWindowLong(buttonDesc[i].hwnd, GWL_WNDPROC, (LONG) ButtonProc);\r
+ SetWindowLongPtr(buttonDesc[i].hwnd, GWLP_WNDPROC, (LONG_PTR) ButtonProc);\r
}\r
}\r
if (gridPen != NULL) DeleteObject(gridPen);\r
VOID\r
DrawCoordsOnDC(HDC hdc)\r
{\r
- static char files[24] = {'0', '1','2','3','4','5','6','7','8','9','0','1','1','0','9','8','7','6','5','4','3','2','1','0'};\r
- static char ranks[24] = {'l', 'k','j','i','h','g','f','e','d','c','b','a','a','b','c','d','e','f','g','h','i','j','k','l'};\r
+ static char files[] = "0123456789012345678901221098765432109876543210";\r
+ static char ranks[] = "wvutsrqponmlkjihgfedcbaabcdefghijklmnopqrstuvw";\r
char str[2] = { NULLCHAR, NULLCHAR };\r
int oldMode, oldAlign, x, y, start, i;\r
HFONT oldFont;\r
if (!appData.showCoords)\r
return;\r
\r
- start = flipView ? 1-(ONE!='1') : 23+(ONE!='1')-BOARD_HEIGHT;\r
+ start = flipView ? 1-(ONE!='1') : 45+(ONE!='1')-BOARD_HEIGHT;\r
\r
oldBrush = SelectObject(hdc, GetStockObject(BLACK_BRUSH));\r
oldMode = SetBkMode(hdc, (appData.monoMode ? OPAQUE : TRANSPARENT));\r
y += squareSize + lineGap;\r
}\r
\r
- start = flipView ? 12-(BOARD_RGHT-BOARD_LEFT) : 12;\r
+ start = flipView ? 23-(BOARD_RGHT-BOARD_LEFT) : 23;\r
\r
SetTextAlign(hdc, TA_RIGHT|TA_BOTTOM);\r
for (i = 0; i < BOARD_RGHT - BOARD_LEFT; i++) {\r
HBITMAP hbm;\r
int w = 100, h = 50;\r
\r
- if(logo == NULL) return;\r
+ if(logo == NULL) {\r
+ if(!logoHeight) return;\r
+ FillRect( hdc, &logoRect, whitePieceBrush );\r
+ }\r
// GetClientRect(hwndMain, &Rect);\r
// bufferBitmap = CreateCompatibleBitmap(hdc, Rect.right-Rect.left+1,\r
// Rect.bottom-Rect.top+1);\r
}\r
}\r
\r
+void\r
+UpdateLogos(int display)\r
+{ // called after loading new engine(s), in tourney or from menu\r
+ LoadLogo(&first, 0, FALSE);\r
+ LoadLogo(&second, 1, appData.icsActive);\r
+ InitDrawingSizes(-2, 0); // adapt layout of board window to presence/absence of logos\r
+ if(display) DisplayLogos();\r
+}\r
+\r
static HDC hdcSeek;\r
\r
// [HGM] seekgraph\r
board[dragInfo.from.y][dragInfo.from.x] = dragged_piece;\r
x = dragInfo.pos.x - squareSize / 2;\r
y = dragInfo.pos.y - squareSize / 2;\r
- DrawPieceOnDC(hdcmem, dragged_piece,\r
- ((int) dragged_piece < (int) BlackPawn), \r
+ DrawPieceOnDC(hdcmem, dragInfo.piece,\r
+ ((int) dragInfo.piece < (int) BlackPawn), \r
(dragInfo.from.y + dragInfo.from.x) % 2, x, y, tmphdc);\r
} \r
\r
boardRect.bottom - boardRect.top,\r
tmphdc, boardRect.left, boardRect.top, SRCCOPY);\r
if(saveDiagFlag) { \r
- BITMAP b; int i, j=0, m, w, wb, fac=0; char pData[1000000]; \r
+ BITMAP b; int i, j=0, m, w, wb, fac=0; char *pData; \r
BITMAPINFOHEADER bih; int color[16], nrColors=0;\r
\r
GetObject(bufferBitmap, sizeof(b), &b);\r
- if(b.bmWidthBytes*b.bmHeight <= 990000) {\r
+ if(pData = malloc(b.bmWidthBytes*b.bmHeight + 10000)) {\r
bih.biSize = sizeof(BITMAPINFOHEADER);\r
bih.biWidth = b.bmWidth;\r
bih.biHeight = b.bmHeight;\r
// write bitmap data\r
for(i=0; i<wb*(b.bmHeight - boardRect.top + OUTER_MARGIN); i++) \r
fputc(pData[i], diagFile);\r
+ free(pData);\r
}\r
}\r
\r
{\r
saveDiagFlag = 1; diagFile = f;\r
HDCDrawPosition(NULL, TRUE, NULL);\r
-\r
saveDiagFlag = 0;\r
\r
-// if(f != NULL) fprintf(f, "Sorry, but this feature is still in preparation\n");\r
- \r
fclose(f);\r
return TRUE;\r
}\r
}\r
}\r
\r
-void DragPieceBegin(int x, int y)\r
+void DragPieceBegin(int x, int y, Boolean instantly)\r
{\r
dragInfo.lastpos.x = boardRect.left + x;\r
dragInfo.lastpos.y = boardRect.top + y;\r
+ if(instantly) dragInfo.pos = dragInfo.lastpos;\r
dragInfo.from.x = fromX;\r
dragInfo.from.y = fromY;\r
+ dragInfo.piece = boards[currentMove][fromY][fromX];\r
dragInfo.start = dragInfo.from;\r
SetCapture(hwndMain);\r
}\r
dragInfo.pos = dragInfo.lastpos = dragInfo.start;\r
}\r
\r
+void ChangeDragPiece(ChessSquare piece)\r
+{\r
+ dragInfo.piece = piece;\r
+}\r
+\r
/* Event handler for mouse messages */\r
VOID\r
MouseEvent(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)\r
\r
case WM_MOUSEMOVE:\r
if(SeekGraphClick(Press, pt.x - boardRect.left, pt.y - boardRect.top, 1)) break;\r
+ if(PromoScroll(pt.x - boardRect.left, pt.y - boardRect.top)) break;\r
MovePV(pt.x - boardRect.left, pt.y - boardRect.top, boardRect.bottom - boardRect.top);\r
if ((appData.animateDragging || appData.highlightDragging)\r
&& (wParam & MK_LBUTTON)\r
LRESULT CALLBACK\r
ButtonProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)\r
{\r
- int id = GetWindowLong(hwnd, GWL_ID);\r
+ int id = GetWindowLongPtr(hwnd, GWLP_ID);\r
int i, dir;\r
\r
for (i=0; i<N_BUTTONS; i++) {\r
SendMessage(h, WM_CHAR, wParam, lParam);\r
return TRUE;\r
} else if (isalpha((char)wParam) || isdigit((char)wParam)){\r
- PopUpMoveDialog((char)wParam);\r
+ TypeInEvent((char)wParam);\r
}\r
break;\r
}\r
LONG old_width, new_width;\r
\r
new_width = get_term_width(hText, FALSE);\r
- old_width = GetWindowLong(hText, GWL_USERDATA);\r
+ old_width = GetWindowLongPtr(hText, GWLP_USERDATA);\r
if (new_width != old_width)\r
{\r
ics_update_width(new_width);\r
- SetWindowLong(hText, GWL_USERDATA, new_width);\r
+ SetWindowLongPtr(hText, GWLP_USERDATA, new_width);\r
}\r
}\r
\r
SendMessage(h, message, wParam, lParam);\r
} else if(lParam != KF_REPEAT) {\r
if (isalpha((char)wParam) || isdigit((char)wParam)) {\r
- PopUpMoveDialog((char)wParam);\r
+ TypeInEvent((char)wParam);\r
} else if((char)wParam == 003) CopyGameToClipboard();\r
else if((char)wParam == 026) PasteGameOrFENFromClipboard();\r
}\r
f = OpenFileDialog(hwnd, "wb", defName,\r
"bmp",\r
DIAGRAM_FILT,\r
- "Save Diagram to File", NULL, fileTitle, NULL);\r
+ _("Save Diagram to File"), NULL, fileTitle, NULL);\r
if (f != NULL) {\r
SaveDiagram(f);\r
}\r
break;\r
\r
case IDM_Match: // [HGM] match: flows into next case, after setting Match Mode and nr of Games\r
- if(gameMode != BeginningOfGame) { // allow menu item to remain enabled for better mode highligting\r
- DisplayError(_("You can only start a match from the initial position."), 0); break;\r
- }\r
- matchMode = 2;// distinguish from command-line-triggered case (matchMode=1)\r
- appData.matchGames = appData.defaultMatchGames;\r
- matchGame = 1;\r
- first.matchWins = second.matchWins = 0;\r
+ MatchEvent(2); // distinguish from command-line-triggered case (matchMode=1)\r
+ break;\r
\r
case IDM_TwoMachines:\r
TwoMachinesEvent();\r
break;\r
\r
case IDM_EditProgs2:\r
- EditTagsPopUp(secondChessProgramNames, &secondChessProgramNames);\r
+ LoadEnginePopUp(hwndMain);\r
+// EditTagsPopUp(secondChessProgramNames, &secondChessProgramNames);\r
break;\r
\r
case IDM_EditServers:\r
EditTagsProc();\r
break;\r
\r
+ case IDM_EditBook:\r
+ EditBookEvent();\r
+ break;\r
+\r
case IDM_EditComment:\r
case IDM_Comment:\r
if (commentUp && editComment) {\r
break;\r
\r
case IDM_TypeInMove:\r
- PopUpMoveDialog('\000');\r
+ TypeInEvent('\000');\r
break;\r
\r
case IDM_TypeInName:\r
\r
case IDM_Engine2Options:\r
savedHwnd = hwnd;\r
- if(WaitForSecond(SettingsMenuIfReady)) break;\r
+ if(WaitForEngine(&second, SettingsMenuIfReady)) break;\r
EngineOptionsPopup(hwnd, &second);\r
break;\r
\r
UciOptionsPopup(hwnd);\r
break;\r
\r
+ case IDM_Tourney:\r
+ TourneyPopup(hwnd);\r
+ break;\r
+\r
case IDM_IcsOptions:\r
IcsOptionsPopup(hwnd);\r
break;\r
break;\r
\r
case IDM_English:\r
- barbaric = 0;\r
+ barbaric = 0; appData.language = "";\r
TranslateMenus(0);\r
CheckMenuItem(GetMenu(hwndMain), lastChecked, MF_BYCOMMAND|MF_UNCHECKED);\r
CheckMenuItem(GetMenu(hwndMain), IDM_English, MF_BYCOMMAND|MF_CHECKED);\r
break;\r
\r
default:\r
- if(wmId > IDM_English && wmId < IDM_English+5) {\r
+ if(wmId > IDM_English && wmId < IDM_English+20) {\r
LoadLanguageFile(languageFile[wmId - IDM_English - 1]);\r
TranslateMenus(0);\r
CheckMenuItem(GetMenu(hwndMain), lastChecked, MF_BYCOMMAND|MF_UNCHECKED);\r
struct stat st;\r
FILE *f;\r
\r
- if (ms->data) free(ms->data);\r
+ if (ms->data && ms->flag) free(ms->data);\r
ms->data = NULL;\r
\r
switch (ms->name[0]) {\r
HANDLE h = FindResource(hInst, ms->name + 1, "WAVE");\r
if (h == NULL) break;\r
ms->data = (void *)LoadResource(hInst, h);\r
+ ms->flag = 0; // not maloced, so cannot be freed!\r
if (h == NULL) break;\r
ok = TRUE;\r
}\r
if (f == NULL) break;\r
if (fstat(fileno(f), &st) < 0) break;\r
ms->data = malloc(st.st_size);\r
+ ms->flag = 1;\r
if (fread(ms->data, st.st_size, 1, f) < 1) break;\r
fclose(f);\r
ok = TRUE;\r
appData.firstChessProgram, "fd", appData.firstDirectory,\r
firstChessProgramNames);\r
InitEngineBox(hDlg, GetDlgItem(hDlg, OPT_SecondChessEngineName),\r
- appData.secondChessProgram, "sd", appData.secondDirectory,\r
- secondChessProgramNames);\r
+ appData.secondChessProgram, singleList ? "fd" : "sd", appData.secondDirectory,\r
+ singleList ? firstChessProgramNames : secondChessProgramNames); //[HGM] single: use first list in second combo\r
hwndCombo = GetDlgItem(hDlg, OPT_ChessServerName);\r
InitComboStringsFromOption(hwndCombo, icsNames); \r
snprintf(buf, MSG_SIZ, "%s /icsport=%s", appData.icsHost, appData.icsPort);\r
GetDlgItemText(hDlg, OPT_ChessEngineName, buf + strlen(buf), sizeof(buf) - strlen(buf));\r
p = buf;\r
ParseArgs(StringGet, &p);\r
- safeStrCpy(buf, "/scp=", sizeof(buf)/sizeof(buf[0]) );\r
+ safeStrCpy(buf, singleList ? "/fcp=" : "/scp=", sizeof(buf)/sizeof(buf[0]) );\r
GetDlgItemText(hDlg, OPT_SecondChessEngineName, buf + strlen(buf), sizeof(buf) - strlen(buf));\r
- p = buf;\r
+ p = buf;
+ SwapEngines(singleList); // temporarily swap first and second, to load a second 'first', ...\r
ParseArgs(StringGet, &p);\r
+ SwapEngines(singleList); // ... and then make it 'second'\r
appData.noChessProgram = FALSE;\r
appData.icsActive = FALSE;\r
} else if (IsDlgButtonChecked(hDlg, OPT_ChessServer)) {\r
{\r
char move[MSG_SIZ];\r
HWND hInput;\r
- ChessMove moveType;\r
- int fromX, fromY, toX, toY;\r
- char promoChar;\r
\r
switch (message) {\r
case WM_INITDIALOG:\r
case IDOK:
\r
shiftKey = GetKeyState(VK_SHIFT) < 0; // [HGM] remember last shift status\r
- GetDlgItemText(hDlg, OPT_Move, move, sizeof(move));\r
- { int n; Board board;\r
- // [HGM] FENedit\r
- if(gameMode == EditPosition && ParseFEN(board, &n, move) ) {\r
- EditPositionPasteFEN(move);\r
- EndDialog(hDlg, TRUE);\r
- return TRUE;\r
- }\r
- // [HGM] movenum: allow move number to be typed in any mode\r
- if(sscanf(move, "%d", &n) == 1 && n != 0 ) {\r
- ToNrEvent(2*n-1);\r
- EndDialog(hDlg, TRUE);\r
- return TRUE;\r
- }\r
- }\r
- if (gameMode != EditGame && currentMove != forwardMostMove && \r
- gameMode != Training) {\r
- DisplayMoveError(_("Displayed move is not current"));\r
- } else {\r
-// GetDlgItemText(hDlg, OPT_Move, move, sizeof(move)); // moved upstream\r
- int ok = ParseOneMove(move, gameMode == EditPosition ? blackPlaysFirst : currentMove, \r
- &moveType, &fromX, &fromY, &toX, &toY, &promoChar);\r
- if(!ok && move[0] >= 'a') { move[0] += 'A' - 'a'; ok = 2; } // [HGM] try also capitalized\r
- if (ok==1 || ok && ParseOneMove(move, gameMode == EditPosition ? blackPlaysFirst : currentMove, \r
- &moveType, &fromX, &fromY, &toX, &toY, &promoChar)) {\r
- UserMoveEvent(fromX, fromY, toX, toY, promoChar); \r
- } else {\r
- DisplayMoveError(_("Could not parse move"));\r
- }\r
- }\r
+ GetDlgItemText(hDlg, OPT_Move, move, sizeof(move));
+ TypeInDoneEvent(move);\r
EndDialog(hDlg, TRUE);\r
return TRUE;\r
case IDCANCEL:\r
PopUpMoveDialog(char firstchar)\r
{\r
FARPROC lpProc;\r
- \r
- if ((gameMode == BeginningOfGame && !appData.icsActive) || \r
- gameMode == MachinePlaysWhite || gameMode == MachinePlaysBlack ||\r
- gameMode == AnalyzeMode || gameMode == EditGame || \r
- gameMode == EditPosition || gameMode == IcsExamining ||\r
- gameMode == IcsPlayingWhite || gameMode == IcsPlayingBlack ||\r
- isdigit(firstchar) && // [HGM] movenum: allow typing in of move nr in 'passive' modes\r
- ( gameMode == AnalyzeFile || gameMode == PlayFromGameFile ||\r
- gameMode == IcsObserving || gameMode == TwoMachinesPlay ) ||\r
- gameMode == Training) {\r
+\r
lpProc = MakeProcInstance((FARPROC)TypeInMoveDialog, hInst);\r
DialogBoxParam(hInst, MAKEINTRESOURCE(DLG_TypeInMove),\r
hwndMain, (DLGPROC)lpProc, (LPARAM)firstchar);\r
FreeProcInstance(lpProc);\r
- }\r
}\r
\r
/*---------------------------------------------------------------------------*\\r
hwndConsole = hDlg;\r
SetFocus(hInput);\r
consoleTextWindowProc = (WNDPROC)\r
- SetWindowLong(hText, GWL_WNDPROC, (LONG) ConsoleTextSubclass);\r
+ SetWindowLongPtr(hText, GWLP_WNDPROC, (LONG_PTR) ConsoleTextSubclass);\r
SendMessage(hText, EM_SETBKGNDCOLOR, FALSE, consoleBackgroundColor);\r
consoleInputWindowProc = (WNDPROC)\r
- SetWindowLong(hInput, GWL_WNDPROC, (LONG) ConsoleInputSubclass);\r
+ SetWindowLongPtr(hInput, GWLP_WNDPROC, (LONG_PTR) ConsoleInputSubclass);\r
SendMessage(hInput, EM_SETBKGNDCOLOR, FALSE, consoleBackgroundColor);\r
Colorize(ColorNormal, TRUE);\r
SendMessage(hInput, EM_SETCHARFORMAT, SCF_ALL, (LPARAM) &consoleCF);\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
+ SetWindowLongPtr(hText, GWLP_USERDATA, 79); // initialize the text window's width\r
\r
return FALSE;\r
\r
{ IDM_Revert, MF_BYCOMMAND|MF_GRAYED },\r
{ IDM_Annotate, MF_BYCOMMAND|MF_GRAYED },\r
{ IDM_NewChat, MF_BYCOMMAND|MF_GRAYED },\r
+\r
+ // Needed to switch from ncp to GNU mode on Engine Load\r
+ { ACTION_POS, MF_BYPOSITION|MF_ENABLED },\r
+ { IDM_MachineWhite, MF_BYCOMMAND|MF_ENABLED },\r
+ { IDM_MachineBlack, MF_BYCOMMAND|MF_ENABLED },\r
+ { IDM_TwoMachines, MF_BYCOMMAND|MF_ENABLED },\r
+ { IDM_Match, MF_BYCOMMAND|MF_ENABLED },\r
+ { IDM_AnalysisMode, MF_BYCOMMAND|MF_ENABLED },\r
+ { IDM_AnalyzeFile, MF_BYCOMMAND|MF_ENABLED },\r
+ { IDM_Engine1Options, MF_BYCOMMAND|MF_ENABLED },\r
+ { IDM_Engine2Options, MF_BYCOMMAND|MF_ENABLED },\r
+ { IDM_TimeControl, MF_BYCOMMAND|MF_ENABLED },\r
+ { IDM_RetractMove, MF_BYCOMMAND|MF_ENABLED },\r
+ { IDM_MoveNow, MF_BYCOMMAND|MF_ENABLED },\r
+ { IDM_Hint, MF_BYCOMMAND|MF_ENABLED },\r
+ { IDM_Book, MF_BYCOMMAND|MF_ENABLED },\r
{ -1, -1 }\r
};\r
\r
{ IDM_MoveNow, MF_BYCOMMAND|MF_GRAYED },\r
{ IDM_Hint, MF_BYCOMMAND|MF_GRAYED },\r
{ IDM_Book, MF_BYCOMMAND|MF_GRAYED },\r
+ { IDM_EditProgs2, 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
{ IDM_Annotate, MF_BYCOMMAND|MF_GRAYED },\r
+ { IDM_Tourney, 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_Match, MF_BYCOMMAND|MF_GRAYED },\r
+// { IDM_Match, MF_BYCOMMAND|MF_GRAYED },\r
{ IDM_TypeInMove, MF_BYCOMMAND|MF_GRAYED },\r
{ IDM_RetractMove, MF_BYCOMMAND|MF_GRAYED },\r
{ -1, -1 }\r
{ IDM_MachineWhite, MF_BYCOMMAND|MF_ENABLED },\r
{ IDM_MachineBlack, MF_BYCOMMAND|MF_ENABLED },\r
{ IDM_TwoMachines, MF_BYCOMMAND|MF_ENABLED },\r
- { IDM_Match, MF_BYCOMMAND|MF_ENABLED },\r
+// { IDM_Match, MF_BYCOMMAND|MF_ENABLED },\r
{ IDM_TypeInMove, MF_BYCOMMAND|MF_ENABLED },\r
{ IDM_RetractMove, MF_BYCOMMAND|MF_ENABLED },\r
{ -1, -1 }\r
* \r
\*---------------------------------------------------------------------------*/\r
VOID\r
+CheckMark(UINT item, int state)\r
+{\r
+ if(item) CheckMenuItem(GetMenu(hwndMain), item, MF_BYCOMMAND|state);\r
+}\r
+\r
+VOID\r
ModeHighlight()\r
{\r
static UINT prevChecked = 0;\r
nowChecked = IDM_MachineWhite;\r
break;\r
case TwoMachinesPlay:\r
- nowChecked = matchMode ? IDM_Match : IDM_TwoMachines; // [HGM] match\r
+ nowChecked = IDM_TwoMachines;\r
break;\r
case AnalyzeMode:\r
nowChecked = IDM_AnalysisMode;\r
nowChecked = 0;\r
break;\r
}\r
- if (prevChecked != 0)\r
- (void) CheckMenuItem(GetMenu(hwndMain),\r
- prevChecked, MF_BYCOMMAND|MF_UNCHECKED);\r
- if (nowChecked != 0)\r
- (void) CheckMenuItem(GetMenu(hwndMain),\r
- nowChecked, MF_BYCOMMAND|MF_CHECKED);\r
+ CheckMark(prevChecked, MF_UNCHECKED);\r
+ CheckMark(nowChecked, MF_CHECKED);\r
+ CheckMark(IDM_Match, matchMode && matchGame < appData.matchGames ? MF_CHECKED : MF_UNCHECKED);\r
\r
if (nowChecked == IDM_LoadGame || nowChecked == IDM_Training) {\r
(void) EnableMenuItem(GetMenu(hwndMain), IDM_Training, \r
/* [DM] icsEngineAnalyze - Do a sceure check too */\r
if (appData.icsActive) {\r
if (appData.icsEngineAnalyze) {\r
- (void) CheckMenuItem(GetMenu(hwndMain), IDM_AnalysisMode,\r
- MF_BYCOMMAND|MF_CHECKED);\r
+ CheckMark(IDM_AnalysisMode, MF_CHECKED);\r
} else {\r
- (void) CheckMenuItem(GetMenu(hwndMain), IDM_AnalysisMode,\r
- MF_BYCOMMAND|MF_UNCHECKED);\r
+ CheckMark(IDM_AnalysisMode, MF_UNCHECKED);\r
}\r
}\r
DisplayLogos(); // [HGM] logos: mode change could have altered logos\r
if (len > remain) len = remain;\r
strncat(messageText, str2, len);\r
}\r
- messageText[MESSAGE_TEXT_MAX - 1] = NULLCHAR;\r
+ messageText[MESSAGE_TEXT_MAX - 1] = NULLCHAR;
+ safeStrCpy(lastMsg, messageText, MSG_SIZ);
\r
if (hwndMain == NULL || IsIconic(hwndMain)) return;\r
\r
MyPlaySound(&sounds[(int)SoundAlarm]);\r
}\r
\r
+VOID\r
+PlayTellSound()\r
+{\r
+ MyPlaySound(&textAttribs[ColorTell].sound);\r
+}\r
+\r
\r
VOID\r
EchoOn()\r
MoveHistorySet( movelist, first, last, current, pvInfoList );\r
\r
EvalGraphSet( first, last, current, pvInfoList );\r
+\r
+ MakeEngineOutputTitle();\r
}\r
\r
void\r
{ // [HGM] wrapper needed because handles must not be passed through back-end\r
EngineOptionsPopup(savedHwnd, cps);\r
}\r
+\r
+int flock(int fid, int code)\r
+{\r
+ HANDLE hFile = (HANDLE) _get_osfhandle(fid);\r
+ OVERLAPPED ov;\r
+ ov.hEvent = NULL;\r
+ ov.Offset = 0;\r
+ ov.OffsetHigh = 0;\r
+ switch(code) {\r
+ case 1: LockFileEx(hFile, LOCKFILE_EXCLUSIVE_LOCK, 0, 1024, 0, &ov); break; // LOCK_SH\r
+ case 2: LockFileEx(hFile, LOCKFILE_EXCLUSIVE_LOCK, 0, 1024, 0, &ov); break; // LOCK_EX\r
+ case 3: UnlockFileEx(hFile, 0, 1024, 0, &ov); break; // LOCK_UN\r
+ default: return -1;\r
+ }\r
+ return 0;\r
+}\r