* Massachusetts. \r
*\r
* Enhancements Copyright 1992-2001, 2002, 2003, 2004, 2005, 2006,\r
- * 2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc.\r
+ * 2007, 2008, 2009, 2010, 2011, 2012 Free Software Foundation, Inc.\r
*\r
* Enhancements Copyright 2005 Alessandro Scotti\r
*\r
extern int whiteFlag, blackFlag;\r
Boolean flipClock = FALSE;\r
extern HANDLE chatHandle[];\r
-extern int ics_type;\r
+extern enum ICS_TYPE ics_type;\r
\r
+int MySearchPath P((char *installDir, char *name, char *fullname));\r
+int MyGetFullPathName P((char *name, char *fullname));\r
void DisplayHoldingsCount(HDC hdc, int x, int y, int align, int copyNumber);\r
VOID NewVariantPopup(HWND hwnd);\r
int FinishMove P((ChessMove moveType, int fromX, int fromY, int toX, int toY,\r
#define ABOUTBOX -1 /* not sure why these are needed */\r
#define ABOUTBOX2 -1\r
\r
-int dialogItems[][41 ] = {\r
+int dialogItems[][42] = {\r
{ ABOUTBOX, IDOK, OPT_MESS, 400 }, \r
{ DLG_TimeControl, IDC_Babble, OPT_TCUseMoves, OPT_TCUseInc, OPT_TCUseFixed, \r
OPT_TCtext1, OPT_TCtext2, OPT_TCitext1, OPT_TCitext2, OPT_TCftext, GPB_Factors, IDC_Factor1, IDC_Factor2, IDOK, IDCANCEL }, \r
OPT_ChooseLightSquareColor, OPT_ChooseDarkSquareColor, OPT_ChooseWhitePieceColor,\r
OPT_ChooseBlackPieceColor, OPT_ChooseHighlightSquareColor, OPT_ChoosePremoveHighlightColor,\r
OPT_Monochrome, OPT_AllWhite, OPT_UpsideDown, OPT_DefaultBoardColors, GPB_Colors,\r
- IDC_Light, IDC_Dark, IDC_White, IDC_Black, IDC_High, IDC_PreHigh, GPB_Size, OPT_Bitmaps, OPT_PieceFont }, \r
+ IDC_Light, IDC_Dark, IDC_White, IDC_Black, IDC_High, IDC_PreHigh, GPB_Size, OPT_Bitmaps, OPT_PieceFont, OPT_Grid }, \r
{ DLG_NewVariant, IDOK, IDCANCEL, OPT_VariantNormal, OPT_VariantFRC, OPT_VariantWildcastle,\r
OPT_VariantNocastle, OPT_VariantLosers, OPT_VariantGiveaway, OPT_VariantSuicide,\r
OPT_Variant3Check, OPT_VariantTwoKings, OPT_VariantAtomic, OPT_VariantCrazyhouse,\r
info.dwTypeData = buf;\r
info.cch = sizeof(buf);\r
GetMenuItemInfo(subMenu, j, TRUE, &info);\r
- if(i < 10) {
+ if(i < 10) {\r
if(menuText[i][j]) safeStrCpy(buf, menuText[i][j], sizeof(buf)/sizeof(buf[0]) );\r
else menuText[i][j] = strdup(buf); // remember original on first change\r
}\r
\r
#endif\r
\r
+#define IDM_RecentEngines 3000\r
+\r
+void\r
+RecentEngineMenu (char *s)\r
+{\r
+ if(appData.icsActive) return;\r
+ if(appData.recentEngines > 0 && *s) { // feature is on, and list non-empty\r
+ HMENU mainMenu = GetMenu(hwndMain);\r
+ HMENU subMenu = GetSubMenu(mainMenu, 5); // Engine menu\r
+ int i=IDM_RecentEngines;\r
+ recentEngines = strdup(appData.recentEngineList); // remember them as they are in menu\r
+ AppendMenu(subMenu, MF_SEPARATOR, (UINT_PTR) 0, NULL);\r
+ while(*s) {\r
+ char *p = strchr(s, '\n');\r
+ if(p == NULL) return; // malformed!\r
+ *p = NULLCHAR;\r
+ AppendMenu(subMenu, MF_ENABLED|MF_STRING|MF_UNCHECKED, (UINT_PTR) i++, (LPCTSTR) s);\r
+ *p = '\n';\r
+ s = p+1;\r
+ }\r
+ }\r
+}\r
+\r
+\r
typedef struct {\r
char *name;\r
int squareSize;\r
}\r
\r
InitDrawingSizes(boardSize, 0);\r
+ RecentEngineMenu(appData.recentEngineList);\r
InitMenuChecks();\r
buttonCount = GetSystemMetrics(SM_CMOUSEBUTTONS);\r
\r
0, 0, 0, 0, SWP_NOMOVE|SWP_NOSIZE);\r
#endif\r
ShowWindow(hwndConsole, nCmdShow);\r
- if(appData.chatBoxes) { // [HGM] chat: open chat boxes\r
- char buf[MSG_SIZ], *p = buf, *q;\r
- safeStrCpy(buf, appData.chatBoxes, sizeof(buf)/sizeof(buf[0]) );\r
- do {\r
- q = strchr(p, ';');\r
- if(q) *q++ = 0;\r
- if(*p) ChatPopUp(p);\r
- } while(p=q);\r
- }\r
SetActiveWindow(hwndConsole);\r
}\r
if(!appData.noGUI) UpdateWindow(hwnd); else ShowWindow(hwnd, SW_MINIMIZE);\r
\r
#define OPTCHAR "/"\r
#define SEPCHAR "="\r
+#define TOPLEVEL 0\r
\r
#include "args.h"\r
\r
RECT crect, wrect, oldRect;\r
int offby;\r
LOGBRUSH logbrush;\r
+ VariantClass v = gameInfo.variant;\r
\r
int suppressVisibleEffects = 0; // [HGM] kludge to request updating sizeInfo only\r
if((int)boardSize >= 1000 ) { boardSize -= 1000; suppressVisibleEffects = 1; }\r
\r
/* [HGM] call with -2 uses old size (for if nr of files, ranks changes) */\r
if(boardSize == (BoardSize)(-2) ) boardSize = oldBoardSize;\r
+ oldBoardSize = boardSize;\r
+\r
+ if(boardSize != SizeMiddling && boardSize != SizePetite && boardSize != SizeBulky && !appData.useFont)\r
+ { // correct board size to one where built-in pieces exist\r
+ if((v == VariantCapablanca || v == VariantGothic || v == VariantGrand || v == VariantCapaRandom || v == VariantJanus || v == VariantSuper)\r
+ && (boardSize < SizePetite || boardSize > SizeBulky) // Archbishop and Chancellor available in entire middle range\r
+ || (v == VariantShogi && boardSize != SizeModerate) // Japanese-style Shogi\r
+ || v == VariantKnightmate || v == VariantSChess || v == VariantXiangqi || v == VariantSpartan\r
+ || v == VariantShatranj || v == VariantMakruk || v == VariantGreat || v == VariantFairy ) {\r
+ if(boardSize < SizeMediocre) boardSize = SizePetite; else\r
+ if(boardSize > SizeModerate) boardSize = SizeBulky; else\r
+ boardSize = SizeMiddling;\r
+ }\r
+ }\r
+ if(!appData.useFont && boardSize == SizePetite && (v == VariantShogi || v == VariantKnightmate)) boardSize = SizeMiddling; // no Unicorn in Petite\r
\r
oldRect.left = wpMain.x; //[HGM] placement: remember previous window params\r
oldRect.top = wpMain.y;\r
\r
sizeInfo[boardSize].cliWidth = boardRect.right + OUTER_MARGIN;\r
sizeInfo[boardSize].cliHeight = boardRect.bottom + OUTER_MARGIN;\r
- oldBoardSize = boardSize;\r
oldTinyLayout = tinyLayout;\r
winW = 2 * GetSystemMetrics(SM_CXFRAME) + boardRect.right + OUTER_MARGIN;\r
winH = 2 * GetSystemMetrics(SM_CYFRAME) + GetSystemMetrics(SM_CYMENU) +\r
SelectObject(hdcSeek, oldBrush);\r
}\r
\r
+void DrawSeekOpen()\r
+{\r
+}\r
+\r
+void DrawSeekClose()\r
+{\r
+}\r
+\r
VOID\r
HDCDrawPosition(HDC hdc, BOOLEAN repaint, Board board)\r
{\r
}\r
break;\r
case 2:\r
- SetCapture(hwndMain);
+ SetCapture(hwndMain);\r
break;\r
case 1:\r
hmenu = LoadMenu(hInst, "DropPieceMenu");\r
PromotionPopup(hwndMain);\r
}\r
\r
-/* Toggle ShowThinking */\r
-VOID\r
-ToggleShowThinking()\r
-{\r
- appData.showThinking = !appData.showThinking;\r
- ShowThinkingEvent();\r
-}\r
-\r
VOID\r
LoadGameDialog(HWND hwnd, char* title)\r
{\r
break;\r
\r
case IDM_AnalysisMode:\r
- if (!first.analysisSupport) {\r
- snprintf(buf, MSG_SIZ, _("%s does not support analysis"), first.tidy);\r
- DisplayError(buf, 0);\r
- } else {\r
+ if(AnalyzeModeEvent()) {\r
SAY("analyzing current position");\r
- /* [DM] icsEngineAnlyze [HGM] Why is this front-end??? */\r
- if (appData.icsActive) {\r
- if (gameMode != IcsObserving) {\r
- snprintf(buf, MSG_SIZ, "You are not observing a game");\r
- DisplayError(buf, 0);\r
- /* secure check */\r
- if (appData.icsEngineAnalyze) {\r
- if (appData.debugMode) \r
- fprintf(debugFP, "Found unexpected active ICS engine analyze \n");\r
- ExitAnalyzeMode();\r
- ModeHighlight();\r
- break;\r
- }\r
- break;\r
- } else {\r
- /* if enable, user want disable icsEngineAnalyze */\r
- if (appData.icsEngineAnalyze) {\r
- ExitAnalyzeMode();\r
- ModeHighlight();\r
- break;\r
- }\r
- appData.icsEngineAnalyze = TRUE;\r
- if (appData.debugMode) fprintf(debugFP, "ICS engine analyze starting...\n");\r
- }\r
- } \r
- if (!appData.showThinking) ToggleShowThinking();\r
- AnalyzeModeEvent();\r
}\r
break;\r
\r
case IDM_AnalyzeFile:\r
- if (!first.analysisSupport) {\r
- char buf[MSG_SIZ];\r
- snprintf(buf, MSG_SIZ, _("%s does not support analysis"), first.tidy);\r
- DisplayError(buf, 0);\r
- } else {\r
- if (!appData.showThinking) ToggleShowThinking();\r
- AnalyzeFileEvent();\r
-// LoadGameDialog(hwnd, _("Analyze Game from File"));\r
- AnalysisPeriodicEvent(1);\r
- }\r
+ AnalyzeFileEvent();\r
break;\r
\r
case IDM_IcsClient:\r
EditTagsPopUp(firstChessProgramNames, &firstChessProgramNames);\r
break;\r
\r
- case IDM_EditProgs2:\r
- LoadEnginePopUp(hwndMain);\r
-// EditTagsPopUp(secondChessProgramNames, &secondChessProgramNames);\r
+ case IDM_LoadProg1:\r
+ LoadEnginePopUp(hwndMain, 0);\r
+ break;\r
+\r
+ case IDM_LoadProg2:\r
+ LoadEnginePopUp(hwndMain, 1);\r
break;\r
\r
case IDM_EditServers:\r
break;\r
\r
default:\r
+ if(wmId >= IDM_RecentEngines && wmId < IDM_RecentEngines + appData.recentEngines)\r
+ RecentEngineEvent(wmId - IDM_RecentEngines);\r
+ else\r
if(wmId > IDM_English && wmId < IDM_English+20) {\r
LoadLanguageFile(languageFile[wmId - IDM_English - 1]);\r
TranslateMenus(0);\r
safeStrCpy(buf, "/fcp=", sizeof(buf)/sizeof(buf[0]) );\r
GetDlgItemText(hDlg, OPT_ChessEngineName, buf + strlen(buf), sizeof(buf) - strlen(buf));\r
p = buf;\r
+ comboLine = strdup(p+5); // [HGM] recent: remember complete line of first combobox\r
ParseArgs(StringGet, &p);\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;
+ p = buf;\r
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
\r
case WM_COMMAND:\r
switch (LOWORD(wParam)) {\r
- case IDOK:
+ case IDOK:\r
\r
shiftKey = GetKeyState(VK_SHIFT) < 0; // [HGM] remember last shift status\r
- GetDlgItemText(hDlg, OPT_Move, move, sizeof(move));
+ GetDlgItemText(hDlg, OPT_Move, move, sizeof(move));\r
TypeInDoneEvent(move);\r
EndDialog(hDlg, TRUE);\r
return TRUE;\r
HFONT oldFont;\r
RECT rect;\r
\r
- if(copyNumber > 1)
+ if(copyNumber > 1)\r
snprintf(buf, sizeof(buf)/sizeof(buf[0]),"%d", copyNumber); else buf[0] = 0;\r
\r
oldFg = SetTextColor(hdc, RGB(255, 255, 255)); /* white */\r
COLORREF oldFg, oldBg;\r
HFONT oldFont;\r
\r
+ if (twoBoards && partnerUp) return;\r
if (appData.clockMode) {\r
if (tinyLayout)\r
snprintf(buf, sizeof(buf)/sizeof(buf[0]), "%c %s %s", color[0], TimeString(timeRemaining), flagFell);\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_LoadProg1, MF_BYCOMMAND|MF_GRAYED },\r
+ { IDM_LoadProg2, 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
if (len > remain) len = remain;\r
strncat(messageText, str2, len);\r
}\r
- messageText[MESSAGE_TEXT_MAX - 1] = NULLCHAR;
- safeStrCpy(lastMsg, messageText, MSG_SIZ);
+ messageText[MESSAGE_TEXT_MAX - 1] = NULLCHAR;\r
+ safeStrCpy(lastMsg, messageText, MSG_SIZ);\r
\r
if (hwndMain == NULL || IsIconic(hwndMain)) return;\r
\r
char consoleTitle[MSG_SIZ];\r
\r
snprintf(consoleTitle, MSG_SIZ, "%s: %s", szConsoleTitle, str);\r
- SetWindowText(hwndConsole, consoleTitle);\r
+ SetWindowText(hwndConsole, consoleTitle);\r
+\r
+ if(appData.chatBoxes) { // [HGM] chat: open chat boxes\r
+ char buf[MSG_SIZ], *p = buf, *q;\r
+ safeStrCpy(buf, appData.chatBoxes, sizeof(buf)/sizeof(buf[0]) );\r
+ do {\r
+ q = strchr(p, ';');\r
+ if(q) *q++ = 0;\r
+ if(*p) ChatPopUp(p);\r
+ } while(p=q);\r
+ }\r
+\r
+ SetActiveWindow(hwndMain);\r
}\r
\r
void\r
ChildProc *cp;\r
int err;\r
SOCKET s;\r
+\r
struct sockaddr_in sa, mysa;\r
struct hostent FAR *hp;\r
unsigned short uport;\r