variation-support patch
[xboard.git] / winboard / winboard.c
index 4ab4f93..774d2b7 100644 (file)
 #endif\r
 \r
 #include "common.h"\r
-#include "winboard.h"\r
 #include "frontend.h"\r
 #include "backend.h"\r
+#include "winboard.h"\r
 #include "moves.h"\r
 #include "wclipbrd.h"\r
-#include "wgamelist.h"\r
-#include "wedittags.h"\r
 #include "woptions.h"\r
 #include "wsockerr.h"\r
 #include "defaults.h"\r
@@ -158,10 +156,10 @@ char installDir[MSG_SIZ];
 \r
 BoardSize boardSize;\r
 BOOLEAN chessProgram;\r
-static int boardX, boardY;\r
+//static int boardX, boardY;\r
 int  minX, minY; // [HGM] placement: volatile limits on upper-left corner\r
 static int squareSize, lineGap, minorSize;\r
-static int winWidth, winHeight, winW, winH;\r
+static int winW, winH;\r
 static RECT messageRect, whiteRect, blackRect, leftLogoRect, rightLogoRect; // [HGM] logo\r
 static int logoHeight = 0;\r
 static char messageText[MESSAGE_TEXT_MAX];\r
@@ -181,8 +179,6 @@ char *secondChessProgramNames;
 #define PALETTESIZE 256\r
 \r
 HINSTANCE hInst;          /* current instance */\r
-HWND hwndMain = NULL;        /* root window*/\r
-HWND hwndConsole = NULL;\r
 BOOLEAN alwaysOnTop = FALSE;\r
 RECT boardRect;\r
 COLORREF lightSquareColor, darkSquareColor, whitePieceColor, \r
@@ -197,8 +193,8 @@ static HBRUSH lightSquareBrush, darkSquareBrush,
   blackSquareBrush, /* [HGM] for band between board and holdings */\r
   explodeBrush,     /* [HGM] atomic */\r
   whitePieceBrush, blackPieceBrush, iconBkgndBrush /*, outlineBrush*/;\r
-static POINT gridEndpoints[(BOARD_SIZE + 1) * 4];\r
-static DWORD gridVertexCounts[(BOARD_SIZE + 1) * 2];\r
+static POINT gridEndpoints[(BOARD_RANKS + BOARD_FILES + 2) * 2];\r
+static DWORD gridVertexCounts[BOARD_RANKS + BOARD_FILES + 2];\r
 static HPEN gridPen = NULL;\r
 static HPEN highlightPen = NULL;\r
 static HPEN premovePen = NULL;\r
@@ -220,7 +216,7 @@ static HBITMAP darkBackTexture = NULL;
 static int liteBackTextureMode = BACK_TEXTURE_MODE_PLAIN;\r
 static int darkBackTextureMode = BACK_TEXTURE_MODE_PLAIN;\r
 static int backTextureSquareSize = 0;\r
-static struct { int x; int y; int mode; } backTextureSquareInfo[BOARD_SIZE][BOARD_SIZE];\r
+static struct { int x; int y; int mode; } backTextureSquareInfo[BOARD_RANKS][BOARD_FILES];\r
 \r
 #if __GNUC__ && !defined(_winmajor)\r
 #define oldDialog 0 /* cygwin doesn't define _winmajor; mingw does */\r
@@ -346,15 +342,7 @@ static char *commentTitle;
 static char *commentText;\r
 static int commentIndex;\r
 static Boolean editComment = FALSE;\r
-HWND commentDialog = NULL;\r
-BOOLEAN commentDialogUp = FALSE;\r
-static int commentX, commentY, commentH, commentW;\r
 \r
-static char *analysisTitle;\r
-static char *analysisText;\r
-HWND analysisDialog = NULL;\r
-BOOLEAN analysisDialogUp = FALSE;\r
-static int analysisX, analysisY, analysisH, analysisW;\r
 \r
 char errorTitle[MSG_SIZ];\r
 char errorMessage[2*MSG_SIZ];\r
@@ -424,37 +412,27 @@ VOID UpdateSampleText(HWND hDlg, int id, MyColorizeAttribs *mca);
 int NewGameFRC();\r
 int GameListOptions();\r
 \r
-HWND moveHistoryDialog = NULL;\r
-BOOLEAN moveHistoryDialogUp = FALSE;\r
-\r
-WindowPlacement wpMoveHistory;\r
+int dummy; // [HGM] for obsolete args\r
 \r
+HWND hwndMain = NULL;        /* root window*/\r
+HWND hwndConsole = NULL;\r
+HWND commentDialog = NULL;\r
+HWND moveHistoryDialog = NULL;\r
 HWND evalGraphDialog = NULL;\r
-BOOLEAN evalGraphDialogUp = FALSE;\r
-\r
-WindowPlacement wpEvalGraph;\r
-\r
 HWND engineOutputDialog = NULL;\r
-BOOLEAN engineOutputDialogUp = FALSE;\r
+HWND gameListDialog = NULL;\r
+HWND editTagsDialog = NULL;\r
 \r
+int commentUp = FALSE;\r
+\r
+WindowPlacement wpMain;\r
+WindowPlacement wpConsole;\r
+WindowPlacement wpComment;\r
+WindowPlacement wpMoveHistory;\r
+WindowPlacement wpEvalGraph;\r
 WindowPlacement wpEngineOutput;\r
 WindowPlacement wpGameList;\r
-WindowPlacement wpConsole;\r
-\r
-VOID MoveHistoryPopUp();\r
-VOID MoveHistoryPopDown();\r
-VOID MoveHistorySet( char movelist[][2*MOVE_LEN], int first, int last, int current, ChessProgramStats_Move * pvInfo );\r
-BOOL MoveHistoryIsUp();\r
-\r
-VOID EvalGraphSet( int first, int last, int current, ChessProgramStats_Move * pvInfo );\r
-VOID EvalGraphPopUp();\r
-VOID EvalGraphPopDown();\r
-BOOL EvalGraphIsUp();\r
-\r
-VOID EngineOutputPopUp();\r
-VOID EngineOutputPopDown();\r
-BOOL EngineOutputIsUp();\r
-VOID EngineOutputUpdate( FrontEndProgramStats * stats );\r
+WindowPlacement wpTags;\r
 \r
 VOID EngineOptionsPopup(); // [HGM] settings\r
 \r
@@ -861,15 +839,15 @@ InitInstance(HINSTANCE hInstance, int nCmdShow, LPSTR lpCmdLine)
   InitBackEnd2();\r
 \r
   /* Make the window visible; update its client area; and return "success" */\r
-  EnsureOnScreen(&boardX, &boardY, minX, minY);\r
+  EnsureOnScreen(&wpMain.x, &wpMain.y, minX, minY);\r
   wp.length = sizeof(WINDOWPLACEMENT);\r
   wp.flags = 0;\r
   wp.showCmd = nCmdShow;\r
   wp.ptMaxPosition.x = wp.ptMaxPosition.y = 0;\r
-  wp.rcNormalPosition.left = boardX;\r
-  wp.rcNormalPosition.right = boardX + winWidth;\r
-  wp.rcNormalPosition.top = boardY;\r
-  wp.rcNormalPosition.bottom = boardY + winHeight;\r
+  wp.rcNormalPosition.left = wpMain.x;\r
+  wp.rcNormalPosition.right = wpMain.x + wpMain.width;\r
+  wp.rcNormalPosition.top = wpMain.y;\r
+  wp.rcNormalPosition.bottom = wpMain.y + wpMain.height;\r
   SetWindowPlacement(hwndMain, &wp);\r
 \r
   if(!appData.noGUI) SetWindowPos(hwndMain, alwaysOnTop ? HWND_TOPMOST : HWND_NOTOPMOST,\r
@@ -1393,30 +1371,32 @@ ArgDescriptor argDescriptors[] = {
   { "secondNPS", ArgInt, (LPVOID) &appData.secondNPS, FALSE },\r
   { "noGUI", ArgTrue, (LPVOID) &appData.noGUI, FALSE },\r
   { "keepLineBreaksICS", ArgBoolean, (LPVOID) &appData.noJoin, TRUE },\r
-\r
+  { "wrapContinuationSequence", ArgString, (LPVOID) &appData.wrapContSeq, FALSE },\r
+  { "useInternalWrap", ArgTrue, (LPVOID) &appData.useInternalWrap, FALSE }, /* noJoin usurps this if set */\r
+  \r
   // [HGM] placement: put all window layouts last in ini file, but man X,Y before all others\r
   { "minX", ArgZ, (LPVOID) &minX, FALSE }, // [HGM] placement: to make suer auxialary windows can be placed\r
   { "minY", ArgZ, (LPVOID) &minY, FALSE },\r
-  { "winWidth",  ArgInt, (LPVOID) &winWidth,  TRUE }, // [HGM] placement: dummies to remember right & bottom\r
-  { "winHeight", ArgInt, (LPVOID) &winHeight, TRUE }, //       for attaching auxiliary windows to them\r
-  { "x", ArgInt, (LPVOID) &boardX, TRUE },\r
-  { "y", ArgInt, (LPVOID) &boardY, TRUE },\r
+  { "winWidth",  ArgInt, (LPVOID) &wpMain.width,  TRUE }, // [HGM] placement: dummies to remember right & bottom\r
+  { "winHeight", ArgInt, (LPVOID) &wpMain.height, TRUE }, //       for attaching auxiliary windows to them\r
+  { "x", ArgInt, (LPVOID) &wpMain.x, TRUE },\r
+  { "y", ArgInt, (LPVOID) &wpMain.y, TRUE },\r
   { "icsX", ArgX,   (LPVOID) &wpConsole.x, TRUE },\r
   { "icsY", ArgY,   (LPVOID) &wpConsole.y, TRUE },\r
   { "icsW", ArgInt, (LPVOID) &wpConsole.width, TRUE },\r
   { "icsH", ArgInt, (LPVOID) &wpConsole.height, TRUE },\r
-  { "analysisX", ArgX,   (LPVOID) &analysisX, FALSE }, // [HGM] placement: analysis window no longer exists\r
-  { "analysisY", ArgY,   (LPVOID) &analysisY, FALSE }, //       provided for compatibility with old ini files\r
-  { "analysisW", ArgInt, (LPVOID) &analysisW, FALSE },\r
-  { "analysisH", ArgInt, (LPVOID) &analysisH, FALSE },\r
-  { "commentX", ArgX,   (LPVOID) &commentX, TRUE },\r
-  { "commentY", ArgY,   (LPVOID) &commentY, TRUE },\r
-  { "commentW", ArgInt, (LPVOID) &commentW, TRUE },\r
-  { "commentH", ArgInt, (LPVOID) &commentH, TRUE },\r
-  { "tagsX", ArgX,   (LPVOID) &editTagsX, TRUE },\r
-  { "tagsY", ArgY,   (LPVOID) &editTagsY, TRUE },\r
-  { "tagsW", ArgInt, (LPVOID) &editTagsW, TRUE },\r
-  { "tagsH", ArgInt, (LPVOID) &editTagsH, TRUE },\r
+  { "analysisX", ArgX,   (LPVOID) &dummy, FALSE }, // [HGM] placement: analysis window no longer exists\r
+  { "analysisY", ArgY,   (LPVOID) &dummy, FALSE }, //       provided for compatibility with old ini files\r
+  { "analysisW", ArgInt, (LPVOID) &dummy, FALSE },\r
+  { "analysisH", ArgInt, (LPVOID) &dummy, FALSE },\r
+  { "commentX", ArgX,   (LPVOID) &wpComment.x, TRUE },\r
+  { "commentY", ArgY,   (LPVOID) &wpComment.y, TRUE },\r
+  { "commentW", ArgInt, (LPVOID) &wpComment.width, TRUE },\r
+  { "commentH", ArgInt, (LPVOID) &wpComment.height, TRUE },\r
+  { "tagsX", ArgX,   (LPVOID) &wpTags.x, TRUE },\r
+  { "tagsY", ArgY,   (LPVOID) &wpTags.y, TRUE },\r
+  { "tagsW", ArgInt, (LPVOID) &wpTags.width, TRUE },\r
+  { "tagsH", ArgInt, (LPVOID) &wpTags.height, TRUE },\r
   { "gameListX", ArgX,   (LPVOID) &wpGameList.x, TRUE },\r
   { "gameListY", ArgY,   (LPVOID) &wpGameList.y, TRUE },\r
   { "gameListW", ArgInt, (LPVOID) &wpGameList.width, TRUE },\r
@@ -1494,6 +1474,10 @@ ParseFontName(char *name, MyFontParams *mfp)
   mfp->italic = (strchr(p, 'i') != NULL);\r
   mfp->underline = (strchr(p, 'u') != NULL);\r
   mfp->strikeout = (strchr(p, 's') != NULL);\r
+  mfp->charset = DEFAULT_CHARSET;\r
+  q = strchr(p, 'c');\r
+  if (q)\r
+    mfp->charset = (BYTE) atoi(q+1);\r
 }\r
 \r
 /* Color name parser.\r
@@ -1771,16 +1755,16 @@ ParseArgs(GetFunc get, void *cl)
       break;\r
 \r
     case ArgX:\r
-      *(int *) ad->argLoc = atoi(argValue) + boardX; // [HGM] placement: translate stored relative to absolute \r
+      *(int *) ad->argLoc = atoi(argValue) + wpMain.x; // [HGM] placement: translate stored relative to absolute \r
       break;\r
 \r
     case ArgY:\r
-      *(int *) ad->argLoc = atoi(argValue) + boardY; // (this is really kludgey, it should be done where used...)\r
+      *(int *) ad->argLoc = atoi(argValue) + wpMain.y; // (this is really kludgey, it should be done where used...)\r
       break;\r
 \r
     case ArgZ:\r
       *(int *) ad->argLoc = atoi(argValue);\r
-      EnsureOnScreen(&boardX, &boardY, minX, minY); \r
+      EnsureOnScreen(&wpMain.x, &wpMain.y, minX, minY); \r
       break;\r
 \r
     case ArgFloat:\r
@@ -1868,7 +1852,7 @@ LFfromMFP(LOGFONT* lf, MyFontParams *mfp)
   lf->lfItalic = mfp->italic;\r
   lf->lfUnderline = mfp->underline;\r
   lf->lfStrikeOut = mfp->strikeout;\r
-  lf->lfCharSet = DEFAULT_CHARSET;\r
+  lf->lfCharSet = mfp->charset;\r
   lf->lfOutPrecision = OUT_DEFAULT_PRECIS;\r
   lf->lfClipPrecision = CLIP_DEFAULT_PRECIS;\r
   lf->lfQuality = DEFAULT_QUALITY;\r
@@ -2044,20 +2028,16 @@ InitAppData(LPSTR lpCmdLine)
   dcb.StopBits = ONESTOPBIT;\r
   settingsFileName = SETTINGS_FILE;\r
   saveSettingsOnExit = TRUE;\r
-  boardX = CW_USEDEFAULT;\r
-  boardY = CW_USEDEFAULT;\r
-  analysisX = CW_USEDEFAULT; \r
-  analysisY = CW_USEDEFAULT; \r
-  analysisW = CW_USEDEFAULT;\r
-  analysisH = CW_USEDEFAULT;\r
-  commentX = CW_USEDEFAULT; \r
-  commentY = CW_USEDEFAULT; \r
-  commentW = CW_USEDEFAULT;\r
-  commentH = CW_USEDEFAULT;\r
-  editTagsX = CW_USEDEFAULT; \r
-  editTagsY = CW_USEDEFAULT; \r
-  editTagsW = CW_USEDEFAULT;\r
-  editTagsH = CW_USEDEFAULT;\r
+  wpMain.x = CW_USEDEFAULT;\r
+  wpMain.y = CW_USEDEFAULT;\r
+  wpComment.x = CW_USEDEFAULT; \r
+  wpComment.y = CW_USEDEFAULT; \r
+  wpComment.width = CW_USEDEFAULT;\r
+  wpComment.height = CW_USEDEFAULT;\r
+  wpTags.x = CW_USEDEFAULT; \r
+  wpTags.y = CW_USEDEFAULT; \r
+  wpTags.width = CW_USEDEFAULT;\r
+  wpTags.height = CW_USEDEFAULT;\r
   icsTextMenuString = ICS_TEXT_MENU_DEFAULT;\r
   icsNames = ICS_NAMES;\r
   firstChessProgramNames = FCP_NAMES;\r
@@ -2187,9 +2167,9 @@ InitAppData(LPSTR lpCmdLine)
   ParseArgs(StringGet, &lpCmdLine);\r
 \r
   /* [HGM] make sure board size is acceptable */\r
-  if(appData.NrFiles > BOARD_SIZE ||\r
-     appData.NrRanks > BOARD_SIZE   )\r
-      DisplayFatalError("Recompile with BOARD_SIZE > 12, to support this size", 0, 2);\r
+  if(appData.NrFiles > BOARD_FILES ||\r
+     appData.NrRanks > BOARD_RANKS   )\r
+      DisplayFatalError("Recompile with BOARD_RANKS or BOARD_FILES, to support this size", 0, 2);\r
 \r
   /* [HGM] After parsing the options from the .ini file, and overruling them\r
    * with options from the command line, we now make an even higher priority\r
@@ -2298,16 +2278,49 @@ InitMenuChecks()
                                     MF_CHECKED : MF_UNCHECKED));\r
 }\r
 \r
+// [HGM] args: these two cases taken out to stay in front-end\r
+      void SaveFontArg(FILE *f, ArgDescriptor *ad)\r
+      {\r
+        int bs;\r
+       for (bs=0; bs<NUM_SIZES; bs++) {\r
+         MyFontParams *mfp = &font[bs][(int) ad->argLoc]->mfp;\r
+          fprintf(f, "/size=%s ", sizeInfo[bs].name);\r
+         fprintf(f, "/%s=\"%s:%g%s%s%s%s%sc%d\"\n",\r
+           ad->argName, mfp->faceName, mfp->pointSize,\r
+            mfp->bold || mfp->italic || mfp->underline || mfp->strikeout ? " " : "",\r
+           mfp->bold ? "b" : "",\r
+           mfp->italic ? "i" : "",\r
+           mfp->underline ? "u" : "",\r
+           mfp->strikeout ? "s" : "",\r
+            (int)mfp->charset);\r
+       }\r
+      }\r
+\r
+      void SaveAttribsArg(FILE *f, ArgDescriptor *ad)\r
+      {\r
+       MyTextAttribs* ta = &textAttribs[(ColorClass)ad->argLoc];\r
+       fprintf(f, "/%s=\"%s%s%s%s%s#%02lx%02lx%02lx\"\n", ad->argName,\r
+          (ta->effects & CFE_BOLD) ? "b" : "",\r
+          (ta->effects & CFE_ITALIC) ? "i" : "",\r
+          (ta->effects & CFE_UNDERLINE) ? "u" : "",\r
+          (ta->effects & CFE_STRIKEOUT) ? "s" : "",\r
+          (ta->effects) ? " " : "",\r
+         ta->color&0xff, (ta->color >> 8)&0xff, (ta->color >> 16)&0xff);\r
+      }\r
+\r
+int MainWindowUp()\r
+{ // [HGM] args: allows testing if main window is realized from back-end\r
+  return hwndMain != NULL;\r
+}\r
 \r
 VOID\r
 SaveSettings(char* name)\r
 {\r
   FILE *f;\r
   ArgDescriptor *ad;\r
-  WINDOWPLACEMENT wp;\r
   char dir[MSG_SIZ];\r
 \r
-  if (!hwndMain) return;\r
+  if (!MainWindowUp()) return;\r
 \r
   GetCurrentDirectory(MSG_SIZ, dir);\r
   SetCurrentDirectory(installDir);\r
@@ -2325,83 +2338,23 @@ SaveSettings(char* name)
   fprintf(f, "; Use a shortcut, an @indirection file, or a .bat file instead.\n");\r
   fprintf(f, ";\n");\r
 \r
-  wp.length = sizeof(WINDOWPLACEMENT);\r
-  GetWindowPlacement(hwndMain, &wp);\r
-  boardX = wp.rcNormalPosition.left;\r
-  boardY = wp.rcNormalPosition.top;\r
-\r
-  if (hwndConsole) {\r
-    GetWindowPlacement(hwndConsole, &wp);\r
-    wpConsole.x = wp.rcNormalPosition.left;\r
-    wpConsole.y = wp.rcNormalPosition.top;\r
-    wpConsole.width = wp.rcNormalPosition.right - wp.rcNormalPosition.left;\r
-    wpConsole.height = wp.rcNormalPosition.bottom - wp.rcNormalPosition.top;\r
-  }\r
-\r
-  if (analysisDialog) {\r
-    GetWindowPlacement(analysisDialog, &wp);\r
-    analysisX = wp.rcNormalPosition.left;\r
-    analysisY = wp.rcNormalPosition.top;\r
-    analysisW = wp.rcNormalPosition.right - wp.rcNormalPosition.left;\r
-    analysisH = wp.rcNormalPosition.bottom - wp.rcNormalPosition.top;\r
-  }\r
-\r
-  if (commentDialog) {\r
-    GetWindowPlacement(commentDialog, &wp);\r
-    commentX = wp.rcNormalPosition.left;\r
-    commentY = wp.rcNormalPosition.top;\r
-    commentW = wp.rcNormalPosition.right - wp.rcNormalPosition.left;\r
-    commentH = wp.rcNormalPosition.bottom - wp.rcNormalPosition.top;\r
-  }\r
-\r
-  if (editTagsDialog) {\r
-    GetWindowPlacement(editTagsDialog, &wp);\r
-    editTagsX = wp.rcNormalPosition.left;\r
-    editTagsY = wp.rcNormalPosition.top;\r
-    editTagsW = wp.rcNormalPosition.right - wp.rcNormalPosition.left;\r
-    editTagsH = wp.rcNormalPosition.bottom - wp.rcNormalPosition.top;\r
-  }\r
-\r
-  if (gameListDialog) {\r
-    GetWindowPlacement(gameListDialog, &wp);\r
-    wpGameList.x = wp.rcNormalPosition.left;\r
-    wpGameList.y = wp.rcNormalPosition.top;\r
-    wpGameList.width = wp.rcNormalPosition.right - wp.rcNormalPosition.left;\r
-    wpGameList.height = wp.rcNormalPosition.bottom - wp.rcNormalPosition.top;\r
-  }\r
+  GetActualPlacement(hwndMain, &wpMain);\r
+  GetActualPlacement(hwndConsole, &wpConsole);\r
+  GetActualPlacement(commentDialog, &wpComment);\r
+  GetActualPlacement(editTagsDialog, &wpTags);\r
+  GetActualPlacement(gameListDialog, &wpGameList);\r
 \r
   /* [AS] Move history */\r
   wpMoveHistory.visible = MoveHistoryIsUp();\r
-  \r
-  if( moveHistoryDialog ) {\r
-    GetWindowPlacement(moveHistoryDialog, &wp);\r
-    wpMoveHistory.x = wp.rcNormalPosition.left;\r
-    wpMoveHistory.y = wp.rcNormalPosition.top;\r
-    wpMoveHistory.width = wp.rcNormalPosition.right - wp.rcNormalPosition.left;\r
-    wpMoveHistory.height = wp.rcNormalPosition.bottom - wp.rcNormalPosition.top;\r
-  }\r
+  GetActualPlacement(moveHistoryDialog, &wpMoveHistory);\r
 \r
   /* [AS] Eval graph */\r
   wpEvalGraph.visible = EvalGraphIsUp();\r
-\r
-  if( evalGraphDialog ) {\r
-    GetWindowPlacement(evalGraphDialog, &wp);\r
-    wpEvalGraph.x = wp.rcNormalPosition.left;\r
-    wpEvalGraph.y = wp.rcNormalPosition.top;\r
-    wpEvalGraph.width = wp.rcNormalPosition.right - wp.rcNormalPosition.left;\r
-    wpEvalGraph.height = wp.rcNormalPosition.bottom - wp.rcNormalPosition.top;\r
-  }\r
+  GetActualPlacement(evalGraphDialog, &wpEvalGraph);\r
 \r
   /* [AS] Engine output */\r
   wpEngineOutput.visible = EngineOutputIsUp();\r
-\r
-  if( engineOutputDialog ) {\r
-    GetWindowPlacement(engineOutputDialog, &wp);\r
-    wpEngineOutput.x = wp.rcNormalPosition.left;\r
-    wpEngineOutput.y = wp.rcNormalPosition.top;\r
-    wpEngineOutput.width = wp.rcNormalPosition.right - wp.rcNormalPosition.left;\r
-    wpEngineOutput.height = wp.rcNormalPosition.bottom - wp.rcNormalPosition.top;\r
-  }\r
+  GetActualPlacement(engineOutputDialog, &wpEngineOutput);\r
 \r
   for (ad = argDescriptors; ad->argName != NULL; ad++) {\r
     if (!ad->save) continue;\r
@@ -2437,10 +2390,10 @@ SaveSettings(char* name)
       fprintf(f, "/%s=%d\n", ad->argName, *(int *)ad->argLoc);\r
       break;\r
     case ArgX:\r
-      fprintf(f, "/%s=%d\n", ad->argName, *(int *)ad->argLoc - boardX); // [HGM] placement: stor relative value\r
+      fprintf(f, "/%s=%d\n", ad->argName, *(int *)ad->argLoc - wpMain.x); // [HGM] placement: stor relative value\r
       break;\r
     case ArgY:\r
-      fprintf(f, "/%s=%d\n", ad->argName, *(int *)ad->argLoc - boardY);\r
+      fprintf(f, "/%s=%d\n", ad->argName, *(int *)ad->argLoc - wpMain.y);\r
       break;\r
     case ArgFloat:\r
       fprintf(f, "/%s=%g\n", ad->argName, *(float *)ad->argLoc);\r
@@ -2463,16 +2416,7 @@ SaveSettings(char* name)
       }\r
       break;\r
     case ArgAttribs:\r
-      {\r
-       MyTextAttribs* ta = &textAttribs[(ColorClass)ad->argLoc];\r
-       fprintf(f, "/%s=\"%s%s%s%s%s#%02lx%02lx%02lx\"\n", ad->argName,\r
-          (ta->effects & CFE_BOLD) ? "b" : "",\r
-          (ta->effects & CFE_ITALIC) ? "i" : "",\r
-          (ta->effects & CFE_UNDERLINE) ? "u" : "",\r
-          (ta->effects & CFE_STRIKEOUT) ? "s" : "",\r
-          (ta->effects) ? " " : "",\r
-         ta->color&0xff, (ta->color >> 8)&0xff, (ta->color >> 16)&0xff);\r
-      }\r
+      SaveAttribsArg(f, ad);\r
       break;\r
     case ArgFilename:\r
       if (strchr(*(char **)ad->argLoc, '\"')) {\r
@@ -2486,20 +2430,7 @@ SaveSettings(char* name)
              sizeInfo[*(BoardSize *)ad->argLoc].name);\r
       break;\r
     case ArgFont:\r
-      {\r
-        int bs;\r
-       for (bs=0; bs<NUM_SIZES; bs++) {\r
-         MyFontParams *mfp = &font[bs][(int) ad->argLoc]->mfp;\r
-          fprintf(f, "/size=%s ", sizeInfo[bs].name);\r
-         fprintf(f, "/%s=\"%s:%g%s%s%s%s%s\"\n",\r
-           ad->argName, mfp->faceName, mfp->pointSize,\r
-            mfp->bold || mfp->italic || mfp->underline || mfp->strikeout ? " " : "",\r
-           mfp->bold ? "b" : "",\r
-           mfp->italic ? "i" : "",\r
-           mfp->underline ? "u" : "",\r
-           mfp->strikeout ? "s" : "");\r
-       }\r
-      }\r
+      SaveFontArg(f, ad);\r
       break;\r
     case ArgCommSettings:\r
       PrintCommSettings(f, ad->argName, (DCB *)ad->argLoc);\r
@@ -3025,7 +2956,7 @@ void CreatePiecesFromFont()
                 }\r
                 else if( strstr(lf.lfFaceName,"GC2004D") != NULL ) {\r
                     /* Good Companion (Some characters get warped as literal :-( */\r
-                    char s[] = "1cmWG0ñueOS¯®oYI23wgQU";\r
+                    char s[] = "1cmWG0??S??oYI23wgQU";\r
                     s[0]=0xB9; s[1]=0xA9; s[6]=0xB1; s[11]=0xBB; s[12]=0xAB; s[17]=0xB3;\r
                     SetCharTable(pieceToFontChar, s);\r
                 }\r
@@ -3193,10 +3124,10 @@ InitDrawingSizes(BoardSize boardSize, int flags)
   /* [HGM] call with -2 uses old size (for if nr of files, ranks changes) */\r
   if(boardSize == (BoardSize)(-2) ) boardSize = oldBoardSize;\r
 \r
-  oldRect.left = boardX; //[HGM] placement: remember previous window params\r
-  oldRect.top = boardY;\r
-  oldRect.right = boardX + winWidth;\r
-  oldRect.bottom = boardY + winHeight;\r
+  oldRect.left = wpMain.x; //[HGM] placement: remember previous window params\r
+  oldRect.top = wpMain.y;\r
+  oldRect.right = wpMain.x + wpMain.width;\r
+  oldRect.bottom = wpMain.y + wpMain.height;\r
 \r
   tinyLayout = sizeInfo[boardSize].tinyLayout;\r
   smallLayout = sizeInfo[boardSize].smallLayout;\r
@@ -3304,49 +3235,49 @@ InitDrawingSizes(BoardSize boardSize, int flags)
   winH = 2 * GetSystemMetrics(SM_CYFRAME) + GetSystemMetrics(SM_CYMENU) +\r
     GetSystemMetrics(SM_CYCAPTION) + boardRect.bottom + OUTER_MARGIN;\r
   if(suppressVisibleEffects) return; // [HGM] when called for filling sizeInfo only\r
-  winWidth = winW;  // [HGM] placement: set through temporary which can used by initial sizing choice\r
-  winHeight = winH; //       without disturbing window attachments\r
+  wpMain.width = winW;  // [HGM] placement: set through temporary which can used by initial sizing choice\r
+  wpMain.height = winH; //       without disturbing window attachments\r
   GetWindowRect(hwndMain, &wrect);\r
-  SetWindowPos(hwndMain, NULL, 0, 0, winWidth, winHeight,\r
+  SetWindowPos(hwndMain, NULL, 0, 0, wpMain.width, wpMain.height,\r
               SWP_NOCOPYBITS|SWP_NOZORDER|SWP_NOMOVE);\r
 \r
   // [HGM] placement: let attached windows follow size change.\r
-  ReattachAfterSize( &oldRect, winWidth, winHeight, moveHistoryDialog, &wpMoveHistory );\r
-  ReattachAfterSize( &oldRect, winWidth, winHeight, evalGraphDialog, &wpEvalGraph );\r
-  ReattachAfterSize( &oldRect, winWidth, winHeight, engineOutputDialog, &wpEngineOutput );\r
-  ReattachAfterSize( &oldRect, winWidth, winHeight, gameListDialog, &wpGameList );\r
-  ReattachAfterSize( &oldRect, winWidth, winHeight, hwndConsole, &wpConsole );\r
+  ReattachAfterSize( &oldRect, wpMain.width, wpMain.height, moveHistoryDialog, &wpMoveHistory );\r
+  ReattachAfterSize( &oldRect, wpMain.width, wpMain.height, evalGraphDialog, &wpEvalGraph );\r
+  ReattachAfterSize( &oldRect, wpMain.width, wpMain.height, engineOutputDialog, &wpEngineOutput );\r
+  ReattachAfterSize( &oldRect, wpMain.width, wpMain.height, gameListDialog, &wpGameList );\r
+  ReattachAfterSize( &oldRect, wpMain.width, wpMain.height, hwndConsole, &wpConsole );\r
 \r
   /* compensate if menu bar wrapped */\r
   GetClientRect(hwndMain, &crect);\r
   offby = boardRect.bottom + OUTER_MARGIN - crect.bottom;\r
-  winHeight += offby;\r
+  wpMain.height += offby;\r
   switch (flags) {\r
   case WMSZ_TOPLEFT:\r
     SetWindowPos(hwndMain, NULL, \r
-                 wrect.right - winWidth, wrect.bottom - winHeight, \r
-                 winWidth, winHeight, SWP_NOCOPYBITS|SWP_NOZORDER);\r
+                 wrect.right - wpMain.width, wrect.bottom - wpMain.height, \r
+                 wpMain.width, wpMain.height, SWP_NOCOPYBITS|SWP_NOZORDER);\r
     break;\r
 \r
   case WMSZ_TOPRIGHT:\r
   case WMSZ_TOP:\r
     SetWindowPos(hwndMain, NULL, \r
-                 wrect.left, wrect.bottom - winHeight, \r
-                 winWidth, winHeight, SWP_NOCOPYBITS|SWP_NOZORDER);\r
+                 wrect.left, wrect.bottom - wpMain.height, \r
+                 wpMain.width, wpMain.height, SWP_NOCOPYBITS|SWP_NOZORDER);\r
     break;\r
 \r
   case WMSZ_BOTTOMLEFT:\r
   case WMSZ_LEFT:\r
     SetWindowPos(hwndMain, NULL, \r
-                 wrect.right - winWidth, wrect.top, \r
-                 winWidth, winHeight, SWP_NOCOPYBITS|SWP_NOZORDER);\r
+                 wrect.right - wpMain.width, wrect.top, \r
+                 wpMain.width, wpMain.height, SWP_NOCOPYBITS|SWP_NOZORDER);\r
     break;\r
 \r
   case WMSZ_BOTTOMRIGHT:\r
   case WMSZ_BOTTOM:\r
   case WMSZ_RIGHT:\r
   default:\r
-    SetWindowPos(hwndMain, NULL, 0, 0, winWidth, winHeight,\r
+    SetWindowPos(hwndMain, NULL, 0, 0, wpMain.width, wpMain.height,\r
                SWP_NOCOPYBITS|SWP_NOZORDER|SWP_NOMOVE);\r
     break;\r
   }\r
@@ -4207,7 +4138,7 @@ BOOL DrawPositionNeedsFullRepaint()
         but animation is fast enough that it's difficult to notice.\r
     */\r
     if( animInfo.piece == EmptySquare ) {\r
-        if( (appData.highlightLastMove || appData.highlightDragging) && IsDrawArrowEnabled() && HasHighlightInfo() ) {\r
+        if( (appData.highlightLastMove || appData.highlightDragging) && IsDrawArrowEnabled() /*&& HasHighlightInfo()*/ ) {\r
             result = TRUE;\r
         }\r
     }\r
@@ -4227,8 +4158,8 @@ DrawBoardOnDC(HDC hdc, Board board, HDC tmphdc)
   if( liteBackTexture != NULL || darkBackTexture != NULL ) {\r
       static int backTextureBoardSize; /* [HGM] boardsize: also new texture if board format changed */\r
       if( backTextureSquareSize != squareSize \r
-       || backTextureBoardSize != BOARD_WIDTH+BOARD_SIZE*BOARD_HEIGHT) {\r
-         backTextureBoardSize = BOARD_WIDTH+BOARD_SIZE*BOARD_HEIGHT;\r
+       || backTextureBoardSize != BOARD_WIDTH+BOARD_FILES*BOARD_HEIGHT) {\r
+         backTextureBoardSize = BOARD_WIDTH+BOARD_FILES*BOARD_HEIGHT;\r
           backTextureSquareSize = squareSize;\r
           RebuildTextureSquareInfo();\r
       }\r
@@ -4840,7 +4771,7 @@ PaintProc(HWND hwnd)
  *   subtracted from x.\r
  */\r
 int EventToSquare(x, limit)\r
-     int x;\r
+     int x, limit;\r
 {\r
   if (x <= 0)\r
     return -2;\r
@@ -5277,34 +5208,55 @@ LoadGameDialog(HWND hwnd, char* title)
   }\r
 }\r
 \r
+int get_term_width()\r
+{\r
+    HDC hdc;\r
+    TEXTMETRIC tm;\r
+    RECT rc;\r
+    HFONT hfont, hold_font;\r
+    LOGFONT lf;\r
+    HWND hText;\r
+\r
+    if (hwndConsole)\r
+        hText = GetDlgItem(hwndConsole, OPT_ConsoleText);\r
+    else\r
+        return 79;\r
+\r
+    // get the text metrics\r
+    hdc = GetDC(hText);\r
+    lf = font[boardSize][CONSOLE_FONT]->lf;\r
+    if (consoleCF.dwEffects & CFE_BOLD)\r
+        lf.lfWeight = FW_BOLD;\r
+    if (consoleCF.dwEffects & CFE_ITALIC)\r
+        lf.lfItalic = TRUE;\r
+    if (consoleCF.dwEffects & CFE_STRIKEOUT)\r
+        lf.lfStrikeOut = TRUE;\r
+    if (consoleCF.dwEffects & CFE_UNDERLINE)\r
+        lf.lfUnderline = TRUE;\r
+    hfont = CreateFontIndirect(&lf);\r
+    hold_font = SelectObject(hdc, hfont);\r
+    GetTextMetrics(hdc, &tm);\r
+    SelectObject(hdc, hold_font);\r
+    DeleteObject(hfont);\r
+    ReleaseDC(hText, hdc);\r
+\r
+    // get the rectangle\r
+    SendMessage(hText, EM_GETRECT, 0, (LPARAM)&rc);\r
+\r
+    return (rc.right-rc.left) / tm.tmAveCharWidth;\r
+}\r
+\r
 void UpdateICSWidth(HWND hText)\r
 {\r
-       HDC hdc;\r
-       TEXTMETRIC tm;\r
-       RECT rc;\r
-       HFONT hfont, hold_font;\r
-       LONG old_width, new_width;\r
-       \r
-       // get the text metrics\r
-       hdc = GetDC(hText);\r
-       hfont = CreateFontIndirect(&font[boardSize][CONSOLE_FONT]->lf);\r
-       hold_font = SelectObject(hdc, hfont);\r
-       GetTextMetrics(hdc, &tm);\r
-       SelectObject(hdc, hold_font);\r
-       DeleteObject(hfont);\r
-       ReleaseDC(hText, hdc);\r
-\r
-       // get the rectangle\r
-       SendMessage(hText, EM_GETRECT, 0, (LPARAM)&rc);\r
-\r
-       // update the width\r
-       new_width = (rc.right-rc.left) / tm.tmAveCharWidth;\r
-       old_width = GetWindowLong(hText, GWL_USERDATA);\r
-       if (new_width != old_width)\r
-       {\r
-               ics_update_width(new_width);\r
-               SetWindowLong(hText, GWL_USERDATA, new_width);\r
-       }\r
+    LONG old_width, new_width;\r
+\r
+    new_width = get_term_width(hText, FALSE);\r
+    old_width = GetWindowLong(hText, GWL_USERDATA);\r
+    if (new_width != old_width)\r
+    {\r
+        ics_update_width(new_width);\r
+        SetWindowLong(hText, GWL_USERDATA, new_width);\r
+    }\r
 }\r
 \r
 VOID\r
@@ -5400,7 +5352,7 @@ WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
     \r
     JAWS_ALT_INTERCEPT\r
 \r
-    if (appData.icsActive && (char)wParam > ' ' && !((char)wParam >= '1' && (char)wParam <= '9')) { \r
+    if (appData.icsActive && ((char)wParam == '\r' || (char)wParam > ' ' && !((char)wParam >= '1' && (char)wParam <= '9'))) { \r
        // [HGM] movenum: for non-zero digits we always do type-in dialog\r
        HWND h = GetDlgItem(hwndConsole, OPT_ConsoleInput);\r
        if (IsIconic(hwndConsole)) ShowWindow(hwndConsole, SW_RESTORE);\r
@@ -5752,7 +5704,7 @@ WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
       break;\r
 \r
     case IDM_EditComment:\r
-      if (commentDialogUp && editComment) {\r
+      if (commentUp && editComment) {\r
        CommentPopDown();\r
       } else {\r
        EditCommentEvent();\r
@@ -6224,18 +6176,18 @@ WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
             RECT rcMain;\r
 \r
 //            GetWindowRect( hwnd, &rcMain ); //[HGM] sticky: in XP this returned new position, not old\r
-           rcMain.left   = boardX;           //              replace by these 4 lines to reconstruct old rect\r
-           rcMain.right  = boardX + winWidth;\r
-           rcMain.top    = boardY;\r
-           rcMain.bottom = boardY + winHeight;\r
+           rcMain.left   = wpMain.x;           //              replace by these 4 lines to reconstruct old rect\r
+           rcMain.right  = wpMain.x + wpMain.width;\r
+           rcMain.top    = wpMain.y;\r
+           rcMain.bottom = wpMain.y + wpMain.height;\r
             \r
             ReattachAfterMove( &rcMain, lpwp->x, lpwp->y, moveHistoryDialog, &wpMoveHistory );\r
             ReattachAfterMove( &rcMain, lpwp->x, lpwp->y, evalGraphDialog, &wpEvalGraph );\r
             ReattachAfterMove( &rcMain, lpwp->x, lpwp->y, engineOutputDialog, &wpEngineOutput );\r
             ReattachAfterMove( &rcMain, lpwp->x, lpwp->y, gameListDialog, &wpGameList );\r
             ReattachAfterMove( &rcMain, lpwp->x, lpwp->y, hwndConsole, &wpConsole );\r
-           boardX = lpwp->x;\r
-            boardY = lpwp->y;\r
+           wpMain.x = lpwp->x;\r
+            wpMain.y = lpwp->y;\r
         }\r
     }\r
     break;\r
@@ -6998,18 +6950,18 @@ CommentDialog(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
       GetClientRect(hDlg, &rect);\r
       sizeX = rect.right;\r
       sizeY = rect.bottom;\r
-      if (commentX != CW_USEDEFAULT && commentY != CW_USEDEFAULT &&\r
-         commentW != CW_USEDEFAULT && commentH != CW_USEDEFAULT) {\r
+      if (wpComment.x != CW_USEDEFAULT && wpComment.y != CW_USEDEFAULT &&\r
+         wpComment.width != CW_USEDEFAULT && wpComment.height != CW_USEDEFAULT) {\r
        WINDOWPLACEMENT wp;\r
-       EnsureOnScreen(&commentX, &commentY, 0, 0);\r
+       EnsureOnScreen(&wpComment.x, &wpComment.y, 0, 0);\r
        wp.length = sizeof(WINDOWPLACEMENT);\r
        wp.flags = 0;\r
        wp.showCmd = SW_SHOW;\r
        wp.ptMaxPosition.x = wp.ptMaxPosition.y = 0;\r
-       wp.rcNormalPosition.left = commentX;\r
-       wp.rcNormalPosition.right = commentX + commentW;\r
-       wp.rcNormalPosition.top = commentY;\r
-       wp.rcNormalPosition.bottom = commentY + commentH;\r
+       wp.rcNormalPosition.left = wpComment.x;\r
+       wp.rcNormalPosition.right = wpComment.x + wpComment.width;\r
+       wp.rcNormalPosition.top = wpComment.y;\r
+       wp.rcNormalPosition.bottom = wpComment.y + wpComment.height;\r
        SetWindowPlacement(hDlg, &wp);\r
 \r
        GetClientRect(hDlg, &rect);\r
@@ -7108,14 +7060,14 @@ EitherCommentPopUp(int index, char *title, char *str, BOOLEAN edit)
 \r
   if (commentDialog) {\r
     SendMessage(commentDialog, WM_INITDIALOG, 0, 0);\r
-    if (!commentDialogUp) ShowWindow(commentDialog, SW_SHOW);\r
+    if (!commentUp) ShowWindow(commentDialog, SW_SHOW);\r
   } else {\r
     lpProc = MakeProcInstance((FARPROC)CommentDialog, hInst);\r
     CreateDialog(hInst, MAKEINTRESOURCE(DLG_EditComment),\r
                 hwndMain, (DLGPROC)lpProc);\r
     FreeProcInstance(lpProc);\r
   }\r
-  commentDialogUp = TRUE;\r
+  commentUp = TRUE;\r
 }\r
 \r
 \r
@@ -7158,13 +7110,8 @@ TypeInMoveDialog(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
        }\r
        // [HGM] movenum: allow move number to be typed in any mode\r
        if(sscanf(move, "%d", &n) == 1 && n != 0 ) {\r
-         currentMove = 2*n-1;\r
-         if(currentMove > forwardMostMove)  currentMove = forwardMostMove;\r
-         if(currentMove < backwardMostMove) currentMove = backwardMostMove;\r
+         ToNrEvent(2*n-1);\r
          EndDialog(hDlg, TRUE);\r
-         DrawPosition(TRUE, boards[currentMove]);\r
-         if(currentMove > backwardMostMove) DisplayMove(currentMove - 1);\r
-         else DisplayMessage("", "");\r
          return TRUE;\r
        }\r
       }\r
@@ -7388,7 +7335,7 @@ GothicDialog(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
   case WM_INITDIALOG:\r
     GetWindowRect(hDlg, &rChild);\r
 \r
-    SetWindowPos(hDlg, NULL, boardX, boardY-height, winWidth, height,\r
+    SetWindowPos(hDlg, NULL, wpMain.x, wpMain.y-height, wpMain.width, height,\r
                                                              SWP_NOZORDER);\r
 \r
     /* \r
@@ -8009,10 +7956,10 @@ ConsoleWndProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
    // [HGM] Chessknight's change 2004-07-13\r
    else { /* Determine Defaults */\r
        WINDOWPLACEMENT wp;\r
-       wpConsole.x = winWidth + 1;\r
-       wpConsole.y = boardY;\r
-       wpConsole.width = screenWidth -  winWidth;\r
-       wpConsole.height = winHeight;\r
+       wpConsole.x = wpMain.width + 1;\r
+       wpConsole.y = wpMain.y;\r
+       wpConsole.width = screenWidth -  wpMain.width;\r
+       wpConsole.height = wpMain.height;\r
        EnsureOnScreen(&wpConsole.x, &wpConsole.y, 0, 0);\r
        wp.length = sizeof(WINDOWPLACEMENT);\r
        wp.flags = 0;\r
@@ -8026,7 +7973,7 @@ ConsoleWndProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
     }\r
 \r
    // Allow hText to highlight URLs and send notifications on them\r
-   wMask = SendMessage(hText, EM_GETEVENTMASK, 0, 0L);\r
+   wMask = (WORD) SendMessage(hText, EM_GETEVENTMASK, 0, 0L);\r
    SendMessage(hText, EM_SETEVENTMASK, 0, wMask | ENM_LINK);\r
    SendMessage(hText, EM_AUTOURLDETECT, TRUE, 0L);\r
    SetWindowLong(hText, GWL_USERDATA, 79); // initialize the text window's width\r
@@ -8541,6 +8488,13 @@ typedef struct {
 } Enables;\r
 \r
 VOID\r
+GreyRevert(Boolean grey)\r
+{ // [HGM] vari: for retracting variations in local mode\r
+  HMENU hmenu = GetMenu(hwndMain);\r
+  EnableMenuItem(hmenu, IDM_Revert, MF_BYCOMMAND|(grey ? MF_GRAYED : MF_ENABLED));\r
+}\r
+\r
+VOID\r
 SetMenuEnables(HMENU hmenu, Enables *enab)\r
 {\r
   while (enab->item > 0) {\r
@@ -9408,7 +9362,7 @@ CommentPopDown(void)
   if (commentDialog) {\r
     ShowWindow(commentDialog, SW_HIDE);\r
   }\r
-  commentDialogUp = FALSE;\r
+  commentUp = FALSE;\r
 }\r
 \r
 VOID\r
@@ -10340,6 +10294,11 @@ RemoveInputSource(InputSourceRef isr)
   }\r
 }\r
 \r
+int no_wrap(char *message, int count)\r
+{\r
+    ConsoleOutput(message, count, FALSE);\r
+    return count;\r
+}\r
 \r
 int\r
 OutputToProcess(ProcRef pr, char *message, int count, int *outError)\r
@@ -10348,11 +10307,32 @@ OutputToProcess(ProcRef pr, char *message, int count, int *outError)
   int outCount = SOCKET_ERROR;\r
   ChildProc *cp = (ChildProc *) pr;\r
   static OVERLAPPED ovl;\r
+  static int line = 0;\r
 \r
-  if (pr == NoProc) {\r
-    ConsoleOutput(message, count, FALSE);\r
-    return count;\r
-  } \r
+  if (pr == NoProc)\r
+  {\r
+    if (appData.noJoin || !appData.useInternalWrap)\r
+      return no_wrap(message, count);\r
+    else\r
+    {\r
+      int width = get_term_width();\r
+      int len = wrap(NULL, message, count, width, &line);\r
+      char *msg = malloc(len);\r
+      int dbgchk;\r
+\r
+      if (!msg)\r
+        return no_wrap(message, count);\r
+      else\r
+      {\r
+        dbgchk = wrap(msg, message, count, width, &line);\r
+        if (dbgchk != len && appData.debugMode)\r
+            fprintf(debugFP, "wrap(): dbgchk(%d) != len(%d)\n", dbgchk, len);\r
+        ConsoleOutput(msg, len, FALSE);\r
+        free(msg);\r
+        return len;\r
+      }\r
+    }\r
+  }\r
 \r
   if (ovl.hEvent == NULL) {\r
     ovl.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);\r
@@ -10436,86 +10416,6 @@ StartAnalysisClock()
                                        (UINT) 2000, NULL);\r
 }\r
 \r
-LRESULT CALLBACK\r
-AnalysisDialog(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)\r
-{\r
-  static HANDLE hwndText;\r
-  RECT rect;\r
-  static int sizeX, sizeY;\r
-  int newSizeX, newSizeY, flags;\r
-  MINMAXINFO *mmi;\r
-\r
-  switch (message) {\r
-  case WM_INITDIALOG: /* message: initialize dialog box */\r
-    /* Initialize the dialog items */\r
-    hwndText = GetDlgItem(hDlg, OPT_AnalysisText);\r
-    SetWindowText(hDlg, analysisTitle);\r
-    SetDlgItemText(hDlg, OPT_AnalysisText, analysisText);\r
-    /* Size and position the dialog */\r
-    if (!analysisDialog) {\r
-      analysisDialog = hDlg;\r
-      flags = SWP_NOZORDER;\r
-      GetClientRect(hDlg, &rect);\r
-      sizeX = rect.right;\r
-      sizeY = rect.bottom;\r
-      if (analysisX != CW_USEDEFAULT && analysisY != CW_USEDEFAULT &&\r
-         analysisW != CW_USEDEFAULT && analysisH != CW_USEDEFAULT) {\r
-       WINDOWPLACEMENT wp;\r
-       EnsureOnScreen(&analysisX, &analysisY, 0, 0);\r
-       wp.length = sizeof(WINDOWPLACEMENT);\r
-       wp.flags = 0;\r
-       wp.showCmd = SW_SHOW;\r
-       wp.ptMaxPosition.x = wp.ptMaxPosition.y = 0;\r
-       wp.rcNormalPosition.left = analysisX;\r
-       wp.rcNormalPosition.right = analysisX + analysisW;\r
-       wp.rcNormalPosition.top = analysisY;\r
-       wp.rcNormalPosition.bottom = analysisY + analysisH;\r
-       SetWindowPlacement(hDlg, &wp);\r
-\r
-       GetClientRect(hDlg, &rect);\r
-       newSizeX = rect.right;\r
-       newSizeY = rect.bottom;\r
-        ResizeEditPlusButtons(hDlg, hwndText, sizeX, sizeY,\r
-                             newSizeX, newSizeY);\r
-       sizeX = newSizeX;\r
-       sizeY = newSizeY;\r
-      }\r
-    }\r
-    return FALSE;\r
-\r
-  case WM_COMMAND: /* message: received a command */\r
-    switch (LOWORD(wParam)) {\r
-    case IDCANCEL:\r
-      if (appData.icsActive && appData.icsEngineAnalyze) { /* [DM] icsEngineAnalyze */\r
-          ExitAnalyzeMode();\r
-          ModeHighlight();\r
-          return TRUE;\r
-      }\r
-      EditGameEvent();\r
-      return TRUE;\r
-    default:\r
-      break;\r
-    }\r
-    break;\r
-\r
-  case WM_SIZE:\r
-    newSizeX = LOWORD(lParam);\r
-    newSizeY = HIWORD(lParam);\r
-    ResizeEditPlusButtons(hDlg, hwndText, sizeX, sizeY, newSizeX, newSizeY);\r
-    sizeX = newSizeX;\r
-    sizeY = newSizeY;\r
-    break;\r
-\r
-  case WM_GETMINMAXINFO:\r
-    /* Prevent resizing window too small */\r
-    mmi = (MINMAXINFO *) lParam;\r
-    mmi->ptMinTrackSize.x = 100;\r
-    mmi->ptMinTrackSize.y = 100;\r
-    break;\r
-  }\r
-  return FALSE;\r
-}\r
-\r
 VOID\r
 SetHighlights(int fromX, int fromY, int toX, int toY)\r
 {\r