* Massachusetts. \r
*\r
* Enhancements Copyright 1992-2001, 2002, 2003, 2004, 2005, 2006,\r
- * 2007, 2008, 2009, 2010 Free Software Foundation, Inc.\r
+ * 2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc.\r
*\r
* Enhancements Copyright 2005 Alessandro Scotti\r
*\r
VOID NewVariantPopup(HWND hwnd);\r
int FinishMove P((ChessMove moveType, int fromX, int fromY, int toX, int toY,\r
/*char*/int promoChar));\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((char *s));\r
HPALETTE hPal;\r
ColorClass currentColorClass;\r
\r
+static HWND savedHwnd;\r
HWND hCommPort = NULL; /* currently open comm port */\r
static HWND hwndPause; /* pause button */\r
static HBITMAP pieceBitmap[3][(int) BlackPawn]; /* [HGM] nr of bitmaps referred to bP in stead of wK */\r
#endif\r
#endif\r
\r
+#define INTERNATIONAL\r
+\r
+#ifdef INTERNATIONAL\r
+# define _(s) T_(s)\r
+# define N_(s) s\r
+#else\r
+# define _(s) s\r
+# define N_(s) s\r
+# define T_(s) s\r
+# define Translate(x, y)\r
+# define LoadLanguageFile(s)\r
+#endif\r
+\r
+#ifdef INTERNATIONAL\r
+\r
+Boolean barbaric; // flag indicating if translation is needed\r
+\r
+// list of item numbers used in each dialog (used to alter language at run time)\r
+\r
+#define ABOUTBOX -1 /* not sure why these are needed */\r
+#define ABOUTBOX2 -1\r
+\r
+int dialogItems[][40] = {\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
+{ DLG_LoadOptions, OPT_Autostep, OPT_AStext1, IDOK, IDCANCEL }, \r
+{ DLG_SaveOptions, OPT_Autosave, OPT_AVPrompt, OPT_AVToFile, OPT_AVBrowse,\r
+ 801, OPT_PGN, OPT_Old, OPT_OutOfBookInfo, IDOK, IDCANCEL }, \r
+{ 1536, 1090, IDC_Directories, 1089, 1091, IDOK, IDCANCEL, 1038, IDC_IndexNr, 1037 }, \r
+{ DLG_CommPort, IDOK, IDCANCEL, IDC_Port, IDC_Rate, IDC_Bits, IDC_Parity,\r
+ IDC_Stop, IDC_Flow, OPT_SerialHelp }, \r
+{ DLG_EditComment, IDOK, OPT_CancelComment, OPT_ClearComment, OPT_EditComment }, \r
+{ DLG_PromotionKing, PB_Chancellor, PB_Archbishop, PB_Queen, PB_Rook, \r
+ PB_Bishop, PB_Knight, PB_King, IDCANCEL, IDC_Yes, IDC_No, IDC_Centaur }, \r
+{ ABOUTBOX2, IDC_ChessBoard }, \r
+{ DLG_GameList, OPT_GameListLoad, OPT_GameListPrev, OPT_GameListNext, \r
+ OPT_GameListClose, IDC_GameListDoFilter }, \r
+{ DLG_EditTags, IDOK, OPT_TagsCancel, OPT_EditTags }, \r
+{ DLG_Error, IDOK }, \r
+{ DLG_Colorize, IDOK, IDCANCEL, OPT_ChooseColor, OPT_Bold, OPT_Italic,\r
+ OPT_Underline, OPT_Strikeout, OPT_Sample }, \r
+{ DLG_Question, IDOK, IDCANCEL, OPT_QuestionText }, \r
+{ DLG_Startup, IDC_Welcome, OPT_ChessEngine, OPT_ChessServer, OPT_View,\r
+ IDC_SPECIFY_ENG_STATIC, IDC_SPECIFY_SERVER_STATIC, OPT_AnyAdditional,\r
+ IDOK, IDCANCEL, IDM_HELPCONTENTS }, \r
+{ DLG_IndexNumber, IDC_Index }, \r
+{ DLG_TypeInMove, IDOK, IDCANCEL }, \r
+{ DLG_TypeInName, IDOK, IDCANCEL }, \r
+{ DLG_Sound, IDC_Event, OPT_NoSound, OPT_DefaultBeep, OPT_BuiltInSound,\r
+ OPT_WavFile, OPT_BrowseSound, OPT_DefaultSounds, IDOK, IDCANCEL, OPT_PlaySound }, \r
+{ DLG_GeneralOptions, IDOK, IDCANCEL, OPT_AlwaysOnTop, OPT_HighlightLastMove,\r
+ OPT_AlwaysQueen, OPT_PeriodicUpdates, OPT_AnimateDragging, OPT_PonderNextMove,\r
+ OPT_AnimateMoving, OPT_PopupExitMessage, OPT_AutoFlag, OPT_PopupMoveErrors,\r
+ OPT_AutoFlipView, OPT_ShowButtonBar, OPT_AutoRaiseBoard, OPT_ShowCoordinates,\r
+ OPT_Blindfold, OPT_ShowThinking, OPT_HighlightDragging, OPT_TestLegality,\r
+ OPT_SaveExtPGN, OPT_HideThinkFromHuman, OPT_ExtraInfoInMoveHistory,\r
+ OPT_HighlightMoveArrow, OPT_AutoLogo ,OPT_SmartMove }, \r
+{ DLG_IcsOptions, IDOK, IDCANCEL, OPT_AutoComment, OPT_AutoKibitz, OPT_AutoObserve,\r
+ OPT_GetMoveList, OPT_LocalLineEditing, OPT_QuietPlay, OPT_SeekGraph, OPT_AutoRefresh,\r
+ OPT_BgObserve, OPT_DualBoard, OPT_Premove, OPT_PremoveWhite, OPT_PremoveBlack,\r
+ OPT_SmartMove, OPT_IcsAlarm, IDC_Sec, OPT_ChooseShoutColor, OPT_ChooseSShoutColor,\r
+ OPT_ChooseChannel1Color, OPT_ChooseChannelColor, OPT_ChooseKibitzColor,\r
+ OPT_ChooseTellColor, OPT_ChooseChallengeColor, OPT_ChooseRequestColor,\r
+ OPT_ChooseSeekColor, OPT_ChooseNormalColor, OPT_ChooseBackgroundColor,\r
+ OPT_DefaultColors, OPT_DontColorize, IDC_Boxes, GPB_Colors, GPB_Premove,\r
+ GPB_General, GPB_Alarm }, \r
+{ DLG_BoardOptions, IDOK, IDCANCEL, OPT_SizeTiny, OPT_SizeTeeny, OPT_SizeDinky,\r
+ OPT_SizePetite, OPT_SizeSlim, OPT_SizeSmall, OPT_SizeMediocre, OPT_SizeMiddling,\r
+ OPT_SizeAverage, OPT_SizeModerate, OPT_SizeMedium, OPT_SizeBulky, OPT_SizeLarge,\r
+ OPT_SizeBig, OPT_SizeHuge, OPT_SizeGiant, OPT_SizeColossal, OPT_SizeTitanic,\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 }, \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
+ OPT_VariantBughouse, OPT_VariantTwilight, OPT_VariantShogi, OPT_VariantSuper,\r
+ OPT_VariantKnightmate, OPT_VariantBerolina, OPT_VariantCylinder, OPT_VariantFairy,\r
+ OPT_VariantMakruk, OPT_VariantGothic, OPT_VariantCapablanca, OPT_VariantJanus,\r
+ OPT_VariantCRC, OPT_VariantFalcon, OPT_VariantCourier, OPT_VariantGreat, OPT_VariantSChess,\r
+ OPT_VariantShatranj, OPT_VariantXiangqi, GPB_Variant, GPB_Board, IDC_Height,\r
+ IDC_Width, IDC_Hand, IDC_Pieces, IDC_Def }, \r
+{ DLG_Fonts, IDOK, IDCANCEL, OPT_ChooseClockFont, OPT_ChooseMessageFont,\r
+ OPT_ChooseCoordFont, OPT_ChooseTagFont, OPT_ChooseCommentsFont, OPT_ChooseConsoleFont, OPT_ChooseMoveHistoryFont, OPT_DefaultFonts,\r
+ OPT_ClockFont, OPT_MessageFont, OPT_CoordFont, OPT_EditTagsFont,\r
+ OPT_CommentsFont, OPT_MessageFont5, GPB_Current, GPB_All, OPT_MessageFont6 }, \r
+{ DLG_NewGameFRC, IDC_NFG_Label, IDC_NFG_Random, IDOK, IDCANCEL }, \r
+{ DLG_GameListOptions, IDC_GLT, IDC_GLT_Up, IDC_GLT_Down, IDC_GLT_Restore,\r
+ IDC_GLT_Default, IDOK, IDCANCEL, IDC_GLT_RestoreTo }, \r
+{ DLG_MoveHistory }, \r
+{ DLG_EvalGraph }, \r
+{ DLG_EngineOutput, IDC_EngineLabel1, IDC_Engine1_NPS, IDC_EngineLabel2, IDC_Engine2_NPS }, \r
+{ DLG_Chat, IDC_Partner, IDC_Clear, IDC_Send, }, \r
+{ DLG_EnginePlayOptions, IDC_EpPonder, IDC_EpShowThinking, IDC_EpHideThinkingHuman,\r
+ IDC_EpPeriodicUpdates, GPB_Adjudications, IDC_Draw, IDC_Moves, IDC_Threshold,\r
+ IDC_Centi, IDC_TestClaims, IDC_DetectMates, IDC_MaterialDraws, IDC_TrivialDraws,\r
+ GPB_Apply, IDC_Rule, IDC_Repeats, IDC_ScoreAbs1, IDC_ScoreAbs2, IDOK, IDCANCEL }, \r
+{ DLG_OptionsUCI, IDC_PolyDir, IDC_BrowseForPolyglotDir, IDC_Hash, IDC_Path,\r
+ IDC_BrowseForEGTB, IDC_Cache, IDC_UseBook, IDC_BrowseForBook, IDC_CPU, IDC_OwnBook1,\r
+ IDC_OwnBook2, IDC_Depth, IDC_Variation, IDC_DefGames, IDOK, IDCANCEL },\r
+{ 0 }\r
+};\r
+\r
+static char languageBuf[50000], *foreign[1000], *english[1000], *languageFile[MSG_SIZ];\r
+static int lastChecked;\r
+static char oldLanguage[MSG_SIZ], *menuText[10][30];\r
+extern int tinyLayout;\r
+extern char * menuBarText[][10];\r
+\r
+void\r
+LoadLanguageFile(char *name)\r
+{ //load the file with translations, and make a list of the strings to be translated, and their translations\r
+ FILE *f;\r
+ int i=0, j=0, n=0, k;\r
+ char buf[MSG_SIZ];\r
+\r
+ if(!name || name[0] == NULLCHAR) return;\r
+ snprintf(buf, MSG_SIZ, "%s%s", name, strchr(name, '.') ? "" : ".lng"); // auto-append lng extension\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
+ if(i >= sizeof(languageBuf)) { DisplayError("Language file too big", 0); return; }\r
+ languageBuf[i] = k;\r
+ if(k == '\n') {\r
+ if(languageBuf[n] == '"' && languageBuf[i-1] == '"') {\r
+ char *p;\r
+ if(p = strstr(languageBuf + n + 1, "\" === \"")) {\r
+ if(p > languageBuf+n+2 && p+8 < languageBuf+i) {\r
+ if(j >= sizeof(english)) { DisplayError("Too many translated strings", 0); return; }\r
+ english[j] = languageBuf + n + 1; *p = 0;\r
+ foreign[j++] = p + 7; languageBuf[i-1] = 0;\r
+//if(appData.debugMode) fprintf(debugFP, "translation: replace '%s' by '%s'\n", english[j-1], foreign[j-1]);\r
+ }\r
+ }\r
+ }\r
+ n = i + 1;\r
+ } else if(i > 0 && languageBuf[i-1] == '\\') {\r
+ switch(k) {\r
+ case 'n': k = '\n'; break;\r
+ case 'r': k = '\r'; break;\r
+ case 't': k = '\t'; break;\r
+ }\r
+ languageBuf[--i] = k;\r
+ }\r
+ i++;\r
+ }\r
+ fclose(f);\r
+ barbaric = (j != 0);\r
+ safeStrCpy(oldLanguage, buf, sizeof(oldLanguage)/sizeof(oldLanguage[0]) );\r
+}\r
+\r
+char *\r
+T_(char *s)\r
+{ // return the translation of the given string\r
+ // efficiency can be improved a lot...\r
+ int i=0;\r
+//if(appData.debugMode) fprintf(debugFP, "T_(%s)\n", s);\r
+ if(!barbaric) return s;\r
+ if(!s) return ""; // sanity\r
+ while(english[i]) {\r
+ if(!strcmp(s, english[i])) return foreign[i];\r
+ i++;\r
+ }\r
+ return s;\r
+}\r
+\r
+void\r
+Translate(HWND hDlg, int dialogID)\r
+{ // translate all text items in the given dialog\r
+ int i=0, j, k;\r
+ char buf[MSG_SIZ], *s;\r
+ if(!barbaric) return;\r
+ while(dialogItems[i][0] && dialogItems[i][0] != dialogID) i++; // find the dialog description\r
+ if(dialogItems[i][0] != dialogID) return; // unknown dialog, should not happen\r
+ GetWindowText( hDlg, buf, MSG_SIZ );\r
+ s = T_(buf);\r
+ if(strcmp(buf, s)) SetWindowText(hDlg, s); // replace by translated string (if different)\r
+ for(j=1; k=dialogItems[i][j]; j++) { // translate all listed dialog items\r
+ GetDlgItemText(hDlg, k, buf, MSG_SIZ);\r
+ if(strlen(buf) == 0) continue;\r
+ s = T_(buf);\r
+ if(strcmp(buf, s)) SetDlgItemText(hDlg, k, s); // replace by translated string (if different)\r
+ }\r
+}\r
+\r
+HMENU\r
+TranslateOneMenu(int i, HMENU subMenu)\r
+{\r
+ int j;\r
+ static MENUITEMINFO info;\r
+\r
+ info.cbSize = sizeof(MENUITEMINFO);\r
+ info.fMask = MIIM_STATE | MIIM_TYPE;\r
+ for(j=GetMenuItemCount(subMenu)-1; j>=0; j--){\r
+ char buf[MSG_SIZ];\r
+ info.dwTypeData = buf;\r
+ info.cch = sizeof(buf);\r
+ GetMenuItemInfo(subMenu, j, TRUE, &info);\r
+ if(i < 10) {
+ 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
+ if(buf[0] == NULLCHAR) continue;\r
+ info.dwTypeData = T_(buf);\r
+ info.cch = strlen(buf)+1;\r
+ SetMenuItemInfo(subMenu, j, TRUE, &info);\r
+ }\r
+ return subMenu;\r
+}\r
+\r
+void\r
+TranslateMenus(int addLanguage)\r
+{\r
+ int i;\r
+ WIN32_FIND_DATA fileData;\r
+ HANDLE hFind;\r
+#define IDM_English 1895\r
+ if(1) {\r
+ HMENU mainMenu = GetMenu(hwndMain);\r
+ for (i=GetMenuItemCount(mainMenu)-1; i>=0; i--) {\r
+ HMENU subMenu = GetSubMenu(mainMenu, i);\r
+ ModifyMenu(mainMenu, i, MF_STRING|MF_BYPOSITION|MF_POPUP|EnableMenuItem(mainMenu, i, MF_BYPOSITION),\r
+ (UINT) subMenu, T_(menuBarText[tinyLayout][i]));\r
+ TranslateOneMenu(i, subMenu);\r
+ }\r
+ DrawMenuBar(hwndMain);\r
+ }\r
+\r
+ if(!addLanguage) return;\r
+ if((hFind = FindFirstFile("*.LNG", &fileData)) != INVALID_HANDLE_VALUE) {\r
+ HMENU mainMenu = GetMenu(hwndMain);\r
+ HMENU subMenu = GetSubMenu(mainMenu, GetMenuItemCount(mainMenu)-1);\r
+ AppendMenu(subMenu, MF_SEPARATOR, (UINT_PTR) 0, NULL);\r
+ AppendMenu(subMenu, MF_ENABLED|MF_STRING|(barbaric?MF_UNCHECKED:MF_CHECKED), (UINT_PTR) IDM_English, (LPCTSTR) "English");\r
+ i = 0; lastChecked = IDM_English;\r
+ do {\r
+ char *p, *q = fileData.cFileName;\r
+ int checkFlag = MF_UNCHECKED;\r
+ languageFile[i] = strdup(q);\r
+ if(barbaric && !strcmp(oldLanguage, q)) {\r
+ checkFlag = MF_CHECKED;\r
+ lastChecked = IDM_English + i + 1;\r
+ CheckMenuItem(mainMenu, IDM_English, MF_BYCOMMAND|MF_UNCHECKED);\r
+ }\r
+ *q = ToUpper(*q); while(*++q) *q = ToLower(*q);\r
+ p = strstr(fileData.cFileName, ".lng");\r
+ if(p) *p = 0;\r
+ AppendMenu(subMenu, MF_ENABLED|MF_STRING|checkFlag, (UINT_PTR) IDM_English + ++i, (LPCTSTR) fileData.cFileName);\r
+ } while(FindNextFile(hFind, &fileData));\r
+ FindClose(hFind);\r
+ }\r
+}\r
+\r
+#endif\r
+\r
typedef struct {\r
char *name;\r
int squareSize;\r
};\r
\r
int tinyLayout = 0, smallLayout = 0;\r
-#define MENU_BAR_ITEMS 7\r
+#define MENU_BAR_ITEMS 9\r
char *menuBarText[2][MENU_BAR_ITEMS+1] = {\r
- { "&File", "&Mode", "&Action", "&Step", "&Options", "&Help", NULL },\r
- { "&F", "&M", "&A", "&S", "&O", "&H", NULL },\r
+ { N_("&File"), N_("&Edit"), N_("&View"), N_("&Mode"), N_("&Action"), N_("E&ngine"), N_("&Options"), N_("&Help"), NULL },\r
+ { N_("&F"), N_("&E"), N_("&V"), N_("&M"), N_("&A"), N_("&N"), N_("&O"), N_("&H"), NULL },\r
};\r
\r
\r
MyTextAttribs textAttribs[(int)NColorClasses];\r
\r
MyColorizeAttribs colorizeAttribs[] = {\r
- { (COLORREF)0, 0, "Shout Text" },\r
- { (COLORREF)0, 0, "SShout/CShout" },\r
- { (COLORREF)0, 0, "Channel 1 Text" },\r
- { (COLORREF)0, 0, "Channel Text" },\r
- { (COLORREF)0, 0, "Kibitz Text" },\r
- { (COLORREF)0, 0, "Tell Text" },\r
- { (COLORREF)0, 0, "Challenge Text" },\r
- { (COLORREF)0, 0, "Request Text" },\r
- { (COLORREF)0, 0, "Seek Text" },\r
- { (COLORREF)0, 0, "Normal Text" },\r
- { (COLORREF)0, 0, "None" }\r
+ { (COLORREF)0, 0, N_("Shout Text") },\r
+ { (COLORREF)0, 0, N_("SShout/CShout") },\r
+ { (COLORREF)0, 0, N_("Channel 1 Text") },\r
+ { (COLORREF)0, 0, N_("Channel Text") },\r
+ { (COLORREF)0, 0, N_("Kibitz Text") },\r
+ { (COLORREF)0, 0, N_("Tell Text") },\r
+ { (COLORREF)0, 0, N_("Challenge Text") },\r
+ { (COLORREF)0, 0, N_("Request Text") },\r
+ { (COLORREF)0, 0, N_("Seek Text") },\r
+ { (COLORREF)0, 0, N_("Normal Text") },\r
+ { (COLORREF)0, 0, N_("None") }\r
};\r
\r
\r
}\r
\r
JAWS_INIT\r
+ TranslateMenus(1);\r
\r
// InitCommonControlsEx(&ex);\r
InitCommonControls();\r
if(appData.autoLogo) {\r
curName = UserName();\r
if(strcmp(curName, oldUserName)) {\r
- sprintf(oldUserName, "logos\\%s.bmp", curName);\r
+ snprintf(oldUserName, MSG_SIZ, "logos\\%s.bmp", curName);\r
userLogo = LoadImage( 0, oldUserName, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE ); \r
- strcpy(oldUserName, curName);\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
}\r
}\r
}\r
setbuf(debugFP, NULL);\r
}\r
\r
+ LoadLanguageFile(appData.language);\r
+\r
InitBackEnd1();\r
\r
// InitEngineUCI( installDir, &first ); // [HGM] incorporated in InitBackEnd1()\r
} else if(appData.autoLogo) {\r
if(appData.firstDirectory && appData.firstDirectory[0]) {\r
char buf[MSG_SIZ];\r
- sprintf(buf, "%s/logo.bmp", appData.firstDirectory);\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
} 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
- sprintf(buf, "logos\\%s.bmp", appData.icsHost);\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
- sprintf(buf, "%s\\logo.bmp", appData.secondDirectory);\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
ShowWindow(hwndConsole, nCmdShow);\r
if(appData.chatBoxes) { // [HGM] chat: open chat boxes\r
char buf[MSG_SIZ], *p = buf, *q;\r
- strcpy(buf, appData.chatBoxes);\r
+ safeStrCpy(buf, appData.chatBoxes, sizeof(buf)/sizeof(buf[0]) );\r
do {\r
q = strchr(p, ';');\r
if(q) *q++ = 0;\r
lf->lfClipPrecision = CLIP_DEFAULT_PRECIS;\r
lf->lfQuality = DEFAULT_QUALITY;\r
lf->lfPitchAndFamily = DEFAULT_PITCH|FF_DONTCARE;\r
- strcpy(lf->lfFaceName, mfp->faceName);\r
+ safeStrCpy(lf->lfFaceName, mfp->faceName, sizeof(lf->lfFaceName)/sizeof(lf->lfFaceName[0]) );\r
}\r
\r
void\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);\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);\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);\r
mfp->pointSize = (float) atof(p);\r
mfp->bold = (strchr(p, 'b') != NULL);\r
mfp->italic = (strchr(p, 'i') != NULL);\r
&red, &green, &blue);\r
}\r
if (count != 3) {\r
- sprintf(buf, "Can't parse color name %s", name);\r
+ snprintf(buf, MSG_SIZ, _("Can't parse color name %s"), name);\r
DisplayError(buf, 0);\r
return RGB(0, 0, 0);\r
}\r
}\r
bs++;\r
}\r
- ExitArgError("Unrecognized board size value", name);\r
+ ExitArgError(_("Unrecognized board size value"), name);\r
}\r
\r
void\r
int\r
MySearchPath(char *installDir, char *name, char *fullname)\r
{\r
- char *dummy, buf[MSG_SIZ];\r
- if(name[0] == '%' && strchr(name+1, '%')) { // [HGM] recognize %*% as environment variable\r
- strcpy(buf, name+1);\r
- *strchr(buf, '%') = 0;\r
- installDir = getenv(buf);\r
- sprintf(fullname, "%s\\%s", installDir, strchr(name+1, '%')+1);\r
- return strlen(fullname);\r
+ char *dummy, buf[MSG_SIZ], *p = name, *q;\r
+ if(name[0]== '%') {\r
+ fullname[0] = 0; // [HGM] first expand any environment variables in the given name\r
+ while(*p == '%' && (q = strchr(p+1, '%'))) { // [HGM] recognize %*% as environment variable\r
+ safeStrCpy(buf, p+1, sizeof(buf)/sizeof(buf[0]) );\r
+ *strchr(buf, '%') = 0;\r
+ strcat(fullname, getenv(buf));\r
+ p = q+1; while(*p == '\\') { strcat(fullname, "\\"); p++; }\r
+ }\r
+ strcat(fullname, p); // after environment variables (if any), take the remainder of the given name\r
+ if(appData.debugMode) fprintf(debugFP, "name = '%s', expanded name = '%s'\n", name, fullname);\r
+ return (int) strlen(fullname);\r
}\r
return (int) SearchPath(installDir, name, NULL, MSG_SIZ, fullname, &dummy);\r
}\r
{\r
FARPROC lpProc;\r
\r
+ LoadLanguageFile(appData.language);\r
lpProc = MakeProcInstance((FARPROC)StartupDialog, hInst);\r
DialogBox(hInst, MAKEINTRESOURCE(DLG_Startup), NULL, (DLGPROC)lpProc);\r
FreeProcInstance(lpProc);\r
{\r
char name[128];\r
\r
- sprintf(name, "%s%d%s", piece, squareSize, suffix);\r
+ snprintf(name, sizeof(name)/sizeof(name[0]), "%s%d%s", piece, squareSize, suffix);\r
if (gameInfo.event &&\r
strcmp(gameInfo.event, "Easter Egg Hunt") == 0 &&\r
strcmp(name, "k80s") == 0) {\r
- strcpy(name, "tim");\r
+ safeStrCpy(name, "tim", sizeof(name)/sizeof(name[0]) );\r
}\r
return LoadBitmap(hinst, name);\r
}\r
LPPALETTEENTRY pe = &(pLogPal->palPalEntry[pLogPal->palNumEntries]);\r
\r
if (pLogPal->palNumEntries++ >= PALETTESIZE) {\r
- DisplayFatalError("Too many colors", 0, 1);\r
+ DisplayFatalError(_("Too many colors"), 0, 1);\r
pLogPal->palNumEntries--;\r
return;\r
}\r
\r
for (i=0; menuBarText[tinyLayout][i]; i++) {\r
ModifyMenu(hmenu, i, MF_STRING|MF_BYPOSITION|MF_POPUP, \r
- (UINT)GetSubMenu(hmenu, i), menuBarText[tinyLayout][i]);\r
+ (UINT)GetSubMenu(hmenu, i), T_(menuBarText[tinyLayout][i]));\r
}\r
DrawMenuBar(hwndMain);\r
}\r
/* Get text area sizes */\r
hdc = GetDC(hwndMain);\r
if (appData.clockMode) {\r
- sprintf(buf, "White: %s", TimeString(23*60*60*1000L));\r
+ snprintf(buf, MSG_SIZ, _("White: %s"), TimeString(23*60*60*1000L));\r
} else {\r
- sprintf(buf, "White");\r
+ snprintf(buf, MSG_SIZ, _("White"));\r
}\r
oldFont = SelectObject(hdc, font[boardSize][CLOCK_FONT]->hf);\r
GetTextExtentPoint(hdc, buf, strlen(buf), &clockSize);\r
SelectObject(hdc, font[boardSize][MESSAGE_FONT]->hf);\r
- str = "We only care about the height here";\r
+ str = _("We only care about the height here");\r
GetTextExtentPoint(hdc, str, strlen(str), &messageSize);\r
SelectObject(hdc, oldFont);\r
ReleaseDC(hwndMain, hdc);\r
pieceBitmap[2][WhiteBishop] = DoLoadBitmap(hInst, "b", squareSize, "w");\r
pieceBitmap[2][WhiteRook] = DoLoadBitmap(hInst, "r", squareSize, "w");\r
pieceBitmap[2][WhiteKing] = DoLoadBitmap(hInst, "k", squareSize, "w");\r
- if( !strcmp(appData.variant, "shogi") && (squareSize==72 || squareSize==49)) {\r
+ if( gameInfo.variant == VariantShogi && squareSize <= 72 && squareSize >= 33) {\r
// in Shogi, Hijack the unused Queen for Lance\r
pieceBitmap[0][WhiteQueen] = DoLoadBitmap(hInst, "l", squareSize, "s");\r
pieceBitmap[1][WhiteQueen] = DoLoadBitmap(hInst, "l", squareSize, "o");\r
pieceBitmap[1][WhiteLance] = DoLoadBitmap(hInst, "l", squareSize, "o");\r
pieceBitmap[2][WhiteLance] = DoLoadBitmap(hInst, "l", squareSize, "w");\r
} else { // Smirf-like\r
- pieceBitmap[0][WhiteAngel] = DoLoadBitmap(hInst, "aa", squareSize, "s");\r
- pieceBitmap[1][WhiteAngel] = DoLoadBitmap(hInst, "aa", squareSize, "o");\r
- pieceBitmap[2][WhiteAngel] = DoLoadBitmap(hInst, "aa", squareSize, "w");\r
+ if(gameInfo.variant == VariantSChess) {\r
+ pieceBitmap[0][WhiteAngel] = DoLoadBitmap(hInst, "v", squareSize, "s");\r
+ pieceBitmap[1][WhiteAngel] = DoLoadBitmap(hInst, "v", squareSize, "o");\r
+ pieceBitmap[2][WhiteAngel] = DoLoadBitmap(hInst, "v", squareSize, "w");\r
+ } else {\r
+ pieceBitmap[0][WhiteAngel] = DoLoadBitmap(hInst, "aa", squareSize, "s");\r
+ pieceBitmap[1][WhiteAngel] = DoLoadBitmap(hInst, "aa", squareSize, "o");\r
+ pieceBitmap[2][WhiteAngel] = DoLoadBitmap(hInst, "aa", squareSize, "w");\r
+ }\r
}\r
if(gameInfo.variant == VariantGothic) { // Vortex-like\r
pieceBitmap[0][WhiteMarshall] = DoLoadBitmap(hInst, "cv", squareSize, "s");\r
pieceBitmap[1][WhiteMarshall] = DoLoadBitmap(hInst, "cv", squareSize, "o");\r
pieceBitmap[2][WhiteMarshall] = DoLoadBitmap(hInst, "cv", squareSize, "w");\r
+ } else if(gameInfo.variant == VariantSChess && (squareSize == 49 || squareSize == 72)) {\r
+ pieceBitmap[0][WhiteMarshall] = DoLoadBitmap(hInst, "e", squareSize, "s");\r
+ pieceBitmap[1][WhiteMarshall] = DoLoadBitmap(hInst, "e", squareSize, "o");\r
+ pieceBitmap[2][WhiteMarshall] = DoLoadBitmap(hInst, "e", squareSize, "w");\r
} else { // WinBoard standard\r
pieceBitmap[0][WhiteMarshall] = DoLoadBitmap(hInst, "c", squareSize, "s");\r
pieceBitmap[1][WhiteMarshall] = DoLoadBitmap(hInst, "c", squareSize, "o");\r
\r
/* [AS] Arrow highlighting support */\r
\r
-static int A_WIDTH = 5; /* Width of arrow body */\r
+static double A_WIDTH = 5; /* Width of arrow body */\r
\r
#define A_HEIGHT_FACTOR 6 /* Length of arrow "point", relative to body width */\r
#define A_WIDTH_FACTOR 3 /* Width of arrow "point", relative to body width */\r
if( d_x == s_x ) {\r
int h = (d_y > s_y) ? +A_WIDTH*A_HEIGHT_FACTOR : -A_WIDTH*A_HEIGHT_FACTOR;\r
\r
- arrow[0].x = s_x + A_WIDTH;\r
+ arrow[0].x = s_x + A_WIDTH + 0.5;\r
arrow[0].y = s_y;\r
\r
- arrow[1].x = s_x + A_WIDTH;\r
+ arrow[1].x = s_x + A_WIDTH + 0.5;\r
arrow[1].y = d_y - h;\r
\r
- arrow[2].x = s_x + A_WIDTH*A_WIDTH_FACTOR;\r
+ arrow[2].x = arrow[1].x + A_WIDTH*(A_WIDTH_FACTOR-1) + 0.5;\r
arrow[2].y = d_y - h;\r
\r
arrow[3].x = d_x;\r
arrow[3].y = d_y;\r
\r
- arrow[4].x = s_x - A_WIDTH*A_WIDTH_FACTOR;\r
- arrow[4].y = d_y - h;\r
-\r
- arrow[5].x = s_x - A_WIDTH;\r
+ arrow[5].x = arrow[1].x - 2*A_WIDTH + 0.5;\r
arrow[5].y = d_y - h;\r
\r
- arrow[6].x = s_x - A_WIDTH;\r
+ arrow[4].x = arrow[5].x - A_WIDTH*(A_WIDTH_FACTOR-1) + 0.5;\r
+ arrow[4].y = d_y - h;\r
+\r
+ arrow[6].x = arrow[1].x - 2*A_WIDTH + 0.5;\r
arrow[6].y = s_y;\r
}\r
else if( d_y == s_y ) {\r
int w = (d_x > s_x) ? +A_WIDTH*A_HEIGHT_FACTOR : -A_WIDTH*A_HEIGHT_FACTOR;\r
\r
arrow[0].x = s_x;\r
- arrow[0].y = s_y + A_WIDTH;\r
+ arrow[0].y = s_y + A_WIDTH + 0.5;\r
\r
arrow[1].x = d_x - w;\r
- arrow[1].y = s_y + A_WIDTH;\r
+ arrow[1].y = s_y + A_WIDTH + 0.5;\r
\r
arrow[2].x = d_x - w;\r
- arrow[2].y = s_y + A_WIDTH*A_WIDTH_FACTOR;\r
+ arrow[2].y = arrow[1].y + A_WIDTH*(A_WIDTH_FACTOR-1) + 0.5;\r
\r
arrow[3].x = d_x;\r
arrow[3].y = d_y;\r
\r
- arrow[4].x = d_x - w;\r
- arrow[4].y = s_y - A_WIDTH*A_WIDTH_FACTOR;\r
-\r
arrow[5].x = d_x - w;\r
- arrow[5].y = s_y - A_WIDTH;\r
+ arrow[5].y = arrow[1].y - 2*A_WIDTH + 0.5;\r
+\r
+ arrow[4].x = d_x - w;\r
+ arrow[4].y = arrow[5].y - A_WIDTH*(A_WIDTH_FACTOR-1) + 0.5;\r
\r
arrow[6].x = s_x;\r
- arrow[6].y = s_y - A_WIDTH;\r
+ arrow[6].y = arrow[1].y - 2*A_WIDTH + 0.5;\r
}\r
else {\r
/* [AS] Needed a lot of paper for this! :-) */\r
arrow[0].x = Round(x - j);\r
arrow[0].y = Round(y + j*dx);\r
\r
- arrow[1].x = Round(x + j);\r
- arrow[1].y = Round(y - j*dx);\r
+ arrow[1].x = Round(arrow[0].x + 2*j); // [HGM] prevent width to be affected by rounding twice\r
+ arrow[1].y = Round(arrow[0].y - 2*j*dx);\r
\r
if( d_x > s_x ) {\r
x = (double) d_x - k;\r
y = (double) d_y + k*dy;\r
}\r
\r
- arrow[2].x = Round(x + j);\r
- arrow[2].y = Round(y - j*dx);\r
+ x = Round(x); y = Round(y); // [HGM] make sure width of shaft is rounded the same way on both ends\r
+\r
+ arrow[6].x = Round(x - j);\r
+ arrow[6].y = Round(y + j*dx);\r
+\r
+ arrow[2].x = Round(arrow[6].x + 2*j);\r
+ arrow[2].y = Round(arrow[6].y - 2*j*dx);\r
\r
- arrow[3].x = Round(x + j*A_WIDTH_FACTOR);\r
- arrow[3].y = Round(y - j*A_WIDTH_FACTOR*dx);\r
+ arrow[3].x = Round(arrow[2].x + j*(A_WIDTH_FACTOR-1));\r
+ arrow[3].y = Round(arrow[2].y - j*(A_WIDTH_FACTOR-1)*dx);\r
\r
arrow[4].x = d_x;\r
arrow[4].y = d_y;\r
\r
- arrow[5].x = Round(x - j*A_WIDTH_FACTOR);\r
- arrow[5].y = Round(y + j*A_WIDTH_FACTOR*dx);\r
-\r
- arrow[6].x = Round(x - j);\r
- arrow[6].y = Round(y + j*dx);\r
+ arrow[5].x = Round(arrow[6].x - j*(A_WIDTH_FACTOR-1));\r
+ arrow[5].y = Round(arrow[6].y + j*(A_WIDTH_FACTOR-1)*dx);\r
}\r
\r
Polygon( hdc, arrow, 7 );\r
SquareToPos( d_row, d_col, &d_x, &d_y);\r
\r
if( d_y > s_y ) {\r
- d_y += squareSize / 4;\r
+ d_y += squareSize / 2 - squareSize / 4; // [HGM] round towards same centers on all sides!\r
}\r
else if( d_y < s_y ) {\r
- d_y += 3 * squareSize / 4;\r
+ d_y += squareSize / 2 + squareSize / 4;\r
}\r
else {\r
d_y += squareSize / 2;\r
}\r
\r
if( d_x > s_x ) {\r
- d_x += squareSize / 4;\r
+ d_x += squareSize / 2 - squareSize / 4;\r
}\r
else if( d_x < s_x ) {\r
- d_x += 3 * squareSize / 4;\r
+ d_x += squareSize / 2 + squareSize / 4;\r
}\r
else {\r
d_x += squareSize / 2;\r
s_y += squareSize / 2;\r
\r
/* Adjust width */\r
- A_WIDTH = squareSize / 14;\r
+ A_WIDTH = squareSize / 14.; //[HGM] make float\r
\r
/* Draw */\r
stLB.lbStyle = BS_SOLID;\r
DeleteDC(tmphdc);\r
}\r
\r
+VOID\r
+DisplayLogos()\r
+{\r
+ if(logoHeight) {\r
+ HDC hdc = GetDC(hwndMain);\r
+ HBITMAP whiteLogo = (HBITMAP) first.programLogo, blackLogo = (HBITMAP) second.programLogo;\r
+ if(appData.autoLogo) {\r
+ \r
+ switch(gameMode) { // pick logos based on game mode\r
+ case IcsObserving:\r
+ whiteLogo = second.programLogo; // ICS logo\r
+ blackLogo = second.programLogo;\r
+ default:\r
+ break;\r
+ case IcsPlayingWhite:\r
+ if(!appData.zippyPlay) whiteLogo = userLogo;\r
+ blackLogo = second.programLogo; // ICS logo\r
+ break;\r
+ case IcsPlayingBlack:\r
+ whiteLogo = second.programLogo; // ICS logo\r
+ blackLogo = appData.zippyPlay ? first.programLogo : userLogo;\r
+ break;\r
+ case TwoMachinesPlay:\r
+ if(first.twoMachinesColor[0] == 'b') {\r
+ whiteLogo = second.programLogo;\r
+ blackLogo = first.programLogo;\r
+ }\r
+ break;\r
+ case MachinePlaysWhite:\r
+ blackLogo = userLogo;\r
+ break;\r
+ case MachinePlaysBlack:\r
+ whiteLogo = userLogo;\r
+ blackLogo = first.programLogo;\r
+ }\r
+ }\r
+ DrawLogoOnDC(hdc, leftLogoRect, flipClock ? blackLogo : whiteLogo);\r
+ DrawLogoOnDC(hdc, rightLogoRect, flipClock ? whiteLogo : blackLogo);\r
+ ReleaseDC(hwndMain, hdc);\r
+ }\r
+}\r
+\r
static HDC hdcSeek;\r
\r
// [HGM] seekgraph\r
void DrawSeekDot(int x, int y, int color)\r
{\r
int square = color & 0x80;\r
- color &= 0x7F;\r
- HBRUSH oldBrush = SelectObject(hdcSeek, \r
+ HBRUSH oldBrush = SelectObject(hdcSeek, \r
color == 0 ? markerBrush : color == 1 ? darkSquareBrush : explodeBrush);\r
+ color &= 0x7F;\r
if(square)\r
Rectangle(hdcSeek, boardRect.left+x - squareSize/9, boardRect.top+y - squareSize/9,\r
boardRect.left+x + squareSize/9, boardRect.top+y + squareSize/9);\r
if(--board[dragInfo.from.y][dragInfo.from.x-1] == 0 )\r
board[dragInfo.from.y][dragInfo.from.x] = EmptySquare;\r
} else \r
- board[dragInfo.from.y][dragInfo.from.x] = EmptySquare;\r
+ board[dragInfo.from.y][dragInfo.from.x] = gatingPiece;\r
}\r
\r
/* Figure out which squares need updating by comparing the \r
if(explodeInfo.radius) { // [HGM] atomic\r
HBRUSH oldBrush;\r
int x, y, r=(explodeInfo.radius * squareSize)/100;\r
+ ChessSquare piece = board[explodeInfo.fromY][explodeInfo.fromX];\r
board[explodeInfo.fromY][explodeInfo.fromX] = EmptySquare; // suppress display of capturer\r
SquareToPos(explodeInfo.toY, explodeInfo.toX, &x, &y);\r
x += squareSize/2;\r
DrawHighlightsOnDC(hdcmem, &highlightInfo, HIGHLIGHT_PEN);\r
DrawHighlightsOnDC(hdcmem, &premoveHighlightInfo, PREMOVE_PEN);\r
DrawBoardOnDC(hdcmem, board, tmphdc);\r
+ board[explodeInfo.fromY][explodeInfo.fromX] = piece;\r
oldBrush = SelectObject(hdcmem, explodeBrush);\r
Ellipse(hdcmem, x-r, y-r, x+r, y+r);\r
SelectObject(hdcmem, oldBrush);\r
}\r
}\r
}\r
- if(logoHeight) {\r
- HBITMAP whiteLogo = (HBITMAP) first.programLogo, blackLogo = (HBITMAP) second.programLogo;\r
- if(appData.autoLogo) {\r
- \r
- switch(gameMode) { // pick logos based on game mode\r
- case IcsObserving:\r
- whiteLogo = second.programLogo; // ICS logo\r
- blackLogo = second.programLogo;\r
- default:\r
- break;\r
- case IcsPlayingWhite:\r
- if(!appData.zippyPlay) whiteLogo = userLogo;\r
- blackLogo = second.programLogo; // ICS logo\r
- break;\r
- case IcsPlayingBlack:\r
- whiteLogo = second.programLogo; // ICS logo\r
- blackLogo = appData.zippyPlay ? first.programLogo : userLogo;\r
- break;\r
- case TwoMachinesPlay:\r
- if(first.twoMachinesColor[0] == 'b') {\r
- whiteLogo = second.programLogo;\r
- blackLogo = first.programLogo;\r
- }\r
- break;\r
- case MachinePlaysWhite:\r
- blackLogo = userLogo;\r
- break;\r
- case MachinePlaysBlack:\r
- whiteLogo = userLogo;\r
- blackLogo = first.programLogo;\r
- }\r
- }\r
- DrawLogoOnDC(hdc, leftLogoRect, flipClock ? blackLogo : whiteLogo);\r
- DrawLogoOnDC(hdc, rightLogoRect, flipClock ? whiteLogo : blackLogo);\r
- }\r
\r
if( appData.highlightMoveWithArrow ) {\r
DrawArrowHighlight(hdcmem);\r
&messageRect, messageText, strlen(messageText), NULL);\r
SelectObject(hdc, oldFont);\r
DisplayBothClocks();\r
+ DisplayLogos();\r
}\r
EndPaint(hwnd,&ps);\r
}\r
} DropEnable;\r
\r
DropEnable dropEnables[] = {\r
- { 'P', DP_Pawn, "Pawn" },\r
- { 'N', DP_Knight, "Knight" },\r
- { 'B', DP_Bishop, "Bishop" },\r
- { 'R', DP_Rook, "Rook" },\r
- { 'Q', DP_Queen, "Queen" },\r
+ { 'P', DP_Pawn, N_("Pawn") },\r
+ { 'N', DP_Knight, N_("Knight") },\r
+ { 'B', DP_Bishop, N_("Bishop") },\r
+ { 'R', DP_Rook, N_("Rook") },\r
+ { 'Q', DP_Queen, N_("Queen") },\r
};\r
\r
VOID\r
dropEnables[i].piece);\r
count = 0;\r
while (p && *p++ == dropEnables[i].piece) count++;\r
- sprintf(item, "%s %d", dropEnables[i].name, count);\r
+ snprintf(item, MSG_SIZ, "%s %d", T_(dropEnables[i].name), count);\r
enable = count > 0 || !appData.testLegality\r
/*!!temp:*/ || (gameInfo.variant == VariantCrazyhouse\r
&& !appData.icsActive);\r
x = BOARD_WIDTH - 1 - x;\r
}\r
\r
+ shiftKey = GetKeyState(VK_SHIFT) < 0; // [HGM] remember last shift status\r
+\r
switch (message) {\r
case WM_LBUTTONDOWN:\r
if (PtInRect((LPRECT) &whiteRect, pt)) {\r
- if (gameMode == EditPosition) {\r
- SetWhiteToPlayEvent();\r
- } else if (gameMode == EditGame || GetKeyState(VK_SHIFT) < 0) {\r
- AdjustClock(flipClock, -1);\r
- } else if (gameMode == IcsPlayingBlack ||\r
- gameMode == MachinePlaysWhite) {\r
- CallFlagEvent();\r
- }\r
+ ClockClick(flipClock);\r
} else if (PtInRect((LPRECT) &blackRect, pt)) {\r
- if (gameMode == EditPosition) {\r
- SetBlackToPlayEvent();\r
- } else if (gameMode == EditGame || GetKeyState(VK_SHIFT) < 0) {\r
- AdjustClock(!flipClock, -1);\r
- } else if (gameMode == IcsPlayingWhite ||\r
- gameMode == MachinePlaysBlack) {\r
- CallFlagEvent();\r
- }\r
+ ClockClick(!flipClock);\r
}\r
dragInfo.start.x = dragInfo.start.y = -1;\r
dragInfo.from = dragInfo.start;\r
case WM_INITDIALOG: /* message: initialize dialog box */\r
/* Center the dialog over the application window */\r
CenterWindow(hDlg, GetWindow(hDlg, GW_OWNER));\r
+ Translate(hDlg, DLG_PromotionKing);\r
ShowWindow(GetDlgItem(hDlg, PB_King), \r
(!appData.testLegality || gameInfo.variant == VariantSuicide ||\r
+ gameInfo.variant == VariantSpartan && !WhiteOnMove(currentMove) ||\r
gameInfo.variant == VariantGiveaway || gameInfo.variant == VariantSuper ) ?\r
SW_SHOW : SW_HIDE);\r
/* [HGM] Only allow C & A promotions if these pieces are defined */\r
ShowWindow(GetDlgItem(hDlg, PB_Archbishop),\r
- ((PieceToChar(WhiteAngel) >= 'A' &&\r
+ ((PieceToChar(WhiteAngel) >= 'A' && WhiteOnMove(currentMove) &&\r
PieceToChar(WhiteAngel) != '~') ||\r
- (PieceToChar(BlackAngel) >= 'A' &&\r
+ (PieceToChar(BlackAngel) >= 'A' && !WhiteOnMove(currentMove) &&\r
PieceToChar(BlackAngel) != '~') ) ?\r
SW_SHOW : SW_HIDE);\r
ShowWindow(GetDlgItem(hDlg, PB_Chancellor), \r
- ((PieceToChar(WhiteMarshall) >= 'A' &&\r
+ ((PieceToChar(WhiteMarshall) >= 'A' && WhiteOnMove(currentMove) &&\r
PieceToChar(WhiteMarshall) != '~') ||\r
- (PieceToChar(BlackMarshall) >= 'A' &&\r
+ (PieceToChar(BlackMarshall) >= 'A' && !WhiteOnMove(currentMove) &&\r
PieceToChar(BlackMarshall) != '~') ) ?\r
SW_SHOW : SW_HIDE);\r
/* [HGM] Hide B & R button in Shogi, use Q as promote, N as defer */\r
ShowWindow(GetDlgItem(hDlg, PB_Bishop), \r
gameInfo.variant != VariantShogi ?\r
SW_SHOW : SW_HIDE);\r
- ShowWindow(GetDlgItem(hDlg, IDC_Yes), \r
- gameInfo.variant == VariantShogi ?\r
- SW_SHOW : SW_HIDE);\r
- ShowWindow(GetDlgItem(hDlg, IDC_No), \r
- gameInfo.variant == VariantShogi ?\r
- SW_SHOW : SW_HIDE);\r
+ if(gameInfo.variant == VariantShogi) {\r
+ SetDlgItemText(hDlg, PB_Queen, "YES");\r
+ SetDlgItemText(hDlg, PB_Knight, "NO");\r
+ SetWindowText(hDlg, "Promote?");\r
+ }\r
ShowWindow(GetDlgItem(hDlg, IDC_Centaur), \r
gameInfo.variant == VariantSuper ?\r
SW_SHOW : SW_HIDE);\r
promoChar = gameInfo.variant == VariantSuper ? PieceToChar(BlackSilver) : PieceToChar(BlackKing);\r
break;\r
case PB_Queen:\r
- promoChar = gameInfo.variant == VariantShogi ? '+' : PieceToChar(BlackQueen);\r
+ promoChar = gameInfo.variant == VariantShogi ? '+' : ToLower(PieceToChar(WhiteOnMove(currentMove) ? WhiteQueen : BlackQueen));\r
break;\r
case PB_Rook:\r
- promoChar = PieceToChar(BlackRook);\r
+ promoChar = ToLower(PieceToChar(WhiteOnMove(currentMove) ? WhiteRook : BlackRook));\r
+ if(gameInfo.variant == VariantSpartan && !WhiteOnMove(currentMove)) promoChar = PieceToChar(BlackDragon);\r
break;\r
case PB_Bishop:\r
- promoChar = PieceToChar(BlackBishop);\r
+ promoChar = ToLower(PieceToChar(WhiteOnMove(currentMove) ? WhiteBishop : BlackBishop));\r
+ if(gameInfo.variant == VariantSpartan && !WhiteOnMove(currentMove)) promoChar = PieceToChar(BlackAlfil);\r
break;\r
case PB_Chancellor:\r
- promoChar = PieceToChar(BlackMarshall);\r
+ promoChar = ToLower(PieceToChar(WhiteOnMove(currentMove) ? WhiteMarshall : BlackMarshall));\r
break;\r
case PB_Archbishop:\r
- promoChar = PieceToChar(BlackAngel);\r
+ promoChar = ToLower(PieceToChar(WhiteOnMove(currentMove) ? WhiteAngel : BlackAngel));\r
break;\r
case PB_Knight:\r
- promoChar = gameInfo.variant == VariantShogi ? '=' : PieceToChar(BlackKnight);\r
+ promoChar = gameInfo.variant == VariantShogi ? '=' : PieceToChar(WhiteOnMove(currentMove) ? WhiteKnight : BlackKnight);\r
break;\r
default:\r
return FALSE;\r
}\r
+ if(promoChar == '.') return FALSE; // invalid piece chosen \r
EndDialog(hDlg, TRUE); /* Exit the dialog */\r
- /* [HGM] <popupFix> Call FinishMove rather than UserMoveEvent, as we\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
UserMoveEvent(fromX, fromY, toX, toY, promoChar);\r
fromX = fromY = -1;\r
if (!appData.highlightLastMove) {\r
if (number == 0) {\r
int error = GameListBuild(f);\r
if (error) {\r
- DisplayError("Cannot build game list", error);\r
+ DisplayError(_("Cannot build game list"), error);\r
} else if (!ListEmpty(&gameList) &&\r
((ListGame *) gameList.tailPred)->number > 1) {\r
GameListPopUp(f, fileTitle);\r
\r
cfmt.cbSize = sizeof(CHARFORMAT);\r
cfmt.dwMask = CFM_FACE|CFM_SIZE|CFM_CHARSET;\r
- strcpy(cfmt.szFaceName, font[boardSize][CONSOLE_FONT]->mfp.faceName);\r
+ safeStrCpy(cfmt.szFaceName, font[boardSize][CONSOLE_FONT]->mfp.faceName,\r
+ sizeof(cfmt.szFaceName)/sizeof(cfmt.szFaceName[0]) );\r
/* yHeight is expressed in twips. A twip is 1/20 of a font's point\r
* size. This was undocumented in the version of MSVC++ that I had\r
* when I wrote the code, but is apparently documented now.\r
break;\r
\r
case IDM_LoadGame:\r
- LoadGameDialog(hwnd, "Load Game from File");\r
+ LoadGameDialog(hwnd, _("Load Game from File"));\r
break;\r
\r
case IDM_LoadNextGame:\r
f = OpenFileDialog(hwnd, "rb", "",\r
appData.oldSaveStyle ? "pos" : "fen",\r
POSITION_FILT,\r
- "Load Position from File", &number, fileTitle, NULL);\r
+ _("Load Position from File"), &number, fileTitle, NULL);\r
if (f != NULL) {\r
LoadPosition(f, number, fileTitle);\r
}\r
f = OpenFileDialog(hwnd, "a", defName,\r
appData.oldSaveStyle ? "gam" : "pgn",\r
GAME_FILT,\r
- "Save Game to File", NULL, fileTitle, NULL);\r
+ _("Save Game to File"), NULL, fileTitle, NULL);\r
if (f != NULL) {\r
SaveGame(f, 0, "");\r
}\r
f = OpenFileDialog(hwnd, "a", defName,\r
appData.oldSaveStyle ? "pos" : "fen",\r
POSITION_FILT,\r
- "Save Position to File", NULL, fileTitle, NULL);\r
+ _("Save Position to File"), NULL, fileTitle, NULL);\r
if (f != NULL) {\r
SavePosition(f, 0, "");\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) break; // allow menu item to remain enabled for better mode highligting\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
\r
case IDM_TwoMachines:\r
TwoMachinesEvent();\r
\r
case IDM_AnalysisMode:\r
if (!first.analysisSupport) {\r
- sprintf(buf, "%s does not support analysis", first.tidy);\r
+ snprintf(buf, MSG_SIZ, _("%s does not support analysis"), first.tidy);\r
DisplayError(buf, 0);\r
} else {\r
SAY("analyzing current position");\r
/* [DM] icsEngineAnlyze [HGM] Why is this front-end??? */\r
if (appData.icsActive) {\r
if (gameMode != IcsObserving) {\r
- sprintf(buf, "You are not observing a game");\r
+ snprintf(buf, MSG_SIZ, "You are not observing a game");\r
DisplayError(buf, 0);\r
/* secure check */\r
if (appData.icsEngineAnalyze) {\r
case IDM_AnalyzeFile:\r
if (!first.analysisSupport) {\r
char buf[MSG_SIZ];\r
- sprintf(buf, "%s does not support analysis", first.tidy);\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
+ LoadGameDialog(hwnd, _("Analyze Game from File"));\r
AnalysisPeriodicEvent(1);\r
}\r
break;\r
break;\r
\r
case IDM_EditGame:\r
+ case IDM_EditGame2:\r
EditGameEvent();\r
SAY("edit game");\r
break;\r
\r
case IDM_EditPosition:\r
+ case IDM_EditPosition2:\r
EditPositionEvent();\r
SAY("enter a FEN string or setup a position on the board using the control R pop up menu");\r
break;\r
ShowGameListProc();\r
break;\r
\r
+ case IDM_EditProgs1:\r
+ EditTagsPopUp(firstChessProgramNames, &firstChessProgramNames);\r
+ break;\r
+\r
+ case IDM_EditProgs2:\r
+ EditTagsPopUp(secondChessProgramNames, &secondChessProgramNames);\r
+ break;\r
+\r
+ case IDM_EditServers:\r
+ EditTagsPopUp(icsNames, &icsNames);\r
+ break;\r
+\r
case IDM_EditTags:\r
+ case IDM_Tags:\r
EditTagsProc();\r
break;\r
\r
case IDM_EditComment:\r
+ case IDM_Comment:\r
if (commentUp && editComment) {\r
CommentPopDown();\r
} else {\r
case IDM_FlipClock:\r
flipClock = !flipClock;\r
DisplayBothClocks();\r
- DrawPosition(FALSE, NULL);\r
+ DisplayLogos();\r
break;\r
\r
case IDM_MuteSounds:\r
break;\r
\r
case IDM_Engine2Options:\r
+ savedHwnd = hwnd;\r
+ if(WaitForSecond(SettingsMenuIfReady)) break;\r
EngineOptionsPopup(hwnd, &second);\r
break;\r
\r
if (!MyHelp (hwnd, "winboard.hlp", HELP_KEY,(DWORD)(LPSTR)"CONTENTS") &&\r
!HtmlHelp(hwnd, "winboard.chm", 0, 0) ) {\r
MessageBox (GetFocus(),\r
- "Unable to activate help",\r
+ _("Unable to activate help"),\r
szAppName, MB_SYSTEMMODAL|MB_OK|MB_ICONHAND);\r
}\r
break;\r
if (!MyHelp (hwnd, "winboard.hlp", HELP_PARTIALKEY, (DWORD)(LPSTR)"") &&\r
!HtmlHelp(hwnd, "winboard.chm", 0, 0) ) {\r
MessageBox (GetFocus(),\r
- "Unable to activate help",\r
+ _("Unable to activate help"),\r
szAppName, MB_SYSTEMMODAL|MB_OK|MB_ICONHAND);\r
}\r
break;\r
case IDM_HELPHELP:\r
if(!WinHelp(hwnd, (LPSTR)NULL, HELP_HELPONHELP, 0)) {\r
MessageBox (GetFocus(),\r
- "Unable to activate help",\r
+ _("Unable to activate help"),\r
szAppName, MB_SYSTEMMODAL|MB_OK|MB_ICONHAND);\r
}\r
break;\r
break;\r
\r
case IDM_DirectCommand1:\r
- AskQuestionEvent("Direct Command",\r
- "Send to chess program:", "", "1");\r
+ AskQuestionEvent(_("Direct Command"),\r
+ _("Send to chess program:"), "", "1");\r
break;\r
case IDM_DirectCommand2:\r
- AskQuestionEvent("Direct Command",\r
- "Send to second chess program:", "", "2");\r
+ AskQuestionEvent(_("Direct Command"),\r
+ _("Send to second chess program:"), "", "2");\r
break;\r
\r
case EP_WhitePawn:\r
fromX = fromY = -1;\r
break;\r
\r
+ case IDM_English:\r
+ barbaric = 0;\r
+ TranslateMenus(0);\r
+ CheckMenuItem(GetMenu(hwndMain), lastChecked, MF_BYCOMMAND|MF_UNCHECKED);\r
+ CheckMenuItem(GetMenu(hwndMain), IDM_English, MF_BYCOMMAND|MF_CHECKED);\r
+ lastChecked = wmId;\r
+ break;\r
+\r
default:\r
+ if(wmId > IDM_English && wmId < IDM_English+5) {\r
+ LoadLanguageFile(languageFile[wmId - IDM_English - 1]);\r
+ TranslateMenus(0);\r
+ CheckMenuItem(GetMenu(hwndMain), lastChecked, MF_BYCOMMAND|MF_UNCHECKED);\r
+ CheckMenuItem(GetMenu(hwndMain), wmId, MF_BYCOMMAND|MF_CHECKED);\r
+ lastChecked = wmId;\r
+ break;\r
+ }\r
return (DefWindowProc(hwnd, message, wParam, lParam));\r
}\r
break;\r
}\r
if (!ok) {\r
char buf[MSG_SIZ];\r
- sprintf(buf, "Error loading sound %s", ms->name);\r
+ snprintf(buf, MSG_SIZ, _("Error loading sound %s"), ms->name);\r
DisplayError(buf, GetLastError());\r
}\r
return ok;\r
number = NULL;\r
}\r
CenterWindow (hDlg, GetWindow (hDlg, GW_OWNER));\r
+ Translate(hDlg, 1536);\r
return FALSE; /* Allow for further processing */\r
\r
case WM_COMMAND:\r
OFNOTIFY *ofnot;\r
switch (uiMsg) {\r
case WM_INITDIALOG:\r
+ Translate(hdlg, DLG_IndexNumber);\r
ofname = (OPENFILENAME *)lParam;\r
number = (UINT *)(ofname->lCustData);\r
break;\r
\r
if (fileName == NULL) fileName = buf1;\r
if (defName == NULL) {\r
- strcpy(fileName, "*.");\r
+ safeStrCpy(fileName, "*.", 3 );\r
strcat(fileName, defExt);\r
} else {\r
- strcpy(fileName, defName);\r
+ safeStrCpy(fileName, defName, MSG_SIZ );\r
}\r
- if (fileTitle) strcpy(fileTitle, "");\r
+ if (fileTitle) safeStrCpy(fileTitle, "", MSG_SIZ );\r
if (number) *number = 0;\r
\r
openFileName.lStructSize = sizeof(OPENFILENAME);\r
/* open the file */\r
f = fopen(openFileName.lpstrFile, write);\r
if (f == NULL) {\r
- MessageBox(hwnd, "File open failed", NULL,\r
+ MessageBox(hwnd, _("File open failed"), NULL,\r
MB_OK|MB_ICONEXCLAMATION);\r
return NULL;\r
}\r
} else {\r
int err = CommDlgExtendedError();\r
- if (err != 0) DisplayError("Internal error in file dialog box", err);\r
+ if (err != 0) DisplayError(_("Internal error in file dialog box"), err);\r
return FALSE;\r
}\r
return f;\r
* menu that TrackPopupMenu displays.\r
*/\r
hmenuTrackPopup = GetSubMenu(hmenu, 0);\r
+ TranslateOneMenu(10, hmenuTrackPopup);\r
\r
SetMenuDefaultItem(hmenuTrackPopup, def, FALSE);\r
\r
SendMessage(hwndCombo, CB_RESETCONTENT, 0, 0);\r
\r
while (*cd != NULL) {\r
- SendMessage(hwndCombo, CB_ADDSTRING, 0, (LPARAM) *cd);\r
+ SendMessage(hwndCombo, CB_ADDSTRING, 0, (LPARAM) T_(*cd));\r
cd++;\r
}\r
}\r
\r
InitComboStringsFromOption(hwndCombo, nthnames);\r
q = QuoteForFilename(nthcp);\r
- sprintf(buf, "%s%s%s", q, nthcp, q);\r
+ snprintf(buf, MSG_SIZ, "%s%s%s", q, nthcp, q);\r
if (*nthdir != NULLCHAR) {\r
q = QuoteForFilename(nthdir);\r
- sprintf(buf + strlen(buf), " /%s=%s%s%s", nthd, q, nthdir, q);\r
+ snprintf(buf + strlen(buf), MSG_SIZ, " /%s=%s%s%s", nthd, q, nthdir, q);\r
}\r
if (*nthcp == NULLCHAR) {\r
SendMessage(hwndCombo, CB_SETCURSEL, (WPARAM) 0, (LPARAM) 0);\r
case WM_INITDIALOG:\r
/* Center the dialog */\r
CenterWindow (hDlg, GetDesktopWindow());\r
+ Translate(hDlg, DLG_Startup);\r
/* Initialize the dialog items */\r
InitEngineBox(hDlg, GetDlgItem(hDlg, OPT_ChessEngineName),\r
appData.firstChessProgram, "fd", appData.firstDirectory,\r
secondChessProgramNames);\r
hwndCombo = GetDlgItem(hDlg, OPT_ChessServerName);\r
InitComboStringsFromOption(hwndCombo, icsNames); \r
- sprintf(buf, "%s /icsport=%s", appData.icsHost, appData.icsPort);\r
+ snprintf(buf, MSG_SIZ, "%s /icsport=%s", appData.icsHost, appData.icsPort);\r
if (*appData.icsHelper != NULLCHAR) {\r
char *q = QuoteForFilename(appData.icsHelper);\r
sprintf(buf + strlen(buf), " /icshelper=%s%s%s", q, appData.icsHelper, q);\r
switch (LOWORD(wParam)) {\r
case IDOK:\r
if (IsDlgButtonChecked(hDlg, OPT_ChessEngine)) {\r
- strcpy(buf, "/fcp=");\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
ParseArgs(StringGet, &p);\r
- strcpy(buf, "/scp=");\r
+ safeStrCpy(buf, "/scp=", sizeof(buf)/sizeof(buf[0]) );\r
GetDlgItemText(hDlg, OPT_SecondChessEngineName, buf + strlen(buf), sizeof(buf) - strlen(buf));\r
p = buf;\r
ParseArgs(StringGet, &p);\r
appData.noChessProgram = FALSE;\r
appData.icsActive = FALSE;\r
} else if (IsDlgButtonChecked(hDlg, OPT_ChessServer)) {\r
- strcpy(buf, "/ics /icshost=");\r
+ safeStrCpy(buf, "/ics /icshost=", sizeof(buf)/sizeof(buf[0]) );\r
GetDlgItemText(hDlg, OPT_ChessServerName, buf + strlen(buf), sizeof(buf) - strlen(buf));\r
p = buf;\r
ParseArgs(StringGet, &p);\r
if (appData.zippyPlay) {\r
- strcpy(buf, "/fcp=");\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
ParseArgs(StringGet, &p);\r
appData.noChessProgram = TRUE;\r
appData.icsActive = FALSE;\r
} else {\r
- MessageBox(hDlg, "Choose an option, or cancel to exit",\r
- "Option Error", MB_OK|MB_ICONEXCLAMATION);\r
+ MessageBox(hDlg, _("Choose an option, or cancel to exit"),\r
+ _("Option Error"), MB_OK|MB_ICONEXCLAMATION);\r
return TRUE;\r
}\r
if (IsDlgButtonChecked(hDlg, OPT_AnyAdditional)) {\r
case IDM_HELPCONTENTS:\r
if (!WinHelp (hDlg, "winboard.hlp", HELP_KEY,(DWORD)(LPSTR)"CONTENTS")) {\r
MessageBox (GetFocus(),\r
- "Unable to activate help",\r
+ _("Unable to activate help"),\r
szAppName, MB_SYSTEMMODAL|MB_OK|MB_ICONHAND);\r
}\r
break;\r
/* Center the dialog over the application window */\r
CenterWindow (hDlg, GetWindow (hDlg, GW_OWNER));\r
SetDlgItemText(hDlg, ABOUTBOX_Version, programVersion);\r
+ Translate(hDlg, ABOUTBOX);\r
JAWS_COPYRIGHT\r
return (TRUE);\r
\r
switch (message) {\r
case WM_INITDIALOG: /* message: initialize dialog box */\r
/* Initialize the dialog items */\r
+ Translate(hDlg, DLG_EditComment);\r
hwndText = GetDlgItem(hDlg, OPT_CommentText);\r
SetDlgItemText(hDlg, OPT_CommentText, commentText);\r
EnableWindow(GetDlgItem(hDlg, OPT_CancelComment), editComment);\r
sizeY = newSizeY;\r
}\r
}\r
- SendDlgItemMessage( hDlg, OPT_CommentText, EM_SETEVENTMASK, 0, ENM_MOUSEEVENTS );\r
+ SendDlgItemMessage( hDlg, OPT_CommentText, EM_SETEVENTMASK, 0, ENM_MOUSEEVENTS | ENM_KEYEVENTS );\r
return FALSE;\r
\r
case WM_COMMAND: /* message: received a command */\r
if( wParam == OPT_CommentText ) {\r
MSGFILTER * lpMF = (MSGFILTER *) lParam;\r
\r
- if( lpMF->msg == WM_RBUTTONDOWN && (lpMF->wParam & (MK_CONTROL | MK_SHIFT)) == 0 ) {\r
+ if( lpMF->msg == WM_RBUTTONDOWN && (lpMF->wParam & (MK_CONTROL | MK_SHIFT)) == 0 ||\r
+ lpMF->msg == WM_CHAR && lpMF->wParam == '\022' ) {\r
POINTL pt;\r
LRESULT index;\r
\r
pt.x = LOWORD( lpMF->lParam );\r
pt.y = HIWORD( lpMF->lParam );\r
\r
+ if(lpMF->msg == WM_CHAR) {\r
+ CHARRANGE sel;\r
+ SendDlgItemMessage( hDlg, OPT_CommentText, EM_EXGETSEL, 0, (LPARAM) &sel );\r
+ index = sel.cpMin;\r
+ } else\r
index = SendDlgItemMessage( hDlg, OPT_CommentText, EM_CHARFROMPOS, 0, (LPARAM) &pt );\r
\r
hwndText = GetDlgItem(hDlg, OPT_CommentText); // cloned from above\r
FARPROC lpProc;\r
char *p, *q;\r
\r
- CheckMenuItem(GetMenu(hwndMain), IDM_EditComment, edit ? MF_CHECKED : MF_UNCHECKED);\r
+ CheckMenuItem(GetMenu(hwndMain), IDM_Comment, edit ? MF_CHECKED : MF_UNCHECKED);\r
\r
if (str == NULL) str = "";\r
p = (char *) malloc(2 * strlen(str) + 2);\r
move[0] = (char) lParam;\r
move[1] = NULLCHAR;\r
CenterWindowEx(hDlg, GetWindow(hDlg, GW_OWNER), 1 );\r
+ Translate(hDlg, DLG_TypeInMove);\r
hInput = GetDlgItem(hDlg, OPT_Move);\r
SetWindowText(hInput, move);\r
SetFocus(hInput);\r
\r
case WM_COMMAND:\r
switch (LOWORD(wParam)) {\r
- case IDOK:\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
}\r
if (gameMode != EditGame && currentMove != forwardMostMove && \r
gameMode != Training) {\r
- DisplayMoveError("Displayed move is not current");\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
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
- if (gameMode != Training)\r
- forwardMostMove = currentMove;\r
UserMoveEvent(fromX, fromY, toX, toY, promoChar); \r
} else {\r
- DisplayMoveError("Could not parse move");\r
+ DisplayMoveError(_("Could not parse move"));\r
}\r
}\r
EndDialog(hDlg, TRUE);\r
move[0] = (char) lParam;\r
move[1] = NULLCHAR;\r
CenterWindowEx(hDlg, GetWindow(hDlg, GW_OWNER), 1 );\r
+ Translate(hDlg, DLG_TypeInName);\r
hInput = GetDlgItem(hDlg, OPT_Name);\r
SetWindowText(hInput, move);\r
SetFocus(hInput);\r
SetUserLogo();\r
SetGameInfo();\r
if(gameMode == MachinePlaysWhite || gameMode == MachinePlaysBlack) {\r
- sprintf(move, "%s vs. %s", gameInfo.white, gameInfo.black);\r
+ snprintf(move, MSG_SIZ, "%s vs. %s", gameInfo.white, gameInfo.black);\r
DisplayTitle(move);\r
}\r
\r
For now, just give it a default position.\r
*/\r
SetWindowPos(hDlg, NULL, boardRect.left+8, boardRect.top+8, 0, 0, SWP_NOZORDER|SWP_NOSIZE);\r
+ Translate(hDlg, DLG_Error);\r
\r
errorDialog = hDlg;\r
SetWindowText(hDlg, errorTitle);\r
SendMessage(hwnd, EM_GETSELTEXT, 0, (LPARAM) name);\r
}\r
if (immediate) {\r
- sprintf(buf, "%s %s", command, name);\r
+ if(strstr(command, "%s")) snprintf(buf, MSG_SIZ, command, name); else\r
+ snprintf(buf, MSG_SIZ, "%s %s", command, name);\r
SetWindowText(hInput, buf);\r
SendMessage(hInput, WM_CHAR, '\r', 0);\r
} else {\r
if(!strcmp(command, "chat")) { ChatPopUp(name); return; }\r
- sprintf(buf, "%s %s ", command, name); /* trailing space */\r
+ snprintf(buf, MSG_SIZ, "%s %s ", command, name); /* trailing space */\r
SetWindowText(hInput, buf);\r
sel.cpMin = 999999;\r
sel.cpMax = 999999;\r
switch (message) {\r
case WM_KEYDOWN:\r
if (!(GetKeyState(VK_CONTROL) & ~1)) break;\r
+ if(wParam=='R') return 0;\r
switch (wParam) {\r
case VK_PRIOR:\r
SendMessage(hwnd, EM_LINESCROLL, 0, -999999);\r
SendMessage(hInput, message, wParam, lParam);\r
}\r
return 0;\r
- } // [HGM] navigate: for Ctrl+R, flow into nex case (moved up here) to summon up menu\r
+ } // [HGM] navigate: for Ctrl+R, flow into next case (moved up here) to summon up menu\r
+ lParam = -1;\r
case WM_RBUTTONDOWN:\r
if (!(GetKeyState(VK_SHIFT) & ~1)) {\r
/* Move selection here if it was empty */\r
pt.y = HIWORD(lParam);\r
SendMessage(hwnd, EM_EXGETSEL, 0, (LPARAM)&sel);\r
if (sel.cpMin == sel.cpMax) {\r
- sel.cpMin = SendMessage(hwnd, EM_CHARFROMPOS, 0, (LPARAM)&pt); /*doc is wrong*/\r
+ if(lParam != -1) sel.cpMin = SendMessage(hwnd, EM_CHARFROMPOS, 0, (LPARAM)&pt); /*doc is wrong*/\r
sel.cpMax = sel.cpMin;\r
SendMessage(hwnd, EM_EXSETSEL, 0, (LPARAM)&sel);\r
}\r
HFONT oldFont;\r
RECT rect;\r
\r
- if(copyNumber > 1) sprintf(buf, "%d", copyNumber); else buf[0] = 0;\r
+ if(copyNumber > 1)
+ snprintf(buf, sizeof(buf)/sizeof(buf[0]),"%d", copyNumber); else buf[0] = 0;\r
\r
oldFg = SetTextColor(hdc, RGB(255, 255, 255)); /* white */\r
oldBg = SetBkColor(hdc, RGB(0, 0, 0)); /* black */\r
\r
if (appData.clockMode) {\r
if (tinyLayout)\r
- sprintf(buf, "%c %s %s", color[0], TimeString(timeRemaining), flagFell);\r
+ snprintf(buf, sizeof(buf)/sizeof(buf[0]), "%c %s %s", color[0], TimeString(timeRemaining), flagFell);\r
else\r
- sprintf(buf, "%s:%c%s %s", color, (logoHeight>0 ? 0 : ' '), TimeString(timeRemaining), flagFell);\r
+ snprintf(buf, sizeof(buf)/sizeof(buf[0]), "%s:%c%s %s", color, (logoHeight>0 ? 0 : ' '), TimeString(timeRemaining), flagFell);\r
str = buf;\r
} else {\r
str = color;\r
rect, str, strlen(str), NULL);\r
if(logoHeight > 0 && appData.clockMode) {\r
RECT r;\r
- sprintf(buf, "%s %s", buf+7, flagFell);\r
+ str += strlen(color)+2;\r
r.top = rect->top + logoHeight/2;\r
r.left = rect->left;\r
r.right = rect->right;\r
{ IDM_NewChat, MF_BYCOMMAND|MF_GRAYED },\r
{ IDM_Engine1Options, MF_BYCOMMAND|MF_GRAYED },\r
{ IDM_Engine2Options, MF_BYCOMMAND|MF_GRAYED },\r
+ { IDM_Sounds, MF_BYCOMMAND|MF_GRAYED },\r
{ -1, -1 }\r
};\r
\r
Enables trainingOnEnables[] = {\r
{ IDM_EditComment, MF_BYCOMMAND|MF_GRAYED },\r
+ { IDM_Comment, MF_BYCOMMAND|MF_GRAYED },\r
{ IDM_Pause, MF_BYCOMMAND|MF_GRAYED },\r
{ IDM_Forward, MF_BYCOMMAND|MF_GRAYED },\r
{ IDM_Backward, MF_BYCOMMAND|MF_GRAYED },\r
\r
Enables trainingOffEnables[] = {\r
{ IDM_EditComment, MF_BYCOMMAND|MF_ENABLED },\r
+ { IDM_Comment, MF_BYCOMMAND|MF_ENABLED },\r
{ IDM_Pause, MF_BYCOMMAND|MF_ENABLED },\r
{ IDM_Forward, MF_BYCOMMAND|MF_ENABLED },\r
{ IDM_Backward, MF_BYCOMMAND|MF_ENABLED },\r
MF_BYCOMMAND|MF_UNCHECKED);\r
}\r
}\r
+ DisplayLogos(); // [HGM] logos: mode change could have altered logos\r
}\r
\r
VOID\r
{\r
HMENU hmenu = GetMenu(hwndMain);\r
SetMenuEnables(hmenu, icsEnables);\r
- EnableMenuItem(GetSubMenu(hmenu, OPTIONS_POS), ICS_POS,\r
- MF_BYPOSITION|MF_ENABLED);\r
+ EnableMenuItem(GetSubMenu(hmenu, OPTIONS_POS), IDM_IcsOptions,\r
+ MF_BYCOMMAND|MF_ENABLED);\r
#if ZIPPY\r
if (appData.zippyPlay) {\r
SetMenuEnables(hmenu, zippyEnables);\r
{\r
HMENU hmenu = GetMenu(hwndMain);\r
SetMenuEnables(hmenu, ncpEnables);\r
- EnableMenuItem(GetSubMenu(hmenu, OPTIONS_POS), SOUNDS_POS,\r
- MF_BYPOSITION|MF_GRAYED);\r
DrawMenuBar(hwndMain);\r
}\r
\r
{\r
char title[MSG_SIZ], *host;\r
if (str[0] != NULLCHAR) {\r
- strcpy(title, str);\r
+ safeStrCpy(title, str, sizeof(title)/sizeof(title[0]) );\r
} else if (appData.icsActive) {\r
if (appData.icsCommPort[0] != NULLCHAR)\r
host = "ICS";\r
else \r
host = appData.icsHost;\r
- sprintf(title, "%s: %s", szTitle, host);\r
+ snprintf(title, MSG_SIZ, "%s: %s", szTitle, host);\r
} else if (appData.noChessProgram) {\r
- strcpy(title, szTitle);\r
+ safeStrCpy(title, szTitle, sizeof(title)/sizeof(title[0]) );\r
} else {\r
- strcpy(title, szTitle);\r
+ safeStrCpy(title, szTitle, sizeof(title)/sizeof(title[0]) );\r
strcat(title, ": ");\r
strcat(title, first.tidy);\r
}\r
int len;\r
\r
if (error == 0) {\r
- strcpy(buf, str);\r
+ safeStrCpy(buf, str, sizeof(buf)/sizeof(buf[0]) );\r
} else {\r
len = FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM,\r
NULL, error, LANG_NEUTRAL,\r
(LPSTR) buf2, MSG_SIZ, NULL);\r
if (len > 0) {\r
- sprintf(buf, "%s:\n%s", str, buf2);\r
+ snprintf(buf, 2*MSG_SIZ, "%s:\n%s", str, buf2);\r
} else {\r
ErrorMap *em = errmap;\r
while (em->err != 0 && em->err != error) em++;\r
if (em->err != 0) {\r
- sprintf(buf, "%s:\n%s", str, em->msg);\r
+ snprintf(buf, 2*MSG_SIZ, "%s:\n%s", str, em->msg);\r
} else {\r
- sprintf(buf, "%s:\nError code %d", str, error);\r
+ snprintf(buf, 2*MSG_SIZ, "%s:\nError code %d", str, error);\r
}\r
}\r
}\r
\r
- ErrorPopUp("Error", buf);\r
+ ErrorPopUp(_("Error"), buf);\r
}\r
\r
\r
ClearHighlights();\r
DrawPosition(FALSE, NULL);\r
if (appData.popupMoveErrors) {\r
- ErrorPopUp("Error", str);\r
+ ErrorPopUp(_("Error"), str);\r
} else {\r
DisplayMessage(str, "");\r
moveErrorMessageUp = TRUE;\r
{\r
char buf[2*MSG_SIZ], buf2[MSG_SIZ];\r
int len;\r
- char *label = exitStatus ? "Fatal Error" : "Exiting";\r
+ char *label = exitStatus ? _("Fatal Error") : _("Exiting");\r
\r
if (error != 0) {\r
len = FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM,\r
NULL, error, LANG_NEUTRAL,\r
(LPSTR) buf2, MSG_SIZ, NULL);\r
if (len > 0) {\r
- sprintf(buf, "%s:\n%s", str, buf2);\r
+ snprintf(buf, 2*MSG_SIZ, "%s:\n%s", str, buf2);\r
} else {\r
ErrorMap *em = errmap;\r
while (em->err != 0 && em->err != error) em++;\r
if (em->err != 0) {\r
- sprintf(buf, "%s:\n%s", str, em->msg);\r
+ snprintf(buf, 2*MSG_SIZ, "%s:\n%s", str, em->msg);\r
} else {\r
- sprintf(buf, "%s:\nError code %d", str, error);\r
+ snprintf(buf, 2*MSG_SIZ, "%s:\nError code %d", str, error);\r
}\r
}\r
str = buf;\r
VOID\r
DisplayInformation(char *str)\r
{\r
- (void) MessageBox(hwndMain, str, "Information", MB_OK|MB_ICONINFORMATION);\r
+ (void) MessageBox(hwndMain, str, _("Information"), MB_OK|MB_ICONINFORMATION);\r
}\r
\r
\r
VOID\r
DisplayNote(char *str)\r
{\r
- ErrorPopUp("Note", str);\r
+ ErrorPopUp(_("Note"), str);\r
}\r
\r
\r
case WM_INITDIALOG:\r
qp = (QuestionParams *) lParam;\r
CenterWindow(hDlg, GetWindow(hDlg, GW_OWNER));\r
+ Translate(hDlg, DLG_Question);\r
SetWindowText(hDlg, qp->title);\r
SetDlgItemText(hDlg, OPT_QuestionText, qp->question);\r
SetFocus(GetDlgItem(hDlg, OPT_QuestionInput));\r
case WM_COMMAND:\r
switch (LOWORD(wParam)) {\r
case IDOK:\r
- strcpy(reply, qp->replyPrefix);\r
+ safeStrCpy(reply, qp->replyPrefix, sizeof(reply)/sizeof(reply[0]) );\r
if (*reply) strcat(reply, " ");\r
len = strlen(reply);\r
GetDlgItemText(hDlg, OPT_QuestionInput, reply + len, sizeof(reply) - len);\r
strcat(reply, "\n");\r
OutputToProcess(qp->pr, reply, strlen(reply), &err);\r
EndDialog(hDlg, TRUE);\r
- if (err) DisplayFatalError("Error writing to chess program", err, 1);\r
+ if (err) DisplayFatalError(_("Error writing to chess program"), err, 1);\r
return TRUE;\r
case IDCANCEL:\r
EndDialog(hDlg, FALSE);\r
lpIndexFRC = (int *) lParam;\r
\r
CenterWindow(hDlg, GetWindow(hDlg, GW_OWNER));\r
+ Translate(hDlg, DLG_NewGameFRC);\r
\r
SendDlgItemMessage( hDlg, IDC_NFG_Edit, EM_SETLIMITTEXT, sizeof(buf)-1, 0 );\r
SetDlgItemInt( hDlg, IDC_NFG_Edit, *lpIndexFRC, TRUE );\r
}\r
return TRUE;\r
case IDC_NFG_Random:\r
- sprintf( buf, "%d", myrandom() ); /* [HGM] shuffle: no longer limit to 960 */\r
+ snprintf( buf, sizeof(buf)/sizeof(buf[0]), "%d", myrandom() ); /* [HGM] shuffle: no longer limit to 960 */\r
SetDlgItemText(hDlg, IDC_NFG_Edit, buf );\r
return TRUE;\r
}\r
gameListOptionsDialog = hDlg; // [HGM] pass through global to keep out off back-end\r
\r
CenterWindow(hDlg, GetWindow(hDlg, GW_OWNER));\r
+ Translate(hDlg, DLG_GameListOptions);\r
\r
/* Initialize list */\r
GLT_TagsToList( lpUserGLT );\r
int result;\r
FARPROC lpProc = MakeProcInstance( (FARPROC) GameListOptions_Proc, hInst );\r
\r
- strcpy( lpUserGLT, appData.gameListTags );\r
+ safeStrCpy( lpUserGLT, appData.gameListTags ,LPUSERGLT_SIZE ); \r
\r
result = DialogBoxParam( hInst, MAKEINTRESOURCE(DLG_GameListOptions), hwndMain, (DLGPROC)lpProc, (LPARAM)lpUserGLT );\r
\r
{\r
char consoleTitle[MSG_SIZ];\r
\r
- sprintf(consoleTitle, "%s: %s", szConsoleTitle, str);\r
+ snprintf(consoleTitle, MSG_SIZ, "%s: %s", szConsoleTitle, str);\r
SetWindowText(hwndConsole, consoleTitle);\r
}\r
\r
VOID\r
CommentPopDown(void)\r
{\r
- CheckMenuItem(GetMenu(hwndMain), IDM_EditComment, MF_UNCHECKED);\r
+ CheckMenuItem(GetMenu(hwndMain), IDM_Comment, MF_UNCHECKED);\r
if (commentDialog) {\r
ShowWindow(commentDialog, SW_HIDE);\r
}\r
}\r
if (!GetUserName(buf, &bufsiz)) {\r
/*DisplayError("Error getting user name", GetLastError());*/\r
- strcpy(buf, "User");\r
+ safeStrCpy(buf, _("User"), sizeof(buf)/sizeof(buf[0]) );\r
}\r
return buf;\r
}\r
\r
if (!GetComputerName(buf, &bufsiz)) {\r
/*DisplayError("Error getting host name", GetLastError());*/\r
- strcpy(buf, "Unknown");\r
+ safeStrCpy(buf, _("Unknown"), sizeof(buf)/sizeof(buf[0]) );\r
}\r
return buf;\r
}\r
hdc = GetDC(hwndMain);\r
if (!IsIconic(hwndMain)) {\r
DisplayAClock(hdc, timeRemaining, highlight, \r
- flipClock ? &blackRect : &whiteRect, "White", flag);\r
+ flipClock ? &blackRect : &whiteRect, _("White"), flag);\r
}\r
if (highlight && iconCurrent == iconBlack) {\r
iconCurrent = iconWhite;\r
hdc = GetDC(hwndMain);\r
if (!IsIconic(hwndMain)) {\r
DisplayAClock(hdc, timeRemaining, highlight, \r
- flipClock ? &whiteRect : &blackRect, "Black", flag);\r
+ flipClock ? &whiteRect : &blackRect, _("Black"), flag);\r
}\r
if (highlight && iconCurrent == iconWhite) {\r
iconCurrent = iconBlack;\r
f = OpenFileDialog(hwndMain, "a", defName,\r
appData.oldSaveStyle ? "gam" : "pgn",\r
GAME_FILT, \r
- "Save Game to File", NULL, fileTitle, NULL);\r
+ _("Save Game to File"), NULL, fileTitle, NULL);\r
if (f != NULL) {\r
SaveGame(f, 0, "");\r
fclose(f);\r
char cmdLine[MSG_SIZ];\r
\r
if (port[0] == NULLCHAR) {\r
- sprintf(cmdLine, "%s %s", appData.telnetProgram, host);\r
+ snprintf(cmdLine, MSG_SIZ, "%s %s", appData.telnetProgram, host);\r
} else {\r
- sprintf(cmdLine, "%s %s %s", appData.telnetProgram, host, port);\r
+ snprintf(cmdLine, MSG_SIZ, "%s %s %s", appData.telnetProgram, host, port);\r
}\r
return StartChildProcess(cmdLine, "", pr);\r
}\r
char fullname[MSG_SIZ];\r
\r
if (*name != '\\')\r
- sprintf(fullname, "\\\\.\\%s", name);\r
+ snprintf(fullname, MSG_SIZ, "\\\\.\\%s", name);\r
else\r
- strcpy(fullname, name);\r
+ safeStrCpy(fullname, name, sizeof(fullname)/sizeof(fullname[0]) );\r
\r
h = CreateFile(name, GENERIC_READ | GENERIC_WRITE,\r
0, NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL);\r
int\r
OpenLoopback(ProcRef *pr)\r
{\r
- DisplayFatalError("Not implemented", 0, 1);\r
+ DisplayFatalError(_("Not implemented"), 0, 1);\r
return NO_ERROR;\r
}\r
\r
break;\r
}\r
prevStderrPort = fromPort; // remember port used\r
- sprintf(stderrPortStr, "%d", fromPort);\r
+ snprintf(stderrPortStr, MSG_SIZ, "%d", fromPort);\r
\r
if (send(s, stderrPortStr, strlen(stderrPortStr) + 1, 0) == SOCKET_ERROR) {\r
err = WSAGetLastError();\r
CmailSigHandlerCallBack(InputSourceRef isr, VOIDSTAR closure,\r
char *buf, int count, int error)\r
{\r
- DisplayFatalError("Not implemented", 0, 1);\r
+ DisplayFatalError(_("Not implemented"), 0, 1);\r
}\r
\r
/* see wgamelist.c for Game List functions */\r
POINT frames[], int * nFrames);\r
\r
\r
+#define kFactor 4\r
+\r
void\r
-AnimateAtomicCapture(int fromX, int fromY, int toX, int toY, int nFrames)\r
+AnimateAtomicCapture(Board board, int fromX, int fromY, int toX, int toY)\r
{ // [HGM] atomic: animate blast wave\r
int i;\r
-if(appData.debugMode) fprintf(debugFP, "exploding (%d,%d)\n", toX, toY);\r
+\r
explodeInfo.fromX = fromX;\r
explodeInfo.fromY = fromY;\r
explodeInfo.toX = toX;\r
explodeInfo.toY = toY;\r
- for(i=1; i<nFrames; i++) {\r
- explodeInfo.radius = (i*180)/(nFrames-1);\r
- DrawPosition(FALSE, NULL);\r
+ for(i=1; i<4*kFactor; i++) {\r
+ explodeInfo.radius = (i*180)/(4*kFactor-1);\r
+ DrawPosition(FALSE, board);\r
Sleep(appData.animSpeed);\r
}\r
explodeInfo.radius = 0;\r
- DrawPosition(TRUE, NULL);\r
+ DrawPosition(TRUE, board);\r
}\r
\r
-#define kFactor 4\r
-\r
void\r
AnimateMove(board, fromX, fromY, toX, toY)\r
Board board;\r
ScreenSquare(fromX, fromY, &start);\r
ScreenSquare(toX, toY, &finish);\r
\r
- /* All pieces except knights move in straight line */\r
- if (piece != WhiteKnight && piece != BlackKnight) {\r
+ /* All moves except knight jumps move in straight line */\r
+ if (!(abs(fromX-toX) == 1 && abs(fromY-toY) == 2 || abs(fromX-toX) == 2 && abs(fromY-toY) == 1)) {\r
mid.x = start.x + (finish.x - start.x) / 2;\r
mid.y = start.y + (finish.y - start.y) / 2;\r
} else {\r
- /* Knight: make diagonal movement then straight */\r
+ /* Knight: make straight movement then diagonal */\r
if (abs(toY - fromY) < abs(toX - fromX)) {\r
mid.x = start.x + (finish.x - start.x) / 2;\r
- mid.y = finish.y;\r
+ mid.y = start.y;\r
} else {\r
- mid.x = finish.x;\r
+ mid.x = start.x;\r
mid.y = start.y + (finish.y - start.y) / 2;\r
}\r
}\r
animInfo.pos = finish;\r
DrawPosition(FALSE, NULL);\r
animInfo.piece = EmptySquare;\r
- if(gameInfo.variant == VariantAtomic && \r
- (board[toY][toX] != EmptySquare || fromX != toX && (piece == WhitePawn || piece == BlackPawn) ) )\r
- AnimateAtomicCapture(fromX, fromY, toX, toY, 2*nFrames);\r
+ Explode(board, fromX, fromY, toX, toY);\r
}\r
\r
/* Convert board position to corner of screen rect and color */\r
\r
EvalGraphSet( first, last, current, pvInfoList );\r
}\r
+\r
+void\r
+SettingsPopUp(ChessProgramState *cps)\r
+{ // [HGM] wrapper needed because handles must not be passed through back-end\r
+ EngineOptionsPopup(savedHwnd, cps);\r
+}\r