Restructured URL code so it fits better with how winboard is set up.
[xboard.git] / winboard / winboard.c
index e270565..6c5d0ee 100644 (file)
@@ -225,7 +225,11 @@ static struct { int x; int y; int mode; } backTextureSquareInfo[BOARD_SIZE][BOAR
 #if __GNUC__ && !defined(_winmajor)\r
 #define oldDialog 0 /* cygwin doesn't define _winmajor; mingw does */\r
 #else\r
+#if defined(_winmajor)\r
 #define oldDialog (_winmajor < 4)\r
+#else\r
+#define oldDialog 0\r
+#endif\r
 #endif\r
 \r
 char *defaultTextAttribs[] = \r
@@ -490,7 +494,7 @@ void ThawUI()
   DrawMenuBar(hwndMain);\r
 }\r
 \r
-static int fromX = -1, fromY = -1, toX, toY; // [HGM] moved upstream, so JAWS can use them\r
+/*static*/ int fromX = -1, fromY = -1, toX, toY; // [HGM] moved upstream, so JAWS can use them\r
 \r
 /* JAWS preparation patch (WinBoard for the sight impaired). Define required insertions as empty */\r
 #ifdef JAWS\r
@@ -879,6 +883,7 @@ InitInstance(HINSTANCE hInstance, int nCmdShow, LPSTR lpCmdLine)
     ShowWindow(hwndConsole, nCmdShow);\r
   }\r
   if(!appData.noGUI)   UpdateWindow(hwnd);  else ShowWindow(hwnd, SW_MINIMIZE);\r
+  if(gameListDialog) SetFocus(gameListDialog); // [HGM] jaws: for if we clicked multi-game game file\r
 \r
   return TRUE;\r
 \r
@@ -1100,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
@@ -1334,6 +1335,7 @@ ArgDescriptor argDescriptors[] = {
   { "secondNeedsNoncompliantFEN", ArgString, (LPVOID) &appData.fenOverride2, FALSE },\r
   { "keepAlive", ArgInt, (LPVOID) &appData.keepAlive, FALSE },\r
   { "icstype", ArgInt, (LPVOID) &ics_type, FALSE },\r
+  { "forceIllegalMoves", ArgTrue, (LPVOID) &appData.forceIllegal, FALSE },\r
 \r
 #ifdef ZIPPY\r
   { "zippyTalk", ArgBoolean, (LPVOID) &appData.zippyTalk, FALSE },\r
@@ -3034,57 +3036,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
+\r
             SelectObject( hdc, hfont_old );\r
 \r
             fontBitmapSquareSize = squareSize;\r
@@ -3880,35 +3835,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
@@ -3916,7 +3849,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
@@ -4453,17 +4385,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
@@ -4493,35 +4414,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
@@ -4811,7 +4703,6 @@ HDCDrawPosition(HDC hdc, BOOLEAN repaint, Board board)
        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
@@ -4859,7 +4750,6 @@ HDCDrawPosition(HDC hdc, BOOLEAN repaint, Board board)
        // write bitmap data\r
        for(i=0; i<wb*(b.bmHeight - boardRect.top + OUTER_MARGIN); i++) \r
                fputc(pData[i], diagFile);\r
-#endif\r
      }\r
   }\r
 \r
@@ -5114,17 +5004,14 @@ MouseEvent(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
        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);\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) {\r
-         if(moveType == IllegalMove) {\r
-               ;\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
@@ -5149,9 +5036,11 @@ MouseEvent(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
                    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
-          } else {       /* not a promotion */\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
@@ -5164,14 +5053,16 @@ MouseEvent(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
              }\r
           }\r
           fromX = fromY = -1;\r
+       noClear:\r
          break;\r
         }\r
-        if (gotPremove) {\r
+        if (gotPremove && moveType != Comment) {\r
            SetPremoveHighlights(fromX, fromY, toX, toY);\r
-            DrawPosition(forceFullRepaint || FALSE, NULL);\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
@@ -5219,7 +5110,7 @@ MouseEvent(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
       toY = y;\r
       saveAnimate = appData.animate; /* sorry, Hawk :) */\r
       appData.animate = appData.animate && !appData.animateDragging;\r
-      moveType = UserMoveTest(fromX, fromY, toX, toY, NULLCHAR);\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
@@ -5247,6 +5138,7 @@ MouseEvent(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
                    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
@@ -5348,16 +5240,6 @@ MouseEvent(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
        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
@@ -5365,7 +5247,6 @@ MouseEvent(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
             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
@@ -5690,11 +5571,7 @@ WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
       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
+        InvalidateRect(hwnd, &boardRect, FALSE);\r
       }\r
       ReleaseDC(hwnd, hdc);\r
     }\r
@@ -6133,6 +6010,12 @@ WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
       DrawPosition(FALSE, NULL);\r
       break;\r
 \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
+      break;\r
+\r
     case IDM_GeneralOptions:\r
       GeneralOptionsPopup(hwnd);\r
       DrawPosition(TRUE, NULL);\r
@@ -6692,6 +6575,7 @@ MyPlaySound(MySound *ms)
 {\r
   BOOLEAN ok = FALSE;\r
 \r
+  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
@@ -6724,13 +6608,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
@@ -8228,8 +8105,25 @@ ConsoleWndProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
   static int sizeX, sizeY;\r
   int newSizeX, newSizeY;\r
   MINMAXINFO *mmi;\r
+  WORD wMask;\r
 \r
   switch (message) {\r
+  case WM_NOTIFY:\r
+    if (((NMHDR*)lParam)->code == EN_LINK)\r
+    {\r
+      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
+        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
@@ -8261,7 +8155,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
@@ -8280,7 +8174,12 @@ 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 = SendMessage(hText, EM_GETEVENTMASK, 0, 0L);\r
+   SendMessage(hText, EM_SETEVENTMASK, 0, wMask | ENM_LINK);\r
+   SendMessage(hText, EM_AUTOURLDETECT, TRUE, 0L);\r
+\r
     return FALSE;\r
 \r
   case WM_SETFOCUS:\r
@@ -9632,6 +9531,7 @@ CommentPopUp(char *title, char *str)
 {\r
   HWND hwnd = GetActiveWindow();\r
   EitherCommentPopUp(0, title, str, FALSE);\r
+  SAY(str);\r
   SetActiveWindow(hwnd);\r
 }\r
 \r
@@ -9872,6 +9772,7 @@ ScheduleDelayedEvent(DelayedEventCallback cb, long millisec)
     }\r
     KillTimer(hwndMain, delayedTimerEvent);\r
     delayedTimerEvent = 0;\r
+    if(delayedTimerCallback != cb) // [HGM] alive: do not "flush" same event, just postpone it\r
     delayedTimerCallback();\r
   }\r
   delayedTimerCallback = cb;\r
@@ -10994,15 +10895,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
@@ -11010,14 +10902,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