added URL detection and provided hotlinks in the ICS client
[xboard.git] / winboard / winboard.c
index 81aa0fb..99f95ba 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
@@ -1335,6 +1339,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
@@ -5115,17 +5120,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
@@ -5150,9 +5152,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
@@ -5165,14 +5169,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
@@ -5220,7 +5226,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
@@ -5248,6 +5254,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
@@ -8238,6 +8245,23 @@ ConsoleWndProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
   MINMAXINFO *mmi;\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
+          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
+      }\r
+    }\r
+    break;\r
   case WM_INITDIALOG: /* message: initialize dialog box */\r
     hwndConsole = hDlg;\r
     hText = GetDlgItem(hDlg, OPT_ConsoleText);\r
@@ -8358,10 +8382,18 @@ ConsoleWndProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
 VOID\r
 ConsoleCreate()\r
 {\r
-  HWND hCons;\r
+  HWND hCons, hText;\r
+  WORD wMask;\r
   if (hwndConsole) return;\r
   hCons = CreateDialog(hInst, szConsoleName, 0, NULL);\r
   SendMessage(hCons, WM_INITDIALOG, 0, 0);\r
+\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
@@ -9640,6 +9672,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