fix for keepalive and chat window
[xboard.git] / winboard / winboard.c
index 21d731d..6452a5b 100644 (file)
 \r
 extern int whiteFlag, blackFlag;\r
 Boolean flipClock = FALSE;\r
+extern HANDLE chatHandle[];\r
+extern int ics_type;\r
 \r
 void DisplayHoldingsCount(HDC hdc, int x, int y, int align, int copyNumber);\r
 VOID NewVariantPopup(HWND hwnd);\r
@@ -108,6 +110,7 @@ int FinishMove P((ChessMove moveType, int fromX, int fromY, int toX, int toY,
 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
   POINT pos;      /* window coordinates of current pos */\r
@@ -449,6 +452,8 @@ VOID EngineOutputPopDown();
 BOOL EngineOutputIsUp();\r
 VOID EngineOutputUpdate( FrontEndProgramStats * stats );\r
 \r
+VOID EngineOptionsPopup(); // [HGM] settings\r
+\r
 VOID GothicPopUp(char *title, VariantClass variant);\r
 /*\r
  * Setting "frozen" should disable all user input other than deleting\r
@@ -492,6 +497,7 @@ static int fromX = -1, fromY = -1, toX, toY; // [HGM] moved upstream, so JAWS ca
 #include "jaws.c"\r
 #else\r
 #define JAWS_INIT\r
+#define JAWS_ARGS\r
 #define JAWS_ALT_INTERCEPT\r
 #define JAWS_KB_NAVIGATION\r
 #define JAWS_MENU_ITEMS\r
@@ -570,7 +576,7 @@ WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
        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 = 7; 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
@@ -595,7 +601,7 @@ WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
                case 4:\r
                  if(!MoveHistoryIsUp()) continue;\r
                  h = mh; break;\r
-//             case 5: // input to eval graph does not seem to get here!\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
@@ -627,6 +633,12 @@ WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
          !(!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
       }\r
@@ -908,6 +920,7 @@ ArgDescriptor argDescriptors[] = {
   { "loadGameFile", ArgFilename, (LPVOID) &appData.loadGameFile, FALSE },\r
   { "", ArgNone, NULL },\r
   /* keyword arguments */\r
+  JAWS_ARGS\r
   { "whitePieceColor", ArgColor, (LPVOID) &whitePieceColor, TRUE },\r
   { "wpc", ArgColor, (LPVOID) &whitePieceColor, FALSE },\r
   { "blackPieceColor", ArgColor, (LPVOID) &blackPieceColor, TRUE },\r
@@ -1319,6 +1332,8 @@ ArgDescriptor argDescriptors[] = {
   { "secondOptions", ArgString, (LPVOID) &appData.secondOptions, FALSE },\r
   { "firstNeedsNoncompliantFEN", ArgString, (LPVOID) &appData.fenOverride1, FALSE },\r
   { "secondNeedsNoncompliantFEN", ArgString, (LPVOID) &appData.fenOverride2, FALSE },\r
+  { "keepAlive", ArgInt, (LPVOID) &appData.keepAlive, FALSE },\r
+  { "icstype", ArgInt, (LPVOID) &ics_type, FALSE },\r
 \r
 #ifdef ZIPPY\r
   { "zippyTalk", ArgBoolean, (LPVOID) &appData.zippyTalk, FALSE },\r
@@ -5094,7 +5109,7 @@ MouseEvent(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
                                                                         ) {\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
+      /* [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
@@ -5107,6 +5122,9 @@ MouseEvent(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
                break; \r
        } else \r
         if(moveType != ImpossibleMove) {\r
+         if(moveType == IllegalMove) {\r
+               ;\r
+         } else\r
           /* [HGM] We use PromotionToKnight in Shogi to indicate frorced promotion */\r
           if (moveType == WhitePromotionKnight || moveType == BlackPromotionKnight ||\r
             ((moveType == WhitePromotionQueen || moveType == BlackPromotionQueen) &&\r
@@ -5124,7 +5142,7 @@ MouseEvent(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
                      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, wthout promotng yet\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
@@ -5140,23 +5158,20 @@ MouseEvent(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
                  ClearHighlights();\r
              }\r
              FinishMove(moveType, fromX, fromY, toX, toY, NULLCHAR);\r
-            fromX = fromY = -1;\r
              if (appData.animate && !appData.highlightLastMove) {\r
                   ClearHighlights();\r
                   DrawPosition(forceFullRepaint || FALSE, NULL);\r
              }\r
           }\r
-          break;\r
+          fromX = fromY = -1;\r
+         break;\r
         }\r
         if (gotPremove) {\r
-            /* [HGM] it seemed that braces were missing here */\r
-            SetPremoveHighlights(fromX, fromY, toX, toY);\r
-            fromX = fromY = -1;\r
-            break;\r
-        }\r
-      }\r
-      ClearHighlights();\r
-      DrawPosition(forceFullRepaint || FALSE, NULL);\r
+           SetPremoveHighlights(fromX, fromY, toX, toY);\r
+            DrawPosition(forceFullRepaint || FALSE, NULL);\r
+       } else ClearHighlights();\r
+        fromX = fromY = -1;\r
+        DrawPosition(forceFullRepaint || FALSE, NULL);\r
     }\r
     /* First downclick, or restart on a square with same color piece */\r
     if (!frozen && OKToStartUserMove(x, y)) {\r
@@ -5652,7 +5667,7 @@ WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
     \r
     JAWS_ALT_INTERCEPT\r
 \r
-    if (appData.icsActive && (isalpha((char)wParam) || wParam == '0')) { \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
@@ -5863,6 +5878,10 @@ WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
       GameListOptions();\r
       break;\r
 \r
+    case IDM_NewChat:\r
+      ChatPopUp();\r
+      break;\r
+\r
     case IDM_CopyPosition:\r
       CopyFENToClipboard();\r
       break;\r
@@ -9391,6 +9410,7 @@ static GLT_Item GLT_ItemInfo[] = {
     { GLT_TIME_CONTROL,"Time Control" },\r
     { GLT_VARIANT,    "Variant" },\r
     { GLT_OUT_OF_BOOK,PGN_OUT_OF_BOOK },\r
+    { GLT_RESULT_COMMENT, "Result Comment" }, // [HGM] rescom\r
     { 0, 0 }\r
 };\r
 \r
@@ -9847,11 +9867,12 @@ void
 ScheduleDelayedEvent(DelayedEventCallback cb, long millisec)\r
 {\r
   if (delayedTimerEvent != 0) {\r
-    if (appData.debugMode) {\r
+    if (appData.debugMode && cb != delayedTimerCallback) { // [HGM] alive: not too much debug\r
       fprintf(debugFP, "ScheduleDelayedEvent: event already scheduled\n");\r
     }\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