This patch adds <Enter> to the characters that cause an automatic switch to the ICS...
[xboard.git] / winboard / winboard.c
index 252e9b0..24fd967 100644 (file)
@@ -2,7 +2,7 @@
  * WinBoard.c -- Windows NT front end to XBoard\r
  *\r
  * Copyright 1991 by Digital Equipment Corporation, Maynard,\r
- * Massachusetts.\r
+ * Massachusetts. \r
  *\r
  * Enhancements Copyright 1992-2001, 2002, 2003, 2004, 2005, 2006,\r
  * 2007, 2008, 2009 Free Software Foundation, Inc.\r
@@ -106,13 +106,13 @@ extern int ics_type;
 void DisplayHoldingsCount(HDC hdc, int x, int y, int align, int copyNumber);\r
 VOID NewVariantPopup(HWND hwnd);\r
 int FinishMove P((ChessMove moveType, int fromX, int fromY, int toX, int toY,\r
-           /*char*/int promoChar));\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(());\r
 typedef struct {\r
-  ChessSquare piece;\r
+  ChessSquare piece;  \r
   POINT pos;      /* window coordinates of current pos */\r
   POINT lastpos;  /* window coordinates of last pos - used for clipping */\r
   POINT from;     /* board coordinates of the piece's orig pos */\r
@@ -131,7 +131,7 @@ typedef struct {
 static DragInfo dragInfo = { {-1,-1}, {-1,-1}, {-1,-1}, {-1,-1} };\r
 \r
 typedef struct {\r
-  POINT sq[2];    /* board coordinates of from, to squares */\r
+  POINT sq[2];   /* board coordinates of from, to squares */\r
 } HighlightInfo;\r
 \r
 static HighlightInfo highlightInfo        = { {{-1, -1}, {-1, -1}} };\r
@@ -185,7 +185,7 @@ HWND hwndMain = NULL;        /* root window*/
 HWND hwndConsole = NULL;\r
 BOOLEAN alwaysOnTop = FALSE;\r
 RECT boardRect;\r
-COLORREF lightSquareColor, darkSquareColor, whitePieceColor,\r
+COLORREF lightSquareColor, darkSquareColor, whitePieceColor, \r
   blackPieceColor, highlightSquareColor, premoveHighlightColor;\r
 HPALETTE hPal;\r
 ColorClass currentColorClass;\r
@@ -232,7 +232,7 @@ static struct { int x; int y; int mode; } backTextureSquareInfo[BOARD_SIZE][BOAR
 #endif\r
 #endif\r
 \r
-char *defaultTextAttribs[] =\r
+char *defaultTextAttribs[] = \r
 {\r
   COLOR_SHOUT, COLOR_SSHOUT, COLOR_CHANNEL1, COLOR_CHANNEL, COLOR_KIBITZ,\r
   COLOR_TELL, COLOR_CHALLENGE, COLOR_REQUEST, COLOR_SEEK, COLOR_NORMAL,\r
@@ -248,7 +248,7 @@ typedef struct {
   int cliWidth, cliHeight;\r
 } SizeInfo;\r
 \r
-SizeInfo sizeInfo[] =\r
+SizeInfo sizeInfo[] = \r
 {\r
   { "tiny",     21, 0, 1, 1, 0, 0 },\r
   { "teeny",    25, 1, 1, 1, 0, 0 },\r
@@ -522,7 +522,7 @@ void ThawUI()
 \r
 int APIENTRY\r
 WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,\r
-    LPSTR lpCmdLine, int nCmdShow)\r
+       LPSTR lpCmdLine, int nCmdShow)\r
 {\r
   MSG msg;\r
   HANDLE hAccelMain, hAccelNoAlt, hAccelNoICS;\r
@@ -552,104 +552,104 @@ WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
   /* Acquire and dispatch messages until a WM_QUIT message is received. */\r
 \r
   while (GetMessage(&msg, /* message structure */\r
-            NULL, /* handle of window receiving the message */\r
-            0,    /* lowest message to examine */\r
-            0))   /* highest message to examine */\r
+                   NULL, /* handle of window receiving the message */\r
+                   0,    /* lowest message to examine */\r
+                   0))   /* highest message to examine */\r
     {\r
 \r
       if(msg.message == WM_CHAR && msg.wParam == '\t') {\r
-    // [HGM] navigate: switch between all windows with tab\r
-    HWND e1 = NULL, e2 = NULL, mh = NULL, hInput = NULL, hText = NULL;\r
-    int i, currentElement = 0;\r
-\r
-    // first determine what element of the chain we come from (if any)\r
-    if(appData.icsActive) {\r
-        hInput = GetDlgItem(hwndConsole, OPT_ConsoleInput);\r
-        hText  = GetDlgItem(hwndConsole, OPT_ConsoleText);\r
-    }\r
-    if(engineOutputDialog && EngineOutputIsUp()) {\r
-        e1 = GetDlgItem(engineOutputDialog, IDC_EngineMemo1);\r
-        e2 = GetDlgItem(engineOutputDialog, IDC_EngineMemo2);\r
-    }\r
-    if(moveHistoryDialog && MoveHistoryIsUp()) {\r
-        mh = GetDlgItem(moveHistoryDialog, IDC_MoveHistory);\r
-    }\r
-    if(msg.hwnd == hwndMain) currentElement = 7 ; else\r
-    if(msg.hwnd == engineOutputDialog) currentElement = 2; else\r
-    if(msg.hwnd == e1)                 currentElement = 2; else\r
-    if(msg.hwnd == e2)                 currentElement = 3; else\r
-    if(msg.hwnd == moveHistoryDialog) currentElement = 4; else\r
-    if(msg.hwnd == mh)                currentElement = 4; else\r
-    if(msg.hwnd == evalGraphDialog)    currentElement = 6; else\r
-    if(msg.hwnd == hText)  currentElement = 5; else\r
-    if(msg.hwnd == hInput) currentElement = 6; else\r
-    for (i = 0; i < N_BUTTONS; i++) {\r
-        if (buttonDesc[i].hwnd == msg.hwnd) { currentElement = 1; break; }\r
-    }\r
-\r
-    // determine where to go to\r
-    if(currentElement) { HWND h = NULL; int direction = GetKeyState(VK_SHIFT) < 0 ? -1 : 1;\r
-      do {\r
-        currentElement = (currentElement + direction) % 7;\r
-        switch(currentElement) {\r
-        case 0:\r
-          h = hwndMain; break; // passing this case always makes the loop exit\r
-        case 1:\r
-          h = buttonDesc[0].hwnd; break; // could be NULL\r
-        case 2:\r
-          if(!EngineOutputIsUp()) continue; // skip closed auxiliary windows\r
-          h = e1; break;\r
-        case 3:\r
-          if(!EngineOutputIsUp()) continue;\r
-          h = e2; break;\r
-        case 4:\r
-          if(!MoveHistoryIsUp()) continue;\r
-          h = mh; break;\r
-//      case 6: // input to eval graph does not seem to get here!\r
-//        if(!EvalGraphIsUp()) continue;\r
-//        h = evalGraphDialog; break;\r
-        case 5:\r
-          if(!appData.icsActive) continue;\r
-          SAY("display");\r
-          h = hText; break;\r
-        case 6:\r
-          if(!appData.icsActive) continue;\r
-          SAY("input");\r
-          h = hInput; break;\r
-        }\r
-      } while(h == 0);\r
-\r
-      if(currentElement > 4 && IsIconic(hwndConsole)) ShowWindow(hwndConsole, SW_RESTORE);\r
-      if(currentElement < 5 && IsIconic(hwndMain))    ShowWindow(hwndMain, SW_RESTORE); // all open together\r
-      SetFocus(h);\r
-\r
-      continue; // this message now has been processed\r
-    }\r
+       // [HGM] navigate: switch between all windows with tab\r
+       HWND e1 = NULL, e2 = NULL, mh = NULL, hInput = NULL, hText = NULL;\r
+       int i, currentElement = 0;\r
+\r
+       // first determine what element of the chain we come from (if any)\r
+       if(appData.icsActive) {\r
+           hInput = GetDlgItem(hwndConsole, OPT_ConsoleInput);\r
+           hText  = GetDlgItem(hwndConsole, OPT_ConsoleText);\r
+       }\r
+       if(engineOutputDialog && EngineOutputIsUp()) {\r
+           e1 = GetDlgItem(engineOutputDialog, IDC_EngineMemo1);\r
+           e2 = GetDlgItem(engineOutputDialog, IDC_EngineMemo2);\r
+       }\r
+       if(moveHistoryDialog && MoveHistoryIsUp()) {\r
+           mh = GetDlgItem(moveHistoryDialog, IDC_MoveHistory);\r
+       }\r
+       if(msg.hwnd == hwndMain) currentElement = 7 ; else\r
+       if(msg.hwnd == engineOutputDialog) currentElement = 2; else\r
+       if(msg.hwnd == e1)                 currentElement = 2; else\r
+       if(msg.hwnd == e2)                 currentElement = 3; else\r
+       if(msg.hwnd == moveHistoryDialog) currentElement = 4; else\r
+       if(msg.hwnd == mh)                currentElement = 4; else\r
+       if(msg.hwnd == evalGraphDialog)    currentElement = 6; else\r
+       if(msg.hwnd == hText)  currentElement = 5; else\r
+       if(msg.hwnd == hInput) currentElement = 6; else\r
+       for (i = 0; i < N_BUTTONS; i++) {\r
+           if (buttonDesc[i].hwnd == msg.hwnd) { currentElement = 1; break; }\r
+       }\r
+\r
+       // determine where to go to\r
+       if(currentElement) { HWND h = NULL; int direction = GetKeyState(VK_SHIFT) < 0 ? -1 : 1;\r
+         do {\r
+           currentElement = (currentElement + direction) % 7;\r
+           switch(currentElement) {\r
+               case 0:\r
+                 h = hwndMain; break; // passing this case always makes the loop exit\r
+               case 1:\r
+                 h = buttonDesc[0].hwnd; break; // could be NULL\r
+               case 2:\r
+                 if(!EngineOutputIsUp()) continue; // skip closed auxiliary windows\r
+                 h = e1; break;\r
+               case 3:\r
+                 if(!EngineOutputIsUp()) continue;\r
+                 h = e2; break;\r
+               case 4:\r
+                 if(!MoveHistoryIsUp()) continue;\r
+                 h = mh; break;\r
+//             case 6: // input to eval graph does not seem to get here!\r
+//               if(!EvalGraphIsUp()) continue;\r
+//               h = evalGraphDialog; break;\r
+               case 5:\r
+                 if(!appData.icsActive) continue;\r
+                 SAY("display");\r
+                 h = hText; break;\r
+               case 6:\r
+                 if(!appData.icsActive) continue;\r
+                 SAY("input");\r
+                 h = hInput; break;\r
+           }\r
+         } while(h == 0);\r
+\r
+         if(currentElement > 4 && IsIconic(hwndConsole)) ShowWindow(hwndConsole, SW_RESTORE);\r
+         if(currentElement < 5 && IsIconic(hwndMain))    ShowWindow(hwndMain, SW_RESTORE); // all open together\r
+         SetFocus(h);\r
+\r
+         continue; // this message now has been processed\r
+       }\r
       }\r
 \r
       if (!(commentDialog && IsDialogMessage(commentDialog, &msg)) &&\r
           !(moveHistoryDialog && IsDialogMessage(moveHistoryDialog, &msg)) &&\r
           !(evalGraphDialog && IsDialogMessage(evalGraphDialog, &msg)) &&\r
           !(engineOutputDialog && IsDialogMessage(engineOutputDialog, &msg)) &&\r
-      !(editTagsDialog && IsDialogMessage(editTagsDialog, &msg)) &&\r
-      !(gameListDialog && IsDialogMessage(gameListDialog, &msg)) &&\r
-      !(errorDialog && IsDialogMessage(errorDialog, &msg)) &&\r
-      !(!frozen && TranslateAccelerator(hwndMain, hAccelMain, &msg)) && JAWS_ACCEL\r
+         !(editTagsDialog && IsDialogMessage(editTagsDialog, &msg)) &&\r
+         !(gameListDialog && IsDialogMessage(gameListDialog, &msg)) &&\r
+         !(errorDialog && IsDialogMessage(errorDialog, &msg)) &&\r
+         !(!frozen && TranslateAccelerator(hwndMain, hAccelMain, &msg)) && JAWS_ACCEL\r
           !(!hwndConsole && TranslateAccelerator(hwndMain, hAccelNoICS, &msg)) &&\r
-      !(!hwndConsole && TranslateAccelerator(hwndMain, hAccelNoAlt, &msg))) {\r
-    int done = 0, i; // [HGM] chat: dispatch cat-box messages\r
-    for(i=0; i<MAX_CHAT; i++)\r
-        if(chatHandle[i] && IsDialogMessage(chatHandle[i], &msg)) {\r
-        done = 1; break;\r
-    }\r
-    if(done) continue; // [HGM] chat: end patch\r
-    TranslateMessage(&msg); /* Translates virtual key codes */\r
-    DispatchMessage(&msg);  /* Dispatches message to window */\r
+         !(!hwndConsole && TranslateAccelerator(hwndMain, hAccelNoAlt, &msg))) {\r
+       int done = 0, i; // [HGM] chat: dispatch cat-box messages\r
+       for(i=0; i<MAX_CHAT; i++) \r
+           if(chatHandle[i] && IsDialogMessage(chatHandle[i], &msg)) {\r
+               done = 1; break;\r
+       }\r
+       if(done) continue; // [HGM] chat: end patch\r
+       TranslateMessage(&msg); /* Translates virtual key codes */\r
+       DispatchMessage(&msg);  /* Dispatches message to window */\r
       }\r
     }\r
 \r
 \r
-  return (msg.wParam);  /* Returns the value from PostQuitMessage */\r
+  return (msg.wParam); /* Returns the value from PostQuitMessage */\r
 }\r
 \r
 /*---------------------------------------------------------------------------*\\r
@@ -664,12 +664,12 @@ SetUserLogo()
     static char oldUserName[MSG_SIZ], *curName;\r
 \r
     if(appData.autoLogo) {\r
-      curName = UserName();\r
-      if(strcmp(curName, oldUserName)) {\r
-        sprintf(oldUserName, "logos\\%s.bmp", curName);\r
-        userLogo = LoadImage( 0, oldUserName, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE );\r
-        strcpy(oldUserName, curName);\r
-      }\r
+         curName = UserName();\r
+         if(strcmp(curName, oldUserName)) {\r
+               sprintf(oldUserName, "logos\\%s.bmp", curName);\r
+               userLogo = LoadImage( 0, oldUserName, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE );    \r
+               strcpy(oldUserName, curName);\r
+         }\r
     }\r
 }\r
 \r
@@ -682,15 +682,15 @@ InitApplication(HINSTANCE hInstance)
   /* main window. */\r
 \r
   wc.style         = CS_HREDRAW | CS_VREDRAW; /* Class style(s). */\r
-  wc.lpfnWndProc   = (WNDPROC)WndProc;  /* Window Procedure */\r
-  wc.cbClsExtra    = 0;         /* No per-class extra data. */\r
-  wc.cbWndExtra    = 0;         /* No per-window extra data. */\r
-  wc.hInstance     = hInstance;     /* Owner of this class */\r
+  wc.lpfnWndProc   = (WNDPROC)WndProc; /* Window Procedure */\r
+  wc.cbClsExtra    = 0;                        /* No per-class extra data. */\r
+  wc.cbWndExtra    = 0;                        /* No per-window extra data. */\r
+  wc.hInstance     = hInstance;                /* Owner of this class */\r
   wc.hIcon         = LoadIcon(hInstance, "icon_white");\r
-  wc.hCursor       = LoadCursor(NULL, IDC_ARROW);   /* Cursor */\r
-  wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);  /* Default color */\r
-  wc.lpszMenuName  = szAppName;         /* Menu name from .RC */\r
-  wc.lpszClassName = szAppName;         /* Name to register as */\r
+  wc.hCursor       = LoadCursor(NULL, IDC_ARROW);      /* Cursor */\r
+  wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); /* Default color */\r
+  wc.lpszMenuName  = szAppName;                        /* Menu name from .RC */\r
+  wc.lpszClassName = szAppName;                        /* Name to register as */\r
 \r
   /* Register the window class and return success/failure code. */\r
   if (!RegisterClass(&wc)) return FALSE;\r
@@ -733,7 +733,7 @@ InitInstance(HINSTANCE hInstance, int nCmdShow, LPSTR lpCmdLine)
   WINDOWPLACEMENT wp;\r
   char *filepart;\r
 \r
-  hInst = hInstance;    /* Store instance handle in our global variable */\r
+  hInst = hInstance;   /* Store instance handle in our global variable */\r
 \r
   if (SearchPath(NULL, "WinBoard.exe", NULL, MSG_SIZ, installDir, &filepart)) {\r
     *filepart = NULLCHAR;\r
@@ -755,9 +755,9 @@ InitInstance(HINSTANCE hInstance, int nCmdShow, LPSTR lpCmdLine)
 \r
   /* Create a main window for this application instance. */\r
   hwnd = CreateWindow(szAppName, szTitle,\r
-              (WS_OVERLAPPEDWINDOW & ~WS_MAXIMIZEBOX),\r
-              CW_USEDEFAULT, 0, CW_USEDEFAULT, 0,\r
-              NULL, NULL, hInstance, NULL);\r
+                     (WS_OVERLAPPEDWINDOW & ~WS_MAXIMIZEBOX),\r
+                     CW_USEDEFAULT, 0, CW_USEDEFAULT, 0,\r
+                     NULL, NULL, hInstance, NULL);\r
   hwndMain = hwnd;\r
 \r
   /* If window could not be created, return "failure" */\r
@@ -774,9 +774,9 @@ InitInstance(HINSTANCE hInstance, int nCmdShow, LPSTR lpCmdLine)
       }\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
-    first.programLogo = LoadImage( 0, buf, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE );\r
+       char buf[MSG_SIZ];\r
+       sprintf(buf, "%s/logo.bmp", appData.firstDirectory);\r
+       first.programLogo = LoadImage( 0, buf, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE );   \r
       }\r
   }\r
 \r
@@ -789,12 +789,12 @@ InitInstance(HINSTANCE hInstance, int nCmdShow, LPSTR lpCmdLine)
   } 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
-    second.programLogo = LoadImage( 0, buf, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE );\r
+       sprintf(buf, "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
-    second.programLogo = LoadImage( 0, buf, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE );\r
+       sprintf(buf, "%s\\logo.bmp", appData.secondDirectory);\r
+       second.programLogo = LoadImage( 0, buf, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE );  \r
       }\r
   }\r
 \r
@@ -824,7 +824,7 @@ InitInstance(HINSTANCE hInstance, int nCmdShow, LPSTR lpCmdLine)
 \r
   /* [AS] Load textures if specified */\r
   ZeroMemory( &backTextureSquareInfo, sizeof(backTextureSquareInfo) );\r
-\r
+  \r
   if( appData.liteBackTextureFile && appData.liteBackTextureFile[0] != NULLCHAR && appData.liteBackTextureFile[0] != '*' ) {\r
       liteBackTexture = LoadImage( 0, appData.liteBackTextureFile, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE );\r
       liteBackTextureMode = appData.liteBackTextureMode;\r
@@ -833,7 +833,7 @@ InitInstance(HINSTANCE hInstance, int nCmdShow, LPSTR lpCmdLine)
           fprintf( debugFP, "Unable to load lite texture bitmap '%s'\n", appData.liteBackTextureFile );\r
       }\r
   }\r
-\r
+  \r
   if( appData.darkBackTextureFile && appData.darkBackTextureFile[0] != NULLCHAR && appData.darkBackTextureFile[0] != '*' ) {\r
       darkBackTexture = LoadImage( 0, appData.darkBackTextureFile, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE );\r
       darkBackTextureMode = appData.darkBackTextureMode;\r
@@ -891,7 +891,7 @@ InitInstance(HINSTANCE hInstance, int nCmdShow, LPSTR lpCmdLine)
 \r
 \r
 typedef enum {\r
-  ArgString, ArgInt, ArgFloat, ArgBoolean, ArgTrue, ArgFalse, ArgNone,\r
+  ArgString, ArgInt, ArgFloat, ArgBoolean, ArgTrue, ArgFalse, ArgNone, \r
   ArgColor, ArgAttribs, ArgFilename, ArgBoardSize, ArgFont, ArgCommSettings,\r
   ArgSettingsFilename,\r
   ArgX, ArgY, ArgZ // [HGM] placement: for window-placement options stored relative to main window\r
@@ -1063,7 +1063,7 @@ ArgDescriptor argDescriptors[] = {
   { "popup", ArgTrue, (LPVOID) &appData.popupMoveErrors, FALSE },\r
   { "xpopup", ArgFalse, (LPVOID) &appData.popupMoveErrors, FALSE },\r
   { "-popup", ArgFalse, (LPVOID) &appData.popupMoveErrors, FALSE },\r
-  { "popUpErrors", ArgBoolean, (LPVOID) &appData.popupMoveErrors,\r
+  { "popUpErrors", ArgBoolean, (LPVOID) &appData.popupMoveErrors, \r
     FALSE }, /* only so that old WinBoard.ini files from betas can be read */\r
   { "clockFont", ArgFont, (LPVOID) CLOCK_FONT, TRUE },\r
   { "messageFont", ArgFont, (LPVOID) MESSAGE_FONT, TRUE },\r
@@ -1105,10 +1105,6 @@ ArgDescriptor argDescriptors[] = {
   { "autoraise", ArgTrue, (LPVOID) &appData.autoRaiseBoard, FALSE },\r
   { "xautoraise", ArgFalse, (LPVOID) &appData.autoRaiseBoard, FALSE },\r
   { "-autoraise", ArgFalse, (LPVOID) &appData.autoRaiseBoard, FALSE },\r
-#if 0\r
-  { "cmailGameName", ArgString, (LPVOID) &appData.cmailGameName, FALSE },\r
-  { "cmail", ArgString, (LPVOID) &appData.cmailGameName, FALSE },\r
-#endif\r
   { "alwaysPromoteToQueen", ArgBoolean, (LPVOID) &appData.alwaysPromoteToQueen, TRUE },\r
   { "queen", ArgTrue, (LPVOID) &appData.alwaysPromoteToQueen, FALSE },\r
   { "xqueen", ArgFalse, (LPVOID) &appData.alwaysPromoteToQueen, FALSE },\r
@@ -1212,13 +1208,13 @@ ArgDescriptor argDescriptors[] = {
   { "soundMove", ArgFilename, (LPVOID) &sounds[(int)SoundMove].name, TRUE },\r
   { "soundBell", ArgFilename, (LPVOID) &sounds[(int)SoundBell].name, TRUE },\r
   { "soundIcsWin", ArgFilename, (LPVOID) &sounds[(int)SoundIcsWin].name,TRUE },\r
-  { "soundIcsLoss", ArgFilename,\r
+  { "soundIcsLoss", ArgFilename, \r
     (LPVOID) &sounds[(int)SoundIcsLoss].name, TRUE },\r
-  { "soundIcsDraw", ArgFilename,\r
+  { "soundIcsDraw", ArgFilename, \r
     (LPVOID) &sounds[(int)SoundIcsDraw].name, TRUE },\r
-  { "soundIcsUnfinished", ArgFilename,\r
+  { "soundIcsUnfinished", ArgFilename, \r
     (LPVOID) &sounds[(int)SoundIcsUnfinished].name, TRUE},\r
-  { "soundIcsAlarm", ArgFilename,\r
+  { "soundIcsAlarm", ArgFilename, \r
     (LPVOID) &sounds[(int)SoundAlarm].name, TRUE },\r
   { "reuseFirst", ArgBoolean, (LPVOID) &appData.reuseFirst, FALSE },\r
   { "reuse", ArgTrue, (LPVOID) &appData.reuseFirst, FALSE },\r
@@ -1301,7 +1297,7 @@ ArgDescriptor argDescriptors[] = {
   { "polyglotDir", ArgFilename, (LPVOID) &appData.polyglotDir, TRUE },\r
   { "usePolyglotBook", ArgBoolean, (LPVOID) &appData.usePolyglotBook, TRUE },\r
   { "polyglotBook", ArgFilename, (LPVOID) &appData.polyglotBook, TRUE },\r
-  { "defaultHashSize", ArgInt, (LPVOID) &appData.defaultHashSize, TRUE },\r
+  { "defaultHashSize", ArgInt, (LPVOID) &appData.defaultHashSize, TRUE }, \r
   { "defaultCacheSizeEGTB", ArgInt, (LPVOID) &appData.defaultCacheSizeEGTB, TRUE },\r
   { "defaultPathEGTB", ArgFilename, (LPVOID) &appData.defaultPathEGTB, TRUE },\r
 \r
@@ -1396,7 +1392,10 @@ ArgDescriptor argDescriptors[] = {
   { "firstNPS", ArgInt, (LPVOID) &appData.firstNPS, FALSE },\r
   { "secondNPS", ArgInt, (LPVOID) &appData.secondNPS, FALSE },\r
   { "noGUI", ArgTrue, (LPVOID) &appData.noGUI, FALSE },\r
-\r
+  { "keepLineBreaksICS", ArgBoolean, (LPVOID) &appData.noJoin, TRUE },\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
@@ -1486,7 +1485,7 @@ ParseFontName(char *name, MyFontParams *mfp)
     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
@@ -1497,6 +1496,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
@@ -1510,7 +1513,7 @@ ParseColorName(char *name)
 \r
   count = sscanf(name, "#%2x%2x%2x", &red, &green, &blue);\r
   if (count != 3) {\r
-    count = sscanf(name, "%3d%*[^0-9]%3d%*[^0-9]%3d",\r
+    count = sscanf(name, "%3d%*[^0-9]%3d%*[^0-9]%3d", \r
       &red, &green, &blue);\r
   }\r
   if (count != 3) {\r
@@ -1624,17 +1627,17 @@ ParseArgs(GetFunc get, void *cl)
       /* Switch */\r
       q = argName;\r
       while (ch != ' ' && ch != '=' && ch != ':' && ch != NULLCHAR &&\r
-         ch != '\n' && ch != '\t') {\r
-    *q++ = ch;\r
-    ch = get(cl);\r
+            ch != '\n' && ch != '\t') {\r
+       *q++ = ch;\r
+       ch = get(cl);\r
       }\r
       *q = NULLCHAR;\r
 \r
       for (ad = argDescriptors; ad->argName != NULL; ad++)\r
-    if (strcmp(ad->argName, argName + 1) == 0) break;\r
+       if (strcmp(ad->argName, argName + 1) == 0) break;\r
 \r
       if (ad->argName == NULL)\r
-    ExitArgError("Unrecognized argument", argName);\r
+       ExitArgError("Unrecognized argument", argName);\r
 \r
     } else if (ch == '@') {\r
       /* Indirection file */\r
@@ -1666,104 +1669,104 @@ ParseArgs(GetFunc get, void *cl)
       start = ch;\r
       ch = get(cl);\r
       while (start) {\r
-    switch (ch) {\r
-    case NULLCHAR:\r
-      start = NULLCHAR;\r
-      break;\r
-\r
-    case '}':\r
-      ch = get(cl);\r
-      start = NULLCHAR;\r
-      break;\r
-\r
-    default:\r
-      *q++ = ch;\r
-      ch = get(cl);\r
-      break;\r
-    }\r
-      }\r
+       switch (ch) {\r
+       case NULLCHAR:\r
+         start = NULLCHAR;\r
+         break;\r
+         \r
+       case '}':\r
+         ch = get(cl);\r
+         start = NULLCHAR;\r
+         break;\r
+\r
+       default:\r
+         *q++ = ch;\r
+         ch = get(cl);\r
+         break;\r
+       }\r
+      }          \r
     } else if (ch == '\'' || ch == '"') {\r
       // Quoting with ' ' or " ", with \ as escape character.\r
       // Inconvenient for long strings that may contain Windows filenames.\r
       start = ch;\r
       ch = get(cl);\r
       while (start) {\r
-    switch (ch) {\r
-    case NULLCHAR:\r
-      start = NULLCHAR;\r
-      break;\r
+       switch (ch) {\r
+       case NULLCHAR:\r
+         start = NULLCHAR;\r
+         break;\r
 \r
-    default:\r
+       default:\r
         not_special:\r
-      *q++ = ch;\r
-      ch = get(cl);\r
-      break;\r
-\r
-    case '\'':\r
-    case '\"':\r
-      if (ch == start) {\r
-        ch = get(cl);\r
-        start = NULLCHAR;\r
-        break;\r
-      } else {\r
-        goto not_special;\r
-      }\r
-\r
-    case '\\':\r
+         *q++ = ch;\r
+         ch = get(cl);\r
+         break;\r
+\r
+       case '\'':\r
+       case '\"':\r
+         if (ch == start) {\r
+           ch = get(cl);\r
+           start = NULLCHAR;\r
+           break;\r
+         } else {\r
+           goto not_special;\r
+         }\r
+\r
+       case '\\':\r
           if (ad->argType == ArgFilename\r
-          || ad->argType == ArgSettingsFilename) {\r
-          goto not_special;\r
-      }\r
-      ch = get(cl);\r
-      switch (ch) {\r
-      case NULLCHAR:\r
-        ExitArgError("Incomplete \\ escape in value for", argName);\r
-        break;\r
-      case 'n':\r
-        *q++ = '\n';\r
-        ch = get(cl);\r
-        break;\r
-      case 'r':\r
-        *q++ = '\r';\r
-        ch = get(cl);\r
-        break;\r
-      case 't':\r
-        *q++ = '\t';\r
-        ch = get(cl);\r
-        break;\r
-      case 'b':\r
-        *q++ = '\b';\r
-        ch = get(cl);\r
-        break;\r
-      case 'f':\r
-        *q++ = '\f';\r
-        ch = get(cl);\r
-        break;\r
-      default:\r
-        octval = 0;\r
-        for (i = 0; i < 3; i++) {\r
-          if (ch >= '0' && ch <= '7') {\r
-        octval = octval*8 + (ch - '0');\r
-        ch = get(cl);\r
-          } else {\r
-        break;\r
-          }\r
-        }\r
-        if (i > 0) {\r
-          *q++ = (char) octval;\r
-        } else {\r
-          *q++ = ch;\r
-          ch = get(cl);\r
-        }\r
-        break;\r
-      }\r
-      break;\r
-    }\r
+             || ad->argType == ArgSettingsFilename) {\r
+             goto not_special;\r
+         }\r
+         ch = get(cl);\r
+         switch (ch) {\r
+         case NULLCHAR:\r
+           ExitArgError("Incomplete \\ escape in value for", argName);\r
+           break;\r
+         case 'n':\r
+           *q++ = '\n';\r
+           ch = get(cl);\r
+           break;\r
+         case 'r':\r
+           *q++ = '\r';\r
+           ch = get(cl);\r
+           break;\r
+         case 't':\r
+           *q++ = '\t';\r
+           ch = get(cl);\r
+           break;\r
+         case 'b':\r
+           *q++ = '\b';\r
+           ch = get(cl);\r
+           break;\r
+         case 'f':\r
+           *q++ = '\f';\r
+           ch = get(cl);\r
+           break;\r
+         default:\r
+           octval = 0;\r
+           for (i = 0; i < 3; i++) {\r
+             if (ch >= '0' && ch <= '7') {\r
+               octval = octval*8 + (ch - '0');\r
+               ch = get(cl);\r
+             } else {\r
+               break;\r
+             }\r
+           }\r
+           if (i > 0) {\r
+             *q++ = (char) octval;\r
+           } else {\r
+             *q++ = ch;\r
+             ch = get(cl);\r
+           }\r
+           break;\r
+         }\r
+         break;\r
+       }\r
       }\r
     } else {\r
       while (ch != ' ' && ch != NULLCHAR && ch != '\t' && ch != '\n') {\r
-    *q++ = ch;\r
-    ch = get(cl);\r
+       *q++ = ch;\r
+       ch = get(cl);\r
       }\r
     }\r
     *q = NULLCHAR;\r
@@ -1774,7 +1777,7 @@ 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) + boardX; // [HGM] placement: translate stored relative to absolute \r
       break;\r
 \r
     case ArgY:\r
@@ -1783,7 +1786,7 @@ ParseArgs(GetFunc get, void *cl)
 \r
     case ArgZ:\r
       *(int *) ad->argLoc = atoi(argValue);\r
-      EnsureOnScreen(&boardX, &boardY, minX, minY);\r
+      EnsureOnScreen(&boardX, &boardY, minX, minY); \r
       break;\r
 \r
     case ArgFloat:\r
@@ -1797,17 +1800,17 @@ ParseArgs(GetFunc get, void *cl)
 \r
     case ArgSettingsFilename:\r
       {\r
-    char fullname[MSG_SIZ];\r
-    if (ParseSettingsFile(argValue, fullname)) {\r
-      if (ad->argLoc != NULL) {\r
-        *(char **) ad->argLoc = strdup(fullname);\r
-      }\r
-    } else {\r
-      if (ad->argLoc != NULL) {\r
-      } else {\r
-        ExitArgError("Failed to open indirection file", argValue);\r
-      }\r
-    }\r
+       char fullname[MSG_SIZ];\r
+       if (ParseSettingsFile(argValue, fullname)) {\r
+         if (ad->argLoc != NULL) {\r
+           *(char **) ad->argLoc = strdup(fullname);\r
+         }\r
+       } else {\r
+         if (ad->argLoc != NULL) {\r
+         } else {\r
+           ExitArgError("Failed to open indirection file", argValue);\r
+         }\r
+       }\r
       }\r
       break;\r
 \r
@@ -1815,15 +1818,15 @@ ParseArgs(GetFunc get, void *cl)
       switch (argValue[0]) {\r
       case 't':\r
       case 'T':\r
-    *(Boolean *) ad->argLoc = TRUE;\r
-    break;\r
+       *(Boolean *) ad->argLoc = TRUE;\r
+       break;\r
       case 'f':\r
       case 'F':\r
-    *(Boolean *) ad->argLoc = FALSE;\r
-    break;\r
+       *(Boolean *) ad->argLoc = FALSE;\r
+       break;\r
       default:\r
-    ExitArgError("Unrecognized boolean argument value", argValue);\r
-    break;\r
+       ExitArgError("Unrecognized boolean argument value", argValue);\r
+       break;\r
       }\r
       break;\r
 \r
@@ -1836,7 +1839,7 @@ ParseArgs(GetFunc get, void *cl)
       ParseAttribs(&textAttribs[cc].color, &textAttribs[cc].effects, argValue);\r
       }\r
       break;\r
-\r
+      \r
     case ArgBoardSize:\r
       *(BoardSize *)ad->argLoc = ParseBoardSize(argValue);\r
       break;\r
@@ -1871,7 +1874,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
@@ -1892,9 +1895,9 @@ SetDefaultTextAttribs()
 {\r
   ColorClass cc;\r
   for (cc = (ColorClass)0; cc < NColorClasses; cc++) {\r
-    ParseAttribs(&textAttribs[cc].color,\r
-         &textAttribs[cc].effects,\r
-             defaultTextAttribs[cc]);\r
+    ParseAttribs(&textAttribs[cc].color, \r
+                &textAttribs[cc].effects, \r
+                defaultTextAttribs[cc]);\r
   }\r
 }\r
 \r
@@ -2049,16 +2052,16 @@ InitAppData(LPSTR lpCmdLine)
   saveSettingsOnExit = TRUE;\r
   boardX = CW_USEDEFAULT;\r
   boardY = CW_USEDEFAULT;\r
-  analysisX = CW_USEDEFAULT;\r
-  analysisY = 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
+  commentX = CW_USEDEFAULT; \r
+  commentY = CW_USEDEFAULT; \r
   commentW = CW_USEDEFAULT;\r
   commentH = CW_USEDEFAULT;\r
-  editTagsX = CW_USEDEFAULT;\r
-  editTagsY = CW_USEDEFAULT;\r
+  editTagsX = CW_USEDEFAULT; \r
+  editTagsY = CW_USEDEFAULT; \r
   editTagsW = CW_USEDEFAULT;\r
   editTagsH = CW_USEDEFAULT;\r
   icsTextMenuString = ICS_TEXT_MENU_DEFAULT;\r
@@ -2180,7 +2183,7 @@ InitAppData(LPSTR lpCmdLine)
       ParseFontName(font[j][i]->def, &font[j][i]->mfp);\r
     }\r
   }\r
-\r
+  \r
   /* Parse default settings file if any */\r
   if (ParseSettingsFile(settingsFileName, buf)) {\r
     settingsFileName = strdup(buf);\r
@@ -2235,7 +2238,7 @@ InitAppData(LPSTR lpCmdLine)
       (chessProgram && (*appData.firstChessProgram == NULLCHAR ||\r
                         *appData.secondChessProgram == NULLCHAR))) {\r
     FARPROC lpProc;\r
-\r
+    \r
     lpProc = MakeProcInstance((FARPROC)StartupDialog, hInst);\r
     DialogBox(hInst, MAKEINTRESOURCE(DLG_Startup), NULL, (DLGPROC)lpProc);\r
     FreeProcInstance(lpProc);\r
@@ -2293,12 +2296,12 @@ InitMenuChecks()
   HMENU hmenu = GetMenu(hwndMain);\r
 \r
   (void) EnableMenuItem(hmenu, IDM_CommPort,\r
-            MF_BYCOMMAND|((appData.icsActive &&\r
-                       *appData.icsCommPort != NULLCHAR) ?\r
-                      MF_ENABLED : MF_GRAYED));\r
+                       MF_BYCOMMAND|((appData.icsActive &&\r
+                                      *appData.icsCommPort != NULLCHAR) ?\r
+                                     MF_ENABLED : MF_GRAYED));\r
   (void) CheckMenuItem(hmenu, IDM_SaveSettingsOnExit,\r
-               MF_BYCOMMAND|(saveSettingsOnExit ?\r
-                     MF_CHECKED : MF_UNCHECKED));\r
+                      MF_BYCOMMAND|(saveSettingsOnExit ?\r
+                                    MF_CHECKED : MF_UNCHECKED));\r
 }\r
 \r
 \r
@@ -2375,7 +2378,7 @@ SaveSettings(char* name)
 \r
   /* [AS] Move history */\r
   wpMoveHistory.visible = MoveHistoryIsUp();\r
-\r
+  \r
   if( moveHistoryDialog ) {\r
     GetWindowPlacement(moveHistoryDialog, &wp);\r
     wpMoveHistory.x = wp.rcNormalPosition.left;\r
@@ -2411,28 +2414,28 @@ SaveSettings(char* name)
     switch (ad->argType) {\r
     case ArgString:\r
       {\r
-    char *p = *(char **)ad->argLoc;\r
-    if ((strchr(p, '\\') || strchr(p, '\n')) && !strchr(p, '}')) {\r
-      /* Quote multiline values or \-containing values\r
-         with { } if possible */\r
-      fprintf(f, "/%s={%s}\n", ad->argName, p);\r
-    } else {\r
-      /* Else quote with " " */\r
-      fprintf(f, "/%s=\"", ad->argName);\r
-      while (*p) {\r
-        if (*p == '\n') fprintf(f, "\n");\r
-        else if (*p == '\r') fprintf(f, "\\r");\r
-        else if (*p == '\t') fprintf(f, "\\t");\r
-        else if (*p == '\b') fprintf(f, "\\b");\r
-        else if (*p == '\f') fprintf(f, "\\f");\r
-        else if (*p < ' ') fprintf(f, "\\%03o", *p);\r
-        else if (*p == '\"') fprintf(f, "\\\"");\r
-        else if (*p == '\\') fprintf(f, "\\\\");\r
-        else putc(*p, f);\r
-        p++;\r
-      }\r
-      fprintf(f, "\"\n");\r
-    }\r
+       char *p = *(char **)ad->argLoc;\r
+       if ((strchr(p, '\\') || strchr(p, '\n')) && !strchr(p, '}')) {\r
+         /* Quote multiline values or \-containing values\r
+            with { } if possible */\r
+         fprintf(f, "/%s={%s}\n", ad->argName, p);\r
+       } else {\r
+         /* Else quote with " " */\r
+         fprintf(f, "/%s=\"", ad->argName);\r
+         while (*p) {\r
+           if (*p == '\n') fprintf(f, "\n");\r
+           else if (*p == '\r') fprintf(f, "\\r");\r
+           else if (*p == '\t') fprintf(f, "\\t");\r
+           else if (*p == '\b') fprintf(f, "\\b");\r
+           else if (*p == '\f') fprintf(f, "\\f");\r
+           else if (*p < ' ') fprintf(f, "\\%03o", *p);\r
+           else if (*p == '\"') fprintf(f, "\\\"");\r
+           else if (*p == '\\') fprintf(f, "\\\\");\r
+           else putc(*p, f);\r
+           p++;\r
+         }\r
+         fprintf(f, "\"\n");\r
+       }\r
       }\r
       break;\r
     case ArgInt:\r
@@ -2449,8 +2452,8 @@ SaveSettings(char* name)
       fprintf(f, "/%s=%g\n", ad->argName, *(float *)ad->argLoc);\r
       break;\r
     case ArgBoolean:\r
-      fprintf(f, "/%s=%s\n", ad->argName,\r
-    (*(Boolean *)ad->argLoc) ? "true" : "false");\r
+      fprintf(f, "/%s=%s\n", ad->argName, \r
+       (*(Boolean *)ad->argLoc) ? "true" : "false");\r
       break;\r
     case ArgTrue:\r
       if (*(Boolean *)ad->argLoc) fprintf(f, "/%s\n", ad->argName);\r
@@ -2460,48 +2463,49 @@ SaveSettings(char* name)
       break;\r
     case ArgColor:\r
       {\r
-    COLORREF color = *(COLORREF *)ad->argLoc;\r
-    fprintf(f, "/%s=#%02lx%02lx%02lx\n", ad->argName,\r
-      color&0xff, (color>>8)&0xff, (color>>16)&0xff);\r
+       COLORREF color = *(COLORREF *)ad->argLoc;\r
+       fprintf(f, "/%s=#%02lx%02lx%02lx\n", ad->argName, \r
+         color&0xff, (color>>8)&0xff, (color>>16)&0xff);\r
       }\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
+       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
+         ta->color&0xff, (ta->color >> 8)&0xff, (ta->color >> 16)&0xff);\r
       }\r
       break;\r
     case ArgFilename:\r
       if (strchr(*(char **)ad->argLoc, '\"')) {\r
-    fprintf(f, "/%s='%s'\n", ad->argName, *(char **)ad->argLoc);\r
+       fprintf(f, "/%s='%s'\n", ad->argName, *(char **)ad->argLoc);\r
       } else {\r
-    fprintf(f, "/%s=\"%s\"\n", ad->argName, *(char **)ad->argLoc);\r
+       fprintf(f, "/%s=\"%s\"\n", ad->argName, *(char **)ad->argLoc);\r
       }\r
       break;\r
     case ArgBoardSize:\r
       fprintf(f, "/%s=%s\n", ad->argName,\r
-          sizeInfo[*(BoardSize *)ad->argLoc].name);\r
+             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
+       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
+         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
-    }\r
+           mfp->bold ? "b" : "",\r
+           mfp->italic ? "i" : "",\r
+           mfp->underline ? "u" : "",\r
+           mfp->strikeout ? "s" : "",\r
+            (int)mfp->charset);\r
+       }\r
       }\r
       break;\r
     case ArgCommSettings:\r
@@ -2587,43 +2591,43 @@ static void DrawTile( int dx, int dy, int dw, int dh, HDC dst, HDC src, int mode
 \r
 /* [AS] [HGM] Make room for more piece types, so all pieces can be different */\r
 enum {\r
-    PM_WP = (int) WhitePawn,\r
-    PM_WN = (int) WhiteKnight,\r
-    PM_WB = (int) WhiteBishop,\r
-    PM_WR = (int) WhiteRook,\r
-    PM_WQ = (int) WhiteQueen,\r
-    PM_WF = (int) WhiteFerz,\r
-    PM_WW = (int) WhiteWazir,\r
-    PM_WE = (int) WhiteAlfil,\r
-    PM_WM = (int) WhiteMan,\r
-    PM_WO = (int) WhiteCannon,\r
-    PM_WU = (int) WhiteUnicorn,\r
-    PM_WH = (int) WhiteNightrider,\r
-    PM_WA = (int) WhiteAngel,\r
-    PM_WC = (int) WhiteMarshall,\r
-    PM_WAB = (int) WhiteCardinal,\r
-    PM_WD = (int) WhiteDragon,\r
-    PM_WL = (int) WhiteLance,\r
-    PM_WS = (int) WhiteCobra,\r
-    PM_WV = (int) WhiteFalcon,\r
-    PM_WSG = (int) WhiteSilver,\r
-    PM_WG = (int) WhiteGrasshopper,\r
+    PM_WP = (int) WhitePawn, \r
+    PM_WN = (int) WhiteKnight, \r
+    PM_WB = (int) WhiteBishop, \r
+    PM_WR = (int) WhiteRook, \r
+    PM_WQ = (int) WhiteQueen, \r
+    PM_WF = (int) WhiteFerz, \r
+    PM_WW = (int) WhiteWazir, \r
+    PM_WE = (int) WhiteAlfil, \r
+    PM_WM = (int) WhiteMan, \r
+    PM_WO = (int) WhiteCannon, \r
+    PM_WU = (int) WhiteUnicorn, \r
+    PM_WH = (int) WhiteNightrider, \r
+    PM_WA = (int) WhiteAngel, \r
+    PM_WC = (int) WhiteMarshall, \r
+    PM_WAB = (int) WhiteCardinal, \r
+    PM_WD = (int) WhiteDragon, \r
+    PM_WL = (int) WhiteLance, \r
+    PM_WS = (int) WhiteCobra, \r
+    PM_WV = (int) WhiteFalcon, \r
+    PM_WSG = (int) WhiteSilver, \r
+    PM_WG = (int) WhiteGrasshopper, \r
     PM_WK = (int) WhiteKing,\r
-    PM_BP = (int) BlackPawn,\r
-    PM_BN = (int) BlackKnight,\r
-    PM_BB = (int) BlackBishop,\r
-    PM_BR = (int) BlackRook,\r
-    PM_BQ = (int) BlackQueen,\r
-    PM_BF = (int) BlackFerz,\r
-    PM_BW = (int) BlackWazir,\r
-    PM_BE = (int) BlackAlfil,\r
+    PM_BP = (int) BlackPawn, \r
+    PM_BN = (int) BlackKnight, \r
+    PM_BB = (int) BlackBishop, \r
+    PM_BR = (int) BlackRook, \r
+    PM_BQ = (int) BlackQueen, \r
+    PM_BF = (int) BlackFerz, \r
+    PM_BW = (int) BlackWazir, \r
+    PM_BE = (int) BlackAlfil, \r
     PM_BM = (int) BlackMan,\r
-    PM_BO = (int) BlackCannon,\r
-    PM_BU = (int) BlackUnicorn,\r
-    PM_BH = (int) BlackNightrider,\r
-    PM_BA = (int) BlackAngel,\r
-    PM_BC = (int) BlackMarshall,\r
-    PM_BG = (int) BlackGrasshopper,\r
+    PM_BO = (int) BlackCannon, \r
+    PM_BU = (int) BlackUnicorn, \r
+    PM_BH = (int) BlackNightrider, \r
+    PM_BA = (int) BlackAngel, \r
+    PM_BC = (int) BlackMarshall, \r
+    PM_BG = (int) BlackGrasshopper, \r
     PM_BAB = (int) BlackCardinal,\r
     PM_BD = (int) BlackDragon,\r
     PM_BL = (int) BlackLance,\r
@@ -2638,9 +2642,9 @@ static HBITMAP hPieceMask[(int) EmptySquare];
 static HBITMAP hPieceFace[(int) EmptySquare];\r
 static int fontBitmapSquareSize = 0;\r
 static char pieceToFontChar[(int) EmptySquare] =\r
-                              { 'p', 'n', 'b', 'r', 'q',\r
+                              { 'p', 'n', 'b', 'r', 'q', \r
                       'n', 'b', 'p', 'n', 'b', 'r', 'b', 'r', 'q', 'k',\r
-                      'k', 'o', 'm', 'v', 't', 'w',\r
+                      'k', 'o', 'm', 'v', 't', 'w', \r
                       'v', 't', 'o', 'm', 'v', 't', 'v', 't', 'w', 'l',\r
                                                               'l' };\r
 \r
@@ -2663,7 +2667,7 @@ static void SetPieceBackground( HDC hdc, COLORREF color, int mode )
     SetRect( &rc, 0, 0, squareSize, squareSize );\r
     FillRect( hdc, &rc, hbrush );\r
     DeleteObject( hbrush );\r
-\r
+    \r
     if( mode == 1 ) {\r
         /* Vertical gradient, good for pawn, knight and rook, less for queen and king */\r
         int steps = squareSize / 2;\r
@@ -2726,9 +2730,9 @@ static void CreatePieceMaskFromFont( HDC hdc_window, HDC hdc, int index )
     RECT rc;\r
     SIZE sz;\r
     POINT pt;\r
-    int backColor = whitePieceColor;\r
+    int backColor = whitePieceColor; \r
     int foreColor = blackPieceColor;\r
-\r
+    \r
     if( index < (int)BlackPawn && appData.fontBackColorWhite != appData.fontForeColorWhite ) {\r
         backColor = appData.fontBackColorWhite;\r
         foreColor = appData.fontForeColorWhite;\r
@@ -2769,7 +2773,7 @@ static void CreatePieceMaskFromFont( HDC hdc_window, HDC hdc, int index )
     ExtFloodFill( hdc, squareSize-1, 0, 0, FLOODFILLSURFACE );\r
     ExtFloodFill( hdc, squareSize-1, squareSize-1, 0, FLOODFILLSURFACE );\r
     SelectObject( hdc, GetStockObject(BLACK_BRUSH) );\r
-    /*\r
+    /* \r
         Step 4: this is the tricky part, the area inside the piece is filled with black,\r
         but if the start point is not inside the piece we're lost!\r
         There should be a better way to do this... if we could create a region or path\r
@@ -2794,7 +2798,7 @@ static void CreatePieceMaskFromFont( HDC hdc_window, HDC hdc, int index )
     }\r
 \r
     SetTextColor( hdc, 0 );\r
-    /*\r
+    /* \r
         Step 5: some fonts have "disconnected" areas that are skipped by the fill:\r
         draw the piece again in black for safety.\r
     */\r
@@ -2822,8 +2826,8 @@ static void CreatePieceMaskFromFont( HDC hdc_window, HDC hdc, int index )
         SelectObject( dc2, bm2 );\r
         FillRect( dc2, &rc, GetStockObject(WHITE_BRUSH) );\r
         BitBlt( dc2, 0, 0, squareSize, squareSize, dc1, 0, 0, SRCINVERT );\r
-\r
-        /*\r
+        \r
+        /* \r
             Now dc2 contains the inverse of the piece mask, i.e. a mask that preserves\r
             the piece background and deletes (makes transparent) the rest.\r
             Thanks to that mask, we are free to paint the background with the greates\r
@@ -3040,57 +3044,10 @@ void CreatePiecesFromFont()
 \r
             /* Create bitmaps */\r
             hfont_old = SelectObject( hdc, hPieceFont );\r
-#if 0\r
-            CreatePieceMaskFromFont( hdc_window, hdc, PM_WP );\r
-            CreatePieceMaskFromFont( hdc_window, hdc, PM_WN );\r
-            CreatePieceMaskFromFont( hdc_window, hdc, PM_WB );\r
-            CreatePieceMaskFromFont( hdc_window, hdc, PM_WR );\r
-            CreatePieceMaskFromFont( hdc_window, hdc, PM_WQ );\r
-            CreatePieceMaskFromFont( hdc_window, hdc, PM_WK );\r
-            CreatePieceMaskFromFont( hdc_window, hdc, PM_BP );\r
-            CreatePieceMaskFromFont( hdc_window, hdc, PM_BN );\r
-            CreatePieceMaskFromFont( hdc_window, hdc, PM_BB );\r
-            CreatePieceMaskFromFont( hdc_window, hdc, PM_BR );\r
-            CreatePieceMaskFromFont( hdc_window, hdc, PM_BQ );\r
-            CreatePieceMaskFromFont( hdc_window, hdc, PM_BK );\r
-\r
-            CreatePieceMaskFromFont( hdc_window, hdc, PM_WA );\r
-            CreatePieceMaskFromFont( hdc_window, hdc, PM_WC );\r
-            CreatePieceMaskFromFont( hdc_window, hdc, PM_WF );\r
-            CreatePieceMaskFromFont( hdc_window, hdc, PM_WH );\r
-            CreatePieceMaskFromFont( hdc_window, hdc, PM_WE );\r
-            CreatePieceMaskFromFont( hdc_window, hdc, PM_WW );\r
-            CreatePieceMaskFromFont( hdc_window, hdc, PM_WU );\r
-            CreatePieceMaskFromFont( hdc_window, hdc, PM_WO );\r
-            CreatePieceMaskFromFont( hdc_window, hdc, PM_WG );\r
-            CreatePieceMaskFromFont( hdc_window, hdc, PM_WM );\r
-            CreatePieceMaskFromFont( hdc_window, hdc, PM_WSG );\r
-            CreatePieceMaskFromFont( hdc_window, hdc, PM_WV );\r
-            CreatePieceMaskFromFont( hdc_window, hdc, PM_WAB );\r
-            CreatePieceMaskFromFont( hdc_window, hdc, PM_WD );\r
-            CreatePieceMaskFromFont( hdc_window, hdc, PM_WL );\r
-            CreatePieceMaskFromFont( hdc_window, hdc, PM_WS );\r
-            CreatePieceMaskFromFont( hdc_window, hdc, PM_BA );\r
-            CreatePieceMaskFromFont( hdc_window, hdc, PM_BC );\r
-            CreatePieceMaskFromFont( hdc_window, hdc, PM_BF );\r
-            CreatePieceMaskFromFont( hdc_window, hdc, PM_BH );\r
-            CreatePieceMaskFromFont( hdc_window, hdc, PM_BE );\r
-            CreatePieceMaskFromFont( hdc_window, hdc, PM_BW );\r
-            CreatePieceMaskFromFont( hdc_window, hdc, PM_BU );\r
-            CreatePieceMaskFromFont( hdc_window, hdc, PM_BO );\r
-            CreatePieceMaskFromFont( hdc_window, hdc, PM_BG );\r
-            CreatePieceMaskFromFont( hdc_window, hdc, PM_BM );\r
-            CreatePieceMaskFromFont( hdc_window, hdc, PM_BSG );\r
-            CreatePieceMaskFromFont( hdc_window, hdc, PM_BV );\r
-            CreatePieceMaskFromFont( hdc_window, hdc, PM_BAB );\r
-            CreatePieceMaskFromFont( hdc_window, hdc, PM_BD );\r
-            CreatePieceMaskFromFont( hdc_window, hdc, PM_BL );\r
-            CreatePieceMaskFromFont( hdc_window, hdc, PM_BS );\r
-#else\r
-        for(i=(int)WhitePawn; i<(int)EmptySquare; i++) /* [HGM] made a loop for this */\r
-        if(PieceToChar((ChessSquare)i) != '.')     /* skip unused pieces         */\r
-            CreatePieceMaskFromFont( hdc_window, hdc, i );\r
-#endif\r
+           for(i=(int)WhitePawn; i<(int)EmptySquare; i++) /* [HGM] made a loop for this */\r
+               if(PieceToChar((ChessSquare)i) != '.')     /* skip unused pieces         */\r
+                   CreatePieceMaskFromFont( hdc_window, hdc, i );\r
+\r
             SelectObject( hdc, hfont_old );\r
 \r
             fontBitmapSquareSize = squareSize;\r
@@ -3155,7 +3112,7 @@ InitDrawingColors()
      */\r
     pLogPal = (NPLOGPALETTE)\r
       LocalAlloc(LMEM_FIXED, (sizeof(LOGPALETTE) +\r
-                  (sizeof(PALETTEENTRY) * (PALETTESIZE))));\r
+                             (sizeof(PALETTEENTRY) * (PALETTESIZE))));\r
     pLogPal->palVersion    = 0x300;\r
   }\r
   pLogPal->palNumEntries = 0;\r
@@ -3209,11 +3166,11 @@ ResizeBoard(int newSizeX, int newSizeY, int flags)
   if (recurse > 0) return;\r
   recurse++;\r
   while (newSize > 0) {\r
-    InitDrawingSizes(newSize+1000, 0); // [HGM] kludge to update sizeInfo without visible effects\r
-    if(newSizeX >= sizeInfo[newSize].cliWidth &&\r
-       newSizeY >= sizeInfo[newSize].cliHeight) break;\r
+       InitDrawingSizes(newSize+1000, 0); // [HGM] kludge to update sizeInfo without visible effects\r
+       if(newSizeX >= sizeInfo[newSize].cliWidth &&\r
+          newSizeY >= sizeInfo[newSize].cliHeight) break;\r
     newSize--;\r
-  }\r
+  } \r
   boardSize = newSize;\r
   InitDrawingSizes(boardSize, flags);\r
   recurse--;\r
@@ -3263,7 +3220,7 @@ InitDrawingSizes(BoardSize boardSize, int flags)
     if (tinyLayout) {\r
       style &= ~WS_SYSMENU;\r
       InsertMenu(hmenu, IDM_Exit, MF_BYCOMMAND, IDM_Minimize,\r
-         "&Minimize\tCtrl+F4");\r
+                "&Minimize\tCtrl+F4");\r
     } else {\r
       style |= WS_SYSMENU;\r
       RemoveMenu(hmenu, IDM_Minimize, MF_BYCOMMAND);\r
@@ -3271,8 +3228,8 @@ InitDrawingSizes(BoardSize boardSize, int flags)
     SetWindowLong(hwndMain, GWL_STYLE, style);\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
+      ModifyMenu(hmenu, i, MF_STRING|MF_BYPOSITION|MF_POPUP, \r
+       (UINT)GetSubMenu(hmenu, i), menuBarText[tinyLayout][i]);\r
     }\r
     DrawMenuBar(hwndMain);\r
   }\r
@@ -3298,16 +3255,16 @@ InitDrawingSizes(BoardSize boardSize, int flags)
   /* Compute where everything goes */\r
   if((first.programLogo || second.programLogo) && !tinyLayout) {\r
         /* [HGM] logo: if either logo is on, reserve space for it */\r
-    logoHeight =  2*clockSize.cy;\r
-    leftLogoRect.left   = OUTER_MARGIN;\r
-    leftLogoRect.right  = leftLogoRect.left + 4*clockSize.cy;\r
-    leftLogoRect.top    = OUTER_MARGIN;\r
-    leftLogoRect.bottom = OUTER_MARGIN + logoHeight;\r
+       logoHeight =  2*clockSize.cy;\r
+       leftLogoRect.left   = OUTER_MARGIN;\r
+       leftLogoRect.right  = leftLogoRect.left + 4*clockSize.cy;\r
+       leftLogoRect.top    = OUTER_MARGIN;\r
+       leftLogoRect.bottom = OUTER_MARGIN + logoHeight;\r
 \r
-    rightLogoRect.right  = OUTER_MARGIN + boardWidth;\r
-    rightLogoRect.left   = rightLogoRect.right - 4*clockSize.cy;\r
-    rightLogoRect.top    = OUTER_MARGIN;\r
-    rightLogoRect.bottom = OUTER_MARGIN + logoHeight;\r
+       rightLogoRect.right  = OUTER_MARGIN + boardWidth;\r
+       rightLogoRect.left   = rightLogoRect.right - 4*clockSize.cy;\r
+       rightLogoRect.top    = OUTER_MARGIN;\r
+       rightLogoRect.bottom = OUTER_MARGIN + logoHeight;\r
 \r
 \r
     whiteRect.left = leftLogoRect.right;\r
@@ -3358,7 +3315,7 @@ InitDrawingSizes(BoardSize boardSize, int flags)
   winHeight = winH; //       without disturbing window attachments\r
   GetWindowRect(hwndMain, &wrect);\r
   SetWindowPos(hwndMain, NULL, 0, 0, winWidth, winHeight,\r
-           SWP_NOCOPYBITS|SWP_NOZORDER|SWP_NOMOVE);\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
@@ -3373,22 +3330,22 @@ InitDrawingSizes(BoardSize boardSize, int flags)
   winHeight += offby;\r
   switch (flags) {\r
   case WMSZ_TOPLEFT:\r
-    SetWindowPos(hwndMain, NULL,\r
-                 wrect.right - winWidth, wrect.bottom - winHeight,\r
+    SetWindowPos(hwndMain, NULL, \r
+                 wrect.right - winWidth, wrect.bottom - winHeight, \r
                  winWidth, winHeight, 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
+    SetWindowPos(hwndMain, NULL, \r
+                 wrect.left, wrect.bottom - winHeight, \r
                  winWidth, winHeight, 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
+    SetWindowPos(hwndMain, NULL, \r
+                 wrect.right - winWidth, wrect.top, \r
                  winWidth, winHeight, SWP_NOCOPYBITS|SWP_NOZORDER);\r
     break;\r
 \r
@@ -3409,21 +3366,21 @@ InitDrawingSizes(BoardSize boardSize, int flags)
     }\r
     if (appData.showButtonBar) {\r
       buttonDesc[i].hwnd =\r
-    CreateWindow("BUTTON", buttonDesc[i].label,\r
-             WS_VISIBLE | WS_CHILD | BS_PUSHBUTTON,\r
-             boardRect.right - BUTTON_WIDTH*(N_BUTTONS-i),\r
-             messageRect.top, BUTTON_WIDTH, messageSize.cy, hwndMain,\r
-             (HMENU) buttonDesc[i].id,\r
-             (HINSTANCE) GetWindowLong(hwndMain, GWL_HINSTANCE), NULL);\r
+       CreateWindow("BUTTON", buttonDesc[i].label,\r
+                    WS_VISIBLE | WS_CHILD | BS_PUSHBUTTON,\r
+                    boardRect.right - BUTTON_WIDTH*(N_BUTTONS-i),\r
+                    messageRect.top, BUTTON_WIDTH, messageSize.cy, hwndMain,\r
+                    (HMENU) buttonDesc[i].id,\r
+                    (HINSTANCE) GetWindowLong(hwndMain, GWL_HINSTANCE), NULL);\r
       if (tinyLayout) {\r
-    SendMessage(buttonDesc[i].hwnd, WM_SETFONT,\r
-            (WPARAM)font[boardSize][MESSAGE_FONT]->hf,\r
-            MAKELPARAM(FALSE, 0));\r
+       SendMessage(buttonDesc[i].hwnd, WM_SETFONT, \r
+                   (WPARAM)font[boardSize][MESSAGE_FONT]->hf,\r
+                   MAKELPARAM(FALSE, 0));\r
       }\r
       if (buttonDesc[i].id == IDM_Pause)\r
-    hwndPause = buttonDesc[i].hwnd;\r
+       hwndPause = buttonDesc[i].hwnd;\r
       buttonDesc[i].wndproc = (WNDPROC)\r
-    SetWindowLong(buttonDesc[i].hwnd, GWL_WNDPROC, (LONG) ButtonProc);\r
+       SetWindowLong(buttonDesc[i].hwnd, GWL_WNDPROC, (LONG) ButtonProc);\r
     }\r
   }\r
   if (gridPen != NULL) DeleteObject(gridPen);\r
@@ -3440,7 +3397,7 @@ InitDrawingSizes(BoardSize boardSize, int flags)
       ExtCreatePen(PS_GEOMETRIC|PS_SOLID|PS_ENDCAP_FLAT|PS_JOIN_MITER,\r
                    lineGap, &logbrush, 0, NULL);\r
 \r
-    logbrush.lbColor = premoveHighlightColor;\r
+    logbrush.lbColor = premoveHighlightColor; \r
     premovePen =\r
       ExtCreatePen(PS_GEOMETRIC|PS_SOLID|PS_ENDCAP_FLAT|PS_JOIN_MITER,\r
                    lineGap, &logbrush, 0, NULL);\r
@@ -3449,7 +3406,7 @@ InitDrawingSizes(BoardSize boardSize, int flags)
     for (i = 0; i < BOARD_HEIGHT + 1; i++) {\r
       gridEndpoints[i*2].x = boardRect.left + lineGap / 2;\r
       gridEndpoints[i*2].y = gridEndpoints[i*2 + 1].y =\r
-    boardRect.top + lineGap / 2 + (i * (squareSize + lineGap));\r
+       boardRect.top + lineGap / 2 + (i * (squareSize + lineGap));\r
       gridEndpoints[i*2 + 1].x = boardRect.left + lineGap / 2 +\r
         BOARD_WIDTH * (squareSize + lineGap);\r
       gridVertexCounts[i*2] = gridVertexCounts[i*2 + 1] = 2;\r
@@ -3458,7 +3415,7 @@ InitDrawingSizes(BoardSize boardSize, int flags)
       gridEndpoints[i*2 + BOARD_HEIGHT*2 + 2].y = boardRect.top + lineGap / 2;\r
       gridEndpoints[i*2 + BOARD_HEIGHT*2 + 2].x =\r
         gridEndpoints[i*2 + 1 + BOARD_HEIGHT*2 + 2].x = boardRect.left +\r
-    lineGap / 2 + (i * (squareSize + lineGap));\r
+       lineGap / 2 + (i * (squareSize + lineGap));\r
       gridEndpoints[i*2 + 1 + BOARD_HEIGHT*2 + 2].y =\r
         boardRect.top + BOARD_HEIGHT * (squareSize + lineGap);\r
       gridVertexCounts[i*2] = gridVertexCounts[i*2 + 1] = 2;\r
@@ -3481,9 +3438,9 @@ InitDrawingSizes(BoardSize boardSize, int flags)
   for (i=0; i<=2; i++) {\r
     for (piece = WhitePawn;\r
          (int) piece < (int) BlackPawn;\r
-     piece = (ChessSquare) ((int) piece + 1)) {\r
+        piece = (ChessSquare) ((int) piece + 1)) {\r
       if (pieceBitmap[i][piece] != NULL)\r
-    DeleteObject(pieceBitmap[i][piece]);\r
+       DeleteObject(pieceBitmap[i][piece]);\r
     }\r
   }\r
 \r
@@ -3515,7 +3472,7 @@ InitDrawingSizes(BoardSize boardSize, int flags)
     pieceBitmap[2][WhiteQueen] = DoLoadBitmap(hInst, "q", squareSize, "w");\r
   }\r
 \r
-  if(squareSize <= 72 && squareSize >= 33) {\r
+  if(squareSize <= 72 && squareSize >= 33) { \r
     /* A & C are available in most sizes now */\r
     if(squareSize != 49 && squareSize != 72 && squareSize != 33) { // Vortex-like\r
       pieceBitmap[0][WhiteAngel] = DoLoadBitmap(hInst, "a", squareSize, "s");\r
@@ -3748,7 +3705,7 @@ DrawCoordsOnDC(HDC hdc)
     str[0] = ranks[start + i];\r
     ExtTextOut(hdc, x + squareSize - 2, y - 1, 0, NULL, str, 1, NULL);\r
     x += squareSize + lineGap;\r
-  }\r
+  }    \r
 \r
   SelectObject(hdc, oldBrush);\r
   SetBkMode(hdc, oldMode);\r
@@ -3760,7 +3717,7 @@ VOID
 DrawGridOnDC(HDC hdc)\r
 {\r
   HPEN oldPen;\r
-\r
\r
   if (lineGap != 0) {\r
     oldPen = SelectObject(hdc, gridPen);\r
     PolyPolyline(hdc, gridEndpoints, gridVertexCounts, BOARD_WIDTH+BOARD_HEIGHT + 2);\r
@@ -3803,18 +3760,18 @@ DrawHighlightsOnDC(HDC hdc)
 {\r
   int i;\r
   for (i=0; i<2; i++) {\r
-    if (highlightInfo.sq[i].x >= 0 && highlightInfo.sq[i].y >= 0)\r
+    if (highlightInfo.sq[i].x >= 0 && highlightInfo.sq[i].y >= 0) \r
       DrawHighlightOnDC(hdc, TRUE,\r
-            highlightInfo.sq[i].x, highlightInfo.sq[i].y,\r
-            HIGHLIGHT_PEN);\r
+                       highlightInfo.sq[i].x, highlightInfo.sq[i].y,\r
+                       HIGHLIGHT_PEN);\r
   }\r
   for (i=0; i<2; i++) {\r
-    if (premoveHighlightInfo.sq[i].x >= 0 &&\r
-    premoveHighlightInfo.sq[i].y >= 0) {\r
-    DrawHighlightOnDC(hdc, TRUE,\r
-              premoveHighlightInfo.sq[i].x,\r
-              premoveHighlightInfo.sq[i].y,\r
-              PREMOVE_PEN);\r
+    if (premoveHighlightInfo.sq[i].x >= 0 && \r
+       premoveHighlightInfo.sq[i].y >= 0) {\r
+       DrawHighlightOnDC(hdc, TRUE,\r
+                         premoveHighlightInfo.sq[i].x, \r
+                         premoveHighlightInfo.sq[i].y,\r
+                         PREMOVE_PEN);\r
     }\r
   }\r
 }\r
@@ -3862,10 +3819,10 @@ DrawPieceOnDC(HDC hdc, ChessSquare piece, int color, int sqcolor, int x, int y,
   }\r
 \r
   if (appData.monoMode) {\r
-    SelectObject(tmphdc, PieceBitmap(piece,\r
+    SelectObject(tmphdc, PieceBitmap(piece, \r
       color == sqcolor ? OUTLINE_PIECE : SOLID_PIECE));\r
     BitBlt(hdc, x, y, squareSize, squareSize, tmphdc, 0, 0,\r
-       sqcolor ? SRCCOPY : NOTSRCCOPY);\r
+          sqcolor ? SRCCOPY : NOTSRCCOPY);\r
   } else {\r
     tmpSize = squareSize;\r
     if(minorSize &&\r
@@ -3886,35 +3843,13 @@ DrawPieceOnDC(HDC hdc, ChessSquare piece, int color, int sqcolor, int x, int y,
         StretchBlt(hdc, x+tmpSize, y+tmpSize, -tmpSize, -tmpSize, tmphdc, 0, 0, tmpSize, tmpSize, 0x00B8074A);\r
       else\r
         BitBlt(hdc, x, y, tmpSize, tmpSize, tmphdc, 0, 0, 0x00B8074A);\r
-#if 0\r
-      /* Use black piece color for outline of white pieces */\r
-      /* Not sure this looks really good (though xboard does it).\r
-     Maybe better to have another selectable color, default black */\r
-      SelectObject(hdc, blackPieceBrush); /* could have own brush */\r
-      SelectObject(tmphdc, PieceBitmap(piece, OUTLINE_PIECE));\r
-      BitBlt(hdc, x, y, tmpSize, tmpSize, tmphdc, 0, 0, 0x00B8074A);\r
-#else\r
       /* Use black for outline of white pieces */\r
       SelectObject(tmphdc, PieceBitmap(piece, OUTLINE_PIECE));\r
       if(appData.upsideDown && color==flipView)\r
         StretchBlt(hdc, x+tmpSize, y+tmpSize, -tmpSize, -tmpSize, tmphdc, 0, 0, tmpSize, tmpSize, SRCAND);\r
       else\r
         BitBlt(hdc, x, y, tmpSize, tmpSize, tmphdc, 0, 0, SRCAND);\r
-#endif\r
     } else {\r
-#if 0\r
-      /* Use white piece color for details of black pieces */\r
-      /* Requires filled-in solid bitmaps (BLACK_PIECE class); the\r
-     WHITE_PIECE ones aren't always the right shape. */\r
-      /* Not sure this looks really good (though xboard does it).\r
-     Maybe better to have another selectable color, default medium gray? */\r
-      oldBitmap = SelectObject(tmphdc, PieceBitmap(piece, BLACK_PIECE));\r
-      oldBrush = SelectObject(hdc, whitePieceBrush); /* could have own brush */\r
-      BitBlt(hdc, x, y, tmpSize, tmpSize, tmphdc, 0, 0, 0x00B8074A);\r
-      SelectObject(tmphdc, PieceBitmap(piece, SOLID_PIECE));\r
-      SelectObject(hdc, blackPieceBrush);\r
-      BitBlt(hdc, x, y, tmpSize, tmpSize, tmphdc, 0, 0, 0x00B8074A);\r
-#else\r
       /* Use square color for details of black pieces */\r
       oldBitmap = SelectObject(tmphdc, PieceBitmap(piece, SOLID_PIECE));\r
       oldBrush = SelectObject(hdc, blackPieceBrush);\r
@@ -3922,7 +3857,6 @@ DrawPieceOnDC(HDC hdc, ChessSquare piece, int color, int sqcolor, int x, int y,
         StretchBlt(hdc, x+tmpSize, y+tmpSize, -tmpSize, -tmpSize, tmphdc, 0, 0, tmpSize, tmpSize, 0x00B8074A);\r
       else\r
         BitBlt(hdc, x, y, tmpSize, tmpSize, tmphdc, 0, 0, 0x00B8074A);\r
-#endif\r
     }\r
     SelectObject(hdc, oldBrush);\r
     SelectObject(tmphdc, oldBitmap);\r
@@ -3934,7 +3868,7 @@ int GetBackTextureMode( int algo )
 {\r
     int result = BACK_TEXTURE_MODE_DISABLED;\r
 \r
-    switch( algo )\r
+    switch( algo ) \r
     {\r
         case BACK_TEXTURE_MODE_PLAIN:\r
             result = 1; /* Always use identity map */\r
@@ -3947,7 +3881,7 @@ int GetBackTextureMode( int algo )
     return result;\r
 }\r
 \r
-/*\r
+/* \r
     [AS] Compute and save texture drawing info, otherwise we may not be able\r
     to handle redraws cleanly (as random numbers would always be different).\r
 */\r
@@ -4074,7 +4008,7 @@ VOID DrawArrowBetweenPoints( HDC hdc, int s_x, int s_y, int d_x, int d_y )
         /* [AS] Needed a lot of paper for this! :-) */\r
         dy = (double) (d_y - s_y) / (double) (d_x - s_x);\r
         dx = (double) (s_x - d_x) / (double) (s_y - d_y);\r
-\r
+  \r
         j = sqrt( Sqr(A_WIDTH) / (1.0 + Sqr(dx)) );\r
 \r
         k = sqrt( Sqr(A_WIDTH*A_HEIGHT_FACTOR) / (1.0 + Sqr(dy)) );\r
@@ -4234,8 +4168,8 @@ HRGN GetArrowHighlightClipRegion( HDC hdc )
 }\r
 \r
 /*\r
-    Warning: this function modifies the behavior of several other functions.\r
-\r
+    Warning: this function modifies the behavior of several other functions. \r
+    \r
     Basically, Winboard is optimized to avoid drawing the whole board if not strictly\r
     needed. Unfortunately, the decision whether or not to perform a full or partial\r
     repaint is scattered all over the place, which is not good for features such as\r
@@ -4247,7 +4181,7 @@ HRGN GetArrowHighlightClipRegion( HDC hdc )
 \r
     In such patched places, I always try refer to this function so there is a single\r
     place to maintain knowledge.\r
-\r
+    \r
     To restore the original behavior, just return FALSE unconditionally.\r
 */\r
 BOOL IsFullRepaintPreferrable()\r
@@ -4262,19 +4196,19 @@ BOOL IsFullRepaintPreferrable()
     return result;\r
 }\r
 \r
-/*\r
+/* \r
     This function is called by DrawPosition to know whether a full repaint must\r
     be forced or not.\r
 \r
-    Only DrawPosition may directly call this function, which makes use of\r
-    some state information. Other function should call DrawPosition specifying\r
+    Only DrawPosition may directly call this function, which makes use of \r
+    some state information. Other function should call DrawPosition specifying \r
     the repaint flag, and can use IsFullRepaintPreferrable if needed.\r
 */\r
 BOOL DrawPositionNeedsFullRepaint()\r
 {\r
     BOOL result = FALSE;\r
 \r
-    /*\r
+    /* \r
         Probably a slightly better policy would be to trigger a full repaint\r
         when animInfo.piece changes state (i.e. empty -> non-empty and viceversa),\r
         but animation is fast enough that it's difficult to notice.\r
@@ -4299,9 +4233,9 @@ DrawBoardOnDC(HDC hdc, Board board, HDC tmphdc)
   /* [AS] Initialize background textures if needed */\r
   if( liteBackTexture != NULL || darkBackTexture != NULL ) {\r
       static int backTextureBoardSize; /* [HGM] boardsize: also new texture if board format changed */\r
-      if( backTextureSquareSize != squareSize\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_SIZE*BOARD_HEIGHT;\r
           backTextureSquareSize = squareSize;\r
           RebuildTextureSquareInfo();\r
       }\r
@@ -4311,7 +4245,7 @@ DrawBoardOnDC(HDC hdc, Board board, HDC tmphdc)
 \r
   for (row = 0; row < BOARD_HEIGHT; row++) {\r
     for (column = 0; column < BOARD_WIDTH; column++) {\r
-\r
+  \r
       SquareToPos(row, column, &x, &y);\r
 \r
       piece = board[row][column];\r
@@ -4338,7 +4272,7 @@ DrawBoardOnDC(HDC hdc, Board board, HDC tmphdc)
             if( row < gameInfo.holdingsSize )\r
                 square_color = 1;\r
             else {\r
-                DisplayHoldingsCount(hdc, x, y, 0, 0);\r
+                DisplayHoldingsCount(hdc, x, y, 0, 0); \r
                 continue;\r
             }\r
       }\r
@@ -4350,20 +4284,20 @@ DrawBoardOnDC(HDC hdc, Board board, HDC tmphdc)
       if (appData.monoMode) {\r
         if (piece == EmptySquare) {\r
           BitBlt(hdc, x, y, squareSize, squareSize, 0, 0, 0,\r
-         square_color ? WHITENESS : BLACKNESS);\r
+                square_color ? WHITENESS : BLACKNESS);\r
         } else {\r
           DrawPieceOnDC(hdc, piece, piece_color, square_color, x, y, tmphdc);\r
         }\r
-      }\r
+      } \r
       else if( backTextureSquareInfo[row][column].mode > 0 ) {\r
           /* [AS] Draw the square using a texture bitmap */\r
           HBITMAP hbm = SelectObject( texture_hdc, square_color ? liteBackTexture : darkBackTexture );\r
-      int r = row, c = column; // [HGM] do not flip board in flipView\r
-      if(flipView) { r = BOARD_HEIGHT-1 - r; c = BOARD_WIDTH-1 - c; }\r
+         int r = row, c = column; // [HGM] do not flip board in flipView\r
+         if(flipView) { r = BOARD_HEIGHT-1 - r; c = BOARD_WIDTH-1 - c; }\r
 \r
-          DrawTile( x, y,\r
-              squareSize, squareSize,\r
-              hdc,\r
+          DrawTile( x, y, \r
+              squareSize, squareSize, \r
+              hdc, \r
               texture_hdc,\r
               backTextureSquareInfo[r][c].mode,\r
               backTextureSquareInfo[r][c].x,\r
@@ -4395,10 +4329,10 @@ DrawBoardOnDC(HDC hdc, Board board, HDC tmphdc)
 int saveDiagFlag = 0; FILE *diagFile; // [HGM] diag\r
 void fputDW(FILE *f, int x)\r
 {\r
-    fputc(x     & 255, f);\r
-    fputc(x>>8  & 255, f);\r
-    fputc(x>>16 & 255, f);\r
-    fputc(x>>24 & 255, f);\r
+       fputc(x     & 255, f);\r
+       fputc(x>>8  & 255, f);\r
+       fputc(x>>16 & 255, f);\r
+       fputc(x>>24 & 255, f);\r
 }\r
 \r
 #define MAX_CLIPS 200   /* more than enough */\r
@@ -4416,14 +4350,14 @@ DrawLogoOnDC(HDC hdc, RECT logoRect, HBITMAP logo)
   if(logo == NULL) return;\r
 //  GetClientRect(hwndMain, &Rect);\r
 //  bufferBitmap = CreateCompatibleBitmap(hdc, Rect.right-Rect.left+1,\r
-//                  Rect.bottom-Rect.top+1);\r
+//                                     Rect.bottom-Rect.top+1);\r
   tmphdc = CreateCompatibleDC(hdc);\r
   hbm = SelectObject(tmphdc, logo);\r
   if( GetObject( logo, sizeof(bi), &bi ) > 0 ) {\r
             w = bi.bmWidth;\r
             h = bi.bmHeight;\r
   }\r
-  StretchBlt(hdc, logoRect.left, logoRect.top, logoRect.right - logoRect.left,\r
+  StretchBlt(hdc, logoRect.left, logoRect.top, logoRect.right - logoRect.left, \r
                   logoRect.bottom - logoRect.top, tmphdc, 0, 0, w, h, SRCCOPY);\r
   SelectObject(tmphdc, hbm);\r
   DeleteDC(tmphdc);\r
@@ -4450,7 +4384,7 @@ HDCDrawPosition(HDC hdc, BOOLEAN repaint, Board board)
    * caller tell it that.  I think this can safely be set to FALSE - but\r
    * if we trust the callers not to request full repaints unnessesarily, then\r
    * we could skip some clipping work.  In other words, only request a full\r
-   * redraw when the majority of pieces have changed positions (ie. flip,\r
+   * redraw when the majority of pieces have changed positions (ie. flip, \r
    * gamestart and similar)  --Hawk\r
    */\r
   Boolean fullrepaint = repaint;\r
@@ -4459,17 +4393,6 @@ HDCDrawPosition(HDC hdc, BOOLEAN repaint, Board board)
       fullrepaint = TRUE;\r
   }\r
 \r
-#if 0\r
-  if( fullrepaint ) {\r
-      static int repaint_count = 0;\r
-      char buf[128];\r
-\r
-      repaint_count++;\r
-      sprintf( buf, "FULL repaint: %d\n", repaint_count );\r
-      OutputDebugString( buf );\r
-  }\r
-#endif\r
-\r
   if (board == NULL) {\r
     if (!lastReqValid) {\r
       return;\r
@@ -4499,35 +4422,6 @@ HDCDrawPosition(HDC hdc, BOOLEAN repaint, Board board)
     releaseDC = FALSE;\r
   }\r
 \r
-#if 0\r
-  fprintf(debugFP, "*******************************\n"\r
-                   "repaint = %s\n"\r
-                   "dragInfo.from (%d,%d)\n"\r
-                   "dragInfo.start (%d,%d)\n"\r
-                   "dragInfo.pos (%d,%d)\n"\r
-                   "dragInfo.lastpos (%d,%d)\n",\r
-                    repaint ? "TRUE" : "FALSE",\r
-                    dragInfo.from.x, dragInfo.from.y,\r
-                    dragInfo.start.x, dragInfo.start.y,\r
-                    dragInfo.pos.x, dragInfo.pos.y,\r
-                    dragInfo.lastpos.x, dragInfo.lastpos.y);\r
-  fprintf(debugFP, "prev:  ");\r
-  for (row = 0; row < BOARD_HEIGHT; row++) {\r
-    for (column = 0; column < BOARD_WIDTH; column++) {\r
-      fprintf(debugFP, "%d ", lastDrawn[row][column]);\r
-    }\r
-  }\r
-  fprintf(debugFP, "\n");\r
-  fprintf(debugFP, "board: ");\r
-  for (row = 0; row < BOARD_HEIGHT; row++) {\r
-    for (column = 0; column < BOARD_WIDTH; column++) {\r
-      fprintf(debugFP, "%d ", board[row][column]);\r
-    }\r
-  }\r
-  fprintf(debugFP, "\n");\r
-  fflush(debugFP);\r
-#endif\r
-\r
   /* Create some work-DCs */\r
   hdcmem = CreateCompatibleDC(hdc);\r
   tmphdc = CreateCompatibleDC(hdc);\r
@@ -4540,66 +4434,66 @@ HDCDrawPosition(HDC hdc, BOOLEAN repaint, Board board)
     if(dragInfo.from.x == BOARD_LEFT-2 ) {\r
             if(--board[dragInfo.from.y][dragInfo.from.x+1] == 0 )\r
         board[dragInfo.from.y][dragInfo.from.x] = EmptySquare;\r
-    } else\r
+    } else \r
     if(dragInfo.from.x == BOARD_RGHT+1) {\r
             if(--board[dragInfo.from.y][dragInfo.from.x-1] == 0 )\r
         board[dragInfo.from.y][dragInfo.from.x] = EmptySquare;\r
-    } else\r
+    } else \r
         board[dragInfo.from.y][dragInfo.from.x] = EmptySquare;\r
   }\r
 \r
-  /* Figure out which squares need updating by comparing the\r
+  /* Figure out which squares need updating by comparing the \r
    * newest board with the last drawn board and checking if\r
    * flipping has changed.\r
    */\r
   if (!fullrepaint && lastDrawnValid && lastDrawnFlipView == flipView) {\r
     for (row = 0; row < BOARD_HEIGHT; row++) { /* [HGM] true size, not 8 */\r
       for (column = 0; column < BOARD_WIDTH; column++) {\r
-    if (lastDrawn[row][column] != board[row][column]) {\r
-      SquareToPos(row, column, &x, &y);\r
-      clips[num_clips++] =\r
-        CreateRectRgn(x, y, x + squareSize, y + squareSize);\r
-    }\r
+       if (lastDrawn[row][column] != board[row][column]) {\r
+         SquareToPos(row, column, &x, &y);\r
+         clips[num_clips++] =\r
+           CreateRectRgn(x, y, x + squareSize, y + squareSize);\r
+       }\r
       }\r
     }\r
     for (i=0; i<2; i++) {\r
       if (lastDrawnHighlight.sq[i].x != highlightInfo.sq[i].x ||\r
-      lastDrawnHighlight.sq[i].y != highlightInfo.sq[i].y) {\r
-    if (lastDrawnHighlight.sq[i].x >= 0 &&\r
-        lastDrawnHighlight.sq[i].y >= 0) {\r
-      SquareToPos(lastDrawnHighlight.sq[i].y,\r
-              lastDrawnHighlight.sq[i].x, &x, &y);\r
-      clips[num_clips++] =\r
-        CreateRectRgn(x - lineGap, y - lineGap,\r
-                      x + squareSize + lineGap, y + squareSize + lineGap);\r
-    }\r
-    if (highlightInfo.sq[i].x >= 0 && highlightInfo.sq[i].y >= 0) {\r
-      SquareToPos(highlightInfo.sq[i].y, highlightInfo.sq[i].x, &x, &y);\r
-      clips[num_clips++] =\r
-        CreateRectRgn(x - lineGap, y - lineGap,\r
-                      x + squareSize + lineGap, y + squareSize + lineGap);\r
-    }\r
+         lastDrawnHighlight.sq[i].y != highlightInfo.sq[i].y) {\r
+       if (lastDrawnHighlight.sq[i].x >= 0 &&\r
+           lastDrawnHighlight.sq[i].y >= 0) {\r
+         SquareToPos(lastDrawnHighlight.sq[i].y,\r
+                     lastDrawnHighlight.sq[i].x, &x, &y);\r
+         clips[num_clips++] =\r
+           CreateRectRgn(x - lineGap, y - lineGap, \r
+                         x + squareSize + lineGap, y + squareSize + lineGap);\r
+       }\r
+       if (highlightInfo.sq[i].x >= 0 && highlightInfo.sq[i].y >= 0) {\r
+         SquareToPos(highlightInfo.sq[i].y, highlightInfo.sq[i].x, &x, &y);\r
+         clips[num_clips++] =\r
+           CreateRectRgn(x - lineGap, y - lineGap, \r
+                         x + squareSize + lineGap, y + squareSize + lineGap);\r
+       }\r
       }\r
     }\r
     for (i=0; i<2; i++) {\r
       if (lastDrawnPremove.sq[i].x != premoveHighlightInfo.sq[i].x ||\r
-      lastDrawnPremove.sq[i].y != premoveHighlightInfo.sq[i].y) {\r
-    if (lastDrawnPremove.sq[i].x >= 0 &&\r
-        lastDrawnPremove.sq[i].y >= 0) {\r
-      SquareToPos(lastDrawnPremove.sq[i].y,\r
-              lastDrawnPremove.sq[i].x, &x, &y);\r
-      clips[num_clips++] =\r
-        CreateRectRgn(x - lineGap, y - lineGap,\r
-                      x + squareSize + lineGap, y + squareSize + lineGap);\r
-    }\r
-    if (premoveHighlightInfo.sq[i].x >= 0 &&\r
-        premoveHighlightInfo.sq[i].y >= 0) {\r
-      SquareToPos(premoveHighlightInfo.sq[i].y,\r
-              premoveHighlightInfo.sq[i].x, &x, &y);\r
-      clips[num_clips++] =\r
-        CreateRectRgn(x - lineGap, y - lineGap,\r
-                      x + squareSize + lineGap, y + squareSize + lineGap);\r
-    }\r
+         lastDrawnPremove.sq[i].y != premoveHighlightInfo.sq[i].y) {\r
+       if (lastDrawnPremove.sq[i].x >= 0 &&\r
+           lastDrawnPremove.sq[i].y >= 0) {\r
+         SquareToPos(lastDrawnPremove.sq[i].y,\r
+                     lastDrawnPremove.sq[i].x, &x, &y);\r
+         clips[num_clips++] =\r
+           CreateRectRgn(x - lineGap, y - lineGap, \r
+                         x + squareSize + lineGap, y + squareSize + lineGap);\r
+       }\r
+       if (premoveHighlightInfo.sq[i].x >= 0 && \r
+           premoveHighlightInfo.sq[i].y >= 0) {\r
+         SquareToPos(premoveHighlightInfo.sq[i].y, \r
+                     premoveHighlightInfo.sq[i].x, &x, &y);\r
+         clips[num_clips++] =\r
+           CreateRectRgn(x - lineGap, y - lineGap, \r
+                         x + squareSize + lineGap, y + squareSize + lineGap);\r
+       }\r
       }\r
     }\r
   } else {\r
@@ -4613,7 +4507,7 @@ HDCDrawPosition(HDC hdc, BOOLEAN repaint, Board board)
    */\r
   GetClientRect(hwndMain, &Rect);\r
   bufferBitmap = CreateCompatibleBitmap(hdc, Rect.right-Rect.left+1,\r
-                    Rect.bottom-Rect.top+1);\r
+                                       Rect.bottom-Rect.top+1);\r
   oldBitmap = SelectObject(hdcmem, bufferBitmap);\r
   if (!appData.monoMode) {\r
     SelectPalette(hdcmem, hPal, FALSE);\r
@@ -4641,8 +4535,8 @@ HDCDrawPosition(HDC hdc, BOOLEAN repaint, Board board)
     }\r
   }\r
 \r
-  /* Are we animating a move?\r
-   * If so,\r
+  /* Are we animating a move?  \r
+   * If so, \r
    *   - remove the piece from the board (temporarely)\r
    *   - calculate the clipping region\r
    */\r
@@ -4655,12 +4549,12 @@ HDCDrawPosition(HDC hdc, BOOLEAN repaint, Board board)
       y2 = boardRect.top + animInfo.pos.y;\r
       clips[num_clips++] = CreateRectRgn(MIN(x,x2), MIN(y,y2), MAX(x,x2)+squareSize, MAX(y,y2)+squareSize);\r
       /* Slight kludge.  The real problem is that after AnimateMove is\r
-     done, the position on the screen does not match lastDrawn.\r
-     This currently causes trouble only on e.p. captures in\r
-     atomic, where the piece moves to an empty square and then\r
-     explodes.  The old and new positions both had an empty square\r
-     at the destination, but animation has drawn a piece there and\r
-     we have to remember to erase it. [HGM] moved until after setting lastDrawn */\r
+        done, the position on the screen does not match lastDrawn.\r
+        This currently causes trouble only on e.p. captures in\r
+        atomic, where the piece moves to an empty square and then\r
+        explodes.  The old and new positions both had an empty square\r
+        at the destination, but animation has drawn a piece there and\r
+        we have to remember to erase it. [HGM] moved until after setting lastDrawn */\r
       lastDrawn[animInfo.to.y][animInfo.to.x] = animInfo.piece;\r
     }\r
   }\r
@@ -4680,61 +4574,61 @@ HDCDrawPosition(HDC hdc, BOOLEAN repaint, Board board)
 \r
   /* Do all the drawing to the memory DC */\r
   if(explodeInfo.radius) { // [HGM] atomic\r
-    HBRUSH oldBrush;\r
-    int x, y, r=(explodeInfo.radius * squareSize)/100;\r
+       HBRUSH oldBrush;\r
+       int x, y, r=(explodeInfo.radius * squareSize)/100;\r
         board[explodeInfo.fromY][explodeInfo.fromX] = EmptySquare; // suppress display of capturer\r
-    SquareToPos(explodeInfo.toY, explodeInfo.toX, &x, &y);\r
-    x += squareSize/2;\r
-    y += squareSize/2;\r
+       SquareToPos(explodeInfo.toY, explodeInfo.toX, &x, &y);\r
+       x += squareSize/2;\r
+       y += squareSize/2;\r
         if(!fullrepaint) {\r
-      clips[num_clips] = CreateRectRgn(x-r, y-r, x+r, y+r);\r
-      ExtSelectClipRgn(hdcmem, clips[num_clips++], RGN_OR);\r
-    }\r
-    DrawGridOnDC(hdcmem);\r
-    DrawHighlightsOnDC(hdcmem);\r
-    DrawBoardOnDC(hdcmem, board, tmphdc);\r
-    oldBrush = SelectObject(hdcmem, explodeBrush);\r
-    Ellipse(hdcmem, x-r, y-r, x+r, y+r);\r
-    SelectObject(hdcmem, oldBrush);\r
+         clips[num_clips] = CreateRectRgn(x-r, y-r, x+r, y+r);\r
+         ExtSelectClipRgn(hdcmem, clips[num_clips++], RGN_OR);\r
+       }\r
+       DrawGridOnDC(hdcmem);\r
+       DrawHighlightsOnDC(hdcmem);\r
+       DrawBoardOnDC(hdcmem, board, tmphdc);\r
+       oldBrush = SelectObject(hdcmem, explodeBrush);\r
+       Ellipse(hdcmem, x-r, y-r, x+r, y+r);\r
+       SelectObject(hdcmem, oldBrush);\r
   } else {\r
     DrawGridOnDC(hdcmem);\r
     DrawHighlightsOnDC(hdcmem);\r
     DrawBoardOnDC(hdcmem, board, tmphdc);\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
+       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
@@ -4758,21 +4652,21 @@ HDCDrawPosition(HDC hdc, BOOLEAN repaint, Board board)
     x = dragInfo.pos.x - squareSize / 2;\r
     y = dragInfo.pos.y - squareSize / 2;\r
     DrawPieceOnDC(hdcmem, dragged_piece,\r
-          ((int) dragged_piece < (int) BlackPawn),\r
+                 ((int) dragged_piece < (int) BlackPawn), \r
                   (dragInfo.from.y + dragInfo.from.x) % 2, x, y, tmphdc);\r
-  }\r
-\r
+  }   \r
+  \r
   /* Put the animated piece back into place and draw it */\r
   if (animInfo.piece != EmptySquare) {\r
     board[animInfo.from.y][animInfo.from.x]  = animInfo.piece;\r
     x = boardRect.left + animInfo.pos.x;\r
     y = boardRect.top + animInfo.pos.y;\r
     DrawPieceOnDC(hdcmem, animInfo.piece,\r
-          ((int) animInfo.piece < (int) BlackPawn),\r
+                 ((int) animInfo.piece < (int) BlackPawn),\r
                   (animInfo.from.y + animInfo.from.x) % 2, x, y, tmphdc);\r
   }\r
 \r
-  /* Release the bufferBitmap by selecting in the old bitmap\r
+  /* Release the bufferBitmap by selecting in the old bitmap \r
    * and delete the memory DC\r
    */\r
   SelectObject(hdcmem, oldBitmap);\r
@@ -4784,7 +4678,7 @@ HDCDrawPosition(HDC hdc, BOOLEAN repaint, Board board)
     for (x = 1; x < num_clips; x++) {\r
       if (ExtSelectClipRgn(hdc, clips[x], RGN_OR) == ERROR)\r
         abort();   // this should never ever happen!\r
-    }\r
+    } \r
   }\r
 \r
   /* Copy the new bitmap onto the screen in one go.\r
@@ -4792,66 +4686,65 @@ HDCDrawPosition(HDC hdc, BOOLEAN repaint, Board board)
    */\r
   oldBitmap = SelectObject(tmphdc, bufferBitmap);\r
   BitBlt(hdc, boardRect.left, boardRect.top,\r
-     boardRect.right - boardRect.left,\r
-     boardRect.bottom - boardRect.top,\r
-     tmphdc, boardRect.left, boardRect.top, SRCCOPY);\r
-  if(saveDiagFlag) {\r
-    BITMAP b; int i, j=0, m, w, wb, fac=0; char pData[1000000];\r
+        boardRect.right - boardRect.left,\r
+        boardRect.bottom - boardRect.top,\r
+        tmphdc, boardRect.left, boardRect.top, SRCCOPY);\r
+  if(saveDiagFlag) { \r
+    BITMAP b; int i, j=0, m, w, wb, fac=0; char pData[1000000]; \r
     BITMAPINFOHEADER bih; int color[16], nrColors=0;\r
 \r
     GetObject(bufferBitmap, sizeof(b), &b);\r
     if(b.bmWidthBytes*b.bmHeight <= 990000) {\r
-    bih.biSize = sizeof(BITMAPINFOHEADER);\r
-    bih.biWidth = b.bmWidth;\r
-    bih.biHeight = b.bmHeight;\r
-    bih.biPlanes = 1;\r
-    bih.biBitCount = b.bmBitsPixel;\r
-    bih.biCompression = 0;\r
-    bih.biSizeImage = b.bmWidthBytes*b.bmHeight;\r
-    bih.biXPelsPerMeter = 0;\r
-    bih.biYPelsPerMeter = 0;\r
-    bih.biClrUsed = 0;\r
-    bih.biClrImportant = 0;\r
-//  fprintf(diagFile, "t=%d\nw=%d\nh=%d\nB=%d\nP=%d\nX=%d\n",\r
-//      b.bmType,  b.bmWidth,  b.bmHeight, b.bmWidthBytes,  b.bmPlanes,  b.bmBitsPixel);\r
-    GetDIBits(tmphdc,bufferBitmap,0,b.bmHeight,pData,(BITMAPINFO*)&bih,DIB_RGB_COLORS);\r
-//  fprintf(diagFile, "%8x\n", (int) pData);\r
-\r
-#if 1\r
-    wb = b.bmWidthBytes;\r
-    // count colors\r
-    for(i=0; i<wb*(b.bmHeight - boardRect.top + OUTER_MARGIN)>>2; i++) {\r
-        int k = ((int*) pData)[i];\r
-        for(j=0; j<nrColors; j++) if(color[j] == k) break;\r
-        if(j >= 16) break;\r
-        color[j] = k;\r
-        if(j >= nrColors) nrColors = j+1;\r
-    }\r
-    if(j<16) { // 16 colors is enough. Compress to 4 bits per pixel\r
-        INT p = 0;\r
-        for(i=0; i<b.bmHeight - boardRect.top + OUTER_MARGIN; i++) {\r
-            for(w=0; w<(wb>>2); w+=2) {\r
-            int k = ((int*) pData)[(wb*i>>2) + w];\r
-            for(j=0; j<nrColors; j++) if(color[j] == k) break;\r
-            k = ((int*) pData)[(wb*i>>2) + w + 1];\r
-            for(m=0; m<nrColors; m++) if(color[m] == k) break;\r
-            pData[p++] = m | j<<4;\r
-            }\r
-            while(p&3) pData[p++] = 0;\r
-        }\r
-        fac = 3;\r
-        wb = ((wb+31)>>5)<<2;\r
-    }\r
-    // write BITMAPFILEHEADER\r
-    fprintf(diagFile, "BM");\r
+       bih.biSize = sizeof(BITMAPINFOHEADER);\r
+       bih.biWidth = b.bmWidth;\r
+       bih.biHeight = b.bmHeight;\r
+       bih.biPlanes = 1;\r
+       bih.biBitCount = b.bmBitsPixel;\r
+       bih.biCompression = 0;\r
+       bih.biSizeImage = b.bmWidthBytes*b.bmHeight;\r
+       bih.biXPelsPerMeter = 0;\r
+       bih.biYPelsPerMeter = 0;\r
+       bih.biClrUsed = 0;\r
+       bih.biClrImportant = 0;\r
+//     fprintf(diagFile, "t=%d\nw=%d\nh=%d\nB=%d\nP=%d\nX=%d\n", \r
+//             b.bmType,  b.bmWidth,  b.bmHeight, b.bmWidthBytes,  b.bmPlanes,  b.bmBitsPixel);\r
+       GetDIBits(tmphdc,bufferBitmap,0,b.bmHeight,pData,(BITMAPINFO*)&bih,DIB_RGB_COLORS);\r
+//     fprintf(diagFile, "%8x\n", (int) pData);\r
+\r
+       wb = b.bmWidthBytes;\r
+       // count colors\r
+       for(i=0; i<wb*(b.bmHeight - boardRect.top + OUTER_MARGIN)>>2; i++) {\r
+               int k = ((int*) pData)[i];\r
+               for(j=0; j<nrColors; j++) if(color[j] == k) break;\r
+               if(j >= 16) break;\r
+               color[j] = k;\r
+               if(j >= nrColors) nrColors = j+1;\r
+       }\r
+       if(j<16) { // 16 colors is enough. Compress to 4 bits per pixel\r
+               INT p = 0;\r
+               for(i=0; i<b.bmHeight - boardRect.top + OUTER_MARGIN; i++) {\r
+                   for(w=0; w<(wb>>2); w+=2) {\r
+                       int k = ((int*) pData)[(wb*i>>2) + w];\r
+                       for(j=0; j<nrColors; j++) if(color[j] == k) break;\r
+                       k = ((int*) pData)[(wb*i>>2) + w + 1];\r
+                       for(m=0; m<nrColors; m++) if(color[m] == k) break;\r
+                       pData[p++] = m | j<<4;\r
+                   }\r
+                   while(p&3) pData[p++] = 0;\r
+               }\r
+               fac = 3;\r
+               wb = ((wb+31)>>5)<<2;\r
+       }\r
+       // write BITMAPFILEHEADER\r
+       fprintf(diagFile, "BM");\r
         fputDW(diagFile, wb*(b.bmHeight - boardRect.top + OUTER_MARGIN)+0x36 + (fac?64:0));\r
         fputDW(diagFile, 0);\r
         fputDW(diagFile, 0x36 + (fac?64:0));\r
-    // write BITMAPINFOHEADER\r
+       // write BITMAPINFOHEADER\r
         fputDW(diagFile, 40);\r
         fputDW(diagFile, b.bmWidth);\r
         fputDW(diagFile, b.bmHeight - boardRect.top + OUTER_MARGIN);\r
-    if(fac) fputDW(diagFile, 0x040001);   // planes and bits/pixel\r
+       if(fac) fputDW(diagFile, 0x040001);   // planes and bits/pixel\r
         else    fputDW(diagFile, 0x200001);   // planes and bits/pixel\r
         fputDW(diagFile, 0);\r
         fputDW(diagFile, 0);\r
@@ -4859,13 +4752,12 @@ HDCDrawPosition(HDC hdc, BOOLEAN repaint, Board board)
         fputDW(diagFile, 0);\r
         fputDW(diagFile, 0);\r
         fputDW(diagFile, 0);\r
-    // write color table\r
-    if(fac)\r
-    for(i=0; i<16; i++) fputDW(diagFile, color[i]);\r
-    // write bitmap data\r
-    for(i=0; i<wb*(b.bmHeight - boardRect.top + OUTER_MARGIN); i++)\r
-        fputc(pData[i], diagFile);\r
-#endif\r
+       // write color table\r
+       if(fac)\r
+       for(i=0; i<16; i++) fputDW(diagFile, color[i]);\r
+       // write bitmap data\r
+       for(i=0; i<wb*(b.bmHeight - boardRect.top + OUTER_MARGIN); i++) \r
+               fputc(pData[i], diagFile);\r
      }\r
   }\r
 \r
@@ -4878,9 +4770,9 @@ HDCDrawPosition(HDC hdc, BOOLEAN repaint, Board board)
   DeleteDC(tmphdc);\r
   DeleteObject(bufferBitmap);\r
 \r
-  if (releaseDC)\r
+  if (releaseDC) \r
     ReleaseDC(hwndMain, hdc);\r
-\r
+  \r
   if (lastDrawnFlipView != flipView) {\r
     if (flipView)\r
       CheckMenuItem(GetMenu(hwndMain),IDM_FlipView, MF_BYCOMMAND|MF_CHECKED);\r
@@ -4906,7 +4798,7 @@ SaveDiagram(f)
     saveDiagFlag = 0;\r
 \r
 //    if(f != NULL) fprintf(f, "Sorry, but this feature is still in preparation\n");\r
-\r
+    \r
     fclose(f);\r
     return TRUE;\r
 }\r
@@ -4929,15 +4821,15 @@ PaintProc(HWND hwnd)
       DrawIcon(hdc, 2, 2, iconCurrent);\r
     } else {\r
       if (!appData.monoMode) {\r
-    SelectPalette(hdc, hPal, FALSE);\r
-    RealizePalette(hdc);\r
+       SelectPalette(hdc, hPal, FALSE);\r
+       RealizePalette(hdc);\r
       }\r
       HDCDrawPosition(hdc, 1, NULL);\r
       oldFont =\r
-    SelectObject(hdc, font[boardSize][MESSAGE_FONT]->hf);\r
+       SelectObject(hdc, font[boardSize][MESSAGE_FONT]->hf);\r
       ExtTextOut(hdc, messageRect.left, messageRect.top,\r
-         ETO_CLIPPED|ETO_OPAQUE,\r
-         &messageRect, messageText, strlen(messageText), NULL);\r
+                ETO_CLIPPED|ETO_OPAQUE,\r
+                &messageRect, messageText, strlen(messageText), NULL);\r
       SelectObject(hdc, oldFont);\r
       DisplayBothClocks();\r
     }\r
@@ -4954,8 +4846,8 @@ PaintProc(HWND hwnd)
  * The offset boardRect.left or boardRect.top must already have been\r
  *   subtracted from x.\r
  */\r
-int\r
-EventToSquare(int x)\r
+int EventToSquare(x, limit)\r
+     int x;\r
 {\r
   if (x <= 0)\r
     return -2;\r
@@ -4965,7 +4857,7 @@ EventToSquare(int x)
   if ((x % (squareSize + lineGap)) >= squareSize)\r
     return -1;\r
   x /= (squareSize + lineGap);\r
-  if (x >= BOARD_SIZE)\r
+    if (x >= limit)\r
     return -2;\r
   return x;\r
 }\r
@@ -4994,19 +4886,37 @@ SetupDropMenu(HMENU hmenu)
 \r
   for (i=0; i<sizeof(dropEnables)/sizeof(DropEnable); i++) {\r
     p = strchr(gameMode == IcsPlayingWhite ? white_holding : black_holding,\r
-           dropEnables[i].piece);\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
     enable = count > 0 || !appData.testLegality\r
       /*!!temp:*/ || (gameInfo.variant == VariantCrazyhouse\r
-              && !appData.icsActive);\r
+                     && !appData.icsActive);\r
     ModifyMenu(hmenu, dropEnables[i].command,\r
-           MF_BYCOMMAND | (enable ? MF_ENABLED : MF_GRAYED) | MF_STRING,\r
-           dropEnables[i].command, item);\r
+              MF_BYCOMMAND | (enable ? MF_ENABLED : MF_GRAYED) | MF_STRING,\r
+              dropEnables[i].command, item);\r
   }\r
 }\r
 \r
+void DragPieceBegin(int x, int y)\r
+{\r
+      dragInfo.lastpos.x = boardRect.left + x;\r
+      dragInfo.lastpos.y = boardRect.top + y;\r
+      dragInfo.from.x = fromX;\r
+      dragInfo.from.y = fromY;\r
+      dragInfo.start = dragInfo.from;\r
+      SetCapture(hwndMain);\r
+}\r
+\r
+void DragPieceEnd(int x, int y)\r
+{\r
+    ReleaseCapture();\r
+    dragInfo.start.x = dragInfo.start.y = -1;\r
+    dragInfo.from = dragInfo.start;\r
+    dragInfo.pos = dragInfo.lastpos = dragInfo.start;\r
+}\r
+\r
 /* Event handler for mouse messages */\r
 VOID\r
 MouseEvent(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)\r
@@ -5015,28 +4925,24 @@ MouseEvent(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
   POINT pt;\r
   static int recursive = 0;\r
   HMENU hmenu;\r
-//  BOOLEAN needsRedraw = FALSE;\r
-  BOOLEAN saveAnimate;\r
   BOOLEAN forceFullRepaint = IsFullRepaintPreferrable(); /* [AS] */\r
-  static BOOLEAN sameAgain = FALSE, promotionChoice = FALSE;\r
-  ChessMove moveType;\r
 \r
   if (recursive) {\r
     if (message == WM_MBUTTONUP) {\r
       /* Hideous kludge to fool TrackPopupMenu into paying attention\r
-     to the middle button: we simulate pressing the left button too!\r
-     */\r
+        to the middle button: we simulate pressing the left button too!\r
+        */\r
       PostMessage(hwnd, WM_LBUTTONDOWN, wParam, lParam);\r
       PostMessage(hwnd, WM_LBUTTONUP, wParam, lParam);\r
     }\r
     return;\r
   }\r
   recursive++;\r
-\r
+  \r
   pt.x = LOWORD(lParam);\r
   pt.y = HIWORD(lParam);\r
-  x = EventToSquare(pt.x - boardRect.left);\r
-  y = EventToSquare(pt.y - boardRect.top);\r
+  x = EventToSquare(pt.x - boardRect.left, BOARD_WIDTH);\r
+  y = EventToSquare(pt.y - boardRect.top, BOARD_HEIGHT);\r
   if (!flipView && y >= 0) {\r
     y = BOARD_HEIGHT - 1 - y;\r
   }\r
@@ -5046,262 +4952,60 @@ MouseEvent(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
 \r
   switch (message) {\r
   case WM_LBUTTONDOWN:\r
-    if(promotionChoice) { // we are waiting for a click to indicate promotion piece\r
-    promotionChoice = FALSE; // only one chance: if click not OK it is interpreted as cancel\r
-    if(appData.debugMode) fprintf(debugFP, "promotion click, x=%d, y=%d\n", x, y);\r
-    if(gameInfo.holdingsWidth &&\r
-        (WhiteOnMove(currentMove)\r
-            ? x == BOARD_WIDTH-1 && y < gameInfo.holdingsSize && y > 0\r
-            : x == 0 && y >= BOARD_HEIGHT - gameInfo.holdingsSize && y < BOARD_HEIGHT-1) ) {\r
-        // click in right holdings, for determining promotion piece\r
-        ChessSquare p = boards[currentMove][y][x];\r
-        if(appData.debugMode) fprintf(debugFP, "square contains %d\n", (int)p);\r
-        if(p != EmptySquare) {\r
-        FinishMove(WhitePromotionQueen, fromX, fromY, toX, toY, ToLower(PieceToChar(p)));\r
-        fromX = fromY = -1;\r
-        break;\r
-        }\r
-    }\r
-    DrawPosition(FALSE, boards[currentMove]);\r
-    break;\r
-    }\r
-    ErrorPopDown();\r
-    sameAgain = FALSE;\r
-    if (y == -2) {\r
-      /* Downclick vertically off board; check if on clock */\r
       if (PtInRect((LPRECT) &whiteRect, pt)) {\r
         if (gameMode == EditPosition) {\r
-      SetWhiteToPlayEvent();\r
-    } else if (gameMode == IcsPlayingBlack ||\r
-           gameMode == MachinePlaysWhite) {\r
-      CallFlagEvent();\r
+         SetWhiteToPlayEvent();\r
+       } else if (gameMode == IcsPlayingBlack ||\r
+                  gameMode == MachinePlaysWhite) {\r
+         CallFlagEvent();\r
         } else if (gameMode == EditGame) {\r
           AdjustClock(flipClock, -1);\r
         }\r
       } else if (PtInRect((LPRECT) &blackRect, pt)) {\r
-    if (gameMode == EditPosition) {\r
-      SetBlackToPlayEvent();\r
-    } else if (gameMode == IcsPlayingWhite ||\r
-           gameMode == MachinePlaysBlack) {\r
-      CallFlagEvent();\r
+       if (gameMode == EditPosition) {\r
+         SetBlackToPlayEvent();\r
+       } else if (gameMode == IcsPlayingWhite ||\r
+                  gameMode == MachinePlaysBlack) {\r
+         CallFlagEvent();\r
         } else if (gameMode == EditGame) {\r
           AdjustClock(!flipClock, -1);\r
-    }\r
+       }\r
       }\r
-      if (!appData.highlightLastMove) {\r
-        ClearHighlights();\r
-    DrawPosition((int) (forceFullRepaint || FALSE), NULL);\r
-      }\r
-      fromX = fromY = -1;\r
-      dragInfo.start.x = dragInfo.start.y = -1;\r
-      dragInfo.from = dragInfo.start;\r
-      break;\r
-    } else if (x < 0 || y < 0\r
-      /* [HGM] block clicks between board and holdings */\r
-              || x == BOARD_LEFT-1 || x == BOARD_RGHT\r
-              || (x == BOARD_LEFT-2 && y < BOARD_HEIGHT-gameInfo.holdingsSize)\r
-              || (x == BOARD_RGHT+1 && y >= gameInfo.holdingsSize)\r
-    /* EditPosition, empty square, or different color piece;\r
-       click-click move is possible */\r
-                               ) {\r
-      break;\r
-    } else if (fromX == x && fromY == y) {\r
-      /* Downclick on same square again */\r
-      ClearHighlights();\r
-      DrawPosition(forceFullRepaint || FALSE, NULL);\r
-      sameAgain = TRUE;\r
-    } else if (fromX != -1 &&\r
-               x != BOARD_LEFT-2 && x != BOARD_RGHT+1\r
-                                                                        ) {\r
-      /* Downclick on different square. */\r
-      /* [HGM] if on holdings file, should count as new first click ! */\r
-      /* [HGM] <sameColor> now always do UserMoveTest(), and check colors there */\r
-    toX = x;\r
-    toY = y;\r
-        /* [HGM] <popupFix> UserMoveEvent requires two calls now,\r
-           to make sure move is legal before showing promotion popup */\r
-        moveType = UserMoveTest(fromX, fromY, toX, toY, NULLCHAR, FALSE);\r
-    if(moveType == AmbiguousMove) { /* [HGM] Edit-Position move executed */\r
-        fromX = fromY = -1;\r
-        ClearHighlights();\r
-        DrawPosition(FALSE, boards[currentMove]);\r
-        break;\r
-    } else\r
-        if(moveType != ImpossibleMove && moveType != Comment) {\r
-          /* [HGM] We use PromotionToKnight in Shogi to indicate frorced promotion */\r
-          if (moveType == WhitePromotionKnight || moveType == BlackPromotionKnight ||\r
-            ((moveType == WhitePromotionQueen || moveType == BlackPromotionQueen) &&\r
-              appData.alwaysPromoteToQueen)) {\r
-                  FinishMove(moveType, fromX, fromY, toX, toY, 'q');\r
-                  if (!appData.highlightLastMove) {\r
-                      ClearHighlights();\r
-                      DrawPosition(forceFullRepaint || FALSE, NULL);\r
-                  }\r
-          } else\r
-          if (moveType == WhitePromotionQueen || moveType == BlackPromotionQueen ) {\r
-                  SetHighlights(fromX, fromY, toX, toY);\r
-                  DrawPosition(forceFullRepaint || FALSE, NULL);\r
-                  /* [HGM] <popupFix> Popup calls FinishMove now.\r
-                     If promotion to Q is legal, all are legal! */\r
-          if(gameInfo.variant == VariantSuper || gameInfo.variant == VariantGreat)\r
-          { ChessSquare p = boards[currentMove][fromY][fromX], q = boards[currentMove][toY][toX];\r
-            // kludge to temporarily execute move on display, without promoting yet\r
-            promotionChoice = TRUE;\r
-            boards[currentMove][fromY][fromX] = EmptySquare; // move Pawn to 8th rank\r
-            boards[currentMove][toY][toX] = p;\r
-            DrawPosition(FALSE, boards[currentMove]);\r
-            boards[currentMove][fromY][fromX] = p; // take back, but display stays\r
-            boards[currentMove][toY][toX] = q;\r
-            DisplayMessage("Select piece from holdings", "");\r
-          } else\r
-                  PromotionPopup(hwnd);\r
-          goto noClear;\r
-          } else { // not a promotion. Move can be illegal if testLegality off, and should be made then.\r
-             if (appData.animate || appData.highlightLastMove) {\r
-                 SetHighlights(fromX, fromY, toX, toY);\r
-             } else {\r
-                 ClearHighlights();\r
-             }\r
-             FinishMove(moveType, fromX, fromY, toX, toY, NULLCHAR);\r
-             if (appData.animate && !appData.highlightLastMove) {\r
-                  ClearHighlights();\r
-                  DrawPosition(forceFullRepaint || FALSE, NULL);\r
-             }\r
-          }\r
-          fromX = fromY = -1;\r
-    noClear:\r
-      break;\r
-        }\r
-        if (gotPremove && moveType != Comment) {\r
-        SetPremoveHighlights(fromX, fromY, toX, toY);\r
-//            DrawPosition(forceFullRepaint || FALSE, NULL);\r
-    } else ClearHighlights();\r
-        fromX = fromY = -1;\r
-        DrawPosition(forceFullRepaint || FALSE, NULL);\r
-    if(moveType != Comment) break;\r
-    }\r
-    /* First downclick, or restart on a square with same color piece */\r
-    if (!frozen && OKToStartUserMove(x, y)) {\r
-      fromX = x;\r
-      fromY = y;\r
-      dragInfo.lastpos = pt;\r
-      dragInfo.from.x = fromX;\r
-      dragInfo.from.y = fromY;\r
-      dragInfo.start = dragInfo.from;\r
-      SetCapture(hwndMain);\r
-    } else {\r
-      fromX = fromY = -1;\r
       dragInfo.start.x = dragInfo.start.y = -1;\r
       dragInfo.from = dragInfo.start;\r
+    if(fromX == -1 && frozen) { // not sure where this is for\r
+               fromX = fromY = -1; \r
       DrawPosition(forceFullRepaint || FALSE, NULL); /* [AS] */\r
+      break;\r
     }\r
+      LeftClick(Press, pt.x - boardRect.left, pt.y - boardRect.top);\r
+      DrawPosition(TRUE, NULL);\r
     break;\r
 \r
   case WM_LBUTTONUP:\r
-    ReleaseCapture();\r
-    if (fromX == -1) break;\r
-    if (x == fromX && y == fromY) {\r
-      dragInfo.from.x = dragInfo.from.y = -1;\r
-      /* Upclick on same square */\r
-      if (sameAgain) {\r
-    /* Clicked same square twice: abort click-click move */\r
-    fromX = fromY = -1;\r
-    gotPremove = 0;\r
-    ClearPremoveHighlights();\r
-      } else {\r
-    /* First square clicked: start click-click move */\r
-    SetHighlights(fromX, fromY, -1, -1);\r
-      }\r
-      DrawPosition(forceFullRepaint || FALSE, NULL);\r
-    } else if (dragInfo.from.x < 0 || dragInfo.from.y < 0) {\r
-      /* Errant click; ignore */\r
-      break;\r
-    } else {\r
-      /* Finish drag move. */\r
-    if (appData.debugMode) {\r
-        fprintf(debugFP, "release\n");\r
-    }\r
-      dragInfo.from.x = dragInfo.from.y = -1;\r
-      toX = x;\r
-      toY = y;\r
-      saveAnimate = appData.animate; /* sorry, Hawk :) */\r
-      appData.animate = appData.animate && !appData.animateDragging;\r
-      moveType = UserMoveTest(fromX, fromY, toX, toY, NULLCHAR, TRUE);\r
-      if(moveType == AmbiguousMove) { /* [HGM] Edit-Position move executed */\r
-        fromX = fromY = -1;\r
-        ClearHighlights();\r
-        DrawPosition(FALSE, boards[currentMove]);\r
-        appData.animate = saveAnimate;\r
-        break;\r
-      } else\r
-      if(moveType != ImpossibleMove) {\r
-          /* [HGM] use move type to determine if move is promotion.\r
-             Knight is Shogi kludge for mandatory promotion, Queen means choice */\r
-          if (moveType == WhitePromotionKnight || moveType == BlackPromotionKnight ||\r
-            ((moveType == WhitePromotionQueen || moveType == BlackPromotionQueen) &&\r
-              appData.alwaysPromoteToQueen))\r
-               FinishMove(moveType, fromX, fromY, toX, toY, 'q');\r
-          else\r
-          if (moveType == WhitePromotionQueen || moveType == BlackPromotionQueen ) {\r
-               DrawPosition(forceFullRepaint || FALSE, NULL);\r
-          if(gameInfo.variant == VariantSuper || gameInfo.variant == VariantGreat)\r
-          { ChessSquare p = boards[currentMove][fromY][fromX], q = boards[currentMove][toY][toX];\r
-            // kludge to temporarily execute move on display, wthout promotng yet\r
-            promotionChoice = TRUE;\r
-            boards[currentMove][fromY][fromX] = EmptySquare; // move Pawn to 8th rank\r
-            boards[currentMove][toY][toX] = p;\r
-            DrawPosition(FALSE, boards[currentMove]);\r
-            boards[currentMove][fromY][fromX] = p; // take back, but display stays\r
-            boards[currentMove][toY][toX] = q;\r
-            appData.animate = saveAnimate;\r
-            DisplayMessage("Select piece from holdings", "");\r
-            break;\r
-          } else\r
-               PromotionPopup(hwnd); /* [HGM] Popup now calls FinishMove */\r
-          } else {\r
-        if(saveAnimate /* ^$!%@#$!$ */  && gameInfo.variant == VariantAtomic\r
-              && (boards[currentMove][toY][toX] != EmptySquare ||\r
-                    moveType == WhiteCapturesEnPassant ||\r
-                    moveType == BlackCapturesEnPassant   ) )\r
-        AnimateAtomicCapture(fromX, fromY, toX, toY, 20);\r
-        FinishMove(moveType, fromX, fromY, toX, toY, NULLCHAR);\r
-      }\r
-      }\r
-      if (gotPremove) SetPremoveHighlights(fromX, fromY, toX, toY);\r
-      appData.animate = saveAnimate;\r
-      fromX = fromY = -1;\r
-      if (appData.highlightDragging && !appData.highlightLastMove) {\r
-    ClearHighlights();\r
-      }\r
-      if (appData.animate || appData.animateDragging ||\r
-      appData.highlightDragging || gotPremove) {\r
-    DrawPosition(forceFullRepaint || FALSE, NULL);\r
-      }\r
-    }\r
-    dragInfo.start.x = dragInfo.start.y = -1;\r
-    dragInfo.pos = dragInfo.lastpos = dragInfo.start;\r
+      LeftClick(Release, pt.x - boardRect.left, pt.y - boardRect.top);\r
+      DrawPosition(TRUE, NULL);\r
     break;\r
 \r
   case WM_MOUSEMOVE:\r
     if ((appData.animateDragging || appData.highlightDragging)\r
-    && (wParam & MK_LBUTTON)\r
-    && dragInfo.from.x >= 0)\r
+       && (wParam & MK_LBUTTON)\r
+       && dragInfo.from.x >= 0) \r
     {\r
       BOOL full_repaint = FALSE;\r
 \r
-      sameAgain = FALSE; /* [HGM] if we drag something around, do keep square selected */\r
       if (appData.animateDragging) {\r
-    dragInfo.pos = pt;\r
+       dragInfo.pos = pt;\r
       }\r
       if (appData.highlightDragging) {\r
-    SetHighlights(fromX, fromY, x, y);\r
+       SetHighlights(fromX, fromY, x, y);\r
         if( IsDrawArrowEnabled() && (x < 0 || x >= BOARD_WIDTH || y < 0 || y >= BOARD_HEIGHT) ) {\r
             full_repaint = TRUE;\r
         }\r
       }\r
-\r
+      \r
       DrawPosition( full_repaint, NULL);\r
-\r
+      \r
       dragInfo.lastpos = dragInfo.pos;\r
     }\r
     break;\r
@@ -5311,13 +5015,13 @@ MouseEvent(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
        /* Mouse Wheel is being rolled forward\r
         * Play moves forward\r
         */\r
-       if((short)HIWORD(wParam) > 0 && currentMove < forwardMostMove)\r
-        { if(lastDir == 1) ForwardEvent(); else lastDir = 1; } // [HGM] suppress first event in direction\r
+       if((short)HIWORD(wParam) > 0 && currentMove < forwardMostMove) \r
+               { if(lastDir == 1) ForwardEvent(); else lastDir = 1; } // [HGM] suppress first event in direction\r
        /* Mouse Wheel is being rolled backward\r
         * Play moves backward\r
         */\r
-       if((short)HIWORD(wParam) < 0 && currentMove > backwardMostMove)\r
-        { if(lastDir == -1) BackwardEvent(); else lastDir = -1; }\r
+       if((short)HIWORD(wParam) < 0 && currentMove > backwardMostMove) \r
+               { if(lastDir == -1) BackwardEvent(); else lastDir = -1; }\r
     }\r
     break;\r
 \r
@@ -5350,30 +5054,19 @@ MouseEvent(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
       fromX = x;\r
       fromY = y;\r
       if (message == WM_MBUTTONDOWN) {\r
-    buttonCount = 3;  /* even if system didn't think so */\r
-    if (wParam & MK_SHIFT)\r
-      MenuPopup(hwnd, pt, LoadMenu(hInst, "BlackPieceMenu"), -1);\r
-    else\r
-      MenuPopup(hwnd, pt, LoadMenu(hInst, "WhitePieceMenu"), -1);\r
+       buttonCount = 3;  /* even if system didn't think so */\r
+       if (wParam & MK_SHIFT) \r
+         MenuPopup(hwnd, pt, LoadMenu(hInst, "BlackPieceMenu"), -1);\r
+       else\r
+         MenuPopup(hwnd, pt, LoadMenu(hInst, "WhitePieceMenu"), -1);\r
       } else { /* message == WM_RBUTTONDOWN */\r
-#if 0\r
-    if (buttonCount == 3) {\r
-      if (wParam & MK_SHIFT)\r
-        MenuPopup(hwnd, pt, LoadMenu(hInst, "WhitePieceMenu"), -1);\r
-      else\r
-        MenuPopup(hwnd, pt, LoadMenu(hInst, "BlackPieceMenu"), -1);\r
-    } else {\r
-      MenuPopup(hwnd, pt, LoadMenu(hInst, "PieceMenu"), -1);\r
-    }\r
-#else\r
-    /* Just have one menu, on the right button.  Windows users don't\r
-       think to try the middle one, and sometimes other software steals\r
-       it, or it doesn't really exist. */\r
+       /* Just have one menu, on the right button.  Windows users don't\r
+          think to try the middle one, and sometimes other software steals\r
+          it, or it doesn't really exist. */\r
         if(gameInfo.variant != VariantShogi)\r
             MenuPopup(hwnd, pt, LoadMenu(hInst, "PieceMenu"), -1);\r
         else\r
             MenuPopup(hwnd, pt, LoadMenu(hInst, "ShogiPieceMenu"), -1);\r
-#endif\r
       }\r
       break;\r
     case IcsPlayingWhite:\r
@@ -5382,8 +5075,8 @@ MouseEvent(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
     case MachinePlaysWhite:\r
     case MachinePlaysBlack:\r
       if (appData.testLegality &&\r
-      gameInfo.variant != VariantBughouse &&\r
-      gameInfo.variant != VariantCrazyhouse) break;\r
+         gameInfo.variant != VariantBughouse &&\r
+         gameInfo.variant != VariantCrazyhouse) break;\r
       if (x < 0 || y < 0) break;\r
       fromX = x;\r
       fromY = y;\r
@@ -5428,14 +5121,14 @@ ButtonProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
       return TRUE;\r
     default:\r
       if (appData.icsActive && (isalpha((char)wParam) || wParam == '0')) {\r
-    // [HGM] movenum: only letters or leading zero should go to ICS input\r
+       // [HGM] movenum: only letters or leading zero should go to ICS input\r
         HWND h = GetDlgItem(hwndConsole, OPT_ConsoleInput);\r
-    if (IsIconic(hwndConsole)) ShowWindow(hwndConsole, SW_RESTORE);\r
-    SetFocus(h);\r
-    SendMessage(h, WM_CHAR, wParam, lParam);\r
-    return TRUE;\r
+       if (IsIconic(hwndConsole)) ShowWindow(hwndConsole, SW_RESTORE);\r
+       SetFocus(h);\r
+       SendMessage(h, WM_CHAR, wParam, lParam);\r
+       return TRUE;\r
       } else if (isalpha((char)wParam) || isdigit((char)wParam)){\r
-    PopUpMoveDialog((char)wParam);\r
+       PopUpMoveDialog((char)wParam);\r
       }\r
       break;\r
     }\r
@@ -5454,39 +5147,39 @@ Promotion(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
   case WM_INITDIALOG: /* message: initialize dialog box */\r
     /* Center the dialog over the application window */\r
     CenterWindow(hDlg, GetWindow(hDlg, GW_OWNER));\r
-    ShowWindow(GetDlgItem(hDlg, PB_King),\r
+    ShowWindow(GetDlgItem(hDlg, PB_King), \r
       (!appData.testLegality || gameInfo.variant == VariantSuicide ||\r
        gameInfo.variant == VariantGiveaway || gameInfo.variant == VariantSuper ) ?\r
-           SW_SHOW : SW_HIDE);\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) != '~') ||\r
         (PieceToChar(BlackAngel) >= 'A' &&\r
          PieceToChar(BlackAngel) != '~')   ) ?\r
-           SW_SHOW : SW_HIDE);\r
-    ShowWindow(GetDlgItem(hDlg, PB_Chancellor),\r
+              SW_SHOW : SW_HIDE);\r
+    ShowWindow(GetDlgItem(hDlg, PB_Chancellor), \r
        ((PieceToChar(WhiteMarshall) >= 'A' &&\r
          PieceToChar(WhiteMarshall) != '~') ||\r
         (PieceToChar(BlackMarshall) >= 'A' &&\r
          PieceToChar(BlackMarshall) != '~')   ) ?\r
-           SW_SHOW : SW_HIDE);\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_Rook),\r
        gameInfo.variant != VariantShogi ?\r
-           SW_SHOW : SW_HIDE);\r
-    ShowWindow(GetDlgItem(hDlg, PB_Bishop),\r
+              SW_SHOW : SW_HIDE);\r
+    ShowWindow(GetDlgItem(hDlg, PB_Bishop), \r
        gameInfo.variant != VariantShogi ?\r
-           SW_SHOW : SW_HIDE);\r
-    ShowWindow(GetDlgItem(hDlg, IDC_Yes),\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
+              SW_SHOW : SW_HIDE);\r
+    ShowWindow(GetDlgItem(hDlg, IDC_No), \r
        gameInfo.variant == VariantShogi ?\r
-           SW_SHOW : SW_HIDE);\r
-    ShowWindow(GetDlgItem(hDlg, IDC_Centaur),\r
+              SW_SHOW : SW_HIDE);\r
+    ShowWindow(GetDlgItem(hDlg, IDC_Centaur), \r
        gameInfo.variant == VariantSuper ?\r
-           SW_SHOW : SW_HIDE);\r
+              SW_SHOW : SW_HIDE);\r
     return TRUE;\r
 \r
   case WM_COMMAND: /* message: received a command */\r
@@ -5525,7 +5218,8 @@ Promotion(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
        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
-    FinishMove(NormalMove, fromX, fromY, toX, toY, promoChar);\r
+    UserMoveEvent(fromX, fromY, toX, toY, promoChar);\r
+    fromX = fromY = -1;\r
     if (!appData.highlightLastMove) {\r
       ClearHighlights();\r
       DrawPosition(FALSE, NULL);\r
@@ -5547,6 +5241,13 @@ PromotionPopup(HWND hwnd)
   FreeProcInstance(lpProc);\r
 }\r
 \r
+void\r
+PromotionPopUp()\r
+{\r
+  DrawPosition(TRUE, NULL);\r
+  PromotionPopup(hwndMain);\r
+}\r
+\r
 /* Toggle ShowThinking */\r
 VOID\r
 ToggleShowThinking()\r
@@ -5562,9 +5263,9 @@ LoadGameDialog(HWND hwnd, char* title)
   FILE *f;\r
   char fileTitle[MSG_SIZ];\r
   f = OpenFileDialog(hwnd, "rb", "",\r
-                 appData.oldSaveStyle ? "gam" : "pgn",\r
-             GAME_FILT,\r
-             title, &number, fileTitle, NULL);\r
+                    appData.oldSaveStyle ? "gam" : "pgn",\r
+                    GAME_FILT,\r
+                    title, &number, fileTitle, NULL);\r
   if (f != NULL) {\r
     cmailMsgLoaded = FALSE;\r
     if (number == 0) {\r
@@ -5573,7 +5274,7 @@ LoadGameDialog(HWND hwnd, char* title)
         DisplayError("Cannot build game list", error);\r
       } else if (!ListEmpty(&gameList) &&\r
                  ((ListGame *) gameList.tailPred)->number > 1) {\r
-    GameListPopUp(f, fileTitle);\r
+       GameListPopUp(f, fileTitle);\r
         return;\r
       }\r
       GameListDestroy();\r
@@ -5583,6 +5284,57 @@ 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
+    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
 ChangedConsoleFont()\r
 {\r
@@ -5603,16 +5355,16 @@ ChangedConsoleFont()
   cfmt.yHeight = (int)(f->mfp.pointSize * 20.0 + 0.5);\r
   cfmt.bCharSet = f->lf.lfCharSet;\r
   cfmt.bPitchAndFamily = f->lf.lfPitchAndFamily;\r
-  SendMessage(hText, EM_SETCHARFORMAT, SCF_ALL, (LPARAM) &cfmt);\r
-  SendMessage(hInput, EM_SETCHARFORMAT, SCF_ALL, (LPARAM) &cfmt);\r
+  SendMessage(hText, EM_SETCHARFORMAT, SCF_ALL, (LPARAM) &cfmt); \r
+  SendMessage(hInput, EM_SETCHARFORMAT, SCF_ALL, (LPARAM) &cfmt); \r
   /* Why are the following seemingly needed too? */\r
-  SendMessage(hText, EM_SETCHARFORMAT, SCF_DEFAULT, (LPARAM) &cfmt);\r
-  SendMessage(hInput, EM_SETCHARFORMAT, SCF_DEFAULT, (LPARAM) &cfmt);\r
+  SendMessage(hText, EM_SETCHARFORMAT, SCF_DEFAULT, (LPARAM) &cfmt); \r
+  SendMessage(hInput, EM_SETCHARFORMAT, SCF_DEFAULT, (LPARAM) &cfmt); \r
   SendMessage(hText, EM_EXGETSEL, 0, (LPARAM)&sel);\r
   tmpsel.cpMin = 0;\r
   tmpsel.cpMax = -1; /*999999?*/\r
   SendMessage(hText, EM_EXSETSEL, 0, (LPARAM)&tmpsel);\r
-  SendMessage(hText, EM_SETCHARFORMAT, SCF_SELECTION, (LPARAM) &cfmt);\r
+  SendMessage(hText, EM_SETCHARFORMAT, SCF_SELECTION, (LPARAM) &cfmt); \r
   /* Trying putting this here too.  It still seems to tickle a RichEdit\r
    *  bug: sometimes RichEdit indents the first line of a paragraph too.\r
    */\r
@@ -5622,6 +5374,7 @@ ChangedConsoleFont()
   paraf.dxOffset = WRAP_INDENT;\r
   SendMessage(hText, EM_SETPARAFORMAT, 0, (LPARAM) &paraf);\r
   SendMessage(hText, EM_EXSETSEL, 0, (LPARAM)&sel);\r
+  UpdateICSWidth(hText);\r
 }\r
 \r
 /*---------------------------------------------------------------------------*\\r
@@ -5672,20 +5425,20 @@ WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
   JAWS_KB_NAVIGATION\r
 \r
   case WM_CHAR:\r
-\r
+    \r
     JAWS_ALT_INTERCEPT\r
 \r
-    if (appData.icsActive && (char)wParam > ' ' && !((char)wParam >= '1' && (char)wParam <= '9')) {\r
-    // [HGM] movenum: for non-zero digits we always do type-in dialog\r
-    HWND h = GetDlgItem(hwndConsole, OPT_ConsoleInput);\r
-    if (IsIconic(hwndConsole)) ShowWindow(hwndConsole, SW_RESTORE);\r
-    SetFocus(h);\r
-    SendMessage(h, message, wParam, lParam);\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
+       SetFocus(h);\r
+       SendMessage(h, message, wParam, lParam);\r
     } else if(lParam != KF_REPEAT) {\r
-    if (isalpha((char)wParam) || isdigit((char)wParam)) {\r
-        PopUpMoveDialog((char)wParam);\r
-    } else if((char)wParam == 003) CopyGameToClipboard();\r
-     else if((char)wParam == 026) PasteGameOrFENFromClipboard();\r
+       if (isalpha((char)wParam) || isdigit((char)wParam)) {\r
+               PopUpMoveDialog((char)wParam);\r
+       } else if((char)wParam == 003) CopyGameToClipboard();\r
+        else if((char)wParam == 026) PasteGameOrFENFromClipboard();\r
     }\r
 \r
     break;\r
@@ -5697,12 +5450,8 @@ WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
       SelectPalette(hdc, hPal, TRUE);\r
       nnew = RealizePalette(hdc);\r
       if (nnew > 0) {\r
-    paletteChanged = TRUE;\r
-#if 0\r
-        UpdateColors(hdc);\r
-#else\r
-        InvalidateRect(hwnd, &boardRect, FALSE);/*faster!*/\r
-#endif\r
+       paletteChanged = TRUE;\r
+        InvalidateRect(hwnd, &boardRect, FALSE);\r
       }\r
       ReleaseDC(hwnd, hdc);\r
     }\r
@@ -5716,7 +5465,7 @@ WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
       SelectPalette(hdc, hPal, FALSE);\r
       nnew = RealizePalette(hdc);\r
       if (nnew > 0) {\r
-    InvalidateRect(hwnd, &boardRect, FALSE);\r
+       InvalidateRect(hwnd, &boardRect, FALSE);\r
       }\r
       ReleaseDC(hwnd, hdc);\r
       return TRUE;\r
@@ -5730,14 +5479,12 @@ WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
     switch (wmId) {\r
     case IDM_NewGame:\r
       ResetGameEvent();\r
-      AnalysisPopDown();\r
       SAY("new game enter a move to play against the computer with white");\r
       break;\r
 \r
     case IDM_NewGameFRC:\r
       if( NewGameFRC() == 0 ) {\r
         ResetGameEvent();\r
-        AnalysisPopDown();\r
       }\r
       break;\r
 \r
@@ -5767,11 +5514,11 @@ WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
       }\r
       number = 1;\r
       f = OpenFileDialog(hwnd, "rb", "",\r
-             appData.oldSaveStyle ? "pos" : "fen",\r
-             POSITION_FILT,\r
-             "Load Position from File", &number, fileTitle, NULL);\r
+                        appData.oldSaveStyle ? "pos" : "fen",\r
+                        POSITION_FILT,\r
+                        "Load Position from File", &number, fileTitle, NULL);\r
       if (f != NULL) {\r
-    LoadPosition(f, number, fileTitle);\r
+       LoadPosition(f, number, fileTitle);\r
       }\r
       break;\r
 \r
@@ -5790,33 +5537,33 @@ WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
     case IDM_SaveGame:\r
       defName = DefaultFileName(appData.oldSaveStyle ? "gam" : "pgn");\r
       f = OpenFileDialog(hwnd, "a", defName,\r
-             appData.oldSaveStyle ? "gam" : "pgn",\r
-             GAME_FILT,\r
-             "Save Game to File", NULL, fileTitle, NULL);\r
+                        appData.oldSaveStyle ? "gam" : "pgn",\r
+                        GAME_FILT,\r
+                        "Save Game to File", NULL, fileTitle, NULL);\r
       if (f != NULL) {\r
-    SaveGame(f, 0, "");\r
+       SaveGame(f, 0, "");\r
       }\r
       break;\r
 \r
     case IDM_SavePosition:\r
       defName = DefaultFileName(appData.oldSaveStyle ? "pos" : "fen");\r
       f = OpenFileDialog(hwnd, "a", defName,\r
-             appData.oldSaveStyle ? "pos" : "fen",\r
-             POSITION_FILT,\r
-             "Save Position to File", NULL, fileTitle, NULL);\r
+                        appData.oldSaveStyle ? "pos" : "fen",\r
+                        POSITION_FILT,\r
+                        "Save Position to File", NULL, fileTitle, NULL);\r
       if (f != NULL) {\r
-    SavePosition(f, 0, "");\r
+       SavePosition(f, 0, "");\r
       }\r
       break;\r
 \r
     case IDM_SaveDiagram:\r
       defName = "diagram";\r
       f = OpenFileDialog(hwnd, "wb", defName,\r
-             "bmp",\r
-             DIAGRAM_FILT,\r
-             "Save Diagram to File", NULL, fileTitle, NULL);\r
+                        "bmp",\r
+                        DIAGRAM_FILT,\r
+                        "Save Diagram to File", NULL, fileTitle, NULL);\r
       if (f != NULL) {\r
-    SaveDiagram(f);\r
+       SaveDiagram(f);\r
       }\r
       break;\r
 \r
@@ -5854,7 +5601,7 @@ WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
         }\r
         else {\r
             EvalGraphPopUp();\r
-        SetFocus(hwndMain);\r
+           SetFocus(hwndMain);\r
         }\r
         break;\r
 \r
@@ -5921,10 +5668,10 @@ WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
        * refresh the tags dialog only if it's visible\r
        */\r
       if (gameMode == MachinePlaysWhite && IsWindowVisible(editTagsDialog)) {\r
-      char *tags;\r
-      tags = PGNTags(&gameInfo);\r
-      TagsPopUp(tags, CmailMsg());\r
-      free(tags);\r
+         char *tags;\r
+         tags = PGNTags(&gameInfo);\r
+         TagsPopUp(tags, CmailMsg());\r
+         free(tags);\r
       }\r
       SAY("computer starts playing white");\r
       break;\r
@@ -5935,10 +5682,10 @@ WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
        * refresh the tags dialog only if it's visible\r
        */\r
       if (gameMode == MachinePlaysBlack && IsWindowVisible(editTagsDialog)) {\r
-      char *tags;\r
-      tags = PGNTags(&gameInfo);\r
-      TagsPopUp(tags, CmailMsg());\r
-      free(tags);\r
+         char *tags;\r
+         tags = PGNTags(&gameInfo);\r
+         TagsPopUp(tags, CmailMsg());\r
+         free(tags);\r
       }\r
       SAY("computer starts playing black");\r
       break;\r
@@ -5949,10 +5696,10 @@ WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
        * refresh the tags dialog only if it's visible\r
        */\r
       if (gameMode == TwoMachinesPlay && IsWindowVisible(editTagsDialog)) {\r
-      char *tags;\r
-      tags = PGNTags(&gameInfo);\r
-      TagsPopUp(tags, CmailMsg());\r
-      free(tags);\r
+         char *tags;\r
+         tags = PGNTags(&gameInfo);\r
+         TagsPopUp(tags, CmailMsg());\r
+         free(tags);\r
       }\r
       SAY("programs start playing each other");\r
       break;\r
@@ -5962,7 +5709,7 @@ WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
         sprintf(buf, "%s does not support analysis", first.tidy);\r
         DisplayError(buf, 0);\r
       } else {\r
-    SAY("analyzing current position");\r
+       SAY("analyzing current position");\r
         /* [DM] icsEngineAnlyze [HGM] Why is this front-end??? */\r
         if (appData.icsActive) {\r
                if (gameMode != IcsObserving) {\r
@@ -5970,7 +5717,7 @@ WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
                        DisplayError(buf, 0);\r
                        /* secure check */\r
                        if (appData.icsEngineAnalyze) {\r
-                               if (appData.debugMode)\r
+                               if (appData.debugMode) \r
                                        fprintf(debugFP, "Found unexpected active ICS engine analyze \n");\r
                                ExitAnalyzeMode();\r
                                ModeHighlight();\r
@@ -5987,9 +5734,9 @@ WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
                        appData.icsEngineAnalyze = TRUE;\r
                        if (appData.debugMode) fprintf(debugFP, "ICS engine analyze starting...\n");\r
                }\r
-        }\r
-    if (!appData.showThinking) ToggleShowThinking();\r
-    AnalyzeModeEvent();\r
+        } \r
+       if (!appData.showThinking) ToggleShowThinking();\r
+       AnalyzeModeEvent();\r
       }\r
       break;\r
 \r
@@ -5999,10 +5746,10 @@ WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
         sprintf(buf, "%s does not support analysis", first.tidy);\r
         DisplayError(buf, 0);\r
       } else {\r
-    if (!appData.showThinking) ToggleShowThinking();\r
-    AnalyzeFileEvent();\r
-    LoadGameDialog(hwnd, "Analyze Game from File");\r
-    AnalysisPeriodicEvent(1);\r
+       if (!appData.showThinking) ToggleShowThinking();\r
+       AnalyzeFileEvent();\r
+       LoadGameDialog(hwnd, "Analyze Game from File");\r
+       AnalysisPeriodicEvent(1);\r
       }\r
       break;\r
 \r
@@ -6034,9 +5781,9 @@ WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
 \r
     case IDM_EditComment:\r
       if (commentDialogUp && editComment) {\r
-    CommentPopDown();\r
+       CommentPopDown();\r
       } else {\r
-    EditCommentEvent();\r
+       EditCommentEvent();\r
       }\r
       break;\r
 \r
@@ -6143,8 +5890,8 @@ WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
 \r
     case IDM_MuteSounds:\r
       mute = !mute; // [HGM] mute: keep track of global muting variable\r
-      CheckMenuItem(GetMenu(hwndMain),IDM_MuteSounds,\r
-                MF_BYCOMMAND|(mute?MF_CHECKED:MF_UNCHECKED));\r
+      CheckMenuItem(GetMenu(hwndMain),IDM_MuteSounds, \r
+                               MF_BYCOMMAND|(mute?MF_CHECKED:MF_UNCHECKED));\r
       break;\r
 \r
     case IDM_GeneralOptions:\r
@@ -6207,8 +5954,8 @@ WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
     case IDM_SaveSettingsOnExit:\r
       saveSettingsOnExit = !saveSettingsOnExit;\r
       (void) CheckMenuItem(GetMenu(hwndMain), IDM_SaveSettingsOnExit,\r
-               MF_BYCOMMAND|(saveSettingsOnExit ?\r
-                     MF_CHECKED : MF_UNCHECKED));\r
+                          MF_BYCOMMAND|(saveSettingsOnExit ?\r
+                                        MF_CHECKED : MF_UNCHECKED));\r
       break;\r
 \r
     case IDM_Hint:\r
@@ -6226,59 +5973,59 @@ WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
     case IDM_Debug:\r
       appData.debugMode = !appData.debugMode;\r
       if (appData.debugMode) {\r
-    char dir[MSG_SIZ];\r
-    GetCurrentDirectory(MSG_SIZ, dir);\r
-    SetCurrentDirectory(installDir);\r
-    debugFP = fopen(appData.nameOfDebugFile, "w");\r
+       char dir[MSG_SIZ];\r
+       GetCurrentDirectory(MSG_SIZ, dir);\r
+       SetCurrentDirectory(installDir);\r
+       debugFP = fopen(appData.nameOfDebugFile, "w");\r
         SetCurrentDirectory(dir);\r
         setbuf(debugFP, NULL);\r
       } else {\r
-    fclose(debugFP);\r
+       fclose(debugFP);\r
         debugFP = NULL;\r
       }\r
       break;\r
 \r
     case IDM_HELPCONTENTS:\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
-            szAppName, MB_SYSTEMMODAL|MB_OK|MB_ICONHAND);\r
+         !HtmlHelp(hwnd, "winboard.chm", 0, 0) ) {\r
+         MessageBox (GetFocus(),\r
+                   "Unable to activate help",\r
+                   szAppName, MB_SYSTEMMODAL|MB_OK|MB_ICONHAND);\r
       }\r
       break;\r
 \r
     case IDM_HELPSEARCH:\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
-            szAppName, MB_SYSTEMMODAL|MB_OK|MB_ICONHAND);\r
+           !HtmlHelp(hwnd, "winboard.chm", 0, 0)       ) {\r
+       MessageBox (GetFocus(),\r
+                   "Unable to activate help",\r
+                   szAppName, MB_SYSTEMMODAL|MB_OK|MB_ICONHAND);\r
       }\r
       break;\r
 \r
     case IDM_HELPHELP:\r
       if(!WinHelp(hwnd, (LPSTR)NULL, HELP_HELPONHELP, 0)) {\r
-    MessageBox (GetFocus(),\r
-            "Unable to activate help",\r
-            szAppName, MB_SYSTEMMODAL|MB_OK|MB_ICONHAND);\r
+       MessageBox (GetFocus(),\r
+                   "Unable to activate help",\r
+                   szAppName, MB_SYSTEMMODAL|MB_OK|MB_ICONHAND);\r
       }\r
       break;\r
 \r
     case IDM_ABOUT:\r
       lpProc = MakeProcInstance((FARPROC)About, hInst);\r
-      DialogBox(hInst,\r
-    (gameInfo.event && strcmp(gameInfo.event, "Easter Egg Hunt") == 0) ?\r
-    "AboutBox2" : "AboutBox", hwnd, (DLGPROC)lpProc);\r
+      DialogBox(hInst, \r
+       (gameInfo.event && strcmp(gameInfo.event, "Easter Egg Hunt") == 0) ?\r
+       "AboutBox2" : "AboutBox", hwnd, (DLGPROC)lpProc);\r
       FreeProcInstance(lpProc);\r
       break;\r
 \r
     case IDM_DirectCommand1:\r
       AskQuestionEvent("Direct Command",\r
-               "Send to chess program:", "", "1");\r
+                      "Send to chess program:", "", "1");\r
       break;\r
     case IDM_DirectCommand2:\r
       AskQuestionEvent("Direct Command",\r
-               "Send to second chess program:", "", "2");\r
+                      "Send to second chess program:", "", "2");\r
       break;\r
 \r
     case EP_WhitePawn:\r
@@ -6476,10 +6223,10 @@ WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
     case ANALYSIS_TIMER_ID:\r
       if ((gameMode == AnalyzeMode || gameMode == AnalyzeFile\r
                  || appData.icsEngineAnalyze) && appData.periodicUpdates) {\r
-    AnalysisPeriodicEvent(0);\r
+       AnalysisPeriodicEvent(0);\r
       } else {\r
-    KillTimer(hwnd, analysisTimerEvent);\r
-    analysisTimerEvent = 0;\r
+       KillTimer(hwnd, analysisTimerEvent);\r
+       analysisTimerEvent = 0;\r
       }\r
       break;\r
     case DELAYED_TIMER_ID:\r
@@ -6505,17 +6252,17 @@ 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
-\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
+            \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
+           boardX = lpwp->x;\r
             boardY = lpwp->y;\r
         }\r
     }\r
@@ -6566,7 +6313,7 @@ WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
     }\r
     break;\r
 \r
-  default:  /* Passes it on if unprocessed */\r
+  default:     /* Passes it on if unprocessed */\r
     return (DefWindowProc(hwnd, message, wParam, lParam));\r
   }\r
   return 0;\r
@@ -6598,8 +6345,8 @@ mysrandom(unsigned int seed)
 }\r
 \r
 \r
-/*\r
- * returns TRUE if user selects a different color, FALSE otherwise\r
+/* \r
+ * returns TRUE if user selects a different color, FALSE otherwise \r
  */\r
 \r
 BOOL\r
@@ -6709,7 +6456,7 @@ MyPlaySound(MySound *ms)
   if(mute) return TRUE; // [HGM] mute: suppress all sound play when muted\r
   switch (ms->name[0]) {\r
   case NULLCHAR:\r
-    if(appData.debugMode) fprintf(debugFP, "silence\n");\r
+       if(appData.debugMode) fprintf(debugFP, "silence\n");\r
     /* Silence */\r
     ok = TRUE;\r
     break;\r
@@ -6720,7 +6467,7 @@ MyPlaySound(MySound *ms)
       ok = PlaySound(ms->name + 1, NULL, SND_ALIAS|SND_ASYNC);\r
     }\r
     if (!ok) ok = MessageBeep(MB_OK);\r
-    break;\r
+    break; \r
   case '!':\r
     /* Builtin wave resource, or "!" alone for silence */\r
     if (ms->name[1]) {\r
@@ -6739,13 +6486,6 @@ MyPlaySound(MySound *ms)
   /* Don't print an error: this can happen innocently if the sound driver\r
      is busy; for instance, if another instance of WinBoard is playing\r
      a sound at about the same time. */\r
-#if 0\r
-  if (!ok) {\r
-    char buf[MSG_SIZ];\r
-    sprintf(buf, "Error playing sound %s", ms->name);\r
-    DisplayError(buf, GetLastError());\r
-  }\r
-#endif\r
   return ok;\r
 }\r
 \r
@@ -6803,8 +6543,8 @@ OpenFileHook(HWND hdlg, UINT uiMsg, WPARAM wParam, LPARAM lParam)
 \r
 FILE *\r
 OpenFileDialog(HWND hwnd, char *write, char *defName, char *defExt, // [HGM] diag: type of 'write' now string\r
-           char *nameFilt, char *dlgTitle, UINT *number,\r
-           char fileTitle[MSG_SIZ], char fileName[MSG_SIZ])\r
+              char *nameFilt, char *dlgTitle, UINT *number,\r
+              char fileTitle[MSG_SIZ], char fileName[MSG_SIZ])\r
 {\r
   OPENFILENAME openFileName;\r
   char buf1[MSG_SIZ];\r
@@ -6833,8 +6573,8 @@ OpenFileDialog(HWND hwnd, char *write, char *defName, char *defExt, // [HGM] dia
   openFileName.nMaxFileTitle     = fileTitle ? MSG_SIZ : 0;\r
   openFileName.lpstrInitialDir   = NULL;\r
   openFileName.lpstrTitle        = dlgTitle;\r
-  openFileName.Flags = OFN_PATHMUSTEXIST | OFN_HIDEREADONLY\r
-    | (write[0] != 'r' ? 0 : OFN_FILEMUSTEXIST)\r
+  openFileName.Flags = OFN_PATHMUSTEXIST | OFN_HIDEREADONLY \r
+    | (write[0] != 'r' ? 0 : OFN_FILEMUSTEXIST) \r
     | (number ? OFN_ENABLETEMPLATE | OFN_ENABLEHOOK: 0)\r
     | (oldDialog ? 0 : OFN_EXPLORER);\r
   openFileName.nFileOffset       = 0;\r
@@ -6845,13 +6585,13 @@ OpenFileDialog(HWND hwnd, char *write, char *defName, char *defExt, // [HGM] dia
     (LPOFNHOOKPROC) OldOpenFileHook : (LPOFNHOOKPROC) OpenFileHook;\r
   openFileName.lpTemplateName    = (LPSTR)(oldDialog ? 1536 : DLG_IndexNumber);\r
 \r
-  if (write[0] != 'r' ? GetSaveFileName(&openFileName) :\r
+  if (write[0] != 'r' ? GetSaveFileName(&openFileName) : \r
                         GetOpenFileName(&openFileName)) {\r
     /* open the file */\r
     f = fopen(openFileName.lpstrFile, write);\r
     if (f == NULL) {\r
       MessageBox(hwnd, "File open failed", NULL,\r
-         MB_OK|MB_ICONEXCLAMATION);\r
+                MB_OK|MB_ICONEXCLAMATION);\r
       return NULL;\r
     }\r
   } else {\r
@@ -6867,7 +6607,7 @@ OpenFileDialog(HWND hwnd, char *write, char *defName, char *defExt, // [HGM] dia
 VOID APIENTRY\r
 MenuPopup(HWND hwnd, POINT pt, HMENU hmenu, UINT def)\r
 {\r
-  HMENU hmenuTrackPopup;    /* floating pop-up menu  */\r
+  HMENU hmenuTrackPopup;       /* floating pop-up menu  */\r
 \r
   /*\r
    * Get the first pop-up menu in the menu template. This is the\r
@@ -6885,12 +6625,12 @@ MenuPopup(HWND hwnd, POINT pt, HMENU hmenu, UINT def)
 \r
   /* Draw and track the floating pop-up menu. */\r
   TrackPopupMenu(hmenuTrackPopup, TPM_CENTERALIGN | TPM_RIGHTBUTTON,\r
-         pt.x, pt.y, 0, hwnd, NULL);\r
+                pt.x, pt.y, 0, hwnd, NULL);\r
 \r
   /* Destroy the menu.*/\r
   DestroyMenu(hmenu);\r
 }\r
-\r
+   \r
 typedef struct {\r
   HWND hDlg, hText;\r
   int sizeX, sizeY, newSizeX, newSizeY;\r
@@ -6909,7 +6649,7 @@ ResizeEditPlusButtonsCallback(HWND hChild, LPARAM lparam)
   pt.x = rect.left + (cl->newSizeX - cl->sizeX)/2;\r
   pt.y = rect.top + cl->newSizeY - cl->sizeY;\r
   ScreenToClient(cl->hDlg, &pt);\r
-  cl->hdwp = DeferWindowPos(cl->hdwp, hChild, NULL,\r
+  cl->hdwp = DeferWindowPos(cl->hdwp, hChild, NULL, \r
     pt.x, pt.y, rect.right - rect.left, rect.bottom - rect.top, SWP_NOZORDER);\r
   return TRUE;\r
 }\r
@@ -6922,10 +6662,10 @@ ResizeEditPlusButtons(HWND hDlg, HWND hText, int sizeX, int sizeY, int newSizeX,
   RECT rectText;\r
   int newTextHeight, newTextWidth;\r
   ResizeEditPlusButtonsClosure cl;\r
-\r
+  \r
   /*if (IsIconic(hDlg)) return;*/\r
   if (newSizeX == sizeX && newSizeY == sizeY) return;\r
-\r
+  \r
   cl.hdwp = BeginDeferWindowPos(8);\r
 \r
   GetWindowRect(hText, &rectText); /* gives screen coords */\r
@@ -6935,7 +6675,7 @@ ResizeEditPlusButtons(HWND hDlg, HWND hText, int sizeX, int sizeY, int newSizeX,
     newSizeY += -newTextHeight;\r
     newTextHeight = 0;\r
   }\r
-  cl.hdwp = DeferWindowPos(cl.hdwp, hText, NULL, 0, 0,\r
+  cl.hdwp = DeferWindowPos(cl.hdwp, hText, NULL, 0, 0, \r
     newTextWidth, newTextHeight, SWP_NOZORDER|SWP_NOMOVE);\r
 \r
   cl.hDlg = hDlg;\r
@@ -6975,9 +6715,9 @@ BOOL CenterWindowEx(HWND hwndChild, HWND hwndParent, int mode)
     /* Calculate new X position, then adjust for screen */\r
     xNew = rParent.left + ((wParent - wChild) /2);\r
     if (xNew < 0) {\r
-    xNew = 0;\r
+       xNew = 0;\r
     } else if ((xNew+wChild) > wScreen) {\r
-    xNew = wScreen - wChild;\r
+       xNew = wScreen - wChild;\r
     }\r
 \r
     /* Calculate new Y position, then adjust for screen */\r
@@ -6989,14 +6729,14 @@ BOOL CenterWindowEx(HWND hwndChild, HWND hwndParent, int mode)
     }\r
 \r
     if (yNew < 0) {\r
-    yNew = 0;\r
+       yNew = 0;\r
     } else if ((yNew+hChild) > hScreen) {\r
-    yNew = hScreen - hChild;\r
+       yNew = hScreen - hChild;\r
     }\r
 \r
     /* Set it, and return */\r
     return SetWindowPos (hwndChild, NULL,\r
-             xNew, yNew, 0, 0, SWP_NOSIZE | SWP_NOZORDER);\r
+                        xNew, yNew, 0, 0, SWP_NOSIZE | SWP_NOZORDER);\r
 }\r
 \r
 /* Center one window over another */\r
@@ -7121,13 +6861,13 @@ StartupDialog(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
     CenterWindow (hDlg, GetDesktopWindow());\r
     /* Initialize the dialog items */\r
     InitEngineBox(hDlg, GetDlgItem(hDlg, OPT_ChessEngineName),\r
-              appData.firstChessProgram, "fd", appData.firstDirectory,\r
-          firstChessProgramNames);\r
+                 appData.firstChessProgram, "fd", appData.firstDirectory,\r
+                 firstChessProgramNames);\r
     InitEngineBox(hDlg, GetDlgItem(hDlg, OPT_SecondChessEngineName),\r
-              appData.secondChessProgram, "sd", appData.secondDirectory,\r
-          secondChessProgramNames);\r
+                 appData.secondChessProgram, "sd", appData.secondDirectory,\r
+                 secondChessProgramNames);\r
     hwndCombo = GetDlgItem(hDlg, OPT_ChessServerName);\r
-    InitComboStringsFromOption(hwndCombo, icsNames);\r
+    InitComboStringsFromOption(hwndCombo, icsNames);    \r
     sprintf(buf, "%s /icsport=%s", appData.icsHost, appData.icsPort);\r
     if (*appData.icsHelper != NULLCHAR) {\r
       char *q = QuoteForFilename(appData.icsHelper);\r
@@ -7159,38 +6899,38 @@ StartupDialog(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
     case IDOK:\r
       if (IsDlgButtonChecked(hDlg, OPT_ChessEngine)) {\r
         strcpy(buf, "/fcp=");\r
-    GetDlgItemText(hDlg, OPT_ChessEngineName, buf + strlen(buf), sizeof(buf) - strlen(buf));\r
+       GetDlgItemText(hDlg, OPT_ChessEngineName, buf + strlen(buf), sizeof(buf) - strlen(buf));\r
         p = buf;\r
-    ParseArgs(StringGet, &p);\r
+       ParseArgs(StringGet, &p);\r
         strcpy(buf, "/scp=");\r
-    GetDlgItemText(hDlg, OPT_SecondChessEngineName, buf + strlen(buf), sizeof(buf) - strlen(buf));\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
+       ParseArgs(StringGet, &p);\r
+       appData.noChessProgram = FALSE;\r
+       appData.icsActive = FALSE;\r
       } else if (IsDlgButtonChecked(hDlg, OPT_ChessServer)) {\r
         strcpy(buf, "/ics /icshost=");\r
-    GetDlgItemText(hDlg, OPT_ChessServerName, buf + strlen(buf), sizeof(buf) - strlen(buf));\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
-      GetDlgItemText(hDlg, OPT_ChessEngineName, buf + strlen(buf), sizeof(buf) - strlen(buf));\r
-      p = buf;\r
-      ParseArgs(StringGet, &p);\r
-    }\r
+       ParseArgs(StringGet, &p);\r
+       if (appData.zippyPlay) {\r
+         strcpy(buf, "/fcp=");\r
+         GetDlgItemText(hDlg, OPT_ChessEngineName, buf + strlen(buf), sizeof(buf) - strlen(buf));\r
+         p = buf;\r
+         ParseArgs(StringGet, &p);\r
+       }\r
       } else if (IsDlgButtonChecked(hDlg, OPT_View)) {\r
-    appData.noChessProgram = TRUE;\r
-    appData.icsActive = FALSE;\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
-    return TRUE;\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
-    GetDlgItemText(hDlg, OPT_AdditionalOptions, buf, sizeof(buf));\r
-    p = buf;\r
-    ParseArgs(StringGet, &p);\r
+       GetDlgItemText(hDlg, OPT_AdditionalOptions, buf, sizeof(buf));\r
+       p = buf;\r
+       ParseArgs(StringGet, &p);\r
       }\r
       EndDialog(hDlg, TRUE);\r
       return TRUE;\r
@@ -7201,9 +6941,9 @@ StartupDialog(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
 \r
     case IDM_HELPCONTENTS:\r
       if (!WinHelp (hDlg, "winboard.hlp", HELP_KEY,(DWORD)(LPSTR)"CONTENTS")) {\r
-    MessageBox (GetFocus(),\r
-            "Unable to activate help",\r
-            szAppName, MB_SYSTEMMODAL|MB_OK|MB_ICONHAND);\r
+       MessageBox (GetFocus(),\r
+                   "Unable to activate help",\r
+                   szAppName, MB_SYSTEMMODAL|MB_OK|MB_ICONHAND);\r
       }\r
       break;\r
 \r
@@ -7236,7 +6976,7 @@ About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
 \r
   case WM_COMMAND: /* message: received a command */\r
     if (LOWORD(wParam) == IDOK /* "OK" box selected? */\r
-    || LOWORD(wParam) == IDCANCEL) { /* System menu close command? */\r
+       || LOWORD(wParam) == IDCANCEL) { /* System menu close command? */\r
       EndDialog(hDlg, TRUE); /* Exit the dialog */\r
       return (TRUE);\r
     }\r
@@ -7277,8 +7017,8 @@ CommentDialog(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
       SetFocus(GetDlgItem(hDlg, IDOK));\r
     }\r
     SendMessage(GetDlgItem(hDlg, OPT_CommentText),\r
-        WM_SETFONT, (WPARAM)font[boardSize][COMMENT_FONT]->hf,\r
-        MAKELPARAM(FALSE, 0));\r
+               WM_SETFONT, (WPARAM)font[boardSize][COMMENT_FONT]->hf,\r
+               MAKELPARAM(FALSE, 0));\r
     /* Size and position the dialog */\r
     if (!commentDialog) {\r
       commentDialog = hDlg;\r
@@ -7287,26 +7027,26 @@ CommentDialog(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
       sizeX = rect.right;\r
       sizeY = rect.bottom;\r
       if (commentX != CW_USEDEFAULT && commentY != CW_USEDEFAULT &&\r
-      commentW != CW_USEDEFAULT && commentH != CW_USEDEFAULT) {\r
-    WINDOWPLACEMENT wp;\r
-    EnsureOnScreen(&commentX, &commentY, 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
-    SetWindowPlacement(hDlg, &wp);\r
-\r
-    GetClientRect(hDlg, &rect);\r
-    newSizeX = rect.right;\r
-    newSizeY = rect.bottom;\r
+         commentW != CW_USEDEFAULT && commentH != CW_USEDEFAULT) {\r
+       WINDOWPLACEMENT wp;\r
+       EnsureOnScreen(&commentX, &commentY, 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
+       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
+                             newSizeX, newSizeY);\r
+       sizeX = newSizeX;\r
+       sizeY = newSizeY;\r
       }\r
     }\r
     return FALSE;\r
@@ -7315,22 +7055,22 @@ CommentDialog(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
     switch (LOWORD(wParam)) {\r
     case IDOK:\r
       if (editComment) {\r
-    char *p, *q;\r
-    /* Read changed options from the dialog box */\r
-    hwndText = GetDlgItem(hDlg, OPT_CommentText);\r
-    len = GetWindowTextLength(hwndText);\r
-    str = (char *) malloc(len + 1);\r
-    GetWindowText(hwndText, str, len + 1);\r
-    p = q = str;\r
-    while (*q) {\r
-      if (*q == '\r')\r
-        q++;\r
-      else\r
-        *p++ = *q++;\r
-    }\r
-    *p = NULLCHAR;\r
-    ReplaceComment(commentIndex, str);\r
-    free(str);\r
+       char *p, *q;\r
+       /* Read changed options from the dialog box */\r
+       hwndText = GetDlgItem(hDlg, OPT_CommentText);\r
+       len = GetWindowTextLength(hwndText);\r
+       str = (char *) malloc(len + 1);\r
+       GetWindowText(hwndText, str, len + 1);\r
+       p = q = str;\r
+       while (*q) {\r
+         if (*q == '\r')\r
+           q++;\r
+         else\r
+           *p++ = *q++;\r
+       }\r
+       *p = NULLCHAR;\r
+       ReplaceComment(commentIndex, str);\r
+       free(str);\r
       }\r
       CommentPopDown();\r
       return TRUE;\r
@@ -7400,7 +7140,7 @@ EitherCommentPopUp(int index, char *title, char *str, BOOLEAN edit)
   } else {\r
     lpProc = MakeProcInstance((FARPROC)CommentDialog, hInst);\r
     CreateDialog(hInst, MAKEINTRESOURCE(DLG_EditComment),\r
-         hwndMain, (DLGPROC)lpProc);\r
+                hwndMain, (DLGPROC)lpProc);\r
     FreeProcInstance(lpProc);\r
   }\r
   commentDialogUp = TRUE;\r
@@ -7410,7 +7150,7 @@ EitherCommentPopUp(int index, char *title, char *str, BOOLEAN edit)
 /*---------------------------------------------------------------------------*\\r
  *\r
  * Type-in move dialog functions\r
- *\r
+ * \r
 \*---------------------------------------------------------------------------*/\r
 \r
 LRESULT CALLBACK\r
@@ -7438,40 +7178,40 @@ TypeInMoveDialog(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
     case IDOK:\r
       GetDlgItemText(hDlg, OPT_Move, move, sizeof(move));\r
       { int n; Board board;\r
-    // [HGM] FENedit\r
-    if(gameMode == EditPosition && ParseFEN(board, &n, move) ) {\r
-        EditPositionPasteFEN(move);\r
-        EndDialog(hDlg, TRUE);\r
-        return TRUE;\r
-    }\r
-    // [HGM] movenum: allow move number to be typed in any mode\r
-    if(sscanf(move, "%d", &n) == 1 && n != 0 ) {\r
-      currentMove = 2*n-1;\r
-      if(currentMove > forwardMostMove)  currentMove = forwardMostMove;\r
-      if(currentMove < backwardMostMove) currentMove = backwardMostMove;\r
-      EndDialog(hDlg, TRUE);\r
-      DrawPosition(TRUE, boards[currentMove]);\r
-      if(currentMove > backwardMostMove) DisplayMove(currentMove - 1);\r
-      else DisplayMessage("", "");\r
-      return TRUE;\r
-    }\r
+       // [HGM] FENedit\r
+       if(gameMode == EditPosition && ParseFEN(board, &n, move) ) {\r
+               EditPositionPasteFEN(move);\r
+               EndDialog(hDlg, TRUE);\r
+               return TRUE;\r
+       }\r
+       // [HGM] movenum: allow move number to be typed in any mode\r
+       if(sscanf(move, "%d", &n) == 1 && n != 0 ) {\r
+         currentMove = 2*n-1;\r
+         if(currentMove > forwardMostMove)  currentMove = forwardMostMove;\r
+         if(currentMove < backwardMostMove) currentMove = backwardMostMove;\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
-      if (gameMode != EditGame && currentMove != forwardMostMove &&\r
-    gameMode != Training) {\r
-    DisplayMoveError("Displayed move is not current");\r
+      if (gameMode != EditGame && currentMove != forwardMostMove && \r
+       gameMode != Training) {\r
+       DisplayMoveError("Displayed move is not current");\r
       } else {\r
-//  GetDlgItemText(hDlg, OPT_Move, move, sizeof(move)); // moved upstream\r
-    int ok = ParseOneMove(move, gameMode == EditPosition ? blackPlaysFirst : currentMove,\r
-      &moveType, &fromX, &fromY, &toX, &toY, &promoChar);\r
-    if(!ok && move[0] >= 'a') { move[0] += 'A' - 'a'; ok = 2; } // [HGM] try also capitalized\r
-    if (ok==1 || ok && ParseOneMove(move, gameMode == EditPosition ? blackPlaysFirst : currentMove,\r
-      &moveType, &fromX, &fromY, &toX, &toY, &promoChar)) {\r
-      if (gameMode != Training)\r
-          forwardMostMove = currentMove;\r
-      UserMoveEvent(fromX, fromY, toX, toY, promoChar);\r
-    } else {\r
-      DisplayMoveError("Could not parse move");\r
-    }\r
+//     GetDlgItemText(hDlg, OPT_Move, move, sizeof(move)); // moved upstream\r
+       int ok = ParseOneMove(move, gameMode == EditPosition ? blackPlaysFirst : currentMove, \r
+         &moveType, &fromX, &fromY, &toX, &toY, &promoChar);\r
+       if(!ok && move[0] >= 'a') { move[0] += 'A' - 'a'; ok = 2; } // [HGM] try also capitalized\r
+       if (ok==1 || ok && ParseOneMove(move, gameMode == EditPosition ? blackPlaysFirst : currentMove, \r
+         &moveType, &fromX, &fromY, &toX, &toY, &promoChar)) {\r
+         if (gameMode != Training)\r
+             forwardMostMove = currentMove;\r
+         UserMoveEvent(fromX, fromY, toX, toY, promoChar);     \r
+       } else {\r
+         DisplayMoveError("Could not parse move");\r
+       }\r
       }\r
       EndDialog(hDlg, TRUE);\r
       return TRUE;\r
@@ -7490,19 +7230,19 @@ VOID
 PopUpMoveDialog(char firstchar)\r
 {\r
     FARPROC lpProc;\r
-\r
-    if ((gameMode == BeginningOfGame && !appData.icsActive) ||\r
+    \r
+    if ((gameMode == BeginningOfGame && !appData.icsActive) || \r
         gameMode == MachinePlaysWhite || gameMode == MachinePlaysBlack ||\r
-    gameMode == AnalyzeMode || gameMode == EditGame ||\r
-    gameMode == EditPosition || gameMode == IcsExamining ||\r
-    gameMode == IcsPlayingWhite || gameMode == IcsPlayingBlack ||\r
-    isdigit(firstchar) && // [HGM] movenum: allow typing in of move nr in 'passive' modes\r
-        ( gameMode == AnalyzeFile || gameMode == PlayFromGameFile ||\r
-          gameMode == IcsObserving || gameMode == TwoMachinesPlay    ) ||\r
-    gameMode == Training) {\r
+       gameMode == AnalyzeMode || gameMode == EditGame || \r
+       gameMode == EditPosition || gameMode == IcsExamining ||\r
+       gameMode == IcsPlayingWhite || gameMode == IcsPlayingBlack ||\r
+       isdigit(firstchar) && // [HGM] movenum: allow typing in of move nr in 'passive' modes\r
+               ( gameMode == AnalyzeFile || gameMode == PlayFromGameFile ||\r
+                 gameMode == IcsObserving || gameMode == TwoMachinesPlay    ) ||\r
+       gameMode == Training) {\r
       lpProc = MakeProcInstance((FARPROC)TypeInMoveDialog, hInst);\r
       DialogBoxParam(hInst, MAKEINTRESOURCE(DLG_TypeInMove),\r
-    hwndMain, (DLGPROC)lpProc, (LPARAM)firstchar);\r
+       hwndMain, (DLGPROC)lpProc, (LPARAM)firstchar);\r
       FreeProcInstance(lpProc);\r
     }\r
 }\r
@@ -7510,7 +7250,7 @@ PopUpMoveDialog(char firstchar)
 /*---------------------------------------------------------------------------*\\r
  *\r
  * Type-in name dialog functions\r
- *\r
+ * \r
 \*---------------------------------------------------------------------------*/\r
 \r
 LRESULT CALLBACK\r
@@ -7554,22 +7294,22 @@ VOID
 PopUpNameDialog(char firstchar)\r
 {\r
     FARPROC lpProc;\r
-\r
+    \r
       lpProc = MakeProcInstance((FARPROC)TypeInNameDialog, hInst);\r
       DialogBoxParam(hInst, MAKEINTRESOURCE(DLG_TypeInName),\r
-    hwndMain, (DLGPROC)lpProc, (LPARAM)firstchar);\r
+       hwndMain, (DLGPROC)lpProc, (LPARAM)firstchar);\r
       FreeProcInstance(lpProc);\r
 }\r
 \r
 /*---------------------------------------------------------------------------*\\r
  *\r
  *  Error dialogs\r
- *\r
+ * \r
 \*---------------------------------------------------------------------------*/\r
 \r
 /* Nonmodal error box */\r
 LRESULT CALLBACK ErrorDialog(HWND hDlg, UINT message,\r
-                 WPARAM wParam, LPARAM lParam);\r
+                            WPARAM wParam, LPARAM lParam);\r
 \r
 VOID\r
 ErrorPopUp(char *title, char *content)\r
@@ -7583,11 +7323,11 @@ ErrorPopUp(char *title, char *content)
   while (*p) {\r
     if (*p == '\n') {\r
       if (modal) {\r
-    *q++ = ' ';\r
-    p++;\r
+       *q++ = ' ';\r
+       p++;\r
       } else {\r
-    *q++ = '\r';\r
-    *q++ = *p++;\r
+       *q++ = '\r';\r
+       *q++ = *p++;\r
       }\r
     } else {\r
       *q++ = *p++;\r
@@ -7596,13 +7336,13 @@ ErrorPopUp(char *title, char *content)
   *q = NULLCHAR;\r
   strncpy(errorTitle, title, sizeof(errorTitle));\r
   errorTitle[sizeof(errorTitle) - 1] = '\0';\r
-\r
+  \r
   if (modal) {\r
     MessageBox(NULL, errorMessage, errorTitle, MB_OK|MB_ICONEXCLAMATION);\r
   } else {\r
     lpProc = MakeProcInstance((FARPROC)ErrorDialog, hInst);\r
     CreateDialog(hInst, MAKEINTRESOURCE(DLG_Error),\r
-         hwndMain, (DLGPROC)lpProc);\r
+                hwndMain, (DLGPROC)lpProc);\r
     FreeProcInstance(lpProc);\r
   }\r
 }\r
@@ -7628,11 +7368,11 @@ ErrorDialog(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
 \r
     /*\r
     SetWindowPos(hDlg, NULL, rChild.left,\r
-      rChild.top + boardRect.top - (rChild.bottom - rChild.top),\r
+      rChild.top + boardRect.top - (rChild.bottom - rChild.top), \r
       0, 0, SWP_NOZORDER|SWP_NOSIZE);\r
     */\r
 \r
-    /*\r
+    /* \r
         [AS] It seems that the above code wants to move the dialog up in the "caption\r
         area" of the main window, but it uses the dialog height as an hard-coded constant,\r
         and it doesn't work when you resize the dialog.\r
@@ -7679,7 +7419,7 @@ GothicDialog(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
     SetWindowPos(hDlg, NULL, boardX, boardY-height, winWidth, height,\r
                                                              SWP_NOZORDER);\r
 \r
-    /*\r
+    /* \r
         [AS] It seems that the above code wants to move the dialog up in the "caption\r
         area" of the main window, but it uses the dialog height as an hard-coded constant,\r
         and it doesn't work when you resize the dialog.\r
@@ -7724,7 +7464,7 @@ GothicPopUp(char *title, VariantClass variant)
     title = lastTitle;\r
     lpProc = MakeProcInstance((FARPROC)GothicDialog, hInst);\r
     CreateDialog(hInst, MAKEINTRESOURCE(DLG_Error),\r
-         hwndMain, (DLGPROC)lpProc);\r
+                hwndMain, (DLGPROC)lpProc);\r
     FreeProcInstance(lpProc);\r
   }\r
 }\r
@@ -7829,8 +7569,8 @@ ParseIcsTextMenu(char *icsTextMenuString)
       c = ';';\r
       t = strchr(s + 1, c);\r
       if (t == NULL) {\r
-    c = '\n';\r
-    t = strchr(s + 1, c);\r
+       c = '\n';\r
+       t = strchr(s + 1, c);\r
       }\r
       if (t != NULL) *t = NULLCHAR;\r
       e->item = strdup(p);\r
@@ -7845,7 +7585,7 @@ ParseIcsTextMenu(char *icsTextMenuString)
       p = t + 1;\r
     }\r
     e++;\r
-  }\r
+  } \r
 }\r
 \r
 HMENU\r
@@ -7860,15 +7600,15 @@ LoadIcsTextMenu(IcsTextMenuEntry *e)
       AppendMenu(h, MF_SEPARATOR, 0, 0);\r
     } else {\r
       if (e->item[0] == '|') {\r
-    AppendMenu(h, MF_STRING|MF_MENUBARBREAK,\r
-           IDM_CommandX + i, &e->item[1]);\r
+       AppendMenu(h, MF_STRING|MF_MENUBARBREAK,\r
+                  IDM_CommandX + i, &e->item[1]);\r
       } else {\r
-    AppendMenu(h, MF_STRING, IDM_CommandX + i, e->item);\r
+       AppendMenu(h, MF_STRING, IDM_CommandX + i, e->item);\r
       }\r
     }\r
     e++;\r
     i++;\r
-  }\r
+  } \r
   return hmenu;\r
 }\r
 \r
@@ -7892,7 +7632,7 @@ CommandX(HWND hwnd, char *command, BOOLEAN getname, BOOLEAN immediate)
       SetFocus(hInput);\r
     }\r
     return;\r
-  }\r
+  }    \r
   SendMessage(hwnd, EM_EXGETSEL, 0, (LPARAM)&sel);\r
   if (sel.cpMin == sel.cpMax) {\r
     /* Expand to surrounding word */\r
@@ -7942,7 +7682,7 @@ CommandX(HWND hwnd, char *command, BOOLEAN getname, BOOLEAN immediate)
   }\r
 }\r
 \r
-LRESULT CALLBACK\r
+LRESULT CALLBACK \r
 ConsoleTextSubclass(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)\r
 {\r
   HWND hInput;\r
@@ -7967,16 +7707,16 @@ ConsoleTextSubclass(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
    if(wParam != '\022') {\r
     if (wParam == '\t') {\r
       if (GetKeyState(VK_SHIFT) < 0) {\r
-    /* shifted */\r
-    if (IsIconic(hwndMain)) ShowWindow(hwndMain, SW_RESTORE);\r
-    if (buttonDesc[0].hwnd) {\r
-      SetFocus(buttonDesc[0].hwnd);\r
-    } else {\r
-      SetFocus(hwndMain);\r
-    }\r
+       /* shifted */\r
+       if (IsIconic(hwndMain)) ShowWindow(hwndMain, SW_RESTORE);\r
+       if (buttonDesc[0].hwnd) {\r
+         SetFocus(buttonDesc[0].hwnd);\r
+       } else {\r
+         SetFocus(hwndMain);\r
+       }\r
       } else {\r
-    /* unshifted */\r
-    SetFocus(GetDlgItem(hwndConsole, OPT_ConsoleInput));\r
+       /* unshifted */\r
+       SetFocus(GetDlgItem(hwndConsole, OPT_ConsoleInput));\r
       }\r
     } else {\r
       hInput = GetDlgItem(hwndConsole, OPT_ConsoleInput);\r
@@ -7987,7 +7727,7 @@ ConsoleTextSubclass(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
    } // [HGM] navigate: for Ctrl+R, flow into nex case (moved up here) to summon up menu\r
   case WM_RBUTTONUP:\r
     if (GetKeyState(VK_SHIFT) & ~1) {\r
-      SendDlgItemMessage(hwndConsole, OPT_ConsoleText,\r
+      SendDlgItemMessage(hwndConsole, OPT_ConsoleText, \r
         WM_COMMAND, MAKEWPARAM(IDM_QuickPaste, 0), 0);\r
     } else {\r
       POINT pt;\r
@@ -8020,8 +7760,8 @@ ConsoleTextSubclass(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
       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
-    sel.cpMax = sel.cpMin;\r
-    SendMessage(hwnd, EM_EXSETSEL, 0, (LPARAM)&sel);\r
+       sel.cpMax = sel.cpMin;\r
+       SendMessage(hwnd, EM_EXSETSEL, 0, (LPARAM)&sel);\r
       }\r
       SendMessage(hwnd, EM_HIDESELECTION, FALSE, FALSE);\r
     }\r
@@ -8031,12 +7771,12 @@ ConsoleTextSubclass(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
     case IDM_QuickPaste:\r
       {\r
         SendMessage(hwnd, EM_EXGETSEL, 0, (LPARAM)&sel);\r
-    if (sel.cpMin == sel.cpMax) {\r
-      MessageBeep(MB_ICONEXCLAMATION);\r
+       if (sel.cpMin == sel.cpMax) {\r
+         MessageBeep(MB_ICONEXCLAMATION);\r
           return 0;\r
-    }\r
-    SendMessage(hwnd, WM_COPY, 0, 0);\r
-    hInput = GetDlgItem(hwndConsole, OPT_ConsoleInput);\r
+       }\r
+       SendMessage(hwnd, WM_COPY, 0, 0);\r
+       hInput = GetDlgItem(hwndConsole, OPT_ConsoleInput);\r
         SendMessage(hInput, WM_PASTE, 0, 0);\r
         SetFocus(hInput);\r
         return 0;\r
@@ -8052,14 +7792,14 @@ ConsoleTextSubclass(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
       return 0;\r
     default:\r
       {\r
-    int i = LOWORD(wParam) - IDM_CommandX;\r
-    if (i >= 0 && i < ICS_TEXT_MENU_SIZE &&\r
-        icsTextMenuEntry[i].command != NULL) {\r
-      CommandX(hwnd, icsTextMenuEntry[i].command,\r
-           icsTextMenuEntry[i].getname,\r
-           icsTextMenuEntry[i].immediate);\r
-      return 0;\r
-    }\r
+       int i = LOWORD(wParam) - IDM_CommandX;\r
+       if (i >= 0 && i < ICS_TEXT_MENU_SIZE &&\r
+           icsTextMenuEntry[i].command != NULL) {\r
+         CommandX(hwnd, icsTextMenuEntry[i].command,\r
+                  icsTextMenuEntry[i].getname,\r
+                  icsTextMenuEntry[i].immediate);\r
+         return 0;\r
+       }\r
       }\r
       break;\r
     }\r
@@ -8099,15 +7839,15 @@ ConsoleInputSubclass(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
     }\r
     switch (wParam) {\r
     case '\r':   /* Enter key */\r
-      is->count = GetWindowText(hwnd, is->buf, INPUT_SOURCE_BUF_SIZE-1);\r
+      is->count = GetWindowText(hwnd, is->buf, INPUT_SOURCE_BUF_SIZE-1);     \r
       if (consoleEcho) SaveInHistory(is->buf);\r
       is->buf[is->count++] = '\n';\r
       is->buf[is->count] = NULLCHAR;\r
       SendMessage(hwndMain, WM_USER_Input, 0, (LPARAM) is);\r
       if (consoleEcho) {\r
-    ConsoleOutput(is->buf, is->count, TRUE);\r
+       ConsoleOutput(is->buf, is->count, TRUE);\r
       } else if (appData.localLineEditing) {\r
-    ConsoleOutput("\n", 1, TRUE);\r
+       ConsoleOutput("\n", 1, TRUE);\r
       }\r
       /* fall thru */\r
     case '\033': /* Escape key */\r
@@ -8117,23 +7857,23 @@ ConsoleInputSubclass(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
       if (consoleEcho) {\r
         cf.crTextColor = textAttribs[ColorNormal].color;\r
       } else {\r
-    cf.crTextColor = COLOR_ECHOOFF;\r
+       cf.crTextColor = COLOR_ECHOOFF;\r
       }\r
       cf.dwEffects = textAttribs[ColorNormal].effects;\r
       SendMessage(hwnd, EM_SETCHARFORMAT, SCF_ALL, (LPARAM)&cf);\r
       return 0;\r
     case '\t':   /* Tab key */\r
       if (GetKeyState(VK_SHIFT) < 0) {\r
-    /* shifted */\r
-    SetFocus(GetDlgItem(hwndConsole, OPT_ConsoleText));\r
+       /* shifted */\r
+       SetFocus(GetDlgItem(hwndConsole, OPT_ConsoleText));\r
       } else {\r
-    /* unshifted */\r
-    if (IsIconic(hwndMain)) ShowWindow(hwndMain, SW_RESTORE);\r
-    if (buttonDesc[0].hwnd) {\r
-      SetFocus(buttonDesc[0].hwnd);\r
-    } else {\r
-      SetFocus(hwndMain);\r
-    }\r
+       /* unshifted */\r
+       if (IsIconic(hwndMain)) ShowWindow(hwndMain, SW_RESTORE);\r
+       if (buttonDesc[0].hwnd) {\r
+         SetFocus(buttonDesc[0].hwnd);\r
+       } else {\r
+         SetFocus(hwndMain);\r
+       }\r
       }\r
       return 0;\r
     case '\023': /* Ctrl+S */\r
@@ -8153,20 +7893,20 @@ ConsoleInputSubclass(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
       GetWindowText(hwnd, buf, MSG_SIZ);\r
       p = PrevInHistory(buf);\r
       if (p != NULL) {\r
-    SetWindowText(hwnd, p);\r
-    sel.cpMin = 999999;\r
-    sel.cpMax = 999999;\r
-    SendMessage(hwnd, EM_EXSETSEL, 0, (LPARAM)&sel);\r
+       SetWindowText(hwnd, p);\r
+       sel.cpMin = 999999;\r
+       sel.cpMax = 999999;\r
+       SendMessage(hwnd, EM_EXSETSEL, 0, (LPARAM)&sel);\r
         return 0;\r
       }\r
       break;\r
     case VK_DOWN:\r
       p = NextInHistory();\r
       if (p != NULL) {\r
-    SetWindowText(hwnd, p);\r
-    sel.cpMin = 999999;\r
-    sel.cpMax = 999999;\r
-    SendMessage(hwnd, EM_EXSETSEL, 0, (LPARAM)&sel);\r
+       SetWindowText(hwnd, p);\r
+       sel.cpMin = 999999;\r
+       sel.cpMax = 999999;\r
+       SendMessage(hwnd, EM_EXSETSEL, 0, (LPARAM)&sel);\r
         return 0;\r
       }\r
       break;\r
@@ -8181,12 +7921,12 @@ ConsoleInputSubclass(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
     }\r
     break;\r
   case WM_MBUTTONDOWN:\r
-    SendDlgItemMessage(hwndConsole, OPT_ConsoleText,\r
+    SendDlgItemMessage(hwndConsole, OPT_ConsoleText, \r
       WM_COMMAND, MAKEWPARAM(IDM_QuickPaste, 0), 0);\r
     break;\r
   case WM_RBUTTONUP:\r
     if (GetKeyState(VK_SHIFT) & ~1) {\r
-      SendDlgItemMessage(hwndConsole, OPT_ConsoleText,\r
+      SendDlgItemMessage(hwndConsole, OPT_ConsoleText, \r
         WM_COMMAND, MAKEWPARAM(IDM_QuickPaste, 0), 0);\r
     } else {\r
       POINT pt;\r
@@ -8206,7 +7946,7 @@ ConsoleInputSubclass(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
     }\r
     return 0;\r
   case WM_COMMAND:\r
-    switch (LOWORD(wParam)) {\r
+    switch (LOWORD(wParam)) { \r
     case IDM_Undo:\r
       SendMessage(hwnd, EM_UNDO, 0, 0);\r
       return 0;\r
@@ -8237,12 +7977,15 @@ LRESULT CALLBACK
 ConsoleWndProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)\r
 {\r
   static SnapData sd;\r
-  static HWND hText, hInput /*, hFocus*/;\r
-//  InputSource *is = consoleInputSource;\r
+  HWND hText, hInput;\r
   RECT rect;\r
   static int sizeX, sizeY;\r
   int newSizeX, newSizeY;\r
   MINMAXINFO *mmi;\r
+  WORD wMask;\r
+\r
+  hText = GetDlgItem(hDlg, OPT_ConsoleText);\r
+  hInput = GetDlgItem(hDlg, OPT_ConsoleInput);\r
 \r
   switch (message) {\r
   case WM_NOTIFY:\r
@@ -8251,21 +7994,18 @@ ConsoleWndProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
       ENLINK *pLink = (ENLINK*)lParam;\r
       if (pLink->msg == WM_LBUTTONUP)\r
       {\r
-          TEXTRANGE tr;\r
-\r
-          tr.chrg = pLink->chrg;\r
-          tr.lpstrText = malloc(1+tr.chrg.cpMax-tr.chrg.cpMin);\r
-          hText = GetDlgItem(hDlg, OPT_ConsoleText);\r
-          SendMessage(hText, EM_GETTEXTRANGE, 0, (LPARAM)&tr);\r
-          ShellExecute(NULL, "open", tr.lpstrText, NULL, NULL, SW_SHOW);\r
-          free(tr.lpstrText);\r
+        TEXTRANGE tr;\r
+\r
+        tr.chrg = pLink->chrg;\r
+        tr.lpstrText = malloc(1+tr.chrg.cpMax-tr.chrg.cpMin);\r
+        SendMessage(hText, EM_GETTEXTRANGE, 0, (LPARAM)&tr);\r
+        ShellExecute(NULL, "open", tr.lpstrText, NULL, NULL, SW_SHOW);\r
+        free(tr.lpstrText);\r
       }\r
     }\r
     break;\r
   case WM_INITDIALOG: /* message: initialize dialog box */\r
     hwndConsole = hDlg;\r
-    hText = GetDlgItem(hDlg, OPT_ConsoleText);\r
-    hInput = GetDlgItem(hDlg, OPT_ConsoleInput);\r
     SetFocus(hInput);\r
     consoleTextWindowProc = (WNDPROC)\r
       SetWindowLong(hText, GWL_WNDPROC, (LONG) ConsoleTextSubclass);\r
@@ -8280,7 +8020,7 @@ ConsoleWndProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
     sizeX = rect.right;\r
     sizeY = rect.bottom;\r
     if (wpConsole.x != CW_USEDEFAULT && wpConsole.y != CW_USEDEFAULT &&\r
-    wpConsole.width != CW_USEDEFAULT && wpConsole.height != CW_USEDEFAULT) {\r
+       wpConsole.width != CW_USEDEFAULT && wpConsole.height != CW_USEDEFAULT) {\r
       WINDOWPLACEMENT wp;\r
       EnsureOnScreen(&wpConsole.x, &wpConsole.y, 0, 0);\r
       wp.length = sizeof(WINDOWPLACEMENT);\r
@@ -8293,7 +8033,7 @@ ConsoleWndProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
       wp.rcNormalPosition.bottom = wpConsole.y + wpConsole.height;\r
       SetWindowPlacement(hDlg, &wp);\r
     }\r
-#if 1\r
+\r
    // [HGM] Chessknight's change 2004-07-13\r
    else { /* Determine Defaults */\r
        WINDOWPLACEMENT wp;\r
@@ -8312,7 +8052,13 @@ ConsoleWndProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
        wp.rcNormalPosition.bottom = wpConsole.y + wpConsole.height;\r
        SetWindowPlacement(hDlg, &wp);\r
     }\r
-#endif\r
+\r
+   // Allow hText to highlight URLs and send notifications on them\r
+   wMask = (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
+\r
     return FALSE;\r
 \r
   case WM_SETFOCUS:\r
@@ -8336,19 +8082,19 @@ ConsoleWndProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
       newTextWidth = rectText.right - rectText.left + newSizeX - sizeX;\r
       newTextHeight = rectText.bottom - rectText.top + newSizeY - sizeY;\r
       if (newTextHeight < 0) {\r
-    newSizeY += -newTextHeight;\r
+       newSizeY += -newTextHeight;\r
         newTextHeight = 0;\r
       }\r
       SetWindowPos(hText, NULL, 0, 0,\r
-    newTextWidth, newTextHeight, SWP_NOZORDER|SWP_NOMOVE);\r
+       newTextWidth, newTextHeight, SWP_NOZORDER|SWP_NOMOVE);\r
       GetWindowRect(hInput, &rectInput); /* gives screen coords */\r
       pt.x = rectInput.left;\r
       pt.y = rectInput.top + newSizeY - sizeY;\r
       ScreenToClient(hDlg, &pt);\r
-      SetWindowPos(hInput, NULL,\r
-    pt.x, pt.y, /* needs client coords */\r
-    rectInput.right - rectInput.left + newSizeX - sizeX,\r
-    rectInput.bottom - rectInput.top, SWP_NOZORDER);\r
+      SetWindowPos(hInput, NULL, \r
+       pt.x, pt.y, /* needs client coords */   \r
+       rectInput.right - rectInput.left + newSizeX - sizeX,\r
+       rectInput.bottom - rectInput.top, SWP_NOZORDER);\r
     }\r
     sizeX = newSizeX;\r
     sizeY = newSizeY;\r
@@ -8372,6 +8118,7 @@ ConsoleWndProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
     return OnMoving( &sd, hDlg, wParam, lParam );\r
 \r
   case WM_EXITSIZEMOVE:\r
+       UpdateICSWidth(hText);\r
     return OnExitSizeMove( &sd, hDlg, wParam, lParam );\r
   }\r
 \r
@@ -8382,17 +8129,10 @@ ConsoleWndProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
 VOID\r
 ConsoleCreate()\r
 {\r
-  HWND hCons, hText;\r
-  WORD wMask;\r
+  HWND hCons;\r
   if (hwndConsole) return;\r
   hCons = CreateDialog(hInst, szConsoleName, 0, NULL);\r
   SendMessage(hCons, WM_INITDIALOG, 0, 0);\r
-\r
-  // make the text item in the console do URL links\r
-  hText = GetDlgItem(hCons, OPT_ConsoleText);\r
-  wMask = SendMessage(hText, EM_GETEVENTMASK, 0, 0L);\r
-  SendMessage(hText, EM_SETEVENTMASK, 0, wMask | ENM_LINK);\r
-  SendMessage(hText, EM_AUTOURLDETECT, TRUE, 0L);\r
 }\r
 \r
 \r
@@ -8419,10 +8159,10 @@ ConsoleOutput(char* data, int length, int forceVisible)
   while (length--) {\r
     if (*p == '\n') {\r
       if (*++p) {\r
-    *q++ = '\r';\r
-    *q++ = '\n';\r
+       *q++ = '\r';\r
+       *q++ = '\n';\r
       } else {\r
-    delayLF = 1;\r
+       delayLF = 1;\r
       }\r
     } else if (*p == '\007') {\r
        MyPlaySound(&sounds[(int)SoundBell]);\r
@@ -8550,8 +8290,8 @@ DisplayAClock(HDC hdc, int timeRemaining, int highlight,
   JAWS_SILENCE\r
 \r
   ExtTextOut(hdc, rect->left + MESSAGE_LINE_LEFTMARGIN,\r
-         rect->top, ETO_CLIPPED|ETO_OPAQUE,\r
-         rect, str, strlen(str), NULL);\r
+            rect->top, ETO_CLIPPED|ETO_OPAQUE,\r
+            rect, str, strlen(str), NULL);\r
   if(logoHeight > 0 && appData.clockMode) {\r
       RECT r;\r
       sprintf(buf, "%s %s", buf+7, flagFell);\r
@@ -8560,8 +8300,8 @@ DisplayAClock(HDC hdc, int timeRemaining, int highlight,
       r.right = rect->right;\r
       r.bottom = rect->bottom;\r
       ExtTextOut(hdc, rect->left + MESSAGE_LINE_LEFTMARGIN,\r
-             r.top, ETO_CLIPPED|ETO_OPAQUE,\r
-             &r, str, strlen(str), NULL);\r
+                r.top, ETO_CLIPPED|ETO_OPAQUE,\r
+                &r, str, strlen(str), NULL);\r
   }\r
   (void) SetTextColor(hdc, oldFg);\r
   (void) SetBkColor(hdc, oldBg);\r
@@ -8571,7 +8311,7 @@ DisplayAClock(HDC hdc, int timeRemaining, int highlight,
 \r
 int\r
 DoReadFile(HANDLE hFile, char *buf, int count, DWORD *outCount,\r
-       OVERLAPPED *ovl)\r
+          OVERLAPPED *ovl)\r
 {\r
   int ok, err;\r
 \r
@@ -8594,9 +8334,9 @@ DoReadFile(HANDLE hFile, char *buf, int count, DWORD *outCount,
     if (err == ERROR_IO_PENDING) {\r
       ok = GetOverlappedResult(hFile, ovl, outCount, TRUE);\r
       if (ok)\r
-    err = NO_ERROR;\r
+       err = NO_ERROR;\r
       else\r
-    err = GetLastError();\r
+       err = GetLastError();\r
     }\r
   }\r
   return err;\r
@@ -8604,7 +8344,7 @@ DoReadFile(HANDLE hFile, char *buf, int count, DWORD *outCount,
 \r
 int\r
 DoWriteFile(HANDLE hFile, char *buf, int count, DWORD *outCount,\r
-        OVERLAPPED *ovl)\r
+           OVERLAPPED *ovl)\r
 {\r
   int ok, err;\r
 \r
@@ -8618,9 +8358,9 @@ DoWriteFile(HANDLE hFile, char *buf, int count, DWORD *outCount,
     if (err == ERROR_IO_PENDING) {\r
       ok = GetOverlappedResult(hFile, ovl, outCount, TRUE);\r
       if (ok)\r
-    err = NO_ERROR;\r
+       err = NO_ERROR;\r
       else\r
-    err = GetLastError();\r
+       err = GetLastError();\r
     }\r
   }\r
   return err;\r
@@ -8632,7 +8372,7 @@ void CheckForInputBufferFull( InputSource * is )
     if( is->lineByLine && (is->next - is->buf) >= INPUT_SOURCE_BUF_SIZE ) {\r
         /* Look for end of line */\r
         char * p = is->buf;\r
-\r
+        \r
         while( p < is->next && *p != '\n' ) {\r
             p++;\r
         }\r
@@ -8660,18 +8400,18 @@ InputThread(LPVOID arg)
   ovl.Internal = ovl.InternalHigh = ovl.Offset = ovl.OffsetHigh = 0;\r
   while (is->hThread != NULL) {\r
     is->error = DoReadFile(is->hFile, is->next,\r
-               INPUT_SOURCE_BUF_SIZE - (is->next - is->buf),\r
-               &is->count, &ovl);\r
+                          INPUT_SOURCE_BUF_SIZE - (is->next - is->buf),\r
+                          &is->count, &ovl);\r
     if (is->error == NO_ERROR) {\r
       is->next += is->count;\r
     } else {\r
       if (is->error == ERROR_BROKEN_PIPE) {\r
-    /* Correct for MS brain damage.  EOF reading a pipe is not an error. */\r
-    is->count = 0;\r
+       /* Correct for MS brain damage.  EOF reading a pipe is not an error. */\r
+       is->count = 0;\r
       } else {\r
-    is->count = (DWORD) -1;\r
+       is->count = (DWORD) -1;\r
         /* [AS] The (is->count <= 0) check below is not useful for unsigned values! */\r
-        break;\r
+        break; \r
       }\r
     }\r
 \r
@@ -8707,37 +8447,37 @@ NonOvlInputThread(LPVOID arg)
   is = (InputSource *) arg;\r
   while (is->hThread != NULL) {\r
     is->error = ReadFile(is->hFile, is->next,\r
-             INPUT_SOURCE_BUF_SIZE - (is->next - is->buf),\r
-             &is->count, NULL) ? NO_ERROR : GetLastError();\r
+                        INPUT_SOURCE_BUF_SIZE - (is->next - is->buf),\r
+                        &is->count, NULL) ? NO_ERROR : GetLastError();\r
     if (is->error == NO_ERROR) {\r
       /* Change CRLF to LF */\r
       if (is->next > is->buf) {\r
-    p = is->next - 1;\r
-    i = is->count + 1;\r
+       p = is->next - 1;\r
+       i = is->count + 1;\r
       } else {\r
-    p = is->next;\r
-    i = is->count;\r
+       p = is->next;\r
+       i = is->count;\r
       }\r
       q = p;\r
       prev = NULLCHAR;\r
       while (i > 0) {\r
-    if (prev == '\r' && *p == '\n') {\r
-      *(q-1) = '\n';\r
-      is->count--;\r
-    } else {\r
-      *q++ = *p;\r
-    }\r
-    prev = *p++;\r
-    i--;\r
+       if (prev == '\r' && *p == '\n') {\r
+         *(q-1) = '\n';\r
+         is->count--;\r
+       } else { \r
+         *q++ = *p;\r
+       }\r
+       prev = *p++;\r
+       i--;\r
       }\r
       *q = NULLCHAR;\r
       is->next = q;\r
     } else {\r
       if (is->error == ERROR_BROKEN_PIPE) {\r
-    /* Correct for MS brain damage.  EOF reading a pipe is not an error. */\r
-    is->count = 0;\r
+       /* Correct for MS brain damage.  EOF reading a pipe is not an error. */\r
+       is->count = 0; \r
       } else {\r
-    is->count = (DWORD) -1;\r
+       is->count = (DWORD) -1;\r
       }\r
     }\r
 \r
@@ -8768,8 +8508,8 @@ SocketInputThread(LPVOID arg)
       is->error = NO_ERROR;\r
       is->next += is->count;\r
       if (is->count == 0 && is->second == is) {\r
-    /* End of file on stderr; quit with no message */\r
-    break;\r
+       /* End of file on stderr; quit with no message */\r
+       break;\r
       }\r
     }\r
     SendMessage(hwndMain, WM_USER_Input, 0, (LPARAM) is);\r
@@ -8793,11 +8533,11 @@ InputEvent(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
     char *q = p;\r
     while (q < is->next) {\r
       if (*q++ == '\n') {\r
-    (is->func)(is, is->closure, p, q - p, NO_ERROR);\r
-    p = q;\r
+       (is->func)(is, is->closure, p, q - p, NO_ERROR);\r
+       p = q;\r
       }\r
     }\r
-\r
+    \r
     /* Move any partial line to the start of the buffer */\r
     q = is->buf;\r
     while (p < is->next) {\r
@@ -8807,8 +8547,8 @@ InputEvent(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
 \r
     if (is->error != NO_ERROR || is->count == 0) {\r
       /* Notify backend of the error.  Note: If there was a partial\r
-     line at the end, it is not flushed through. */\r
-      (is->func)(is, is->closure, is->buf, is->count, is->error);\r
+        line at the end, it is not flushed through. */\r
+      (is->func)(is, is->closure, is->buf, is->count, is->error);   \r
     }\r
   } else {\r
     /* Feed in the whole chunk of input at once */\r
@@ -8848,6 +8588,7 @@ Enables gnuEnables[] = {
   { IDM_StopExamining, MF_BYCOMMAND|MF_GRAYED },\r
   { IDM_StopObserving, MF_BYCOMMAND|MF_GRAYED },\r
   { IDM_Revert, MF_BYCOMMAND|MF_GRAYED },\r
+  { IDM_NewChat, MF_BYCOMMAND|MF_GRAYED },\r
   { -1, -1 }\r
 };\r
 \r
@@ -8857,6 +8598,7 @@ Enables icsEnables[] = {
   { IDM_MachineWhite, MF_BYCOMMAND|MF_GRAYED },\r
   { IDM_MachineBlack, MF_BYCOMMAND|MF_GRAYED },\r
   { IDM_TwoMachines, MF_BYCOMMAND|MF_GRAYED },\r
+  { IDM_MachineBoth, MF_BYCOMMAND|MF_GRAYED },\r
   { IDM_AnalysisMode, MF_BYCOMMAND|MF_ENABLED },\r
   { IDM_AnalyzeFile, MF_BYCOMMAND|MF_GRAYED },\r
   { IDM_TimeControl, MF_BYCOMMAND|MF_GRAYED },\r
@@ -8864,6 +8606,8 @@ Enables icsEnables[] = {
   { IDM_Hint, MF_BYCOMMAND|MF_GRAYED },\r
   { IDM_Book, MF_BYCOMMAND|MF_GRAYED },\r
   { IDM_IcsOptions, MF_BYCOMMAND|MF_ENABLED },\r
+  { IDM_Engine1Options, MF_BYCOMMAND|MF_GRAYED },\r
+  { IDM_Engine2Options, MF_BYCOMMAND|MF_GRAYED },\r
   { -1, -1 }\r
 };\r
 \r
@@ -8872,6 +8616,7 @@ Enables zippyEnables[] = {
   { IDM_MoveNow, MF_BYCOMMAND|MF_ENABLED },\r
   { IDM_Hint, MF_BYCOMMAND|MF_ENABLED },\r
   { IDM_Book, MF_BYCOMMAND|MF_ENABLED },\r
+  { IDM_Engine1Options, MF_BYCOMMAND|MF_ENABLED },\r
   { -1, -1 }\r
 };\r
 #endif\r
@@ -8892,6 +8637,10 @@ Enables ncpEnables[] = {
   { IDM_TimeControl, MF_BYCOMMAND|MF_GRAYED },\r
   { IDM_Hint, MF_BYCOMMAND|MF_GRAYED },\r
   { IDM_Book, MF_BYCOMMAND|MF_GRAYED },\r
+  { IDM_MachineBoth, MF_BYCOMMAND|MF_GRAYED },\r
+  { IDM_NewChat, MF_BYCOMMAND|MF_GRAYED },\r
+  { IDM_Engine1Options, MF_BYCOMMAND|MF_GRAYED },\r
+  { IDM_Engine2Options, MF_BYCOMMAND|MF_GRAYED },\r
   { -1, -1 }\r
 };\r
 \r
@@ -8973,7 +8722,7 @@ Enables userThinkingEnables[] = {
  *\r
  *  Front-end interface functions exported by XBoard.\r
  *  Functions appear in same order as prototypes in frontend.h.\r
- *\r
+ * \r
 \*---------------------------------------------------------------------------*/\r
 VOID\r
 ModeHighlight()\r
@@ -8985,7 +8734,7 @@ ModeHighlight()
   if (pausing != prevPausing) {\r
     prevPausing = pausing;\r
     (void) CheckMenuItem(GetMenu(hwndMain), IDM_Pause,\r
-             MF_BYCOMMAND|(pausing ? MF_CHECKED : MF_UNCHECKED));\r
+                        MF_BYCOMMAND|(pausing ? MF_CHECKED : MF_UNCHECKED));\r
     if (hwndPause) SetWindowText(hwndPause, pausing ? "C" : "P");\r
   }\r
 \r
@@ -9038,17 +8787,17 @@ ModeHighlight()
   }\r
   if (prevChecked != 0)\r
     (void) CheckMenuItem(GetMenu(hwndMain),\r
-             prevChecked, MF_BYCOMMAND|MF_UNCHECKED);\r
+                        prevChecked, MF_BYCOMMAND|MF_UNCHECKED);\r
   if (nowChecked != 0)\r
     (void) CheckMenuItem(GetMenu(hwndMain),\r
-             nowChecked, MF_BYCOMMAND|MF_CHECKED);\r
+                        nowChecked, MF_BYCOMMAND|MF_CHECKED);\r
 \r
   if (nowChecked == IDM_LoadGame || nowChecked == IDM_Training) {\r
-    (void) EnableMenuItem(GetMenu(hwndMain), IDM_Training,\r
-              MF_BYCOMMAND|MF_ENABLED);\r
+    (void) EnableMenuItem(GetMenu(hwndMain), IDM_Training, \r
+                         MF_BYCOMMAND|MF_ENABLED);\r
   } else {\r
-    (void) EnableMenuItem(GetMenu(hwndMain),\r
-              IDM_Training, MF_BYCOMMAND|MF_GRAYED);\r
+    (void) EnableMenuItem(GetMenu(hwndMain), \r
+                         IDM_Training, MF_BYCOMMAND|MF_GRAYED);\r
   }\r
 \r
   prevChecked = nowChecked;\r
@@ -9104,7 +8853,7 @@ SetCmailMode()
   SetMenuEnables(GetMenu(hwndMain), cmailEnables);\r
 }\r
 \r
-VOID\r
+VOID \r
 SetTrainingModeOn()\r
 {\r
   int i;\r
@@ -9160,7 +8909,7 @@ DisplayTitle(char *str)
   } else if (appData.icsActive) {\r
     if (appData.icsCommPort[0] != NULLCHAR)\r
       host = "ICS";\r
-    else\r
+    else \r
       host = appData.icsHost;\r
     sprintf(title, "%s: %s", szTitle, host);\r
   } else if (appData.noChessProgram) {\r
@@ -9209,7 +8958,7 @@ DisplayMessage(char *str1, char *str2)
   hdc = GetDC(hwndMain);\r
   oldFont = SelectObject(hdc, font[boardSize][MESSAGE_FONT]->hf);\r
   ExtTextOut(hdc, messageRect.left, messageRect.top, ETO_CLIPPED|ETO_OPAQUE,\r
-         &messageRect, messageText, strlen(messageText), NULL);\r
+            &messageRect, messageText, strlen(messageText), NULL);\r
   (void) SelectObject(hdc, oldFont);\r
   (void) ReleaseDC(hwndMain, hdc);\r
 }\r
@@ -9224,21 +8973,21 @@ DisplayError(char *str, int error)
     strcpy(buf, str);\r
   } else {\r
     len = FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM,\r
-            NULL, error, LANG_NEUTRAL,\r
-            (LPSTR) buf2, MSG_SIZ, NULL);\r
+                       NULL, error, LANG_NEUTRAL,\r
+                       (LPSTR) buf2, MSG_SIZ, NULL);\r
     if (len > 0) {\r
       sprintf(buf, "%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
+       sprintf(buf, "%s:\n%s", str, em->msg);\r
       } else {\r
-    sprintf(buf, "%s:\nError code %d", str, error);\r
+       sprintf(buf, "%s:\nError code %d", str, error);\r
       }\r
     }\r
   }\r
-\r
+  \r
   ErrorPopUp("Error", buf);\r
 }\r
 \r
@@ -9266,17 +9015,17 @@ DisplayFatalError(char *str, int error, int exitStatus)
 \r
   if (error != 0) {\r
     len = FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM,\r
-            NULL, error, LANG_NEUTRAL,\r
-            (LPSTR) buf2, MSG_SIZ, NULL);\r
+                       NULL, error, LANG_NEUTRAL,\r
+                       (LPSTR) buf2, MSG_SIZ, NULL);\r
     if (len > 0) {\r
       sprintf(buf, "%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
+       sprintf(buf, "%s:\n%s", str, em->msg);\r
       } else {\r
-    sprintf(buf, "%s:\nError code %d", str, error);\r
+       sprintf(buf, "%s:\nError code %d", str, error);\r
       }\r
     }\r
     str = buf;\r
@@ -9286,7 +9035,7 @@ DisplayFatalError(char *str, int error, int exitStatus)
   }\r
   if (appData.popupExitMessage) {\r
     (void) MessageBox(hwndMain, str, label, MB_OK|\r
-              (exitStatus ? MB_ICONSTOP : MB_ICONINFORMATION));\r
+                     (exitStatus ? MB_ICONSTOP : MB_ICONINFORMATION));\r
   }\r
   ExitEvent(exitStatus);\r
 }\r
@@ -9355,7 +9104,7 @@ AskQuestion(char* title, char *question, char *replyPrefix, ProcRef pr)
 {\r
     QuestionParams qp;\r
     FARPROC lpProc;\r
-\r
+    \r
     qp.title = title;\r
     qp.question = question;\r
     qp.replyPrefix = replyPrefix;\r
@@ -9392,10 +9141,10 @@ LRESULT CALLBACK NewGameFRC_Proc(HWND hDlg, UINT message, WPARAM wParam, LPARAM
         case IDOK:\r
             *lpIndexFRC = GetDlgItemInt(hDlg, IDC_NFG_Edit, &index_is_ok, TRUE );\r
             EndDialog( hDlg, 0 );\r
-        shuffleOpenings = TRUE; /* [HGM] shuffle: switch shuffling on for as long as we stay in current variant */\r
+           shuffleOpenings = TRUE; /* [HGM] shuffle: switch shuffling on for as long as we stay in current variant */\r
             return TRUE;\r
         case IDCANCEL:\r
-            EndDialog( hDlg, 1 );\r
+            EndDialog( hDlg, 1 );   \r
             return TRUE;\r
         case IDC_NFG_Edit:\r
             if( HIWORD(wParam) == EN_CHANGE ) {\r
@@ -9556,7 +9305,7 @@ LRESULT CALLBACK GameListOptions_Proc(HWND hDlg, UINT message, WPARAM wParam, LP
     {\r
     case WM_INITDIALOG:\r
         lpUserGLT = (char *) lParam;\r
-\r
+        \r
         strcpy( glt, lpUserGLT );\r
 \r
         CenterWindow(hDlg, GetWindow(hDlg, GW_OWNER));\r
@@ -9627,7 +9376,7 @@ int GameListOptions()
 \r
     if( result == 0 ) {\r
         /* [AS] Memory leak here! */\r
-        appData.gameListTags = strdup( glt );\r
+        appData.gameListTags = strdup( glt ); \r
     }\r
 \r
     return result;\r
@@ -9646,9 +9395,14 @@ DisplayIcsInteractionTitle(char *str)
 void\r
 DrawPosition(int fullRedraw, Board board)\r
 {\r
-  HDCDrawPosition(NULL, (BOOLEAN) fullRedraw, board);\r
+  HDCDrawPosition(NULL, (BOOLEAN) fullRedraw, board); \r
 }\r
 \r
+void NotifyFrontendLogin()\r
+{\r
+       if (hwndConsole)\r
+               UpdateICSWidth(GetDlgItem(hwndConsole, OPT_ConsoleText));\r
+}\r
 \r
 VOID\r
 ResetFrontEnd()\r
@@ -9767,8 +9521,8 @@ UserName()
   static char buf[MSG_SIZ];\r
   DWORD bufsiz = MSG_SIZ;\r
 \r
-  if(appData.userName != NULL && appData.userName[0] != 0) {\r
-    return appData.userName; /* [HGM] username: prefer name selected by user over his system login */\r
+  if(appData.userName != NULL && appData.userName[0] != 0) { \r
+       return appData.userName; /* [HGM] username: prefer name selected by user over his system login */\r
   }\r
   if (!GetUserName(buf, &bufsiz)) {\r
     /*DisplayError("Error getting user name", GetLastError());*/\r
@@ -9810,7 +9564,7 @@ void
 StartClockTimer(long millisec)\r
 {\r
   clockTimerEvent = SetTimer(hwndMain, (UINT) CLOCK_TIMER_ID,\r
-                 (UINT) millisec, NULL);\r
+                            (UINT) millisec, NULL);\r
 }\r
 \r
 void\r
@@ -9822,8 +9576,8 @@ DisplayWhiteClock(long timeRemaining, int highlight)
   if(appData.noGUI) return;\r
   hdc = GetDC(hwndMain);\r
   if (!IsIconic(hwndMain)) {\r
-    DisplayAClock(hdc, timeRemaining, highlight,\r
-            flipClock ? &blackRect : &whiteRect, "White", flag);\r
+    DisplayAClock(hdc, timeRemaining, highlight, \r
+                       flipClock ? &blackRect : &whiteRect, "White", flag);\r
   }\r
   if (highlight && iconCurrent == iconBlack) {\r
     iconCurrent = iconWhite;\r
@@ -9846,8 +9600,8 @@ DisplayBlackClock(long timeRemaining, int highlight)
   if(appData.noGUI) return;\r
   hdc = GetDC(hwndMain);\r
   if (!IsIconic(hwndMain)) {\r
-    DisplayAClock(hdc, timeRemaining, highlight,\r
-            flipClock ? &whiteRect : &blackRect, "Black", flag);\r
+    DisplayAClock(hdc, timeRemaining, highlight, \r
+                       flipClock ? &whiteRect : &blackRect, "Black", flag);\r
   }\r
   if (highlight && iconCurrent == iconWhite) {\r
     iconCurrent = iconBlack;\r
@@ -9881,7 +9635,7 @@ void
 StartLoadGameTimer(long millisec)\r
 {\r
   loadGameTimerEvent = SetTimer(hwndMain, (UINT) LOAD_GAME_TIMER_ID,\r
-                (UINT) millisec, NULL);\r
+                               (UINT) millisec, NULL);\r
 }\r
 \r
 void\r
@@ -9893,9 +9647,9 @@ AutoSaveGame()
 \r
   defName = DefaultFileName(appData.oldSaveStyle ? "gam" : "pgn");\r
   f = OpenFileDialog(hwndMain, "a", defName,\r
-             appData.oldSaveStyle ? "gam" : "pgn",\r
-             GAME_FILT,\r
-             "Save Game to File", NULL, fileTitle, NULL);\r
+                    appData.oldSaveStyle ? "gam" : "pgn",\r
+                    GAME_FILT, \r
+                    "Save Game to File", NULL, fileTitle, NULL);\r
   if (f != NULL) {\r
     SaveGame(f, 0, "");\r
     fclose(f);\r
@@ -9917,7 +9671,7 @@ ScheduleDelayedEvent(DelayedEventCallback cb, long millisec)
   }\r
   delayedTimerCallback = cb;\r
   delayedTimerEvent = SetTimer(hwndMain, (UINT) DELAYED_TIMER_ID,\r
-                (UINT) millisec, NULL);\r
+                               (UINT) millisec, NULL);\r
 }\r
 \r
 DelayedEventCallback\r
@@ -10004,9 +9758,9 @@ StartChildProcess(char *cmdLine, char *dir, ProcRef *pr)
 \r
   /* Duplicate the read handle to the pipe, so it is not inherited. */\r
   fSuccess = DuplicateHandle(GetCurrentProcess(), hChildStdoutRd,\r
-                 GetCurrentProcess(), &hChildStdoutRdDup, 0,\r
-                 FALSE, /* not inherited */\r
-                 DUPLICATE_SAME_ACCESS);\r
+                            GetCurrentProcess(), &hChildStdoutRdDup, 0,\r
+                            FALSE,     /* not inherited */\r
+                            DUPLICATE_SAME_ACCESS);\r
   if (! fSuccess) {\r
     return GetLastError();\r
   }\r
@@ -10026,9 +9780,9 @@ StartChildProcess(char *cmdLine, char *dir, ProcRef *pr)
 \r
   /* Duplicate the write handle to the pipe, so it is not inherited. */\r
   fSuccess = DuplicateHandle(GetCurrentProcess(), hChildStdinWr,\r
-                 GetCurrentProcess(), &hChildStdinWrDup, 0,\r
-                 FALSE, /* not inherited */\r
-                 DUPLICATE_SAME_ACCESS);\r
+                            GetCurrentProcess(), &hChildStdinWrDup, 0,\r
+                            FALSE,     /* not inherited */\r
+                            DUPLICATE_SAME_ACCESS);\r
   if (! fSuccess) {\r
     return GetLastError();\r
   }\r
@@ -10055,15 +9809,15 @@ StartChildProcess(char *cmdLine, char *dir, ProcRef *pr)
   siStartInfo.hStdError = hChildStdoutWr;\r
 \r
   fSuccess = CreateProcess(NULL,\r
-               cmdLine,    /* command line */\r
-               NULL,       /* process security attributes */\r
-               NULL,       /* primary thread security attrs */\r
-               TRUE,       /* handles are inherited */\r
-               DETACHED_PROCESS|CREATE_NEW_PROCESS_GROUP,\r
-               NULL,       /* use parent's environment */\r
-               NULL,\r
-               &siStartInfo, /* STARTUPINFO pointer */\r
-               &piProcInfo); /* receives PROCESS_INFORMATION */\r
+                          cmdLine,        /* command line */\r
+                          NULL,           /* process security attributes */\r
+                          NULL,           /* primary thread security attrs */\r
+                          TRUE,           /* handles are inherited */\r
+                          DETACHED_PROCESS|CREATE_NEW_PROCESS_GROUP,\r
+                          NULL,           /* use parent's environment */\r
+                          NULL,\r
+                          &siStartInfo, /* STARTUPINFO pointer */\r
+                          &piProcInfo); /* receives PROCESS_INFORMATION */\r
 \r
   err = GetLastError();\r
   SetCurrentDirectory(buf); /* return to prev directory */\r
@@ -10123,7 +9877,7 @@ DestroyChildProcess(ProcRef pr, int/*boolean*/ signal)
     /*!!if (signal) GenerateConsoleCtrlEvent(CTRL_BREAK_EVENT, cp->pid);*/\r
 \r
     /* [AS] Special termination modes for misbehaving programs... */\r
-    if( signal == 9 ) {\r
+    if( signal == 9 ) { \r
         result = TerminateProcess( cp->hProcess, 0 );\r
 \r
         if ( appData.debugMode) {\r
@@ -10276,7 +10030,7 @@ OpenTCP(char *host, char *port, ProcRef *pr)
 \r
   /* Make connection */\r
   if (connect(s, (struct sockaddr *) &sa,\r
-          sizeof(struct sockaddr_in)) == SOCKET_ERROR) {\r
+             sizeof(struct sockaddr_in)) == SOCKET_ERROR) {\r
     err = WSAGetLastError();\r
     WSACleanup();\r
     return err;\r
@@ -10305,7 +10059,7 @@ OpenCommPort(char *name, ProcRef *pr)
     strcpy(fullname, name);\r
 \r
   h = CreateFile(name, GENERIC_READ | GENERIC_WRITE,\r
-         0, NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL);\r
+                0, NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL);\r
   if (h == (HANDLE) -1) {\r
     return GetLastError();\r
   }\r
@@ -10398,15 +10152,15 @@ OpenRcmd(char* host, char* user, char* cmd, ProcRef* pr)
     }\r
     if (s == INVALID_SOCKET) {\r
       if ((s = socket(PF_INET, SOCK_STREAM, 0)) == INVALID_SOCKET) {\r
-    err = WSAGetLastError();\r
-    WSACleanup();\r
-    return err;\r
+       err = WSAGetLastError();\r
+       WSACleanup();\r
+       return err;\r
       }\r
     }\r
     uport = (unsigned short) fromPort;\r
     mysa.sin_port = htons(uport);\r
     if (bind(s, (struct sockaddr *) &mysa, sizeof(struct sockaddr_in))\r
-    == SOCKET_ERROR) {\r
+       == SOCKET_ERROR) {\r
       err = WSAGetLastError();\r
       if (err == WSAEADDRINUSE) continue;\r
       WSACleanup();\r
@@ -10416,9 +10170,9 @@ OpenRcmd(char* host, char* user, char* cmd, ProcRef* pr)
       sizeof(struct sockaddr_in)) == SOCKET_ERROR) {\r
       err = WSAGetLastError();\r
       if (err == WSAEADDRINUSE) {\r
-    closesocket(s);\r
+       closesocket(s);\r
         s = -1;\r
-    continue;\r
+       continue;\r
       }\r
       WSACleanup();\r
       return err;\r
@@ -10441,16 +10195,16 @@ OpenRcmd(char* host, char* user, char* cmd, ProcRef* pr)
     }\r
     if (s2 == INVALID_SOCKET) {\r
       if ((s2 = socket(PF_INET, SOCK_STREAM, 0)) == INVALID_SOCKET) {\r
-    err = WSAGetLastError();\r
-    closesocket(s);\r
-    WSACleanup();\r
-    return err;\r
+       err = WSAGetLastError();\r
+       closesocket(s);\r
+       WSACleanup();\r
+       return err;\r
       }\r
     }\r
     uport = (unsigned short) fromPort;\r
     mysa.sin_port = htons(uport);\r
     if (bind(s2, (struct sockaddr *) &mysa, sizeof(struct sockaddr_in))\r
-    == SOCKET_ERROR) {\r
+       == SOCKET_ERROR) {\r
       err = WSAGetLastError();\r
       if (err == WSAEADDRINUSE) continue;\r
       (void) closesocket(s);\r
@@ -10460,9 +10214,9 @@ OpenRcmd(char* host, char* user, char* cmd, ProcRef* pr)
     if (listen(s2, 1) == SOCKET_ERROR) {\r
       err = WSAGetLastError();\r
       if (err == WSAEADDRINUSE) {\r
-    closesocket(s2);\r
-    s2 = INVALID_SOCKET;\r
-    continue;\r
+       closesocket(s2);\r
+       s2 = INVALID_SOCKET;\r
+       continue;\r
       }\r
       (void) closesocket(s);\r
       (void) closesocket(s2);\r
@@ -10527,7 +10281,7 @@ OpenRcmd(char* host, char* user, char* cmd, ProcRef* pr)
 \r
 InputSourceRef\r
 AddInputSource(ProcRef pr, int lineByLine,\r
-           InputCallback func, VOIDSTAR closure)\r
+              InputCallback func, VOIDSTAR closure)\r
 {\r
   InputSource *is, *is2 = NULL;\r
   ChildProc *cp = (ChildProc *) pr;\r
@@ -10543,7 +10297,7 @@ AddInputSource(ProcRef pr, int lineByLine,
     consoleInputSource = is;\r
   } else {\r
     is->kind = cp->kind;\r
-    /*\r
+    /* \r
         [AS] Try to avoid a race condition if the thread is given control too early:\r
         we create all threads suspended so that the is->hThread variable can be\r
         safely assigned, then let the threads start with ResumeThread.\r
@@ -10553,23 +10307,23 @@ AddInputSource(ProcRef pr, int lineByLine,
       is->hFile = cp->hFrom;\r
       cp->hFrom = NULL; /* now owned by InputThread */\r
       is->hThread =\r
-    CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE) NonOvlInputThread,\r
-             (LPVOID) is, CREATE_SUSPENDED, &is->id);\r
+       CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE) NonOvlInputThread,\r
+                    (LPVOID) is, CREATE_SUSPENDED, &is->id);\r
       break;\r
 \r
     case CPComm:\r
       is->hFile = cp->hFrom;\r
       cp->hFrom = NULL; /* now owned by InputThread */\r
       is->hThread =\r
-    CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE) InputThread,\r
-             (LPVOID) is, CREATE_SUSPENDED, &is->id);\r
+       CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE) InputThread,\r
+                    (LPVOID) is, CREATE_SUSPENDED, &is->id);\r
       break;\r
 \r
     case CPSock:\r
       is->sock = cp->sock;\r
       is->hThread =\r
-    CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE) SocketInputThread,\r
-             (LPVOID) is, CREATE_SUSPENDED, &is->id);\r
+       CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE) SocketInputThread,\r
+                    (LPVOID) is, CREATE_SUSPENDED, &is->id);\r
       break;\r
 \r
     case CPRcmd:\r
@@ -10580,11 +10334,11 @@ AddInputSource(ProcRef pr, int lineByLine,
       is2->sock = cp->sock2;\r
       is2->second = is2;\r
       is->hThread =\r
-    CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE) SocketInputThread,\r
-             (LPVOID) is, CREATE_SUSPENDED, &is->id);\r
+       CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE) SocketInputThread,\r
+                    (LPVOID) is, CREATE_SUSPENDED, &is->id);\r
       is2->hThread =\r
-    CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE) SocketInputThread,\r
-             (LPVOID) is2, CREATE_SUSPENDED, &is2->id);\r
+       CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE) SocketInputThread,\r
+                    (LPVOID) is2, CREATE_SUSPENDED, &is2->id);\r
       break;\r
     }\r
 \r
@@ -10614,6 +10368,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
@@ -10622,10 +10381,31 @@ 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
+  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
@@ -10646,7 +10426,7 @@ OutputToProcess(ProcRef pr, char *message, int count, int *outError)
 \r
   case CPReal:\r
     if (WriteFile(((ChildProc *)pr)->hTo, message, count,\r
-          &dOutCount, NULL)) {\r
+                 &dOutCount, NULL)) {\r
       *outError = NO_ERROR;\r
       outCount = (int) dOutCount;\r
     } else {\r
@@ -10656,7 +10436,7 @@ OutputToProcess(ProcRef pr, char *message, int count, int *outError)
 \r
   case CPComm:\r
     *outError = DoWriteFile(((ChildProc *)pr)->hTo, message, count,\r
-                &dOutCount, &ovl);\r
+                           &dOutCount, &ovl);\r
     if (*outError == NO_ERROR) {\r
       outCount = (int) dOutCount;\r
     }\r
@@ -10667,7 +10447,7 @@ OutputToProcess(ProcRef pr, char *message, int count, int *outError)
 \r
 int\r
 OutputToProcessDelayed(ProcRef pr, char *message, int count, int *outError,\r
-               long msdelay)\r
+                      long msdelay)\r
 {\r
   /* Ignore delay, not implemented for WinBoard */\r
   return OutputToProcess(pr, message, count, outError);\r
@@ -10676,7 +10456,7 @@ OutputToProcessDelayed(ProcRef pr, char *message, int count, int *outError,
 \r
 void\r
 CmailSigHandlerCallBack(InputSourceRef isr, VOIDSTAR closure,\r
-            char *buf, int count, int error)\r
+                       char *buf, int count, int error)\r
 {\r
   DisplayFatalError("Not implemented", 0, 1);\r
 }\r
@@ -10707,7 +10487,7 @@ StartAnalysisClock()
 {\r
   if (analysisTimerEvent) return;\r
   analysisTimerEvent = SetTimer(hwndMain, (UINT) ANALYSIS_TIMER_ID,\r
-                                (UINT) 2000, NULL);\r
+                                       (UINT) 2000, NULL);\r
 }\r
 \r
 LRESULT CALLBACK\r
@@ -10733,26 +10513,26 @@ AnalysisDialog(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
       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
+         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
+                             newSizeX, newSizeY);\r
+       sizeX = newSizeX;\r
+       sizeY = newSizeY;\r
       }\r
     }\r
     return FALSE;\r
@@ -10791,51 +10571,6 @@ AnalysisDialog(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
 }\r
 \r
 VOID\r
-AnalysisPopUp(char* title, char* str)\r
-{\r
-  FARPROC lpProc;\r
-  char *p, *q;\r
-\r
-  /* [AS] */\r
-  EngineOutputPopUp();\r
-  return;\r
-\r
-  if (str == NULL) str = "";\r
-  p = (char *) malloc(2 * strlen(str) + 2);\r
-  q = p;\r
-  while (*str) {\r
-    if (*str == '\n') *q++ = '\r';\r
-    *q++ = *str++;\r
-  }\r
-  *q = NULLCHAR;\r
-  if (analysisText != NULL) free(analysisText);\r
-  analysisText = p;\r
-\r
-  if (analysisDialog) {\r
-    SetWindowText(analysisDialog, title);\r
-    SetDlgItemText(analysisDialog, OPT_AnalysisText, analysisText);\r
-    ShowWindow(analysisDialog, SW_SHOW);\r
-  } else {\r
-    analysisTitle = title;\r
-    lpProc = MakeProcInstance((FARPROC)AnalysisDialog, hInst);\r
-    CreateDialog(hInst, MAKEINTRESOURCE(DLG_Analysis),\r
-         hwndMain, (DLGPROC)lpProc);\r
-    FreeProcInstance(lpProc);\r
-  }\r
-  analysisDialogUp = TRUE;\r
-}\r
-\r
-VOID\r
-AnalysisPopDown()\r
-{\r
-  if (analysisDialog) {\r
-    ShowWindow(analysisDialog, SW_HIDE);\r
-  }\r
-  analysisDialogUp = FALSE;\r
-}\r
-\r
-\r
-VOID\r
 SetHighlights(int fromX, int fromY, int toX, int toY)\r
 {\r
   highlightInfo.sq[0].x = fromX;\r
@@ -10847,7 +10582,7 @@ SetHighlights(int fromX, int fromY, int toX, int toY)
 VOID\r
 ClearHighlights()\r
 {\r
-  highlightInfo.sq[0].x = highlightInfo.sq[0].y =\r
+  highlightInfo.sq[0].x = highlightInfo.sq[0].y = \r
     highlightInfo.sq[1].x = highlightInfo.sq[1].y = -1;\r
 }\r
 \r
@@ -10863,7 +10598,7 @@ SetPremoveHighlights(int fromX, int fromY, int toX, int toY)
 VOID\r
 ClearPremoveHighlights()\r
 {\r
-  premoveHighlightInfo.sq[0].x = premoveHighlightInfo.sq[0].y =\r
+  premoveHighlightInfo.sq[0].x = premoveHighlightInfo.sq[0].y = \r
     premoveHighlightInfo.sq[1].x = premoveHighlightInfo.sq[1].y = -1;\r
 }\r
 \r
@@ -10893,20 +10628,20 @@ static void Tween( POINT * start, POINT * mid, POINT * finish, int factor,
 \r
 void\r
 AnimateAtomicCapture(int fromX, int fromY, int toX, int toY, int nFrames)\r
-{   // [HGM] atomic: animate blast wave\r
-    int i;\r
+{      // [HGM] atomic: animate blast wave\r
+       int i;\r
 if(appData.debugMode) fprintf(debugFP, "exploding (%d,%d)\n", toX, toY);\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
-        Sleep(appData.animSpeed);\r
-    }\r
-    explodeInfo.radius = 0;\r
-    DrawPosition(TRUE, NULL);\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
+           Sleep(appData.animSpeed);\r
+       }\r
+       explodeInfo.radius = 0;\r
+       DrawPosition(TRUE, NULL);\r
 }\r
 \r
 #define kFactor 4\r
@@ -10947,7 +10682,7 @@ AnimateMove(board, fromX, fromY, toX, toY)
        mid.y = start.y + (finish.y - start.y) / 2;\r
      }\r
   }\r
-\r
+  \r
   /* Don't use as many frames for very short moves */\r
   if (abs(toY - fromY) + abs(toX - fromX) <= 2)\r
     Tween(&start, &mid, &finish, kFactor - 1, frames, &nFrames);\r
@@ -10969,9 +10704,9 @@ AnimateMove(board, fromX, fromY, toX, toY)
   animInfo.pos = finish;\r
   DrawPosition(FALSE, NULL);\r
   animInfo.piece = EmptySquare;\r
-  if(gameInfo.variant == VariantAtomic &&\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
+       AnimateAtomicCapture(fromX, fromY, toX, toY, 2*nFrames);\r
 }\r
 \r
 /*      Convert board position to corner of screen rect and color       */\r
@@ -11016,11 +10751,11 @@ Tween(start, mid, finish, factor, frames, nFrames)
     count ++;\r
     fraction = fraction / 2;\r
   }\r
-\r
+  \r
   /* Midpoint */\r
   frames[count] = *mid;\r
   count ++;\r
-\r
+  \r
   /* Slow out, stepping 1/2, then 1/4, ... */\r
   fraction = 2;\r
   for (n = 0; n < factor; n++) {\r
@@ -11035,15 +10770,6 @@ Tween(start, mid, finish, factor, frames, nFrames)
 void\r
 HistorySet( char movelist[][2*MOVE_LEN], int first, int last, int current )\r
 {\r
-#if 0\r
-    char buf[256];\r
-\r
-    sprintf( buf, "HistorySet: first=%d, last=%d, current=%d (%s)\n",\r
-        first, last, current, current >= 0 ? movelist[current] : "n/a" );\r
-\r
-    OutputDebugString( buf );\r
-#endif\r
-\r
     MoveHistorySet( movelist, first, last, current, pvInfoList );\r
 \r
     EvalGraphSet( first, last, current, pvInfoList );\r
@@ -11051,14 +10777,5 @@ HistorySet( char movelist[][2*MOVE_LEN], int first, int last, int current )
 \r
 void SetProgramStats( FrontEndProgramStats * stats )\r
 {\r
-#if 0\r
-    char buf[1024];\r
-\r
-    sprintf( buf, "SetStats for %d: depth=%d, nodes=%lu, score=%5.2f, time=%5.2f, pv=%s\n",\r
-        stats->which, stats->depth, stats->nodes, stats->score / 100.0, stats->time / 100.0, stats->pv == 0 ? "n/a" : stats->pv );\r
-\r
-    OutputDebugString( buf );\r
-#endif\r
-\r
     EngineOutputUpdate( stats );\r
 }\r