changes from H.G. Muller; version 4.3.13
[xboard.git] / winboard / woptions.c
index d568cee..f2a797e 100644 (file)
@@ -1,6 +1,6 @@
 /*\r
  * woptions.c -- Options dialog box routines for WinBoard\r
- * $Id: woptions.c,v 2.1 2003/10/27 19:21:02 mann Exp $
+ * $Id: woptions.c,v 2.1 2003/10/27 19:21:02 mann Exp $\r
  *\r
  * Copyright 2000 Free Software Foundation, Inc.\r
  *\r
@@ -26,6 +26,7 @@
 #include <windows.h>   /* required for all Windows applications */\r
 #include <stdio.h>\r
 #include <stdlib.h>\r
+#include <shlobj.h>    /* [AS] Requires NT 4.0 or Win95 */\r
 \r
 #include "common.h"\r
 #include "winboard.h"\r
@@ -59,10 +60,12 @@ extern ColorClass currentColorClass;
 extern HWND hwndConsole;\r
 extern char *defaultTextAttribs[];\r
 extern HWND commentDialog;\r
+extern HWND moveHistoryDialog;\r
 extern char installDir[];\r
 extern HWND hCommPort;    /* currently open comm port */\r
 extern DCB dcb;\r
 extern BOOLEAN chessProgram;\r
+extern startedFromPositionFile; /* [HGM] loadPos */\r
 \r
 /* types */\r
 \r
@@ -80,6 +83,7 @@ typedef struct {
 \r
 LRESULT CALLBACK GeneralOptions(HWND, UINT, WPARAM, LPARAM);\r
 LRESULT CALLBACK BoardOptions(HWND, UINT, WPARAM, LPARAM);\r
+LRESULT CALLBACK NewVariant(HWND, UINT, WPARAM, LPARAM);\r
 LRESULT CALLBACK IcsOptions(HWND, UINT, WPARAM, LPARAM);\r
 LRESULT CALLBACK FontOptions(HWND, UINT, WPARAM, LPARAM);\r
 LRESULT CALLBACK CommPortOptions(HWND, UINT, WPARAM, LPARAM);\r
@@ -167,8 +171,10 @@ GeneralOptionsDialog(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
     CHECK_BOX(OPT_ShowCoordinates, appData.showCoords);\r
     CHECK_BOX(OPT_ShowThinking, appData.showThinking);\r
     CHECK_BOX(OPT_TestLegality, appData.testLegality);\r
-    CHECK_BOX(OPT_HideThinkFromHuman, appData.hideThinkingFromHuman);
-    CHECK_BOX(OPT_SaveExtPGN, appData.saveExtendedInfoInPGN);
+    CHECK_BOX(OPT_HideThinkFromHuman, appData.hideThinkingFromHuman);\r
+    CHECK_BOX(OPT_SaveExtPGN, appData.saveExtendedInfoInPGN);\r
+    CHECK_BOX(OPT_ExtraInfoInMoveHistory, appData.showEvalInMoveHistory);\r
+    CHECK_BOX(OPT_HighlightMoveArrow, appData.highlightMoveWithArrow);\r
 \r
 #undef CHECK_BOX\r
 \r
@@ -210,8 +216,10 @@ GeneralOptionsDialog(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
       appData.showCoords           = IS_CHECKED(OPT_ShowCoordinates);\r
       ShowThinkingEvent(             IS_CHECKED(OPT_ShowThinking));\r
       appData.testLegality         = IS_CHECKED(OPT_TestLegality);\r
-      appData.hideThinkingFromHuman= IS_CHECKED(OPT_HideThinkFromHuman);
-      appData.saveExtendedInfoInPGN= IS_CHECKED(OPT_SaveExtPGN);
+      appData.hideThinkingFromHuman= IS_CHECKED(OPT_HideThinkFromHuman);\r
+      appData.saveExtendedInfoInPGN= IS_CHECKED(OPT_SaveExtPGN);\r
+      appData.showEvalInMoveHistory= IS_CHECKED(OPT_ExtraInfoInMoveHistory);\r
+      appData.highlightMoveWithArrow=IS_CHECKED(OPT_HighlightMoveArrow);\r
 \r
 #undef IS_CHECKED\r
 \r
@@ -488,7 +496,7 @@ BoardOptionsWhichRadio(HWND hDlg)
 LRESULT CALLBACK\r
 BoardOptionsDialog(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)\r
 {\r
-  static Boolean  mono;\r
+  static Boolean  mono, white, flip;\r
   static BoardSize size;\r
   static COLORREF lsc, dsc, wpc, bpc, hsc, phc;\r
   static HBITMAP pieces[3];\r
@@ -557,6 +565,12 @@ BoardOptionsDialog(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
     if (appData.monoMode)\r
       CheckDlgButton(hDlg, OPT_Monochrome, TRUE);\r
 \r
+    if (appData.allWhite)\r
+      CheckDlgButton(hDlg, OPT_AllWhite, TRUE);\r
+\r
+    if (appData.upsideDown)\r
+      CheckDlgButton(hDlg, OPT_UpsideDown, TRUE);\r
+\r
     pieces[0] = DoLoadBitmap(hInst, "n", SAMPLE_SQ_SIZE, "s");\r
     pieces[1] = DoLoadBitmap(hInst, "n", SAMPLE_SQ_SIZE, "w");\r
     pieces[2] = DoLoadBitmap(hInst, "n", SAMPLE_SQ_SIZE, "o");\r
@@ -568,6 +582,8 @@ BoardOptionsDialog(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
     hsc = highlightSquareColor;\r
     phc = premoveHighlightColor;\r
     mono = appData.monoMode;\r
+    white= appData.allWhite;\r
+    flip = appData.upsideDown;\r
     size = boardSize;\r
 \r
     SetBoardOptionEnables(hDlg);\r
@@ -612,6 +628,8 @@ BoardOptionsDialog(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
          (wpc  != whitePieceColor) ||\r
          (bpc  != blackPieceColor) ||\r
          (hsc  != highlightSquareColor) ||\r
+          (flip != appData.upsideDown) ||\r
+          (white != appData.allWhite) ||\r
          (phc  != premoveHighlightColor)) {\r
 \r
          lightSquareColor = lsc;\r
@@ -621,6 +639,8 @@ BoardOptionsDialog(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
          highlightSquareColor = hsc;\r
          premoveHighlightColor = phc;\r
          appData.monoMode = mono;\r
+          appData.allWhite = white;\r
+          appData.upsideDown = flip;\r
 \r
          InitDrawingColors();\r
          InitDrawingSizes(boardSize, 0);\r
@@ -688,7 +708,11 @@ BoardOptionsDialog(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
       hsc = ParseColorName(HIGHLIGHT_SQUARE_COLOR);\r
       phc = ParseColorName(PREMOVE_HIGHLIGHT_COLOR);\r
       mono = FALSE;\r
+      white= FALSE;\r
+      flip = FALSE;\r
       CheckDlgButton(hDlg, OPT_Monochrome, FALSE);\r
+      CheckDlgButton(hDlg, OPT_AllWhite,   FALSE);\r
+      CheckDlgButton(hDlg, OPT_UpsideDown, FALSE);\r
       PaintColorBlock(hDlg, OPT_LightSquareColor, lsc);\r
       PaintColorBlock(hDlg, OPT_DarkSquareColor,  dsc);\r
       PaintColorBlock(hDlg, OPT_WhitePieceColor,  wpc);\r
@@ -706,6 +730,16 @@ BoardOptionsDialog(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
       mono = !mono;\r
       SetBoardOptionEnables(hDlg);\r
       break;\r
+\r
+    case OPT_AllWhite:\r
+      white = !white;\r
+      SetBoardOptionEnables(hDlg);\r
+      break;\r
+\r
+    case OPT_UpsideDown:\r
+      flip = !flip;\r
+      SetBoardOptionEnables(hDlg);\r
+      break;\r
     }\r
     break;\r
   }\r
@@ -722,6 +756,169 @@ BoardOptionsPopup(HWND hwnd)
   FreeProcInstance(lpProc);\r
 }\r
 \r
+VariantClass\r
+VariantWhichRadio(HWND hDlg)\r
+{\r
+  return (IsDlgButtonChecked(hDlg, OPT_VariantFairy) ? VariantFairy :\r
+         (IsDlgButtonChecked(hDlg, OPT_VariantGothic) ? VariantGothic :\r
+         (IsDlgButtonChecked(hDlg, OPT_VariantCrazyhouse) ? VariantCrazyhouse :\r
+         (IsDlgButtonChecked(hDlg, OPT_VariantBughouse) ? VariantBughouse :\r
+         (IsDlgButtonChecked(hDlg, OPT_VariantCourier) ? VariantCourier :\r
+         (IsDlgButtonChecked(hDlg, OPT_VariantShatranj) ? VariantShatranj :\r
+         (IsDlgButtonChecked(hDlg, OPT_VariantShogi) ? VariantShogi :\r
+         (IsDlgButtonChecked(hDlg, OPT_VariantXiangqi) ? VariantXiangqi :\r
+         (IsDlgButtonChecked(hDlg, OPT_VariantCapablanca) ? VariantCapablanca :\r
+         (IsDlgButtonChecked(hDlg, OPT_VariantTwoKings) ? VariantTwoKings :\r
+         (IsDlgButtonChecked(hDlg, OPT_VariantKnightmate) ? VariantKnightmate :\r
+         (IsDlgButtonChecked(hDlg, OPT_VariantLosers) ? VariantLosers :\r
+         (IsDlgButtonChecked(hDlg, OPT_VariantSuicide) ? VariantSuicide :\r
+         (IsDlgButtonChecked(hDlg, OPT_VariantAtomic) ? VariantAtomic :\r
+         (IsDlgButtonChecked(hDlg, OPT_VariantShatranj) ? VariantShatranj :\r
+         (IsDlgButtonChecked(hDlg, OPT_VariantFRC) ? VariantFischeRandom :\r
+         (IsDlgButtonChecked(hDlg, OPT_VariantCylinder) ? VariantCylinder :\r
+         (IsDlgButtonChecked(hDlg, OPT_VariantFalcon) ? VariantFalcon :\r
+          VariantNormal ))))))))))))))))));\r
+}\r
+\r
+LRESULT CALLBACK\r
+NewVariantDialog(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)\r
+{\r
+  static Boolean  mono;\r
+  static VariantClass v;\r
+  static COLORREF lsc, dsc, wpc, bpc, hsc, phc;\r
+  static HBITMAP pieces[3];\r
+  static int n1_ok, n2_ok, n3_ok;\r
+\r
+  switch (message) {\r
+  case WM_INITDIALOG: /* message: initialize dialog box */\r
+    /* Center the dialog over the application window */\r
+    CenterWindow (hDlg, GetWindow (hDlg, GW_OWNER));\r
+    /* Initialize the dialog items */\r
+    switch (gameInfo.variant) {\r
+    case VariantNormal:\r
+      CheckDlgButton(hDlg, OPT_VariantNormal, TRUE);\r
+      break;\r
+    case VariantCrazyhouse:\r
+      CheckDlgButton(hDlg, OPT_VariantCrazyhouse, TRUE);\r
+      break;\r
+    case VariantBughouse:\r
+      CheckDlgButton(hDlg, OPT_VariantBughouse, TRUE);\r
+      break;\r
+    case VariantShogi:\r
+      CheckDlgButton(hDlg, OPT_VariantShogi, TRUE);\r
+      break;\r
+    case VariantXiangqi:\r
+      CheckDlgButton(hDlg, OPT_VariantXiangqi, TRUE);\r
+      break;\r
+    case VariantCapablanca:\r
+      CheckDlgButton(hDlg, OPT_VariantCapablanca, TRUE);\r
+      break;\r
+    case VariantGothic:\r
+      CheckDlgButton(hDlg, OPT_VariantGothic, TRUE);\r
+      break;\r
+    case VariantCourier:\r
+      CheckDlgButton(hDlg, OPT_VariantCourier, TRUE);\r
+      break;\r
+    case VariantKnightmate:\r
+      CheckDlgButton(hDlg, OPT_VariantKnightmate, TRUE);\r
+      break;\r
+    case VariantTwoKings:\r
+      CheckDlgButton(hDlg, OPT_VariantTwoKings, TRUE);\r
+      break;\r
+    case VariantFairy:\r
+      CheckDlgButton(hDlg, OPT_VariantFairy, TRUE);\r
+      break;\r
+    case VariantAtomic:\r
+      CheckDlgButton(hDlg, OPT_VariantAtomic, TRUE);\r
+      break;\r
+    case VariantSuicide:\r
+      CheckDlgButton(hDlg, OPT_VariantSuicide, TRUE);\r
+      break;\r
+    case VariantLosers:\r
+      CheckDlgButton(hDlg, OPT_VariantLosers, TRUE);\r
+      break;\r
+    case VariantShatranj:\r
+      CheckDlgButton(hDlg, OPT_VariantShatranj, TRUE);\r
+      break;\r
+    case VariantFischeRandom:\r
+      CheckDlgButton(hDlg, OPT_VariantFRC, TRUE);\r
+      break;\r
+    }\r
+\r
+    SetDlgItemInt( hDlg, IDC_Files, -1, TRUE );\r
+    SendDlgItemMessage( hDlg, IDC_Files, EM_SETSEL, 0, -1 );\r
+\r
+    SetDlgItemInt( hDlg, IDC_Ranks, -1, TRUE );\r
+    SendDlgItemMessage( hDlg, IDC_Ranks, EM_SETSEL, 0, -1 );\r
+\r
+    SetDlgItemInt( hDlg, IDC_Holdings, -1, TRUE );\r
+    SendDlgItemMessage( hDlg, IDC_Ranks, EM_SETSEL, 0, -1 );\r
+\r
+    n1_ok = n2_ok = n3_ok = FALSE;\r
+\r
+    return TRUE;\r
+\r
+  case WM_COMMAND: /* message: received a command */\r
+    switch (LOWORD(wParam)) {\r
+    case IDOK:\r
+      /* \r
+       * if we call EndDialog() after the call to ChangeBoardSize(),\r
+       * then ChangeBoardSize() does not take effect, although the new\r
+       * boardSize is saved. Go figure...\r
+       */\r
+      EndDialog(hDlg, TRUE);\r
+\r
+      v = VariantWhichRadio(hDlg);\r
+\r
+      gameInfo.variant = v;\r
+      appData.variant = VariantName(v);\r
+\r
+      appData.NrFiles = (int) GetDlgItemInt(hDlg, IDC_Files, NULL, FALSE );\r
+      appData.NrRanks = (int) GetDlgItemInt(hDlg, IDC_Ranks, NULL, FALSE );\r
+      appData.holdingsSize = (int) GetDlgItemInt(hDlg, IDC_Holdings, NULL, FALSE );\r
+\r
+      if(!n1_ok) appData.NrFiles = -1;\r
+      if(!n2_ok) appData.NrRanks = -1;\r
+      if(!n3_ok) appData.holdingsSize = -1;\r
+\r
+      startedFromPositionFile = FALSE; /* [HGM] loadPos: no longer valid in new variant */\r
+      appData.pieceToCharTable = NULL;\r
+      Reset(TRUE, TRUE);\r
+\r
+      return TRUE;\r
+\r
+    case IDCANCEL:\r
+      EndDialog(hDlg, FALSE);\r
+      return TRUE;\r
+\r
+    case IDC_Ranks:\r
+    case IDC_Files:\r
+    case IDC_Holdings:\r
+        if( HIWORD(wParam) == EN_CHANGE ) {\r
+\r
+            GetDlgItemInt(hDlg, IDC_Files, &n1_ok, FALSE );\r
+            GetDlgItemInt(hDlg, IDC_Ranks, &n2_ok, FALSE );\r
+            GetDlgItemInt(hDlg, IDC_Holdings, &n3_ok, FALSE );\r
+\r
+            /*EnableWindow( GetDlgItem(hDlg, IDOK), n1_ok && n2_ok && n3_ok ? TRUE : FALSE );*/\r
+        }\r
+        return TRUE;\r
+    }\r
+    break;\r
+  }\r
+  return FALSE;\r
+}\r
+\r
+\r
+VOID\r
+NewVariantPopup(HWND hwnd)\r
+{\r
+  FARPROC lpProc = MakeProcInstance((FARPROC)NewVariantDialog, hInst);\r
+  DialogBox(hInst, MAKEINTRESOURCE(DLG_NewVariant), hwnd,\r
+         (DLGPROC) lpProc);\r
+  FreeProcInstance(lpProc);\r
+}\r
+\r
 /*---------------------------------------------------------------------------*\\r
  *\r
  * ICS Options Dialog functions\r
@@ -1315,6 +1512,7 @@ FontOptionsDialog(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
       SetSampleFontText(hDlg, OPT_SampleTagFont, &workFont[EDITTAGS_FONT]);\r
       SetSampleFontText(hDlg, OPT_SampleCommentsFont, &workFont[COMMENT_FONT]);\r
       SetSampleFontText(hDlg, OPT_SampleConsoleFont, &workFont[CONSOLE_FONT]);\r
+      SetSampleFontText(hDlg, OPT_SampleMoveHistoryFont, &workFont[MOVEHISTORY_FONT]);\r
       firstPaint = FALSE;\r
     }\r
     break;\r
@@ -1342,6 +1540,7 @@ FontOptionsDialog(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
        CopyFont(font[i][EDITTAGS_FONT], &workFont[EDITTAGS_FONT]);\r
        CopyFont(font[i][CONSOLE_FONT],  &workFont[CONSOLE_FONT]);\r
        CopyFont(font[i][COMMENT_FONT],  &workFont[COMMENT_FONT]);\r
+       CopyFont(font[i][MOVEHISTORY_FONT],  &workFont[MOVEHISTORY_FONT]);\r
       }\r
       /* end sad necessity */\r
 \r
@@ -1364,6 +1563,13 @@ FontOptionsDialog(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
        InvalidateRect(editTagsDialog, &rect, TRUE);\r
       }\r
 \r
+      if( moveHistoryDialog != NULL ) {\r
+       SendDlgItemMessage(moveHistoryDialog, IDC_MoveHistory,\r
+         WM_SETFONT, (WPARAM)font[boardSize][MOVEHISTORY_FONT]->hf, \r
+         MAKELPARAM(TRUE, 0));\r
+       InvalidateRect(editTagsDialog, NULL, TRUE);\r
+      }\r
+\r
       if (hwndConsole) {\r
        ChangedConsoleFont();\r
       }\r
@@ -1409,6 +1615,11 @@ FontOptionsDialog(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
       SetSampleFontText(hDlg, OPT_SampleConsoleFont, &workFont[CONSOLE_FONT]);\r
       break;\r
 \r
+    case OPT_ChooseMoveHistoryFont:\r
+      MyCreateFont(hDlg, &workFont[MOVEHISTORY_FONT]);\r
+      SetSampleFontText(hDlg, OPT_SampleMoveHistoryFont, &workFont[MOVEHISTORY_FONT]);\r
+      break;\r
+\r
     case OPT_DefaultFonts:\r
       for (i=0; i<NUM_FONTS; i++) {\r
        DeleteObject(&workFont[i].hf);\r
@@ -1421,6 +1632,7 @@ FontOptionsDialog(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
       SetSampleFontText(hDlg, OPT_SampleTagFont, &workFont[EDITTAGS_FONT]);\r
       SetSampleFontText(hDlg, OPT_SampleCommentsFont, &workFont[COMMENT_FONT]);\r
       SetSampleFontText(hDlg, OPT_SampleConsoleFont, &workFont[CONSOLE_FONT]);\r
+      SetSampleFontText(hDlg, OPT_SampleMoveHistoryFont, &workFont[MOVEHISTORY_FONT]);\r
       break;\r
     }\r
   }\r
@@ -2237,6 +2449,7 @@ SaveOptionsDialog(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
     } else {\r
       CheckRadioButton(hDlg, OPT_PGN, OPT_Old, OPT_PGN);\r
     }\r
+    CheckDlgButton( hDlg, OPT_OutOfBookInfo, appData.saveOutOfBookInfo );\r
     SetSaveOptionEnables(hDlg);\r
     return TRUE;\r
 \r
@@ -2276,6 +2489,7 @@ SaveOptionsDialog(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
        appData.saveGameFile = "";\r
       }\r
       appData.oldSaveStyle = IsDlgButtonChecked(hDlg, OPT_Old);\r
+      appData.saveOutOfBookInfo = IsDlgButtonChecked( hDlg, OPT_OutOfBookInfo );\r
       EndDialog(hDlg, TRUE);\r
       return TRUE;\r
 \r
@@ -2433,4 +2647,254 @@ TimeControlOptionsPopup(HWND hwnd)
   }\r
 }\r
 \r
+/*---------------------------------------------------------------------------*\\r
+ *\r
+ * Engine Options Dialog functions\r
+ *\r
+\*---------------------------------------------------------------------------*/\r
+#define CHECK_BOX(x,y) CheckDlgButton(hDlg, (x), (BOOL)(y))\r
+#define IS_CHECKED(x) (Boolean)IsDlgButtonChecked(hDlg, (x))\r
+\r
+#define INT_ABS( n )    ((n) >= 0 ? (n) : -(n))\r
+\r
+LRESULT CALLBACK EnginePlayOptionsDialog(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)\r
+{\r
+  switch (message) {\r
+  case WM_INITDIALOG: /* message: initialize dialog box */\r
 \r
+    /* Center the dialog over the application window */\r
+    CenterWindow (hDlg, GetWindow (hDlg, GW_OWNER));\r
+\r
+    /* Initialize the dialog items */\r
+    CHECK_BOX(IDC_EpPeriodicUpdates, appData.periodicUpdates);\r
+    CHECK_BOX(IDC_EpPonder, appData.ponderNextMove);\r
+    CHECK_BOX(IDC_EpShowThinking, appData.showThinking);\r
+    CHECK_BOX(IDC_EpHideThinkingHuman, appData.hideThinkingFromHuman);\r
+\r
+    CHECK_BOX(IDC_TestClaims, appData.testClaims);\r
+    CHECK_BOX(IDC_DetectMates, appData.checkMates);\r
+    CHECK_BOX(IDC_MaterialDraws, appData.materialDraws);\r
+    CHECK_BOX(IDC_TrivialDraws, appData.trivialDraws);\r
+\r
+    SetDlgItemInt( hDlg, IDC_EpDrawMoveCount, appData.adjudicateDrawMoves, TRUE );\r
+    SendDlgItemMessage( hDlg, IDC_EpDrawMoveCount, EM_SETSEL, 0, -1 );\r
+\r
+    SetDlgItemInt( hDlg, IDC_EpAdjudicationThreshold, INT_ABS(appData.adjudicateLossThreshold), TRUE );\r
+    SendDlgItemMessage( hDlg, IDC_EpAdjudicationThreshold, EM_SETSEL, 0, -1 );\r
+\r
+    SetDlgItemInt( hDlg, IDC_RuleMoves, appData.ruleMoves, TRUE );\r
+    SendDlgItemMessage( hDlg, IDC_RuleMoves, EM_SETSEL, 0, -1 );\r
+\r
+    SetDlgItemInt( hDlg, IDC_DrawRepeats, INT_ABS(appData.drawRepeats), TRUE );\r
+    SendDlgItemMessage( hDlg, IDC_DrawRepeats, EM_SETSEL, 0, -1 );\r
+\r
+    return TRUE;\r
+\r
+  case WM_COMMAND: /* message: received a command */\r
+    switch (LOWORD(wParam)) {\r
+    case IDOK:\r
+      /* Read changed options from the dialog box */\r
+      PeriodicUpdatesEvent(          IS_CHECKED(IDC_EpPeriodicUpdates));\r
+      PonderNextMoveEvent(           IS_CHECKED(IDC_EpPonder));\r
+      ShowThinkingEvent(             IS_CHECKED(IDC_EpShowThinking));\r
+      appData.hideThinkingFromHuman= IS_CHECKED(IDC_EpHideThinkingHuman);\r
+      appData.testClaims    = IS_CHECKED(IDC_TestClaims);\r
+      appData.checkMates    = IS_CHECKED(IDC_DetectMates);\r
+      appData.materialDraws = IS_CHECKED(IDC_MaterialDraws);\r
+      appData.trivialDraws  = IS_CHECKED(IDC_TrivialDraws);\r
+\r
+      appData.adjudicateDrawMoves = GetDlgItemInt(hDlg, IDC_EpDrawMoveCount, NULL, FALSE );\r
+      appData.adjudicateLossThreshold = - (int) GetDlgItemInt(hDlg, IDC_EpAdjudicationThreshold, NULL, FALSE );\r
+      appData.ruleMoves = GetDlgItemInt(hDlg, IDC_RuleMoves, NULL, FALSE );\r
+      appData.drawRepeats = (int) GetDlgItemInt(hDlg, IDC_DrawRepeats, NULL, FALSE );\r
+\r
+      EndDialog(hDlg, TRUE);\r
+      return TRUE;\r
+\r
+    case IDCANCEL:\r
+      EndDialog(hDlg, FALSE);\r
+      return TRUE;\r
+\r
+    case IDC_EpDrawMoveCount:\r
+    case IDC_EpAdjudicationThreshold:\r
+    case IDC_DrawRepeats:\r
+    case IDC_RuleMoves:\r
+        if( HIWORD(wParam) == EN_CHANGE ) {\r
+            int n1_ok;\r
+            int n2_ok;\r
+            int n3_ok;\r
+            int n4_ok;\r
+\r
+            GetDlgItemInt(hDlg, IDC_EpDrawMoveCount, &n1_ok, FALSE );\r
+            GetDlgItemInt(hDlg, IDC_EpAdjudicationThreshold, &n2_ok, FALSE );\r
+            GetDlgItemInt(hDlg, IDC_RuleMoves, &n3_ok, FALSE );\r
+            GetDlgItemInt(hDlg, IDC_DrawRepeats, &n4_ok, FALSE );\r
+\r
+            EnableWindow( GetDlgItem(hDlg, IDOK), n1_ok && n2_ok && n3_ok && n4_ok ? TRUE : FALSE );\r
+        }\r
+        return TRUE;\r
+    }\r
+    break;\r
+  }\r
+  return FALSE;\r
+}\r
+\r
+VOID EnginePlayOptionsPopup(HWND hwnd)\r
+{\r
+  FARPROC lpProc;\r
+\r
+  lpProc = MakeProcInstance((FARPROC)EnginePlayOptionsDialog, hInst);\r
+  DialogBox(hInst, MAKEINTRESOURCE(DLG_EnginePlayOptions), hwnd, (DLGPROC) lpProc);\r
+  FreeProcInstance(lpProc);\r
+}\r
+\r
+/*---------------------------------------------------------------------------*\\r
+ *\r
+ * UCI Options Dialog functions\r
+ *\r
+\*---------------------------------------------------------------------------*/\r
+static BOOL BrowseForFolder( const char * title, char * path )\r
+{\r
+    BOOL result = FALSE;\r
+    BROWSEINFO bi;\r
+    LPITEMIDLIST pidl;\r
+\r
+    ZeroMemory( &bi, sizeof(bi) );\r
+\r
+    bi.lpszTitle = title == 0 ? "Choose Folder" : title;\r
+    bi.ulFlags = BIF_RETURNONLYFSDIRS;\r
+\r
+    pidl = SHBrowseForFolder( &bi );\r
+\r
+    if( pidl != 0 ) {\r
+        IMalloc * imalloc = 0;\r
+\r
+        if( SHGetPathFromIDList( pidl, path ) ) {\r
+            result = TRUE;\r
+        }\r
+\r
+        if( SUCCEEDED( SHGetMalloc ( &imalloc ) ) ) {\r
+            imalloc->lpVtbl->Free(imalloc,pidl);\r
+            imalloc->lpVtbl->Release(imalloc);\r
+        }\r
+    }\r
+\r
+    return result;\r
+}\r
+\r
+LRESULT CALLBACK UciOptionsDialog(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)\r
+{\r
+  char buf[MAX_PATH];\r
+\r
+  switch (message) {\r
+  case WM_INITDIALOG: /* message: initialize dialog box */\r
+\r
+    /* Center the dialog over the application window */\r
+    CenterWindow (hDlg, GetWindow (hDlg, GW_OWNER));\r
+\r
+    /* Initialize the dialog items */\r
+    SetDlgItemText( hDlg, IDC_PolyglotDir, appData.polyglotDir );\r
+    SetDlgItemInt( hDlg, IDC_HashSize, appData.defaultHashSize, TRUE );\r
+    SetDlgItemText( hDlg, IDC_PathToEGTB, appData.defaultPathEGTB );\r
+    SetDlgItemInt( hDlg, IDC_SizeOfEGTB, appData.defaultCacheSizeEGTB, TRUE );\r
+    CheckDlgButton( hDlg, IDC_UseBook, (BOOL) appData.usePolyglotBook );\r
+    SetDlgItemText( hDlg, IDC_BookFile, appData.polyglotBook );\r
+\r
+    SendDlgItemMessage( hDlg, IDC_PolyglotDir, EM_SETSEL, 0, -1 );\r
+\r
+    return TRUE;\r
+\r
+  case WM_COMMAND: /* message: received a command */\r
+    switch (LOWORD(wParam)) {\r
+    case IDOK:\r
+      GetDlgItemText( hDlg, IDC_PolyglotDir, buf, sizeof(buf) );\r
+      appData.polyglotDir = strdup(buf);\r
+      appData.defaultHashSize = GetDlgItemInt(hDlg, IDC_HashSize, NULL, FALSE );\r
+      appData.defaultCacheSizeEGTB = GetDlgItemInt(hDlg, IDC_SizeOfEGTB, NULL, FALSE );\r
+      GetDlgItemText( hDlg, IDC_PathToEGTB, buf, sizeof(buf) );\r
+      appData.defaultPathEGTB = strdup(buf);\r
+      GetDlgItemText( hDlg, IDC_BookFile, buf, sizeof(buf) );\r
+      appData.polyglotBook = strdup(buf);\r
+      appData.usePolyglotBook = (Boolean) IsDlgButtonChecked( hDlg, IDC_UseBook );\r
+\r
+      EndDialog(hDlg, TRUE);\r
+      return TRUE;\r
+\r
+    case IDCANCEL:\r
+      EndDialog(hDlg, FALSE);\r
+      return TRUE;\r
+\r
+    case IDC_BrowseForBook:\r
+      {\r
+          char filter[] = { \r
+              'A','l','l',' ','F','i','l','e','s', 0,\r
+              '*','.','*', 0,\r
+              'B','I','N',' ','F','i','l','e','s', 0,\r
+              '*','.','b','i','n', 0,\r
+              0 };\r
+\r
+          OPENFILENAME ofn;\r
+\r
+          strcpy( buf, "" );\r
+\r
+          ZeroMemory( &ofn, sizeof(ofn) );\r
+\r
+          ofn.lStructSize = sizeof(ofn);\r
+          ofn.hwndOwner = hDlg;\r
+          ofn.hInstance = hInst;\r
+          ofn.lpstrFilter = filter;\r
+          ofn.lpstrFile = buf;\r
+          ofn.nMaxFile = sizeof(buf);\r
+          ofn.lpstrTitle = "Choose Book";\r
+          ofn.Flags = OFN_FILEMUSTEXIST | OFN_LONGNAMES | OFN_HIDEREADONLY;\r
+\r
+          if( GetOpenFileName( &ofn ) ) {\r
+              SetDlgItemText( hDlg, IDC_BookFile, buf );\r
+          }\r
+      }\r
+      return TRUE;\r
+\r
+    case IDC_BrowseForPolyglotDir:\r
+      if( BrowseForFolder( "Choose Polyglot Directory", buf ) ) {\r
+        SetDlgItemText( hDlg, IDC_PolyglotDir, buf );\r
+\r
+        strcat( buf, "\\polyglot.exe" );\r
+\r
+        if( GetFileAttributes(buf) == 0xFFFFFFFF ) {\r
+            MessageBox( hDlg, "Polyglot was not found in the specified folder!", "Warning", MB_OK | MB_ICONWARNING );\r
+        }\r
+      }\r
+      return TRUE;\r
+\r
+    case IDC_BrowseForEGTB:\r
+      if( BrowseForFolder( "Choose EGTB Directory:", buf ) ) {\r
+        SetDlgItemText( hDlg, IDC_PathToEGTB, buf );\r
+      }\r
+      return TRUE;\r
+\r
+    case IDC_HashSize:\r
+    case IDC_SizeOfEGTB:\r
+        if( HIWORD(wParam) == EN_CHANGE ) {\r
+            int n1_ok;\r
+            int n2_ok;\r
+\r
+            GetDlgItemInt(hDlg, IDC_HashSize, &n1_ok, FALSE );\r
+            GetDlgItemInt(hDlg, IDC_SizeOfEGTB, &n2_ok, FALSE );\r
+\r
+            EnableWindow( GetDlgItem(hDlg, IDOK), n1_ok && n2_ok ? TRUE : FALSE );\r
+        }\r
+        return TRUE;\r
+    }\r
+    break;\r
+  }\r
+  return FALSE;\r
+}\r
+\r
+VOID UciOptionsPopup(HWND hwnd)\r
+{\r
+  FARPROC lpProc;\r
+\r
+  lpProc = MakeProcInstance((FARPROC)UciOptionsDialog, hInst);\r
+  DialogBox(hInst, MAKEINTRESOURCE(DLG_OptionsUCI), hwnd, (DLGPROC) lpProc);\r
+  FreeProcInstance(lpProc);\r
+}\r