+++ /dev/null
-/*\r
- * woptions.c -- Options dialog box routines for WinBoard\r
- *\r
- * Copyright 2000, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016 Free\r
- * Software Foundation, Inc.\r
- *\r
- * Enhancements Copyright 2005 Alessandro Scotti\r
- *\r
- * ------------------------------------------------------------------------\r
- *\r
- * GNU XBoard is free software: you can redistribute it and/or modify\r
- * it under the terms of the GNU General Public License as published by\r
- * the Free Software Foundation, either version 3 of the License, or (at\r
- * your option) any later version.\r
- *\r
- * GNU XBoard is distributed in the hope that it will be useful, but\r
- * WITHOUT ANY WARRANTY; without even the implied warranty of\r
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\r
- * General Public License for more details.\r
- *\r
- * You should have received a copy of the GNU General Public License\r
- * along with this program. If not, see http://www.gnu.org/licenses/. *\r
- *\r
- *------------------------------------------------------------------------\r
- ** See the file ChangeLog for a revision history. */\r
-\r
-#include "config.h"\r
-\r
-#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
-#include <ctype.h>\r
-\r
-#include "common.h"\r
-#include "frontend.h"\r
-#include "winboard.h"\r
-#include "backend.h"\r
-#include "woptions.h"\r
-#include "defaults.h"\r
-#include <richedit.h>\r
-\r
-#if __GNUC__\r
-#include <errno.h>\r
-#include <string.h>\r
-#endif\r
-\r
-#define _(s) T_(s)\r
-#define N_(s) s\r
-\r
-/* Imports from winboard.c */\r
-\r
-extern MyFont *font[NUM_SIZES][NUM_FONTS];\r
-extern HINSTANCE hInst; /* current instance */\r
-extern HWND hwndMain; /* root window*/\r
-extern BOOLEAN alwaysOnTop;\r
-extern RECT boardRect;\r
-extern COLORREF lightSquareColor, darkSquareColor, whitePieceColor,\r
- blackPieceColor, highlightSquareColor, premoveHighlightColor;\r
-extern HPALETTE hPal;\r
-extern BoardSize boardSize;\r
-extern COLORREF consoleBackgroundColor;\r
-extern MyColorizeAttribs colorizeAttribs[]; /* do I need the size? */\r
-extern MyTextAttribs textAttribs[];\r
-extern MySound sounds[];\r
-extern ColorClass currentColorClass;\r
-extern HWND hwndConsole;\r
-extern char *defaultTextAttribs[];\r
-extern HWND commentDialog;\r
-extern HWND moveHistoryDialog;\r
-extern HWND engineOutputDialog;\r
-extern char installDir[];\r
-extern HWND hCommPort; /* currently open comm port */\r
-extern DCB dcb;\r
-extern BOOLEAN chessProgram;\r
-extern int startedFromPositionFile; /* [HGM] loadPos */\r
-extern int searchTime;\r
-\r
-/* types */\r
-\r
-typedef struct {\r
- char *label;\r
- unsigned value;\r
-} ComboData;\r
-\r
-typedef struct {\r
- char *label;\r
- char *name;\r
-} SoundComboData;\r
-\r
-/* module prototypes */\r
-\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
-LRESULT CALLBACK LoadOptions(HWND, UINT, WPARAM, LPARAM);\r
-LRESULT CALLBACK SaveOptions(HWND, UINT, WPARAM, LPARAM);\r
-LRESULT CALLBACK TimeControl(HWND, UINT, WPARAM, LPARAM);\r
-VOID ChangeBoardSize(BoardSize newSize);\r
-VOID PaintSampleSquare(\r
- HWND hwnd,\r
- int ctrlid,\r
- COLORREF squareColor,\r
- COLORREF pieceColor,\r
- COLORREF squareOutlineColor,\r
- COLORREF pieceDetailColor,\r
- BOOL isWhitePiece,\r
- BOOL isMono,\r
- HBITMAP pieces[3]\r
- );\r
-VOID PaintColorBlock(HWND hwnd, int ctrlid, COLORREF color);\r
-VOID SetBoardOptionEnables(HWND hDlg);\r
-BoardSize BoardOptionsWhichRadio(HWND hDlg);\r
-BOOL APIENTRY MyCreateFont(HWND hwnd, MyFont *font);\r
-VOID UpdateSampleText(HWND hDlg, int id, MyColorizeAttribs *mca);\r
-LRESULT CALLBACK ColorizeTextDialog(HWND , UINT, WPARAM, LPARAM);\r
-VOID ColorizeTextPopup(HWND hwnd, ColorClass cc);\r
-VOID SetIcsOptionEnables(HWND hDlg);\r
-VOID SetSampleFontText(HWND hwnd, int id, const MyFont *mf);\r
-VOID CopyFont(MyFont *dest, const MyFont *src);\r
-void InitSoundComboData(SoundComboData *scd);\r
-void ResetSoundComboData(SoundComboData *scd);\r
-void InitSoundCombo(HWND hwndCombo, SoundComboData *scd);\r
-int SoundDialogWhichRadio(HWND hDlg);\r
-VOID SoundDialogSetEnables(HWND hDlg, int radio);\r
-char * SoundDialogGetName(HWND hDlg, int radio);\r
-void DisplaySelectedSound(HWND hDlg, HWND hCombo, const char *name);\r
-VOID ParseCommSettings(char *arg, DCB *dcb);\r
-VOID PrintCommSettings(FILE *f, char *name, DCB *dcb);\r
-void InitCombo(HANDLE hwndCombo, ComboData *cd);\r
-void SelectComboValue(HANDLE hwndCombo, ComboData *cd, unsigned value);\r
-VOID SetLoadOptionEnables(HWND hDlg);\r
-VOID SetSaveOptionEnables(HWND hDlg);\r
-VOID SetTimeControlEnables(HWND hDlg);\r
-\r
-char *\r
-InterpretFileName(char *buf, char *homeDir)\r
-{ // [HGM] file name relative to homeDir. (Taken out of SafeOptionsDialog, because it is generally useful)\r
- char *result = NULL;\r
- if ((isalpha(buf[0]) && buf[1] == ':') ||\r
- (buf[0] == '\\' && buf[1] == '\\')) {\r
- return strdup(buf);\r
- } else {\r
- char buf2[MSG_SIZ], buf3[MSG_SIZ];\r
- char *dummy;\r
- GetCurrentDirectory(MSG_SIZ, buf3);\r
- SetCurrentDirectory(homeDir);\r
- if (GetFullPathName(buf, MSG_SIZ, buf2, &dummy)) {\r
- result = strdup(buf2);\r
- } else {\r
- result = strdup(buf);\r
- }\r
- SetCurrentDirectory(buf3);\r
- }\r
- return result;\r
-}\r
-\r
-/*---------------------------------------------------------------------------*\\r
- *\r
- * General Options Dialog functions\r
- *\r
-\*---------------------------------------------------------------------------*/\r
-\r
-\r
-LRESULT CALLBACK\r
-GeneralOptionsDialog(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)\r
-{\r
- static Boolean oldShowCoords;\r
- static Boolean oldBlindfold;\r
- static Boolean oldShowButtonBar;\r
- static Boolean oldAutoLogo;\r
-\r
- switch (message) {\r
- case WM_INITDIALOG: /* message: initialize dialog box */\r
- oldShowCoords = appData.showCoords;\r
- oldBlindfold = appData.blindfold;\r
- oldShowButtonBar = appData.showButtonBar;\r
- oldAutoLogo = appData.autoLogo;\r
-\r
- /* Center the dialog over the application window */\r
- CenterWindow (hDlg, GetWindow (hDlg, GW_OWNER));\r
- Translate(hDlg, DLG_GeneralOptions);\r
-\r
- /* Initialize the dialog items */\r
-#define CHECK_BOX(x,y) CheckDlgButton(hDlg, (x), (BOOL)(y))\r
-\r
- CHECK_BOX(OPT_AlwaysOnTop, alwaysOnTop);\r
- CHECK_BOX(OPT_AlwaysQueen, appData.alwaysPromoteToQueen);\r
- CHECK_BOX(OPT_AnimateDragging, appData.animateDragging);\r
- CHECK_BOX(OPT_AnimateMoving, appData.animate);\r
- CHECK_BOX(OPT_AutoFlag, appData.autoCallFlag);\r
- CHECK_BOX(OPT_AutoFlipView, appData.autoFlipView);\r
- CHECK_BOX(OPT_AutoRaiseBoard, appData.autoRaiseBoard);\r
- CHECK_BOX(OPT_Blindfold, appData.blindfold);\r
- CHECK_BOX(OPT_HighlightDragging, appData.highlightDragging);\r
- CHECK_BOX(OPT_HighlightLastMove, appData.highlightLastMove);\r
- CHECK_BOX(OPT_PeriodicUpdates, appData.periodicUpdates);\r
- CHECK_BOX(OPT_PonderNextMove, appData.ponderNextMove);\r
- CHECK_BOX(OPT_PopupExitMessage, appData.popupExitMessage);\r
- CHECK_BOX(OPT_PopupMoveErrors, appData.popupMoveErrors);\r
- CHECK_BOX(OPT_ShowButtonBar, appData.showButtonBar);\r
- 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);\r
- CHECK_BOX(OPT_SaveExtPGN, appData.saveExtendedInfoInPGN);\r
- CHECK_BOX(OPT_ExtraInfoInMoveHistory, appData.showEvalInMoveHistory);\r
- CHECK_BOX(OPT_HighlightMoveArrow, appData.highlightMoveWithArrow);\r
- CHECK_BOX(OPT_AutoLogo, appData.autoLogo); // [HGM] logo\r
- CHECK_BOX(OPT_SmartMove, appData.oneClick); // [HGM] one-click\r
- CHECK_BOX(OPT_AutoTags, appData.autoDisplayTags); // [HGM]\r
- CHECK_BOX(OPT_AutoComment, appData.autoDisplayComment); // [HGM]\r
- CHECK_BOX(OPT_Headers, appData.headers); // [HGM]\r
- CHECK_BOX(OPT_Variations, appData.variations); // [HGM]\r
- CHECK_BOX(OPT_AutoExtend, appData.autoExtend); // [HGM]\r
-\r
-#undef CHECK_BOX\r
-\r
- EnableWindow(GetDlgItem(hDlg, OPT_AutoFlag),\r
- appData.icsActive || !appData.noChessProgram);\r
- EnableWindow(GetDlgItem(hDlg, OPT_AutoFlipView),\r
- appData.icsActive || !appData.noChessProgram);\r
- EnableWindow(GetDlgItem(hDlg, OPT_PonderNextMove),\r
- !appData.noChessProgram);\r
- EnableWindow(GetDlgItem(hDlg, OPT_PeriodicUpdates),\r
- !appData.noChessProgram && !appData.icsActive);\r
- EnableWindow(GetDlgItem(hDlg, OPT_ShowThinking),\r
- !appData.noChessProgram);\r
- return TRUE;\r
-\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
-\r
-#define IS_CHECKED(x) (Boolean)IsDlgButtonChecked(hDlg, (x))\r
-\r
- alwaysOnTop = IS_CHECKED(OPT_AlwaysOnTop);\r
- appData.alwaysPromoteToQueen = IS_CHECKED(OPT_AlwaysQueen);\r
- appData.animateDragging = IS_CHECKED(OPT_AnimateDragging);\r
- appData.animate = IS_CHECKED(OPT_AnimateMoving);\r
- appData.autoCallFlag = IS_CHECKED(OPT_AutoFlag);\r
- appData.autoFlipView = IS_CHECKED(OPT_AutoFlipView);\r
- appData.autoRaiseBoard = IS_CHECKED(OPT_AutoRaiseBoard);\r
- appData.blindfold = IS_CHECKED(OPT_Blindfold);\r
- appData.highlightDragging = IS_CHECKED(OPT_HighlightDragging);\r
- appData.highlightLastMove = IS_CHECKED(OPT_HighlightLastMove);\r
- PeriodicUpdatesEvent( IS_CHECKED(OPT_PeriodicUpdates));\r
- PonderNextMoveEvent( IS_CHECKED(OPT_PonderNextMove));\r
- appData.popupExitMessage = IS_CHECKED(OPT_PopupExitMessage);\r
- appData.popupMoveErrors = IS_CHECKED(OPT_PopupMoveErrors);\r
- appData.showButtonBar = IS_CHECKED(OPT_ShowButtonBar);\r
- appData.showCoords = IS_CHECKED(OPT_ShowCoordinates);\r
- // [HGM] thinking: next three moved up\r
- appData.saveExtendedInfoInPGN= IS_CHECKED(OPT_SaveExtPGN);\r
- appData.hideThinkingFromHuman= IS_CHECKED(OPT_HideThinkFromHuman);\r
- appData.showEvalInMoveHistory= IS_CHECKED(OPT_ExtraInfoInMoveHistory);\r
- appData.showThinking = IS_CHECKED(OPT_ShowThinking);\r
- ShowThinkingEvent(); // [HGM] thinking: tests four options\r
- appData.testLegality = IS_CHECKED(OPT_TestLegality);\r
- appData.highlightMoveWithArrow=IS_CHECKED(OPT_HighlightMoveArrow);\r
- appData.autoLogo =IS_CHECKED(OPT_AutoLogo); // [HGM] logo\r
- appData.oneClick =IS_CHECKED(OPT_SmartMove); // [HGM] one-click\r
- appData.autoDisplayTags =IS_CHECKED(OPT_AutoTags); // [HGM]\r
- appData.autoDisplayComment =IS_CHECKED(OPT_AutoComment); // [HGM]\r
- appData.headers =IS_CHECKED(OPT_Headers); // [HGM]\r
- appData.variations =IS_CHECKED(OPT_Variations); // [HGM]\r
- appData.autoExtend =IS_CHECKED(OPT_AutoExtend); // [HGM]\r
-\r
-#undef IS_CHECKED\r
-\r
- SetWindowPos(hwndMain, alwaysOnTop ? HWND_TOPMOST : HWND_NOTOPMOST,\r
- 0, 0, 0, 0, SWP_NOMOVE|SWP_NOSIZE);\r
-#if AOT_CONSOLE\r
- if (hwndConsole) {\r
- SetWindowPos(hwndConsole, alwaysOnTop ? HWND_TOPMOST : HWND_NOTOPMOST,\r
- 0, 0, 0, 0, SWP_NOMOVE|SWP_NOSIZE);\r
- }\r
-#endif\r
- if (!appData.highlightLastMove) {\r
- ClearHighlights();\r
- DrawPosition(FALSE, NULL);\r
- }\r
- /*\r
- * for some reason the redraw seems smoother when we invalidate\r
- * the board rect after the call to EndDialog()\r
- */\r
- EndDialog(hDlg, TRUE);\r
-\r
- if (oldAutoLogo != appData.autoLogo) { // [HGM] logo: remove any logos when we switch autologo off\r
- if(oldAutoLogo) first.programLogo = second.programLogo = NULL;\r
- InitDrawingSizes(boardSize, 0);\r
- } else if (oldShowButtonBar != appData.showButtonBar) {\r
- InitDrawingSizes(boardSize, 0);\r
- } else if ((oldShowCoords != appData.showCoords) ||\r
- (oldBlindfold != appData.blindfold)) {\r
- InvalidateRect(hwndMain, &boardRect, FALSE);\r
- }\r
-\r
- return TRUE;\r
-\r
- case IDCANCEL:\r
- EndDialog(hDlg, FALSE);\r
- return TRUE;\r
-\r
- }\r
- break;\r
- }\r
- return FALSE;\r
-}\r
-\r
-VOID\r
-GeneralOptionsPopup(HWND hwnd)\r
-{\r
- FARPROC lpProc;\r
-\r
- lpProc = MakeProcInstance((FARPROC)GeneralOptionsDialog, hInst);\r
- DialogBox(hInst, MAKEINTRESOURCE(DLG_GeneralOptions), hwnd,\r
- (DLGPROC) lpProc);\r
- FreeProcInstance(lpProc);\r
-}\r
-/*---------------------------------------------------------------------------*\\r
- *\r
- * Board Options Dialog functions\r
- *\r
-\*---------------------------------------------------------------------------*/\r
-\r
-const int SAMPLE_SQ_SIZE = 54;\r
-\r
-VOID\r
-ChangeBoardSize(BoardSize newSize)\r
-{\r
- if (newSize != boardSize) {\r
- boardSize = newSize;\r
- InitDrawingSizes(boardSize, 0);\r
- }\r
-}\r
-\r
-VOID\r
-PaintSampleSquare(\r
- HWND hwnd,\r
- int ctrlid,\r
- COLORREF squareColor,\r
- COLORREF pieceColor,\r
- COLORREF squareOutlineColor,\r
- COLORREF pieceDetailColor,\r
- BOOL isWhitePiece,\r
- BOOL isMono,\r
- HBITMAP pieces[3]\r
- )\r
-{\r
- HBRUSH brushSquare;\r
- HBRUSH brushSquareOutline;\r
- HBRUSH brushPiece;\r
- HBRUSH brushPieceDetail;\r
- HBRUSH oldBrushPiece = NULL;\r
- HBRUSH oldBrushSquare;\r
- HBITMAP oldBitmapMem;\r
- HBITMAP oldBitmapTemp;\r
- HBITMAP bufferBitmap;\r
- RECT rect;\r
- HDC hdcScreen, hdcMem, hdcTemp;\r
- HPEN pen, oldPen;\r
- HWND hCtrl = GetDlgItem(hwnd, ctrlid);\r
- int x, y;\r
-\r
- const int SOLID = 0;\r
- const int WHITE = 1;\r
- const int OUTLINE = 2;\r
- const int BORDER = 4;\r
-\r
- InvalidateRect(hCtrl, NULL, TRUE);\r
- UpdateWindow(hCtrl);\r
- GetClientRect(hCtrl, &rect);\r
- x = rect.left + (BORDER / 2);\r
- y = rect.top + (BORDER / 2);\r
- hdcScreen = GetDC(hCtrl);\r
- hdcMem = CreateCompatibleDC(hdcScreen);\r
- hdcTemp = CreateCompatibleDC(hdcScreen);\r
-\r
- bufferBitmap = CreateCompatibleBitmap(hdcScreen, rect.right-rect.left+1,\r
- rect.bottom-rect.top+1);\r
- oldBitmapMem = SelectObject(hdcMem, bufferBitmap);\r
- if (!isMono) {\r
- SelectPalette(hdcMem, hPal, FALSE);\r
- }\r
- brushSquare = CreateSolidBrush(squareColor);\r
- brushSquareOutline = CreateSolidBrush(squareOutlineColor);\r
- brushPiece = CreateSolidBrush(pieceColor);\r
- brushPieceDetail = CreateSolidBrush(pieceDetailColor);\r
-\r
- /*\r
- * first draw the rectangle\r
- */\r
- pen = CreatePen(PS_SOLID, BORDER, squareOutlineColor);\r
- oldPen = (HPEN) SelectObject(hdcMem, pen);\r
- oldBrushSquare = (HBRUSH)SelectObject(hdcMem, brushSquare);\r
- Rectangle(hdcMem, rect.left, rect.top, rect.right, rect.bottom);\r
-\r
- /*\r
- * now draw the piece\r
- */\r
- if (isMono) {\r
- oldBitmapTemp = SelectObject(hdcTemp, pieces[OUTLINE]);\r
- BitBlt(hdcMem, x, y, SAMPLE_SQ_SIZE, SAMPLE_SQ_SIZE, hdcTemp, 0, 0,\r
- isWhitePiece ? SRCCOPY : NOTSRCCOPY);\r
- SelectObject(hdcTemp, oldBitmapTemp);\r
- } else {\r
- if (isWhitePiece) {\r
- oldBitmapTemp = SelectObject(hdcTemp, pieces[WHITE]);\r
- oldBrushPiece = SelectObject(hdcMem, brushPiece);\r
- BitBlt(hdcMem, x, y, SAMPLE_SQ_SIZE, SAMPLE_SQ_SIZE,\r
- hdcTemp, 0, 0, 0x00B8074A);\r
- /* Use black for outline of white pieces */\r
- SelectObject(hdcTemp, pieces[OUTLINE]);\r
- BitBlt(hdcMem, x, y, SAMPLE_SQ_SIZE, SAMPLE_SQ_SIZE,\r
- hdcTemp, 0, 0, SRCAND);\r
- } else {\r
- /* Use square color for details of black pieces */\r
- oldBitmapTemp = SelectObject(hdcTemp, pieces[SOLID]);\r
- oldBrushPiece = SelectObject(hdcMem, brushPiece);\r
- BitBlt(hdcMem, x, y, SAMPLE_SQ_SIZE, SAMPLE_SQ_SIZE,\r
- hdcTemp, 0, 0, 0x00B8074A);\r
- }\r
- SelectObject(hdcMem, oldBrushPiece);\r
- SelectObject(hdcTemp, oldBitmapTemp);\r
- }\r
- /*\r
- * copy the memory dc to the screen\r
- */\r
- SelectObject(hdcMem, bufferBitmap);\r
- BitBlt(hdcScreen, rect.left, rect.top,\r
- rect.right - rect.left,\r
- rect.bottom - rect.top,\r
- hdcMem, rect.left, rect.top, SRCCOPY);\r
- SelectObject(hdcMem, oldBitmapMem);\r
- /*\r
- * clean up\r
- */\r
- SelectObject(hdcMem, oldBrushSquare);\r
- SelectObject(hdcMem, oldPen);\r
- DeleteObject(brushPiece);\r
- DeleteObject(brushPieceDetail);\r
- DeleteObject(brushSquare);\r
- DeleteObject(brushSquareOutline);\r
- DeleteObject(pen);\r
- DeleteDC(hdcTemp);\r
- DeleteDC(hdcMem);\r
- ReleaseDC(hCtrl, hdcScreen);\r
-}\r
-\r
-\r
-VOID\r
-PaintColorBlock(HWND hwnd, int ctrlid, COLORREF color)\r
-{\r
- HDC hdc;\r
- HBRUSH brush, oldBrush;\r
- RECT rect;\r
- HWND hCtrl = GetDlgItem(hwnd, ctrlid);\r
-\r
- hdc = GetDC(hCtrl);\r
- InvalidateRect(hCtrl, NULL, TRUE);\r
- UpdateWindow(hCtrl);\r
- GetClientRect(hCtrl, &rect);\r
- brush = CreateSolidBrush(color);\r
- oldBrush = (HBRUSH)SelectObject(hdc, brush);\r
- Rectangle(hdc, rect.left, rect.top, rect.right, rect.bottom);\r
- SelectObject(hdc, oldBrush);\r
- DeleteObject(brush);\r
- ReleaseDC(hCtrl, hdc);\r
-}\r
-\r
-\r
-VOID\r
-SetBoardOptionEnables(HWND hDlg)\r
-{\r
- if (IsDlgButtonChecked(hDlg, OPT_Monochrome)) {\r
- ShowWindow(GetDlgItem(hDlg, OPT_LightSquareColor), SW_HIDE);\r
- ShowWindow(GetDlgItem(hDlg, OPT_DarkSquareColor), SW_HIDE);\r
- ShowWindow(GetDlgItem(hDlg, OPT_WhitePieceColor), SW_HIDE);\r
- ShowWindow(GetDlgItem(hDlg, OPT_BlackPieceColor), SW_HIDE);\r
-\r
- EnableWindow(GetDlgItem(hDlg, OPT_ChooseLightSquareColor), FALSE);\r
- EnableWindow(GetDlgItem(hDlg, OPT_ChooseDarkSquareColor), FALSE);\r
- EnableWindow(GetDlgItem(hDlg, OPT_ChooseWhitePieceColor), FALSE);\r
- EnableWindow(GetDlgItem(hDlg, OPT_ChooseBlackPieceColor), FALSE);\r
- } else {\r
- ShowWindow(GetDlgItem(hDlg, OPT_LightSquareColor), SW_SHOW);\r
- ShowWindow(GetDlgItem(hDlg, OPT_DarkSquareColor), SW_SHOW);\r
- ShowWindow(GetDlgItem(hDlg, OPT_WhitePieceColor), SW_SHOW);\r
- ShowWindow(GetDlgItem(hDlg, OPT_BlackPieceColor), SW_SHOW);\r
-\r
- EnableWindow(GetDlgItem(hDlg, OPT_ChooseLightSquareColor), TRUE);\r
- EnableWindow(GetDlgItem(hDlg, OPT_ChooseDarkSquareColor), TRUE);\r
- EnableWindow(GetDlgItem(hDlg, OPT_ChooseWhitePieceColor), TRUE);\r
- EnableWindow(GetDlgItem(hDlg, OPT_ChooseBlackPieceColor), TRUE);\r
- }\r
-}\r
-\r
-BoardSize\r
-BoardOptionsWhichRadio(HWND hDlg)\r
-{\r
- return (IsDlgButtonChecked(hDlg, OPT_SizeTiny) ? SizeTiny :\r
- (IsDlgButtonChecked(hDlg, OPT_SizeTeeny) ? SizeTeeny :\r
- (IsDlgButtonChecked(hDlg, OPT_SizeDinky) ? SizeDinky :\r
- (IsDlgButtonChecked(hDlg, OPT_SizePetite) ? SizePetite :\r
- (IsDlgButtonChecked(hDlg, OPT_SizeSlim) ? SizeSlim :\r
- (IsDlgButtonChecked(hDlg, OPT_SizeSmall) ? SizeSmall :\r
- (IsDlgButtonChecked(hDlg, OPT_SizeMediocre) ? SizeMediocre :\r
- (IsDlgButtonChecked(hDlg, OPT_SizeMiddling) ? SizeMiddling :\r
- (IsDlgButtonChecked(hDlg, OPT_SizeAverage) ? SizeAverage :\r
- (IsDlgButtonChecked(hDlg, OPT_SizeModerate) ? SizeModerate :\r
- (IsDlgButtonChecked(hDlg, OPT_SizeMedium) ? SizeMedium :\r
- (IsDlgButtonChecked(hDlg, OPT_SizeBulky) ? SizeBulky :\r
- (IsDlgButtonChecked(hDlg, OPT_SizeLarge) ? SizeLarge :\r
- (IsDlgButtonChecked(hDlg, OPT_SizeBig) ? SizeBig :\r
- (IsDlgButtonChecked(hDlg, OPT_SizeHuge) ? SizeHuge :\r
- (IsDlgButtonChecked(hDlg, OPT_SizeGiant) ? SizeGiant :\r
- (IsDlgButtonChecked(hDlg, OPT_SizeColossal) ? SizeColossal :\r
- SizeTitanic )))))))))))))))));\r
-}\r
-\r
-LRESULT CALLBACK\r
-BoardOptionsDialog(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)\r
-{\r
- static Boolean mono, white, flip, fonts, bitmaps, grid;\r
- static BoardSize size;\r
- static COLORREF lsc, dsc, wpc, bpc, hsc, phc;\r
- static HBITMAP pieces[3];\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
- Translate(hDlg, DLG_BoardOptions);\r
- /* Initialize the dialog items */\r
- switch (boardSize) {\r
- case SizeTiny:\r
- CheckDlgButton(hDlg, OPT_SizeTiny, TRUE);\r
- break;\r
- case SizeTeeny:\r
- CheckDlgButton(hDlg, OPT_SizeTeeny, TRUE);\r
- break;\r
- case SizeDinky:\r
- CheckDlgButton(hDlg, OPT_SizeDinky, TRUE);\r
- break;\r
- case SizePetite:\r
- CheckDlgButton(hDlg, OPT_SizePetite, TRUE);\r
- break;\r
- case SizeSlim:\r
- CheckDlgButton(hDlg, OPT_SizeSlim, TRUE);\r
- break;\r
- case SizeSmall:\r
- CheckDlgButton(hDlg, OPT_SizeSmall, TRUE);\r
- break;\r
- case SizeMediocre:\r
- CheckDlgButton(hDlg, OPT_SizeMediocre, TRUE);\r
- break;\r
- case SizeMiddling:\r
- CheckDlgButton(hDlg, OPT_SizeMiddling, TRUE);\r
- break;\r
- case SizeAverage:\r
- CheckDlgButton(hDlg, OPT_SizeAverage, TRUE);\r
- break;\r
- case SizeModerate:\r
- CheckDlgButton(hDlg, OPT_SizeModerate, TRUE);\r
- break;\r
- case SizeMedium:\r
- CheckDlgButton(hDlg, OPT_SizeMedium, TRUE);\r
- break;\r
- case SizeBulky:\r
- CheckDlgButton(hDlg, OPT_SizeBulky, TRUE);\r
- break;\r
- case SizeLarge:\r
- CheckDlgButton(hDlg, OPT_SizeLarge, TRUE);\r
- break;\r
- case SizeBig:\r
- CheckDlgButton(hDlg, OPT_SizeBig, TRUE);\r
- break;\r
- case SizeHuge:\r
- CheckDlgButton(hDlg, OPT_SizeHuge, TRUE);\r
- break;\r
- case SizeGiant:\r
- CheckDlgButton(hDlg, OPT_SizeGiant, TRUE);\r
- break;\r
- case SizeColossal:\r
- CheckDlgButton(hDlg, OPT_SizeColossal, TRUE);\r
- break;\r
- case SizeTitanic:\r
- CheckDlgButton(hDlg, OPT_SizeTitanic, TRUE);\r
- default: ; // should not happen, but suppresses warning on pedantic compilers\r
- }\r
-\r
- 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
- if (appData.useBitmaps)\r
- CheckDlgButton(hDlg, OPT_Bitmaps, TRUE);\r
-\r
- if (appData.useFont)\r
- CheckDlgButton(hDlg, OPT_PieceFont, TRUE);\r
-\r
- if (appData.overrideLineGap >= 0)\r
- CheckDlgButton(hDlg, OPT_Grid, 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
-\r
- lsc = lightSquareColor;\r
- dsc = darkSquareColor;\r
- fonts = appData.useFont;\r
- wpc = fonts ? appData.fontBackColorWhite : whitePieceColor;\r
- bpc = fonts ? appData.fontForeColorBlack : blackPieceColor;\r
- hsc = highlightSquareColor;\r
- phc = premoveHighlightColor;\r
- mono = appData.monoMode;\r
- white= appData.allWhite;\r
- flip = appData.upsideDown;\r
- size = boardSize;\r
- bitmaps = appData.useBitmaps;\r
- grid = appData.overrideLineGap >= 0;\r
-\r
- SetBoardOptionEnables(hDlg);\r
- return TRUE;\r
-\r
- case WM_PAINT:\r
- PaintColorBlock(hDlg, OPT_LightSquareColor, lsc);\r
- PaintColorBlock(hDlg, OPT_DarkSquareColor, dsc);\r
- PaintColorBlock(hDlg, OPT_WhitePieceColor, wpc);\r
- PaintColorBlock(hDlg, OPT_BlackPieceColor, bpc);\r
- PaintColorBlock(hDlg, OPT_HighlightSquareColor, hsc);\r
- PaintColorBlock(hDlg, OPT_PremoveHighlightColor, phc);\r
- PaintSampleSquare(hDlg, OPT_SampleLightSquare, lsc, wpc, hsc, bpc,\r
- TRUE, mono, pieces);\r
- PaintSampleSquare(hDlg, OPT_SampleDarkSquare, dsc, bpc, phc, wpc,\r
- FALSE, mono, pieces);\r
-\r
- return FALSE;\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
- size = BoardOptionsWhichRadio(hDlg);\r
-\r
- /*\r
- * did any settings change?\r
- */\r
- if (size != boardSize) {\r
- ChangeBoardSize(size);\r
- }\r
-\r
- if (bitmaps && !appData.useBitmaps) InitTextures();\r
-\r
- if ((mono != appData.monoMode) ||\r
- (lsc != lightSquareColor) ||\r
- (dsc != darkSquareColor) ||\r
- (wpc != fonts ? appData.fontBackColorWhite : whitePieceColor) ||\r
- (bpc != fonts ? appData.fontForeColorBlack : blackPieceColor) ||\r
- (hsc != highlightSquareColor) ||\r
- (flip != appData.upsideDown) ||\r
- (white != appData.allWhite) ||\r
- (fonts != appData.useFont) ||\r
- (bitmaps != appData.useBitmaps) ||\r
- (grid != appData.overrideLineGap >= 0) ||\r
- (phc != premoveHighlightColor)) {\r
-\r
- lightSquareColor = lsc;\r
- darkSquareColor = dsc;\r
- if(fonts) {\r
- appData.fontBackColorWhite = wpc;\r
- appData.fontForeColorBlack = bpc;\r
- } else {\r
- whitePieceColor = wpc;\r
- blackPieceColor = bpc;\r
- }\r
- highlightSquareColor = hsc;\r
- premoveHighlightColor = phc;\r
- appData.monoMode = mono;\r
- appData.allWhite = white;\r
- appData.upsideDown = flip;\r
- appData.useFont = fonts;\r
- appData.useBitmaps = bitmaps;\r
- if(grid != appData.overrideLineGap >= 0) appData.overrideLineGap = grid - 1;\r
-\r
- InitDrawingColors();\r
- InitDrawingSizes(boardSize, 0);\r
- InvalidateRect(hwndMain, &boardRect, FALSE);\r
- }\r
- DeleteObject(pieces[0]);\r
- DeleteObject(pieces[1]);\r
-\r
- DeleteObject(pieces[2]);\r
- return TRUE;\r
-\r
- case IDCANCEL:\r
- DeleteObject(pieces[0]);\r
- DeleteObject(pieces[1]);\r
- DeleteObject(pieces[2]);\r
- EndDialog(hDlg, FALSE);\r
- return TRUE;\r
-\r
- case OPT_ChooseLightSquareColor:\r
- if (ChangeColor(hDlg, &lsc))\r
- PaintColorBlock(hDlg, OPT_LightSquareColor, lsc);\r
- PaintSampleSquare(hDlg, OPT_SampleLightSquare, lsc, wpc, hsc, bpc,\r
- TRUE, mono, pieces);\r
- break;\r
-\r
- case OPT_ChooseDarkSquareColor:\r
- if (ChangeColor(hDlg, &dsc))\r
- PaintColorBlock(hDlg, OPT_DarkSquareColor, dsc);\r
- PaintSampleSquare(hDlg, OPT_SampleDarkSquare, dsc, bpc, phc, wpc,\r
- FALSE, mono, pieces);\r
- break;\r
-\r
- case OPT_ChooseWhitePieceColor:\r
- if (ChangeColor(hDlg, &wpc))\r
- PaintColorBlock(hDlg, OPT_WhitePieceColor, wpc);\r
- PaintSampleSquare(hDlg, OPT_SampleLightSquare, lsc, wpc, hsc, bpc,\r
- TRUE, mono, pieces);\r
- break;\r
-\r
- case OPT_ChooseBlackPieceColor:\r
- if (ChangeColor(hDlg, &bpc))\r
- PaintColorBlock(hDlg, OPT_BlackPieceColor, bpc);\r
- PaintSampleSquare(hDlg, OPT_SampleDarkSquare, dsc, bpc, phc, wpc,\r
- FALSE, mono, pieces);\r
- break;\r
-\r
- case OPT_ChooseHighlightSquareColor:\r
- if (ChangeColor(hDlg, &hsc))\r
- PaintColorBlock(hDlg, OPT_HighlightSquareColor, hsc);\r
- PaintSampleSquare(hDlg, OPT_SampleLightSquare, lsc, wpc, hsc, bpc,\r
- TRUE, mono, pieces);\r
- break;\r
-\r
- case OPT_ChoosePremoveHighlightColor:\r
- if (ChangeColor(hDlg, &phc))\r
- PaintColorBlock(hDlg, OPT_PremoveHighlightColor, phc);\r
- PaintSampleSquare(hDlg, OPT_SampleDarkSquare, dsc, bpc, phc, wpc,\r
- FALSE, mono, pieces);\r
- break;\r
-\r
- case OPT_DefaultBoardColors:\r
- lsc = ParseColorName(LIGHT_SQUARE_COLOR);\r
- dsc = ParseColorName(DARK_SQUARE_COLOR);\r
- wpc = ParseColorName(WHITE_PIECE_COLOR);\r
- bpc = ParseColorName(BLACK_PIECE_COLOR);\r
- 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
- PaintColorBlock(hDlg, OPT_BlackPieceColor, bpc);\r
- PaintColorBlock(hDlg, OPT_HighlightSquareColor, hsc);\r
- PaintColorBlock(hDlg, OPT_PremoveHighlightColor, phc);\r
- SetBoardOptionEnables(hDlg);\r
- PaintSampleSquare(hDlg, OPT_SampleLightSquare, lsc, wpc, hsc, bpc,\r
- TRUE, mono, pieces);\r
- PaintSampleSquare(hDlg, OPT_SampleDarkSquare, dsc, bpc, phc, wpc,\r
- FALSE, mono, pieces);\r
- break;\r
-\r
- case OPT_Monochrome:\r
- mono = !mono;\r
- SetBoardOptionEnables(hDlg);\r
- break;\r
-\r
- case OPT_AllWhite:\r
- white = !white;\r
- break;\r
-\r
- case OPT_UpsideDown:\r
- flip = !flip;\r
- break;\r
-\r
- case OPT_Bitmaps:\r
- bitmaps = !bitmaps;\r
- break;\r
-\r
- case OPT_PieceFont:\r
- fonts = !fonts;\r
- break;\r
-\r
- case OPT_Grid:\r
- grid = !grid;\r
- break;\r
- }\r
- break;\r
- }\r
- return FALSE;\r
-}\r
-\r
-\r
-VOID\r
-BoardOptionsPopup(HWND hwnd)\r
-{\r
- FARPROC lpProc = MakeProcInstance((FARPROC)BoardOptionsDialog, hInst);\r
- DialogBox(hInst, MAKEINTRESOURCE(DLG_BoardOptions), hwnd,\r
- (DLGPROC) lpProc);\r
- FreeProcInstance(lpProc);\r
-}\r
-\r
-int radioButton[] = {\r
- OPT_VariantNormal,\r
- -1, // Loadable\r
- OPT_VariantWildcastle,\r
- OPT_VariantNocastle,\r
- OPT_VariantFRC,\r
- OPT_VariantBughouse,\r
- OPT_VariantCrazyhouse,\r
- OPT_VariantLosers,\r
- OPT_VariantSuicide,\r
- OPT_VariantGiveaway,\r
- OPT_VariantTwoKings,\r
- -1, //Kriegspiel\r
- OPT_VariantAtomic,\r
- OPT_Variant3Check,\r
- OPT_VariantShatranj,\r
- -1,\r
- -1,\r
- -1,\r
- -1,\r
- -1,\r
- -1,\r
- -1,\r
- -1,\r
- OPT_VariantShogi,\r
- -1, // Chu\r
- OPT_VariantCourier,\r
- OPT_VariantGothic,\r
- OPT_VariantCapablanca,\r
- OPT_VariantKnightmate,\r
- OPT_VariantFairy, \r
- OPT_VariantCylinder,\r
- OPT_VariantFalcon,\r
- OPT_VariantCRC,\r
- OPT_VariantBerolina,\r
- OPT_VariantJanus,\r
- OPT_VariantSuper,\r
- OPT_VariantGreat,\r
- -1, // Twilight,\r
- OPT_VariantMakruk,\r
- OPT_VariantSChess,\r
- OPT_VariantGrand,\r
- OPT_VariantSpartan, // Spartan\r
- OPT_VariantXiangqi,\r
- OPT_VariantASEAN,\r
- OPT_VariantLion,\r
- -2 // sentinel\r
-};\r
-\r
-VariantClass\r
-VariantWhichRadio(HWND hDlg)\r
-{\r
- int i=0, j;\r
- *engineVariant = NULLCHAR;\r
- while((j = radioButton[i++]) != -2) {\r
- if(j == -1) continue; // no menu button\r
- if(IsDlgButtonChecked(hDlg, j) &&\r
- (appData.noChessProgram || strstr(first.variants, VariantName(i-1)))) return (VariantClass) i-1;\r
- }\r
- for(i=0; i<15; i++) { // check for engine-defined variants\r
- if(IsDlgButtonChecked(hDlg, OPT_EngineVariant+i) ) {\r
- GetDlgItemText(hDlg, OPT_EngineVariant+i, engineVariant, MSG_SIZ); // remember name, so we can resolve it later\r
- return VariantUnknown;\r
- }\r
- }\r
- return gameInfo.variant; // If no button checked, keep old\r
-}\r
-\r
-void\r
-VariantShowRadio(HWND hDlg)\r
-{\r
- char c = *engineVariant, *v, *p;\r
- int i=0, j;\r
- CheckDlgButton(hDlg, radioButton[gameInfo.variant], TRUE);\r
- *engineVariant = NULLCHAR; // [HGM] kludge to prevent VariantName will always return engineVariant\r
- while((j = radioButton[i++]) != -2) {\r
- if(j == -1) continue; // no menu button\r
- v = VariantName(i-1); p = strstr(first.variants, v);\r
- EnableWindow(GetDlgItem(hDlg, j), appData.noChessProgram || p && (!*v || strlen(v) == strlen(p) || p[strlen(v)] == ','));\r
- }\r
- *engineVariant = c;\r
- for(i=0; i<15; i++) { // initialize engine-defined variants\r
- char *v = EngineDefinedVariant(&first, i); // get name of #i\r
- if(v) { // there is such a variant\r
- EnableWindow(GetDlgItem(hDlg, OPT_EngineVariant+i), TRUE); // and enable the button\r
- SetDlgItemText(hDlg, OPT_EngineVariant+i, v); // put its name on button\r
- } else EnableWindow(GetDlgItem(hDlg, OPT_EngineVariant+i), FALSE); // no such variant; disable button\r
- }\r
-}\r
-\r
-LRESULT CALLBACK\r
-NewVariantDialog(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)\r
-{\r
- static VariantClass v;\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
- Translate(hDlg, DLG_NewVariant);\r
-\r
- /* Initialize the dialog items */\r
- VariantShowRadio(hDlg);\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
- if(!appData.noChessProgram) {\r
- char *name = VariantName(v), buf[MSG_SIZ];\r
- if (first.protocolVersion > 1 && StrStr(first.variants, name) == NULL) {\r
- /* [HGM] in protocol 2 we check if variant is suported by engine */\r
- snprintf(buf, MSG_SIZ, _("Variant %s not supported by %s"), name, first.tidy);\r
- DisplayError(buf, 0);\r
- return TRUE; /* treat as _("Cancel") if first engine does not support it */\r
- } else\r
- if (second.initDone && second.protocolVersion > 1 && StrStr(second.variants, name) == NULL) {\r
- snprintf(buf, MSG_SIZ, _("Warning: second engine (%s) does not support this!"), second.tidy);\r
- DisplayError(buf, 0); /* use of second engine is optional; only warn user */\r
- }\r
- }\r
-\r
- gameInfo.variant = v;\r
- ASSIGN(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
- shuffleOpenings = FALSE; /* [HGM] shuffle: possible shuffle reset when we switch */\r
- startedFromPositionFile = FALSE; /* [HGM] loadPos: no longer valid in new variant */\r
- appData.pieceToCharTable = NULL;\r
- ASSIGN(appData.pieceNickNames, "");\r
- ASSIGN(appData.colorNickNames, "");\r
- ASSIGN(appData.men, "");\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
- *\r
-\*---------------------------------------------------------------------------*/\r
-\r
-BOOL APIENTRY\r
-MyCreateFont(HWND hwnd, MyFont *font)\r
-{\r
- CHOOSEFONT cf;\r
- HFONT hf;\r
-\r
- /* Initialize members of the CHOOSEFONT structure. */\r
- cf.lStructSize = sizeof(CHOOSEFONT);\r
- cf.hwndOwner = hwnd;\r
- cf.hDC = (HDC)NULL;\r
- cf.lpLogFont = &font->lf;\r
- cf.iPointSize = 0;\r
- cf.Flags = CF_SCREENFONTS|/*CF_ANSIONLY|*/CF_INITTOLOGFONTSTRUCT;\r
- cf.rgbColors = RGB(0,0,0);\r
- cf.lCustData = 0L;\r
- cf.lpfnHook = (LPCFHOOKPROC)NULL;\r
- cf.lpTemplateName = (LPSTR)NULL;\r
- cf.hInstance = (HINSTANCE) NULL;\r
- cf.lpszStyle = (LPSTR)NULL;\r
- cf.nFontType = SCREEN_FONTTYPE;\r
- cf.nSizeMin = 0;\r
- cf.nSizeMax = 0;\r
-\r
- /* Display the CHOOSEFONT common-dialog box. */\r
- if (!ChooseFont(&cf)) {\r
- return FALSE;\r
- }\r
-\r
- /* Create a logical font based on the user's */\r
- /* selection and return a handle identifying */\r
- /* that font. */\r
- hf = CreateFontIndirect(cf.lpLogFont);\r
- if (hf == NULL) {\r
- return FALSE;\r
- }\r
-\r
- font->hf = hf;\r
- font->mfp.pointSize = (float) (cf.iPointSize / 10.0);\r
- font->mfp.bold = (font->lf.lfWeight >= FW_BOLD);\r
- font->mfp.italic = font->lf.lfItalic;\r
- font->mfp.underline = font->lf.lfUnderline;\r
- font->mfp.strikeout = font->lf.lfStrikeOut;\r
- font->mfp.charset = font->lf.lfCharSet;\r
- safeStrCpy(font->mfp.faceName, font->lf.lfFaceName, sizeof(font->mfp.faceName)/sizeof(font->mfp.faceName[0]) );\r
- return TRUE;\r
-}\r
-\r
-\r
-VOID\r
-UpdateSampleText(HWND hDlg, int id, MyColorizeAttribs *mca)\r
-{\r
- CHARFORMAT cf;\r
- cf.cbSize = sizeof(CHARFORMAT);\r
- cf.dwMask =\r
- CFM_COLOR|CFM_CHARSET|CFM_BOLD|CFM_ITALIC|CFM_UNDERLINE|CFM_STRIKEOUT|CFM_FACE|CFM_SIZE;\r
- cf.crTextColor = mca->color;\r
- cf.dwEffects = mca->effects;\r
- safeStrCpy(cf.szFaceName, font[boardSize][CONSOLE_FONT]->mfp.faceName, sizeof(cf.szFaceName)/sizeof(cf.szFaceName[0]) );\r
- /*\r
- * The 20.0 below is in fact documented. yHeight is expressed in twips.\r
- * A twip is 1/20 of a font's point size. See documentation of CHARFORMAT.\r
- * --msw\r
- */\r
- cf.yHeight = (int)(font[boardSize][CONSOLE_FONT]->mfp.pointSize * 20.0 + 0.5);\r
- cf.bCharSet = DEFAULT_CHARSET; /* should be ignored anyway */\r
- cf.bPitchAndFamily = DEFAULT_PITCH|FF_DONTCARE;\r
- SendDlgItemMessage(hDlg, id, EM_SETCHARFORMAT, SCF_ALL, (LPARAM)&cf);\r
-}\r
-\r
-LRESULT CALLBACK\r
-ColorizeTextDialog(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)\r
-{\r
- static MyColorizeAttribs mca;\r
- static ColorClass cc;\r
- COLORREF background = (COLORREF)0;\r
-\r
- switch (message) {\r
- case WM_INITDIALOG:\r
- cc = (ColorClass)lParam;\r
- mca = colorizeAttribs[cc];\r
- /* Center the dialog over the application window */\r
- CenterWindow (hDlg, GetWindow (hDlg, GW_OWNER));\r
- Translate(hDlg, DLG_Colorize);\r
- /* Initialize the dialog items */\r
- CheckDlgButton(hDlg, OPT_Bold, (mca.effects & CFE_BOLD) != 0);\r
- CheckDlgButton(hDlg, OPT_Italic, (mca.effects & CFE_ITALIC) != 0);\r
- CheckDlgButton(hDlg, OPT_Underline, (mca.effects & CFE_UNDERLINE) != 0);\r
- CheckDlgButton(hDlg, OPT_Strikeout, (mca.effects & CFE_STRIKEOUT) != 0);\r
-\r
- /* get the current background color from the parent window */\r
- SendMessage(GetWindow(hDlg, GW_OWNER),WM_COMMAND,\r
- (WPARAM)WM_USER_GetConsoleBackground,\r
- (LPARAM)&background);\r
-\r
- /* set the background color */\r
- SendDlgItemMessage(hDlg, OPT_Sample, EM_SETBKGNDCOLOR, FALSE, background);\r
-\r
- SetDlgItemText(hDlg, OPT_Sample, T_(mca.name));\r
- UpdateSampleText(hDlg, OPT_Sample, &mca);\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
- colorizeAttribs[cc] = mca;\r
- textAttribs[cc].color = mca.color;\r
- textAttribs[cc].effects = mca.effects;\r
- Colorize(currentColorClass, TRUE);\r
- if (cc == ColorNormal) {\r
- CHARFORMAT cf;\r
- cf.cbSize = sizeof(CHARFORMAT);\r
- cf.dwMask = CFM_COLOR;\r
- cf.crTextColor = mca.color;\r
- SendDlgItemMessage(hwndConsole, OPT_ConsoleInput,\r
- EM_SETCHARFORMAT, SCF_ALL, (LPARAM)&cf);\r
- }\r
- EndDialog(hDlg, TRUE);\r
- return TRUE;\r
-\r
- case IDCANCEL:\r
- EndDialog(hDlg, FALSE);\r
- return TRUE;\r
-\r
- case OPT_ChooseColor:\r
- ChangeColor(hDlg, &mca.color);\r
- UpdateSampleText(hDlg, OPT_Sample, &mca);\r
- return TRUE;\r
-\r
- default:\r
- mca.effects =\r
- (IsDlgButtonChecked(hDlg, OPT_Bold) ? CFE_BOLD : 0) |\r
- (IsDlgButtonChecked(hDlg, OPT_Italic) ? CFE_ITALIC : 0) |\r
- (IsDlgButtonChecked(hDlg, OPT_Underline) ? CFE_UNDERLINE : 0) |\r
- (IsDlgButtonChecked(hDlg, OPT_Strikeout) ? CFE_STRIKEOUT : 0);\r
- UpdateSampleText(hDlg, OPT_Sample, &mca);\r
- break;\r
- }\r
- break;\r
- }\r
- return FALSE;\r
-}\r
-\r
-VOID\r
-ColorizeTextPopup(HWND hwnd, ColorClass cc)\r
-{\r
- FARPROC lpProc;\r
-\r
- lpProc = MakeProcInstance((FARPROC)ColorizeTextDialog, hInst);\r
- DialogBoxParam(hInst, MAKEINTRESOURCE(DLG_Colorize),\r
- hwnd, (DLGPROC)lpProc, (LPARAM) cc);\r
- FreeProcInstance(lpProc);\r
-}\r
-\r
-VOID\r
-SetIcsOptionEnables(HWND hDlg)\r
-{\r
-#define ENABLE_DLG_ITEM(x,y) EnableWindow(GetDlgItem(hDlg,(x)), (y))\r
-\r
- UINT state = IsDlgButtonChecked(hDlg, OPT_Premove);\r
- ENABLE_DLG_ITEM(OPT_PremoveWhite, state);\r
- ENABLE_DLG_ITEM(OPT_PremoveWhiteText, state);\r
- ENABLE_DLG_ITEM(OPT_PremoveBlack, state);\r
- ENABLE_DLG_ITEM(OPT_PremoveBlackText, state);\r
-\r
- ENABLE_DLG_ITEM(OPT_IcsAlarmTime, IsDlgButtonChecked(hDlg, OPT_IcsAlarm));\r
-\r
-#undef ENABLE_DLG_ITEM\r
-}\r
-\r
-\r
-LRESULT CALLBACK\r
-IcsOptionsDialog(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)\r
-{\r
- char buf[MSG_SIZ];\r
- int number;\r
- int i;\r
- static COLORREF cbc;\r
- static MyColorizeAttribs *mca;\r
- COLORREF *colorref;\r
-\r
- switch (message) {\r
- case WM_INITDIALOG: /* message: initialize dialog box */\r
-\r
- mca = colorizeAttribs;\r
-\r
- for (i=0; i < NColorClasses - 1; i++) {\r
- mca[i].color = textAttribs[i].color;\r
- mca[i].effects = textAttribs[i].effects;\r
- }\r
- cbc = consoleBackgroundColor;\r
-\r
- /* Center the dialog over the application window */\r
- CenterWindow (hDlg, GetWindow (hDlg, GW_OWNER));\r
- Translate(hDlg, DLG_IcsOptions);\r
-\r
- /* Initialize the dialog items */\r
-#define CHECK_BOX(x,y) CheckDlgButton(hDlg, (x), (BOOL)(y))\r
-\r
- CHECK_BOX(OPT_AutoKibitz, appData.autoKibitz);\r
- CHECK_BOX(OPT_AutoComment, appData.autoComment);\r
- CHECK_BOX(OPT_AutoObserve, appData.autoObserve);\r
- CHECK_BOX(OPT_AutoCreate, appData.autoCreateLogon);\r
- CHECK_BOX(OPT_GetMoveList, appData.getMoveList);\r
- CHECK_BOX(OPT_LocalLineEditing, appData.localLineEditing);\r
- CHECK_BOX(OPT_QuietPlay, appData.quietPlay);\r
- CHECK_BOX(OPT_SeekGraph, appData.seekGraph);\r
- CHECK_BOX(OPT_AutoRefresh, appData.autoRefresh);\r
- CHECK_BOX(OPT_BgObserve, appData.bgObserve);\r
- CHECK_BOX(OPT_DualBoard, appData.dualBoard);\r
- CHECK_BOX(OPT_SmartMove, appData.oneClick);\r
- CHECK_BOX(OPT_Premove, appData.premove);\r
- CHECK_BOX(OPT_PremoveWhite, appData.premoveWhite);\r
- CHECK_BOX(OPT_PremoveBlack, appData.premoveBlack);\r
- CHECK_BOX(OPT_IcsAlarm, appData.icsAlarm);\r
- CHECK_BOX(OPT_DontColorize, !appData.colorize);\r
-\r
-#undef CHECK_BOX\r
-\r
- snprintf(buf, MSG_SIZ, "%d", appData.icsAlarmTime / 1000);\r
- SetDlgItemText(hDlg, OPT_IcsAlarmTime, buf);\r
- SetDlgItemText(hDlg, OPT_PremoveWhiteText, appData.premoveWhiteText);\r
- SetDlgItemText(hDlg, OPT_PremoveBlackText, appData.premoveBlackText);\r
- SetDlgItemText(hDlg, OPT_StartupChatBoxes, appData.chatBoxes);\r
-\r
- SendDlgItemMessage(hDlg, OPT_SampleShout, EM_SETBKGNDCOLOR, 0, cbc);\r
- SendDlgItemMessage(hDlg, OPT_SampleSShout, EM_SETBKGNDCOLOR, 0, cbc);\r
- SendDlgItemMessage(hDlg, OPT_SampleChannel1, EM_SETBKGNDCOLOR, 0, cbc);\r
- SendDlgItemMessage(hDlg, OPT_SampleChannel, EM_SETBKGNDCOLOR, 0, cbc);\r
- SendDlgItemMessage(hDlg, OPT_SampleKibitz, EM_SETBKGNDCOLOR, 0, cbc);\r
- SendDlgItemMessage(hDlg, OPT_SampleTell, EM_SETBKGNDCOLOR, 0, cbc);\r
- SendDlgItemMessage(hDlg, OPT_SampleChallenge, EM_SETBKGNDCOLOR, 0, cbc);\r
- SendDlgItemMessage(hDlg, OPT_SampleRequest, EM_SETBKGNDCOLOR, 0, cbc);\r
- SendDlgItemMessage(hDlg, OPT_SampleSeek, EM_SETBKGNDCOLOR, 0, cbc);\r
- SendDlgItemMessage(hDlg, OPT_SampleNormal, EM_SETBKGNDCOLOR, 0, cbc);\r
-\r
- SetDlgItemText(hDlg, OPT_SampleShout, T_(mca[ColorShout].name));\r
- SetDlgItemText(hDlg, OPT_SampleSShout, T_(mca[ColorSShout].name));\r
- SetDlgItemText(hDlg, OPT_SampleChannel1, T_(mca[ColorChannel1].name));\r
- SetDlgItemText(hDlg, OPT_SampleChannel, T_(mca[ColorChannel].name));\r
- SetDlgItemText(hDlg, OPT_SampleKibitz, T_(mca[ColorKibitz].name));\r
- SetDlgItemText(hDlg, OPT_SampleTell, T_(mca[ColorTell].name));\r
- SetDlgItemText(hDlg, OPT_SampleChallenge, T_(mca[ColorChallenge].name));\r
- SetDlgItemText(hDlg, OPT_SampleRequest, T_(mca[ColorRequest].name));\r
- SetDlgItemText(hDlg, OPT_SampleSeek, T_(mca[ColorSeek].name));\r
- SetDlgItemText(hDlg, OPT_SampleNormal, T_(mca[ColorNormal].name));\r
-\r
- UpdateSampleText(hDlg, OPT_SampleShout, &mca[ColorShout]);\r
- UpdateSampleText(hDlg, OPT_SampleSShout, &mca[ColorSShout]);\r
- UpdateSampleText(hDlg, OPT_SampleChannel1, &mca[ColorChannel1]);\r
- UpdateSampleText(hDlg, OPT_SampleChannel, &mca[ColorChannel]);\r
- UpdateSampleText(hDlg, OPT_SampleKibitz, &mca[ColorKibitz]);\r
- UpdateSampleText(hDlg, OPT_SampleTell, &mca[ColorTell]);\r
- UpdateSampleText(hDlg, OPT_SampleChallenge, &mca[ColorChallenge]);\r
- UpdateSampleText(hDlg, OPT_SampleRequest, &mca[ColorRequest]);\r
- UpdateSampleText(hDlg, OPT_SampleSeek, &mca[ColorSeek]);\r
- UpdateSampleText(hDlg, OPT_SampleNormal, &mca[ColorNormal]);\r
-\r
- SetIcsOptionEnables(hDlg);\r
- return TRUE;\r
-\r
- case WM_COMMAND: /* message: received a command */\r
- switch (LOWORD(wParam)) {\r
-\r
- case WM_USER_GetConsoleBackground:\r
- /* the ColorizeTextDialog needs the current background color */\r
- colorref = (COLORREF *)lParam;\r
- *colorref = cbc;\r
- return FALSE;\r
-\r
- case IDOK:\r
- /* Read changed options from the dialog box */\r
- GetDlgItemText(hDlg, OPT_IcsAlarmTime, buf, MSG_SIZ);\r
- if (sscanf(buf, "%d", &number) != 1 || (number < 0)){\r
- MessageBox(hDlg, _("Invalid ICS Alarm Time"),\r
- _("Option Error"), MB_OK|MB_ICONEXCLAMATION);\r
- return FALSE;\r
- }\r
-\r
-#define IS_CHECKED(x) (Boolean)IsDlgButtonChecked(hDlg, (x))\r
-\r
- appData.icsAlarm = IS_CHECKED(OPT_IcsAlarm);\r
- appData.premove = IS_CHECKED(OPT_Premove);\r
- appData.premoveWhite = IS_CHECKED(OPT_PremoveWhite);\r
- appData.premoveBlack = IS_CHECKED(OPT_PremoveBlack);\r
- appData.autoKibitz = IS_CHECKED(OPT_AutoKibitz);\r
- appData.autoComment = IS_CHECKED(OPT_AutoComment);\r
- appData.autoObserve = IS_CHECKED(OPT_AutoObserve);\r
- appData.autoCreateLogon = IS_CHECKED(OPT_AutoCreate);\r
- appData.getMoveList = IS_CHECKED(OPT_GetMoveList);\r
- appData.localLineEditing = IS_CHECKED(OPT_LocalLineEditing);\r
- appData.quietPlay = IS_CHECKED(OPT_QuietPlay);\r
- appData.seekGraph = IS_CHECKED(OPT_SeekGraph);\r
- appData.autoRefresh = IS_CHECKED(OPT_AutoRefresh);\r
- appData.bgObserve = IS_CHECKED(OPT_BgObserve);\r
- appData.dualBoard = IS_CHECKED(OPT_DualBoard);\r
- appData.oneClick = IS_CHECKED(OPT_SmartMove);\r
-\r
-#undef IS_CHECKED\r
-\r
- appData.icsAlarmTime = number * 1000;\r
- GetDlgItemText(hDlg, OPT_PremoveWhiteText, appData.premoveWhiteText, 5);\r
- GetDlgItemText(hDlg, OPT_PremoveBlackText, appData.premoveBlackText, 5);\r
- GetDlgItemText(hDlg, OPT_StartupChatBoxes, buf, sizeof(buf));\r
- buf[sizeof(buf)-1] = NULLCHAR; appData.chatBoxes = StrSave(buf); // memory leak\r
-\r
- if (appData.localLineEditing) {\r
- DontEcho();\r
- EchoOn();\r
- } else {\r
- DoEcho();\r
- EchoOff();\r
- }\r
-\r
- appData.colorize =\r
- (Boolean)!IsDlgButtonChecked(hDlg, OPT_DontColorize);\r
-\r
- ChangedConsoleFont();\r
-\r
- if (!appData.colorize) {\r
- CHARFORMAT cf;\r
- COLORREF background = ParseColorName(COLOR_BKGD);\r
- /*\r
- SetDefaultTextAttribs();\r
- Colorize(currentColorClass);\r
- */\r
- cf.cbSize = sizeof(CHARFORMAT);\r
- cf.dwMask = CFM_COLOR;\r
- cf.crTextColor = ParseColorName(COLOR_NORMAL);\r
-\r
- SendDlgItemMessage(hwndConsole, OPT_ConsoleInput,\r
- EM_SETCHARFORMAT, SCF_ALL, (LPARAM)&cf);\r
- SendDlgItemMessage(hwndConsole, OPT_ConsoleText,\r
- EM_SETBKGNDCOLOR, FALSE, background);\r
- SendDlgItemMessage(hwndConsole, OPT_ConsoleInput,\r
- EM_SETBKGNDCOLOR, FALSE, background);\r
- }\r
-\r
- if (cbc != consoleBackgroundColor) {\r
- consoleBackgroundColor = cbc;\r
- if (appData.colorize) {\r
- SendDlgItemMessage(hwndConsole, OPT_ConsoleText,\r
- EM_SETBKGNDCOLOR, FALSE, consoleBackgroundColor);\r
- SendDlgItemMessage(hwndConsole, OPT_ConsoleInput,\r
- EM_SETBKGNDCOLOR, FALSE, consoleBackgroundColor);\r
- }\r
- }\r
-\r
- for (i=0; i < NColorClasses - 1; i++) {\r
- textAttribs[i].color = mca[i].color;\r
- textAttribs[i].effects = mca[i].effects;\r
- }\r
-\r
- EndDialog(hDlg, TRUE);\r
- return TRUE;\r
-\r
- case IDCANCEL:\r
- EndDialog(hDlg, FALSE);\r
- return TRUE;\r
-\r
- case OPT_ChooseShoutColor:\r
- ColorizeTextPopup(hDlg, ColorShout);\r
- UpdateSampleText(hDlg, OPT_SampleShout, &mca[ColorShout]);\r
- break;\r
-\r
- case OPT_ChooseSShoutColor:\r
- ColorizeTextPopup(hDlg, ColorSShout);\r
- UpdateSampleText(hDlg, OPT_SampleSShout, &mca[ColorSShout]);\r
- break;\r
-\r
- case OPT_ChooseChannel1Color:\r
- ColorizeTextPopup(hDlg, ColorChannel1);\r
- UpdateSampleText(hDlg, OPT_SampleChannel1,\r
- &colorizeAttribs[ColorChannel1]);\r
- break;\r
-\r
- case OPT_ChooseChannelColor:\r
- ColorizeTextPopup(hDlg, ColorChannel);\r
- UpdateSampleText(hDlg, OPT_SampleChannel, &mca[ColorChannel]);\r
- break;\r
-\r
- case OPT_ChooseKibitzColor:\r
- ColorizeTextPopup(hDlg, ColorKibitz);\r
- UpdateSampleText(hDlg, OPT_SampleKibitz, &mca[ColorKibitz]);\r
- break;\r
-\r
- case OPT_ChooseTellColor:\r
- ColorizeTextPopup(hDlg, ColorTell);\r
- UpdateSampleText(hDlg, OPT_SampleTell, &mca[ColorTell]);\r
- break;\r
-\r
- case OPT_ChooseChallengeColor:\r
- ColorizeTextPopup(hDlg, ColorChallenge);\r
- UpdateSampleText(hDlg, OPT_SampleChallenge, &mca[ColorChallenge]);\r
- break;\r
-\r
- case OPT_ChooseRequestColor:\r
- ColorizeTextPopup(hDlg, ColorRequest);\r
- UpdateSampleText(hDlg, OPT_SampleRequest, &mca[ColorRequest]);\r
- break;\r
-\r
- case OPT_ChooseSeekColor:\r
- ColorizeTextPopup(hDlg, ColorSeek);\r
- UpdateSampleText(hDlg, OPT_SampleSeek, &mca[ColorSeek]);\r
- break;\r
-\r
-\r
-\r
-\r
- case OPT_ChooseNormalColor:\r
- ColorizeTextPopup(hDlg, ColorNormal);\r
- UpdateSampleText(hDlg, OPT_SampleNormal, &mca[ColorNormal]);\r
- break;\r
-\r
- case OPT_ChooseBackgroundColor:\r
- if (ChangeColor(hDlg, &cbc)) {\r
- SendDlgItemMessage(hDlg, OPT_SampleShout, EM_SETBKGNDCOLOR, 0, cbc);\r
- SendDlgItemMessage(hDlg, OPT_SampleSShout, EM_SETBKGNDCOLOR, 0, cbc);\r
- SendDlgItemMessage(hDlg, OPT_SampleChannel1, EM_SETBKGNDCOLOR, 0, cbc);\r
- SendDlgItemMessage(hDlg, OPT_SampleChannel, EM_SETBKGNDCOLOR, 0, cbc);\r
- SendDlgItemMessage(hDlg, OPT_SampleKibitz, EM_SETBKGNDCOLOR, 0, cbc);\r
- SendDlgItemMessage(hDlg, OPT_SampleTell, EM_SETBKGNDCOLOR, 0, cbc);\r
- SendDlgItemMessage(hDlg, OPT_SampleChallenge, EM_SETBKGNDCOLOR, 0, cbc);\r
- SendDlgItemMessage(hDlg, OPT_SampleRequest, EM_SETBKGNDCOLOR, 0, cbc);\r
- SendDlgItemMessage(hDlg, OPT_SampleSeek, EM_SETBKGNDCOLOR, 0, cbc);\r
- SendDlgItemMessage(hDlg, OPT_SampleNormal, EM_SETBKGNDCOLOR, 0, cbc);\r
- }\r
- break;\r
-\r
- case OPT_DefaultColors:\r
- for (i=0; i < NColorClasses - 1; i++)\r
- ParseAttribs(&mca[i].color,\r
- &mca[i].effects,\r
- defaultTextAttribs[i]);\r
-\r
- cbc = ParseColorName(COLOR_BKGD);\r
- SendDlgItemMessage(hDlg, OPT_SampleShout, EM_SETBKGNDCOLOR, 0, cbc);\r
- SendDlgItemMessage(hDlg, OPT_SampleSShout, EM_SETBKGNDCOLOR, 0, cbc);\r
- SendDlgItemMessage(hDlg, OPT_SampleChannel1, EM_SETBKGNDCOLOR, 0, cbc);\r
- SendDlgItemMessage(hDlg, OPT_SampleChannel, EM_SETBKGNDCOLOR, 0, cbc);\r
- SendDlgItemMessage(hDlg, OPT_SampleKibitz, EM_SETBKGNDCOLOR, 0, cbc);\r
- SendDlgItemMessage(hDlg, OPT_SampleTell, EM_SETBKGNDCOLOR, 0, cbc);\r
- SendDlgItemMessage(hDlg, OPT_SampleChallenge, EM_SETBKGNDCOLOR, 0, cbc);\r
- SendDlgItemMessage(hDlg, OPT_SampleRequest, EM_SETBKGNDCOLOR, 0, cbc);\r
- SendDlgItemMessage(hDlg, OPT_SampleSeek, EM_SETBKGNDCOLOR, 0, cbc);\r
- SendDlgItemMessage(hDlg, OPT_SampleNormal, EM_SETBKGNDCOLOR, 0, cbc);\r
-\r
- UpdateSampleText(hDlg, OPT_SampleShout, &mca[ColorShout]);\r
- UpdateSampleText(hDlg, OPT_SampleSShout, &mca[ColorSShout]);\r
- UpdateSampleText(hDlg, OPT_SampleChannel1, &mca[ColorChannel1]);\r
- UpdateSampleText(hDlg, OPT_SampleChannel, &mca[ColorChannel]);\r
- UpdateSampleText(hDlg, OPT_SampleKibitz, &mca[ColorKibitz]);\r
- UpdateSampleText(hDlg, OPT_SampleTell, &mca[ColorTell]);\r
- UpdateSampleText(hDlg, OPT_SampleChallenge, &mca[ColorChallenge]);\r
- UpdateSampleText(hDlg, OPT_SampleRequest, &mca[ColorRequest]);\r
- UpdateSampleText(hDlg, OPT_SampleSeek, &mca[ColorSeek]);\r
- UpdateSampleText(hDlg, OPT_SampleNormal, &mca[ColorNormal]);\r
- break;\r
-\r
- default:\r
- SetIcsOptionEnables(hDlg);\r
- break;\r
- }\r
- break;\r
- }\r
- return FALSE;\r
-}\r
-\r
-VOID\r
-IcsOptionsPopup(HWND hwnd)\r
-{\r
- FARPROC lpProc = MakeProcInstance((FARPROC)IcsOptionsDialog, hInst);\r
- DialogBox(hInst, MAKEINTRESOURCE(DLG_IcsOptions), hwnd,\r
- (DLGPROC) lpProc);\r
- FreeProcInstance(lpProc);\r
-}\r
-\r
-/*---------------------------------------------------------------------------*\\r
- *\r
- * Fonts Dialog functions\r
- *\r
-\*---------------------------------------------------------------------------*/\r
-\r
-char *string; // sorry\r
-\r
-VOID\r
-SetSampleFontText(HWND hwnd, int id, const MyFont *mf)\r
-{\r
- char buf[MSG_SIZ];\r
- HWND hControl;\r
- HDC hdc;\r
- CHARFORMAT cf;\r
- SIZE size;\r
- RECT rectClient, rectFormat;\r
- HFONT oldFont;\r
- POINT center;\r
- int len;\r
-\r
- len = snprintf(buf, MSG_SIZ, "%.0f pt. %s%s%s\n",\r
- mf->mfp.pointSize, mf->mfp.faceName,\r
- mf->mfp.bold ? " bold" : "",\r
- mf->mfp.italic ? " italic" : "");\r
- if(id != OPT_SamplePieceFont)\r
- SetDlgItemText(hwnd, id, buf);\r
- else SetDlgItemText(hwnd, id, string);\r
-\r
- hControl = GetDlgItem(hwnd, id);\r
- hdc = GetDC(hControl);\r
- SetMapMode(hdc, MM_TEXT); /* 1 pixel == 1 logical unit */\r
- oldFont = SelectObject(hdc, mf->hf);\r
-\r
- /* get number of logical units necessary to display font name */\r
- GetTextExtentPoint32(hdc, buf, len, &size);\r
-\r
- /* calculate formatting rectangle in the rich edit control.\r
- * May be larger or smaller than the actual control.\r
- */\r
- GetClientRect(hControl, &rectClient);\r
- center.x = (rectClient.left + rectClient.right) / 2;\r
- center.y = (rectClient.top + rectClient.bottom) / 2;\r
- rectFormat.top = center.y - (size.cy / 2) - 1;\r
- rectFormat.bottom = center.y + (size.cy / 2) + 1;\r
- rectFormat.left = center.x - (size.cx / 2) - 1;\r
- rectFormat.right = center.x + (size.cx / 2) + 1;\r
-\r
- cf.cbSize = sizeof(CHARFORMAT);\r
- cf.dwMask = CFM_FACE|CFM_SIZE|CFM_CHARSET|CFM_BOLD|CFM_ITALIC;\r
- cf.dwEffects = 0;\r
- if (mf->lf.lfWeight == FW_BOLD) cf.dwEffects |= CFE_BOLD;\r
- if (mf->lf.lfItalic) cf.dwEffects |= CFE_ITALIC;\r
- safeStrCpy(cf.szFaceName, mf->mfp.faceName, sizeof(cf.szFaceName)/sizeof(cf.szFaceName[0]) );\r
- /*\r
- * yHeight is expressed in twips. A twip is 1/20 of a font's point\r
- * size. See documentation of CHARFORMAT. --msw\r
- */\r
- cf.yHeight = (int)(mf->mfp.pointSize * 20.0 + 0.5);\r
- cf.bCharSet = mf->lf.lfCharSet;\r
- cf.bPitchAndFamily = mf->lf.lfPitchAndFamily;\r
-\r
- /* format the text in the rich edit control */\r
- SendMessage(hControl, EM_SETCHARFORMAT, SCF_ALL, (LPARAM) &cf);\r
- if(id != OPT_SamplePieceFont)\r
- SendMessage(hControl, EM_SETRECT, (WPARAM)0, (LPARAM) &rectFormat);\r
-\r
- /* clean up */\r
- SelectObject(hdc, oldFont);\r
- ReleaseDC(hControl, hdc);\r
-}\r
-\r
-VOID\r
-CopyFont(MyFont *dest, const MyFont *src)\r
-{\r
- dest->mfp.pointSize = src->mfp.pointSize;\r
- dest->mfp.bold = src->mfp.bold;\r
- dest->mfp.italic = src->mfp.italic;\r
- dest->mfp.underline = src->mfp.underline;\r
- dest->mfp.strikeout = src->mfp.strikeout;\r
- dest->mfp.charset = src->mfp.charset;\r
- safeStrCpy(dest->mfp.faceName, src->mfp.faceName, sizeof(dest->mfp.faceName)/sizeof(dest->mfp.faceName[0]) );\r
- CreateFontInMF(dest);\r
-}\r
-\r
-\r
-LRESULT CALLBACK\r
-FontOptionsDialog(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)\r
-{\r
- static MyFont workFont[NUM_FONTS+1];\r
- static BOOL firstPaint;\r
- static char pieceText[] = "ABCDEFGHIJKLMNOPQRSTUVWXZabcdefghijklmnopqrstuvwxyz";\r
- int i;\r
- RECT rect;\r
-\r
- switch (message) {\r
- case WM_INITDIALOG:\r
-\r
- /* copy the current font settings into a working copy */\r
- for (i=0; i < NUM_FONTS; i++)\r
- CopyFont(&workFont[i], font[boardSize][i]);\r
- strncpy(workFont[NUM_FONTS].mfp.faceName, appData.renderPiecesWithFont, sizeof(workFont[NUM_FONTS].mfp.faceName));\r
- workFont[NUM_FONTS].mfp.pointSize = 16.;\r
- workFont[NUM_FONTS].mfp.charset = DEFAULT_CHARSET;\r
-\r
- Translate(hDlg, DLG_Fonts);\r
- if (!appData.icsActive)\r
- EnableWindow(GetDlgItem(hDlg, OPT_ChooseConsoleFont), FALSE);\r
-\r
- firstPaint = TRUE; /* see rant below */\r
-\r
- /* If I don't call SetFocus(), the dialog won't respond to the keyboard\r
- * when first drawn. Why is this the only dialog that behaves this way? Is\r
- * is the WM_PAINT stuff below?? Sigh...\r
- */\r
- SetFocus(GetDlgItem(hDlg, IDOK));\r
- break;\r
-\r
- case WM_PAINT:\r
- /* This should not be necessary. However, if SetSampleFontText() is called\r
- * in response to WM_INITDIALOG, the strings are not properly centered in\r
- * the controls when the dialog first appears. I can't figure out why, so\r
- * this is the workaround. --msw\r
- */\r
- if (firstPaint) {\r
- SetSampleFontText(hDlg, OPT_SampleClockFont, &workFont[CLOCK_FONT]);\r
- SetSampleFontText(hDlg, OPT_SampleMessageFont, &workFont[MESSAGE_FONT]);\r
- SetSampleFontText(hDlg, OPT_SampleCoordFont, &workFont[COORD_FONT]);\r
- 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
- SetSampleFontText(hDlg, OPT_SampleGameListFont, &workFont[GAMELIST_FONT]);\r
- string = appData.fontToPieceTable;\r
- SetSampleFontText(hDlg, OPT_SamplePieceFont, &workFont[NUM_FONTS]);\r
- firstPaint = FALSE;\r
- }\r
- break;\r
-\r
- case WM_COMMAND: /* message: received a command */\r
- switch (LOWORD(wParam)) {\r
-\r
- case IDOK:\r
- /* again, it seems to avoid redraw problems if we call EndDialog first */\r
- EndDialog(hDlg, FALSE);\r
-\r
- /* copy modified settings back to the fonts array */\r
- for (i=0; i < NUM_FONTS; i++)\r
- CopyFont(font[boardSize][i], &workFont[i]);\r
-\r
- { // Make new piece-to-char table\r
- char buf[MSG_SIZ];\r
- GetDlgItemText(hDlg, OPT_SamplePieceFont, buf, MSG_SIZ);\r
- ASSIGN(appData.fontToPieceTable, buf);\r
- }\r
- ASSIGN(appData.renderPiecesWithFont, workFont[NUM_FONTS].mfp.faceName); // piece font\r
-\r
- /* a sad necessity due to the original design of having a separate\r
- * console font, tags font, and comment font for each board size. IMHO\r
- * these fonts should not be dependent on the current board size. I'm\r
- * running out of time, so I am doing this hack rather than redesign the\r
- * data structure. Besides, I think if I redesigned the data structure, I\r
- * might break backwards compatibility with old winboard.ini files.\r
- * --msw\r
- */\r
- for (i=0; i < NUM_SIZES; i++) {\r
- 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
- CopyFont(font[i][GAMELIST_FONT], &workFont[GAMELIST_FONT]);\r
- }\r
- /* end sad necessity */\r
-\r
- InitDrawingSizes(boardSize, 0);\r
- InvalidateRect(hwndMain, NULL, TRUE);\r
-\r
- if (commentDialog) {\r
- SendDlgItemMessage(commentDialog, OPT_CommentText,\r
- WM_SETFONT, (WPARAM)font[boardSize][COMMENT_FONT]->hf,\r
- MAKELPARAM(TRUE, 0));\r
- GetClientRect(GetDlgItem(commentDialog, OPT_CommentText), &rect);\r
- InvalidateRect(commentDialog, &rect, TRUE);\r
- }\r
-\r
- if (editTagsDialog) {\r
- SendDlgItemMessage(editTagsDialog, OPT_TagsText,\r
- WM_SETFONT, (WPARAM)font[boardSize][EDITTAGS_FONT]->hf,\r
- MAKELPARAM(TRUE, 0));\r
- GetClientRect(GetDlgItem(editTagsDialog, OPT_TagsText), &rect);\r
- 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
- SendMessage( moveHistoryDialog, WM_INITDIALOG, 0, 0 );\r
-// InvalidateRect(editTagsDialog, NULL, TRUE); // [HGM] this ws improperly cloned?\r
- }\r
-\r
- if( engineOutputDialog != NULL ) {\r
- SendDlgItemMessage(engineOutputDialog, IDC_EngineMemo1,\r
- WM_SETFONT, (WPARAM)font[boardSize][MOVEHISTORY_FONT]->hf,\r
- MAKELPARAM(TRUE, 0));\r
- SendDlgItemMessage(engineOutputDialog, IDC_EngineMemo2,\r
- WM_SETFONT, (WPARAM)font[boardSize][MOVEHISTORY_FONT]->hf,\r
- MAKELPARAM(TRUE, 0));\r
- }\r
-\r
- if (hwndConsole) {\r
- ChangedConsoleFont();\r
- }\r
-\r
- for (i=0; i<NUM_FONTS; i++)\r
- DeleteObject(&workFont[i].hf);\r
-\r
- return TRUE;\r
-\r
- case IDCANCEL:\r
- for (i=0; i<NUM_FONTS; i++)\r
- DeleteObject(&workFont[i].hf);\r
- EndDialog(hDlg, FALSE);\r
- return TRUE;\r
-\r
- case OPT_ChooseClockFont:\r
- MyCreateFont(hDlg, &workFont[CLOCK_FONT]);\r
- SetSampleFontText(hDlg, OPT_SampleClockFont, &workFont[CLOCK_FONT]);\r
- break;\r
-\r
- case OPT_ChooseMessageFont:\r
- MyCreateFont(hDlg, &workFont[MESSAGE_FONT]);\r
- SetSampleFontText(hDlg, OPT_SampleMessageFont, &workFont[MESSAGE_FONT]);\r
- break;\r
-\r
- case OPT_ChooseCoordFont:\r
- MyCreateFont(hDlg, &workFont[COORD_FONT]);\r
- SetSampleFontText(hDlg, OPT_SampleCoordFont, &workFont[COORD_FONT]);\r
- break;\r
-\r
- case OPT_ChooseTagFont:\r
- MyCreateFont(hDlg, &workFont[EDITTAGS_FONT]);\r
- SetSampleFontText(hDlg, OPT_SampleTagFont, &workFont[EDITTAGS_FONT]);\r
- break;\r
-\r
- case OPT_ChooseCommentsFont:\r
- MyCreateFont(hDlg, &workFont[COMMENT_FONT]);\r
- SetSampleFontText(hDlg, OPT_SampleCommentsFont, &workFont[COMMENT_FONT]);\r
- break;\r
-\r
- case OPT_ChooseConsoleFont:\r
- MyCreateFont(hDlg, &workFont[CONSOLE_FONT]);\r
- 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_ChooseGameListFont:\r
- MyCreateFont(hDlg, &workFont[GAMELIST_FONT]);\r
- SetSampleFontText(hDlg, OPT_SampleGameListFont, &workFont[GAMELIST_FONT]);\r
- break;\r
-\r
- case OPT_ChoosePieceFont:\r
- MyCreateFont(hDlg, &workFont[NUM_FONTS]);\r
- string = pieceText;\r
- SetSampleFontText(hDlg, OPT_SamplePieceFont, &workFont[NUM_FONTS]);\r
- break;\r
-\r
- case OPT_DefaultFonts:\r
- for (i=0; i<NUM_FONTS; i++) {\r
- DeleteObject(&workFont[i].hf);\r
- ParseFontName(font[boardSize][i]->def, &workFont[i].mfp);\r
- CreateFontInMF(&workFont[i]);\r
- }\r
- SetSampleFontText(hDlg, OPT_SampleClockFont, &workFont[CLOCK_FONT]);\r
- SetSampleFontText(hDlg, OPT_SampleMessageFont, &workFont[MESSAGE_FONT]);\r
- SetSampleFontText(hDlg, OPT_SampleCoordFont, &workFont[COORD_FONT]);\r
- 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
- SetSampleFontText(hDlg, OPT_SampleGameListFont, &workFont[GAMELIST_FONT]);\r
- break;\r
- }\r
- }\r
- return FALSE;\r
-}\r
-\r
-VOID\r
-FontsOptionsPopup(HWND hwnd)\r
-{\r
- FARPROC lpProc = MakeProcInstance((FARPROC)FontOptionsDialog, hInst);\r
- DialogBox(hInst, MAKEINTRESOURCE(DLG_Fonts), hwnd,\r
- (DLGPROC) lpProc);\r
- FreeProcInstance(lpProc);\r
-}\r
-\r
-/*---------------------------------------------------------------------------*\\r
- *\r
- * Sounds Dialog functions\r
- *\r
-\*---------------------------------------------------------------------------*/\r
-\r
-\r
-SoundComboData soundComboData[] = {\r
- {N_("Move"), NULL},\r
- {N_("Bell"), NULL},\r
- {N_("Roar"), NULL},\r
- {N_("ICS Alarm"), NULL},\r
- {N_("ICS Win"), NULL},\r
- {N_("ICS Loss"), NULL},\r
- {N_("ICS Draw"), NULL},\r
- {N_("ICS Unfinished"), NULL},\r
- {N_("Shout"), NULL},\r
- {N_("SShout/CShout"), NULL},\r
- {N_("Channel 1"), NULL},\r
- {N_("Channel"), NULL},\r
- {N_("Kibitz"), NULL},\r
- {N_("Tell"), NULL},\r
- {N_("Challenge"), NULL},\r
- {N_("Request"), NULL},\r
- {N_("Seek"), NULL},\r
- {NULL, NULL},\r
-};\r
-\r
-\r
-void\r
-InitSoundComboData(SoundComboData *scd)\r
-{\r
- SoundClass sc;\r
- ColorClass cc;\r
- int index;\r
-\r
- /* copy current sound settings to combo array */\r
-\r
- for ( sc = (SoundClass)0; sc < NSoundClasses; sc++) {\r
- scd[sc].name = strdup(sounds[sc].name);\r
- }\r
- for ( cc = (ColorClass)0; cc < NColorClasses - 2; cc++) {\r
- index = (int)cc + (int)NSoundClasses;\r
- scd[index].name = strdup(textAttribs[cc].sound.name);\r
- }\r
-}\r
-\r
-\r
-void\r
-ResetSoundComboData(SoundComboData *scd)\r
-{\r
- while (scd->label) {\r
- if (scd->name != NULL) {\r
- free (scd->name);\r
- scd->name = NULL;\r
- }\r
- scd++;\r
- }\r
-}\r
-\r
-void\r
-InitSoundCombo(HWND hwndCombo, SoundComboData *scd)\r
-{\r
- char buf[255];\r
- DWORD err;\r
- DWORD cnt = 0;\r
- SendMessage(hwndCombo, CB_RESETCONTENT, 0, 0);\r
-\r
- /* send the labels to the combo box */\r
- while (scd->label) {\r
- err = SendMessage(hwndCombo, CB_ADDSTRING, 0, (LPARAM) T_(scd->label));\r
- if (err != cnt++) {\r
- snprintf(buf, MSG_SIZ, "InitSoundCombo(): err '%d', cnt '%d'\n",\r
- (int)err, (int)cnt);\r
- MessageBox(NULL, buf, NULL, MB_OK);\r
- }\r
- scd++;\r
- }\r
- SendMessage(hwndCombo, CB_SETCURSEL, (WPARAM) 0, (LPARAM) 0);\r
-}\r
-\r
-int\r
-SoundDialogWhichRadio(HWND hDlg)\r
-{\r
- if (IsDlgButtonChecked(hDlg, OPT_NoSound)) return OPT_NoSound;\r
- if (IsDlgButtonChecked(hDlg, OPT_DefaultBeep)) return OPT_DefaultBeep;\r
- if (IsDlgButtonChecked(hDlg, OPT_BuiltInSound)) return OPT_BuiltInSound;\r
- if (IsDlgButtonChecked(hDlg, OPT_WavFile)) return OPT_WavFile;\r
- return -1;\r
-}\r
-\r
-VOID\r
-SoundDialogSetEnables(HWND hDlg, int radio)\r
-{\r
- EnableWindow(GetDlgItem(hDlg, OPT_BuiltInSoundName),\r
- radio == OPT_BuiltInSound);\r
- EnableWindow(GetDlgItem(hDlg, OPT_WavFileName), radio == OPT_WavFile);\r
- EnableWindow(GetDlgItem(hDlg, OPT_BrowseSound), radio == OPT_WavFile);\r
-}\r
-\r
-char *\r
-SoundDialogGetName(HWND hDlg, int radio)\r
-{\r
- static char buf[MSG_SIZ], buf2[MSG_SIZ], buf3[MSG_SIZ];\r
- char *dummy, *ret;\r
- switch (radio) {\r
- case OPT_NoSound:\r
- default:\r
- return "";\r
- case OPT_DefaultBeep:\r
- return "$";\r
- case OPT_BuiltInSound:\r
- buf[0] = '!';\r
- GetDlgItemText(hDlg, OPT_BuiltInSoundName, buf + 1, sizeof(buf) - 1);\r
- return buf;\r
- case OPT_WavFile:\r
- GetDlgItemText(hDlg, OPT_WavFileName, buf, sizeof(buf));\r
- GetCurrentDirectory(MSG_SIZ, buf3);\r
- SetCurrentDirectory(installDir);\r
- if (GetFullPathName(buf, MSG_SIZ, buf2, &dummy)) {\r
- ret = buf2;\r
- } else {\r
- ret = buf;\r
- }\r
- SetCurrentDirectory(buf3);\r
- return ret;\r
- }\r
-}\r
-\r
-void\r
-DisplaySelectedSound(HWND hDlg, HWND hCombo, const char *name)\r
-{\r
- int radio;\r
- /*\r
- * I think it's best to clear the combo and edit boxes. It looks stupid\r
- * to have a value from another sound event sitting there grayed out.\r
- */\r
- SetDlgItemText(hDlg, OPT_WavFileName, "");\r
- SendMessage(hCombo, CB_SETCURSEL, (WPARAM) -1, (LPARAM) 0);\r
-\r
- if (appData.debugMode)\r
- fprintf(debugFP, "DisplaySelectedSound(,,'%s'):\n", name);\r
- switch (name[0]) {\r
- case NULLCHAR:\r
- radio = OPT_NoSound;\r
- break;\r
- case '$':\r
- if (name[1] == NULLCHAR) {\r
- radio = OPT_DefaultBeep;\r
- } else {\r
- radio = OPT_WavFile;\r
- SetDlgItemText(hDlg, OPT_WavFileName, name);\r
- }\r
- break;\r
- case '!':\r
- if (name[1] == NULLCHAR) {\r
- radio = OPT_NoSound;\r
- } else {\r
- radio = OPT_BuiltInSound;\r
- if (SendMessage(hCombo, CB_SELECTSTRING, (WPARAM) -1,\r
- (LPARAM) (name + 1)) == CB_ERR) {\r
- SendMessage(hCombo, CB_SETCURSEL, (WPARAM) -1, (LPARAM) 0);\r
- SendMessage(hCombo, WM_SETTEXT, (WPARAM) 0, (LPARAM) (name + 1));\r
- }\r
- }\r
- break;\r
- default:\r
- radio = OPT_WavFile;\r
- SetDlgItemText(hDlg, OPT_WavFileName, name);\r
- break;\r
- }\r
- SoundDialogSetEnables(hDlg, radio);\r
- CheckRadioButton(hDlg, OPT_NoSound, OPT_WavFile, radio);\r
-}\r
-\r
-\r
-char *builtInSoundNames[] = BUILT_IN_SOUND_NAMES;\r
-\r
-LRESULT CALLBACK\r
-SoundOptionsDialog(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)\r
-{\r
- static HWND hSoundCombo;\r
- static DWORD index;\r
- static HWND hBISN;\r
- int radio;\r
- MySound tmp;\r
- FILE *f;\r
- char buf[MSG_SIZ];\r
- char *newName;\r
- SoundClass sc;\r
- ColorClass cc;\r
- SoundComboData *scd;\r
- int oldMute;\r
-\r
- switch (message) {\r
- case WM_INITDIALOG:\r
- /* Center the dialog over the application window */\r
- CenterWindow (hDlg, GetWindow (hDlg, GW_OWNER));\r
- Translate(hDlg, DLG_Sound);\r
-\r
- /* Initialize the built-in sounds combo */\r
- hBISN = GetDlgItem(hDlg, OPT_BuiltInSoundName);\r
- InitComboStrings(hBISN, builtInSoundNames);\r
-\r
- /* Initialize the sound events combo */\r
- index = 0;\r
- InitSoundComboData(soundComboData);\r
- hSoundCombo = GetDlgItem(hDlg, CBO_Sounds);\r
- InitSoundCombo(hSoundCombo, soundComboData);\r
-\r
- /* update the dialog */\r
- DisplaySelectedSound(hDlg, hBISN, soundComboData[index].name);\r
- return TRUE;\r
-\r
- case WM_COMMAND: /* message: received a command */\r
-\r
- if (((HWND)lParam == hSoundCombo) &&\r
- (HIWORD(wParam) == CBN_SELCHANGE)) {\r
- /*\r
- * the user has selected a new sound event. We must store the name for\r
- * the previously selected event, then retrieve the name for the\r
- * newly selected event and update the dialog.\r
- */\r
- radio = SoundDialogWhichRadio(hDlg);\r
- newName = strdup(SoundDialogGetName(hDlg, radio));\r
-\r
- if (strcmp(newName, soundComboData[index].name) != 0) {\r
- free(soundComboData[index].name);\r
- soundComboData[index].name = newName;\r
- } else {\r
- free(newName);\r
- newName = NULL;\r
- }\r
- /* now get the settings for the newly selected event */\r
- index = SendMessage(hSoundCombo, CB_GETCURSEL, (WPARAM)0, (LPARAM)0);\r
- DisplaySelectedSound(hDlg, hBISN, soundComboData[index].name);\r
-\r
- return TRUE;\r
- }\r
- switch (LOWORD(wParam)) {\r
- case IDOK:\r
- /*\r
- * save the name for the currently selected sound event\r
- */\r
- radio = SoundDialogWhichRadio(hDlg);\r
- newName = strdup(SoundDialogGetName(hDlg, radio));\r
-\r
- if (strcmp(soundComboData[index].name, newName) != 0) {\r
- free(soundComboData[index].name);\r
- soundComboData[index].name = newName;\r
- } else {\r
- free(newName);\r
- newName = NULL;\r
- }\r
-\r
- /* save all the sound names that changed and load the sounds */\r
-\r
- for ( sc = (SoundClass)0; sc < NSoundClasses; sc++) {\r
- if (strcmp(soundComboData[sc].name, sounds[sc].name) != 0) {\r
- free(sounds[sc].name);\r
- sounds[sc].name = strdup(soundComboData[sc].name);\r
- MyLoadSound(&sounds[sc]);\r
- }\r
- }\r
- for ( cc = (ColorClass)0; cc < NColorClasses - 2; cc++) {\r
- index = (int)cc + (int)NSoundClasses;\r
- if (strcmp(soundComboData[index].name,\r
- textAttribs[cc].sound.name) != 0) {\r
- free(textAttribs[cc].sound.name);\r
- textAttribs[cc].sound.name = strdup(soundComboData[index].name);\r
- MyLoadSound(&textAttribs[cc].sound);\r
- }\r
- }\r
-\r
- mute = FALSE; // [HGM] mute: switch sounds automatically on if we select one\r
- CheckMenuItem(GetMenu(hwndMain),IDM_MuteSounds,MF_BYCOMMAND|MF_UNCHECKED);\r
- ResetSoundComboData(soundComboData);\r
- EndDialog(hDlg, TRUE);\r
- return TRUE;\r
-\r
- case IDCANCEL:\r
- ResetSoundComboData(soundComboData);\r
- EndDialog(hDlg, FALSE);\r
- return TRUE;\r
-\r
- case OPT_DefaultSounds:\r
- /* can't use SetDefaultSounds() because we need to be able to "undo" if\r
- * user selects "Cancel" later on. So we do it the hard way here.\r
- */\r
- scd = &soundComboData[0];\r
- while (scd->label != NULL) {\r
- if (scd->name != NULL) free(scd->name);\r
- scd->name = strdup("");\r
- scd++;\r
- }\r
- free(soundComboData[(int)SoundBell].name);\r
- soundComboData[(int)SoundBell].name = strdup(SOUND_BELL);\r
- DisplaySelectedSound(hDlg, hBISN, soundComboData[index].name);\r
- break;\r
-\r
- case OPT_PlaySound:\r
- radio = SoundDialogWhichRadio(hDlg);\r
- tmp.name = strdup(SoundDialogGetName(hDlg, radio));\r
- tmp.data = NULL;\r
- MyLoadSound(&tmp);\r
- oldMute = mute; mute = FALSE; // [HGM] mute: always sound when user presses play, ignorig mute setting\r
- MyPlaySound(&tmp);\r
- mute = oldMute;\r
- if (tmp.data != NULL) FreeResource(tmp.data); // technically obsolete fn, but tmp.data is NOT malloc'd mem\r
- if (tmp.name != NULL) free(tmp.name);\r
- return TRUE;\r
-\r
- case OPT_BrowseSound:\r
- f = OpenFileDialog(hDlg, "rb", NULL, "wav", SOUND_FILT,\r
- _("Browse for Sound File"), NULL, NULL, buf);\r
- if (f != NULL) {\r
- fclose(f);\r
- SetDlgItemText(hDlg, OPT_WavFileName, buf);\r
- }\r
- return TRUE;\r
-\r
- default:\r
- radio = SoundDialogWhichRadio(hDlg);\r
- SoundDialogSetEnables(hDlg, radio);\r
- break;\r
- }\r
- break;\r
- }\r
- return FALSE;\r
-}\r
-\r
-\r
-VOID SoundOptionsPopup(HWND hwnd)\r
-{\r
- FARPROC lpProc;\r
-\r
- lpProc = MakeProcInstance((FARPROC)SoundOptionsDialog, hInst);\r
- DialogBox(hInst, MAKEINTRESOURCE(DLG_Sound), hwnd, (DLGPROC)lpProc);\r
- FreeProcInstance(lpProc);\r
-}\r
-\r
-\r
-/*---------------------------------------------------------------------------*\\r
- *\r
- * Comm Port dialog functions\r
- *\r
-\*---------------------------------------------------------------------------*/\r
-\r
-\r
-#define FLOW_NONE 0\r
-#define FLOW_XOFF 1\r
-#define FLOW_CTS 2\r
-#define FLOW_DSR 3\r
-\r
-#define PORT_NONE\r
-\r
-ComboData cdPort[] = { {"None", PORT_NONE}, {"COM1", 1}, {"COM2", 2},\r
- {"COM3", 3}, {"COM4", 4}, {NULL, 0} };\r
-ComboData cdDataRate[] = { {"110", 110}, {"300", 300}, {"600", 600}, {"1200", 1200},\r
- {"2400", 2400}, {"4800", 4800}, {"9600", 9600}, {"19200", 19200},\r
- {"38400", 38400}, {NULL, 0} };\r
-ComboData cdDataBits[] = { {"5", 5}, {"6", 6}, {"7", 7}, {"8", 8}, {NULL, 0} };\r
-ComboData cdParity[] = { {"None", NOPARITY}, {"Odd", ODDPARITY}, {"Even", EVENPARITY},\r
- {"Mark", MARKPARITY}, {"Space", SPACEPARITY}, {NULL, 0} };\r
-ComboData cdStopBits[] = { {"1", ONESTOPBIT}, {"1.5", ONE5STOPBITS},\r
- {"2", TWOSTOPBITS}, {NULL, 0} };\r
-ComboData cdFlow[] = { {"None", FLOW_NONE}, {"Xoff/Xon", FLOW_XOFF}, {"CTS", FLOW_CTS},\r
- {"DSR", FLOW_DSR}, {NULL, 0} };\r
-\r
-\r
-VOID\r
-ParseCommSettings(char *arg, DCB *dcb)\r
-{\r
- int dataRate, count;\r
- char bits[MSG_SIZ], parity[MSG_SIZ], stopBits[MSG_SIZ], flow[MSG_SIZ];\r
- ComboData *cd;\r
- count = sscanf(arg, "%d%*[, ]%[^, ]%*[, ]%[^, ]%*[, ]%[^, ]%*[, ]%[^, ]",\r
- &dataRate, bits, parity, stopBits, flow);\r
- if (count != 5) goto cant_parse;\r
- dcb->BaudRate = dataRate;\r
- cd = cdDataBits;\r
- while (cd->label != NULL) {\r
- if (StrCaseCmp(cd->label, bits) == 0) {\r
- dcb->ByteSize = cd->value;\r
- break;\r
- }\r
- cd++;\r
- }\r
- if (cd->label == NULL) goto cant_parse;\r
- cd = cdParity;\r
- while (cd->label != NULL) {\r
- if (StrCaseCmp(cd->label, parity) == 0) {\r
- dcb->Parity = cd->value;\r
- break;\r
- }\r
- cd++;\r
- }\r
- if (cd->label == NULL) goto cant_parse;\r
- cd = cdStopBits;\r
- while (cd->label != NULL) {\r
- if (StrCaseCmp(cd->label, stopBits) == 0) {\r
- dcb->StopBits = cd->value;\r
- break;\r
- }\r
- cd++;\r
- }\r
- cd = cdFlow;\r
- if (cd->label == NULL) goto cant_parse;\r
- while (cd->label != NULL) {\r
- if (StrCaseCmp(cd->label, flow) == 0) {\r
- switch (cd->value) {\r
- case FLOW_NONE:\r
- dcb->fOutX = FALSE;\r
- dcb->fOutxCtsFlow = FALSE;\r
- dcb->fOutxDsrFlow = FALSE;\r
- break;\r
- case FLOW_CTS:\r
- dcb->fOutX = FALSE;\r
- dcb->fOutxCtsFlow = TRUE;\r
- dcb->fOutxDsrFlow = FALSE;\r
- break;\r
- case FLOW_DSR:\r
- dcb->fOutX = FALSE;\r
- dcb->fOutxCtsFlow = FALSE;\r
- dcb->fOutxDsrFlow = TRUE;\r
- break;\r
- case FLOW_XOFF:\r
- dcb->fOutX = TRUE;\r
- dcb->fOutxCtsFlow = FALSE;\r
- dcb->fOutxDsrFlow = FALSE;\r
- break;\r
- }\r
- break;\r
- }\r
- cd++;\r
- }\r
- if (cd->label == NULL) goto cant_parse;\r
- return;\r
-cant_parse:\r
- ExitArgError(_("Can't parse com port settings"), arg, TRUE);\r
-}\r
-\r
-\r
-VOID PrintCommSettings(FILE *f, char *name, DCB *dcb)\r
-{\r
- char *flow = "??", *parity = "??", *stopBits = "??";\r
- ComboData *cd;\r
-\r
- cd = cdParity;\r
- while (cd->label != NULL) {\r
- if (dcb->Parity == cd->value) {\r
- parity = cd->label;\r
- break;\r
- }\r
- cd++;\r
- }\r
- cd = cdStopBits;\r
- while (cd->label != NULL) {\r
- if (dcb->StopBits == cd->value) {\r
- stopBits = cd->label;\r
- break;\r
- }\r
- cd++;\r
- }\r
- if (dcb->fOutX) {\r
- flow = cdFlow[FLOW_XOFF].label;\r
- } else if (dcb->fOutxCtsFlow) {\r
- flow = cdFlow[FLOW_CTS].label;\r
- } else if (dcb->fOutxDsrFlow) {\r
- flow = cdFlow[FLOW_DSR].label;\r
- } else {\r
- flow = cdFlow[FLOW_NONE].label;\r
- }\r
- fprintf(f, "/%s=%d,%d,%s,%s,%s\n", name,\r
- (int)dcb->BaudRate, dcb->ByteSize, parity, stopBits, flow);\r
-}\r
-\r
-\r
-void\r
-InitCombo(HANDLE hwndCombo, ComboData *cd)\r
-{\r
- SendMessage(hwndCombo, CB_RESETCONTENT, 0, 0);\r
-\r
- while (cd->label != NULL) {\r
- SendMessage(hwndCombo, CB_ADDSTRING, 0, (LPARAM) cd->label);\r
- cd++;\r
- }\r
-}\r
-\r
-void\r
-SelectComboValue(HANDLE hwndCombo, ComboData *cd, unsigned value)\r
-{\r
- int i;\r
-\r
- i = 0;\r
- while (cd->label != NULL) {\r
- if (cd->value == value) {\r
- SendMessage(hwndCombo, CB_SETCURSEL, (WPARAM) i, (LPARAM) 0);\r
- return;\r
- }\r
- cd++;\r
- i++;\r
- }\r
-}\r
-\r
-LRESULT CALLBACK\r
-CommPortOptionsDialog(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)\r
-{\r
- char buf[MSG_SIZ];\r
- HANDLE hwndCombo;\r
- char *p;\r
- LRESULT index;\r
- unsigned value;\r
- int err;\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
- Translate(hDlg, DLG_CommPort);\r
- /* Initialize the dialog items */\r
- /* !! There should probably be some synchronization\r
- in accessing hCommPort and dcb. Or does modal nature\r
- of this dialog box do it for us?\r
- */\r
- hwndCombo = GetDlgItem(hDlg, OPT_Port);\r
- InitCombo(hwndCombo, cdPort);\r
- p = strrchr(appData.icsCommPort, '\\');\r
- if (p++ == NULL) p = appData.icsCommPort;\r
- if ((*p == '\0') ||\r
- (SendMessage(hwndCombo, CB_SELECTSTRING, (WPARAM) -1, (LPARAM) p) == CB_ERR)) {\r
- SendMessage(hwndCombo, CB_SELECTSTRING, (WPARAM) -1, (LPARAM) "None");\r
- }\r
- EnableWindow(hwndCombo, hCommPort == NULL); /*!! don't allow change for now*/\r
-\r
- hwndCombo = GetDlgItem(hDlg, OPT_DataRate);\r
- InitCombo(hwndCombo, cdDataRate);\r
- snprintf(buf, MSG_SIZ, "%u", (int)dcb.BaudRate);\r
- if (SendMessage(hwndCombo, CB_SELECTSTRING, (WPARAM) -1, (LPARAM) buf) == CB_ERR) {\r
- SendMessage(hwndCombo, CB_SETCURSEL, (WPARAM) -1, (LPARAM) 0);\r
- SendMessage(hwndCombo, WM_SETTEXT, (WPARAM) 0, (LPARAM) buf);\r
- }\r
-\r
- hwndCombo = GetDlgItem(hDlg, OPT_Bits);\r
- InitCombo(hwndCombo, cdDataBits);\r
- SelectComboValue(hwndCombo, cdDataBits, dcb.ByteSize);\r
-\r
- hwndCombo = GetDlgItem(hDlg, OPT_Parity);\r
- InitCombo(hwndCombo, cdParity);\r
- SelectComboValue(hwndCombo, cdParity, dcb.Parity);\r
-\r
- hwndCombo = GetDlgItem(hDlg, OPT_StopBits);\r
- InitCombo(hwndCombo, cdStopBits);\r
- SelectComboValue(hwndCombo, cdStopBits, dcb.StopBits);\r
-\r
- hwndCombo = GetDlgItem(hDlg, OPT_Flow);\r
- InitCombo(hwndCombo, cdFlow);\r
- if (dcb.fOutX) {\r
- SelectComboValue(hwndCombo, cdFlow, FLOW_XOFF);\r
- } else if (dcb.fOutxCtsFlow) {\r
- SelectComboValue(hwndCombo, cdFlow, FLOW_CTS);\r
- } else if (dcb.fOutxDsrFlow) {\r
- SelectComboValue(hwndCombo, cdFlow, FLOW_DSR);\r
- } else {\r
- SelectComboValue(hwndCombo, cdFlow, FLOW_NONE);\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
-#ifdef NOTDEF\r
- /* !! Currently we can't change comm ports in midstream */\r
- hwndCombo = GetDlgItem(hDlg, OPT_Port);\r
- index = SendMessage(hwndCombo, CB_GETCURSEL, (WPARAM) 0, (LPARAM) 0);\r
- if (index == PORT_NONE) {\r
- appData.icsCommPort = "";\r
- if (hCommPort != NULL) {\r
- CloseHandle(hCommPort);\r
- hCommPort = NULL;\r
- }\r
- EndDialog(hDlg, TRUE);\r
- return TRUE;\r
- }\r
- SendMessage(hwndCombo, WM_GETTEXT, (WPARAM) MSG_SIZ, (LPARAM) buf);\r
- appData.icsCommPort = strdup(buf);\r
- if (hCommPort != NULL) {\r
- CloseHandle(hCommPort);\r
- hCommPort = NULL;\r
- }\r
- /* now what?? can't really do this; have to fix up the ChildProc\r
- and InputSource records for the comm port that we gave to the\r
- back end. */\r
-#endif /*NOTDEF*/\r
-\r
- hwndCombo = GetDlgItem(hDlg, OPT_DataRate);\r
- SendMessage(hwndCombo, WM_GETTEXT, (WPARAM) MSG_SIZ, (LPARAM) buf);\r
- if (sscanf(buf, "%u", &value) != 1) {\r
- MessageBox(hDlg, _("Invalid data rate"),\r
- _("Option Error"), MB_OK|MB_ICONEXCLAMATION);\r
- return TRUE;\r
- }\r
- dcb.BaudRate = value;\r
-\r
- hwndCombo = GetDlgItem(hDlg, OPT_Bits);\r
- index = SendMessage(hwndCombo, CB_GETCURSEL, (WPARAM) 0, (LPARAM) 0);\r
- dcb.ByteSize = cdDataBits[index].value;\r
-\r
- hwndCombo = GetDlgItem(hDlg, OPT_Parity);\r
- index = SendMessage(hwndCombo, CB_GETCURSEL, (WPARAM) 0, (LPARAM) 0);\r
- dcb.Parity = cdParity[index].value;\r
-\r
- hwndCombo = GetDlgItem(hDlg, OPT_StopBits);\r
- index = SendMessage(hwndCombo, CB_GETCURSEL, (WPARAM) 0, (LPARAM) 0);\r
- dcb.StopBits = cdStopBits[index].value;\r
-\r
- hwndCombo = GetDlgItem(hDlg, OPT_Flow);\r
- index = SendMessage(hwndCombo, CB_GETCURSEL, (WPARAM) 0, (LPARAM) 0);\r
- switch (cdFlow[index].value) {\r
- case FLOW_NONE:\r
- dcb.fOutX = FALSE;\r
- dcb.fOutxCtsFlow = FALSE;\r
- dcb.fOutxDsrFlow = FALSE;\r
- break;\r
- case FLOW_CTS:\r
- dcb.fOutX = FALSE;\r
- dcb.fOutxCtsFlow = TRUE;\r
- dcb.fOutxDsrFlow = FALSE;\r
- break;\r
- case FLOW_DSR:\r
- dcb.fOutX = FALSE;\r
- dcb.fOutxCtsFlow = FALSE;\r
- dcb.fOutxDsrFlow = TRUE;\r
- break;\r
- case FLOW_XOFF:\r
- dcb.fOutX = TRUE;\r
- dcb.fOutxCtsFlow = FALSE;\r
- dcb.fOutxDsrFlow = FALSE;\r
- break;\r
- }\r
- if (!SetCommState(hCommPort, (LPDCB) &dcb)) {\r
- err = GetLastError();\r
- switch(MessageBox(hDlg,\r
- "Failed to set comm port state;\r\ninvalid options?",\r
- _("Option Error"), MB_ABORTRETRYIGNORE|MB_ICONQUESTION)) {\r
- case IDABORT:\r
- DisplayFatalError(_("Failed to set comm port state"), err, 1);\r
- exit(1); /*is it ok to do this from here?*/\r
-\r
- case IDRETRY:\r
- return TRUE;\r
-\r
- case IDIGNORE:\r
- EndDialog(hDlg, TRUE);\r
- return TRUE;\r
- }\r
- }\r
-\r
- EndDialog(hDlg, TRUE);\r
- return TRUE;\r
-\r
- case IDCANCEL:\r
- EndDialog(hDlg, FALSE);\r
- return TRUE;\r
-\r
- default:\r
- break;\r
- }\r
- break;\r
- }\r
- return FALSE;\r
-}\r
-\r
-VOID\r
-CommPortOptionsPopup(HWND hwnd)\r
-{\r
- FARPROC lpProc = MakeProcInstance((FARPROC)CommPortOptionsDialog, hInst);\r
- DialogBox(hInst, MAKEINTRESOURCE(DLG_CommPort), hwnd, (DLGPROC) lpProc);\r
- FreeProcInstance(lpProc);\r
-}\r
-\r
-/*---------------------------------------------------------------------------*\\r
- *\r
- * Load Options dialog functions\r
- *\r
-\*---------------------------------------------------------------------------*/\r
-\r
-int\r
-LoadOptionsWhichRadio(HWND hDlg)\r
-{\r
- return (IsDlgButtonChecked(hDlg, OPT_Exact) ? 1 :\r
- (IsDlgButtonChecked(hDlg, OPT_Subset) ? 2 :\r
- (IsDlgButtonChecked(hDlg, OPT_Struct) ? 3 :\r
- (IsDlgButtonChecked(hDlg, OPT_Material) ? 4 :\r
- (IsDlgButtonChecked(hDlg, OPT_Range) ? 5 :\r
- (IsDlgButtonChecked(hDlg, OPT_Difference) ? 6 : -1))))));\r
-}\r
-\r
-VOID\r
-SetLoadOptionEnables(HWND hDlg)\r
-{\r
- UINT state;\r
-\r
- state = IsDlgButtonChecked(hDlg, OPT_Autostep);\r
- EnableWindow(GetDlgItem(hDlg, OPT_ASTimeDelay), state);\r
- EnableWindow(GetDlgItem(hDlg, OPT_AStext1), state);\r
-}\r
-\r
-LRESULT CALLBACK\r
-LoadOptions(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)\r
-{\r
- char buf[MSG_SIZ];\r
- float fnumber;\r
- int 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
- Translate(hDlg, DLG_LoadOptions);\r
- /* Initialize the dialog items */\r
- if (appData.timeDelay >= 0.0) {\r
- CheckDlgButton(hDlg, OPT_Autostep, TRUE);\r
- snprintf(buf, MSG_SIZ, "%.2g", appData.timeDelay);\r
- SetDlgItemText(hDlg, OPT_ASTimeDelay, buf);\r
- } else {\r
- CheckDlgButton(hDlg, OPT_Autostep, FALSE);\r
- }\r
- SetLoadOptionEnables(hDlg);\r
- SetDlgItemInt(hDlg, OPT_elo1, appData.eloThreshold1, FALSE);\r
- SetDlgItemInt(hDlg, OPT_elo2, appData.eloThreshold2, FALSE);\r
- SetDlgItemInt(hDlg, OPT_date, appData.dateThreshold, FALSE);\r
- SetDlgItemInt(hDlg, OPT_Stretch, appData.stretch, FALSE);\r
- CheckDlgButton(hDlg, OPT_Reversed, appData.ignoreColors);\r
- CheckDlgButton(hDlg, OPT_Mirror, appData.findMirror);\r
- SetDlgItemText(hDlg, OPT_Counts, "");\r
- switch (appData.searchMode) {\r
- case 1:\r
- CheckDlgButton(hDlg, OPT_Exact, TRUE);\r
- break;\r
- case 2:\r
- CheckDlgButton(hDlg, OPT_Subset, TRUE);\r
- break;\r
- case 3:\r
- CheckDlgButton(hDlg, OPT_Struct, TRUE);\r
- break;\r
- case 4:\r
- CheckDlgButton(hDlg, OPT_Material, TRUE);\r
- break;\r
- case 5:\r
- CheckDlgButton(hDlg, OPT_Range, TRUE);\r
- break;\r
- case 6:\r
- CheckDlgButton(hDlg, OPT_Difference, TRUE);\r
- break;\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
- if (IsDlgButtonChecked(hDlg, OPT_Autostep)) {\r
- GetDlgItemText(hDlg, OPT_ASTimeDelay, buf, MSG_SIZ);\r
- if (sscanf(buf, "%f", &fnumber) != 1) {\r
- MessageBox(hDlg, _("Invalid load game step rate"),\r
- _("Option Error"), MB_OK|MB_ICONEXCLAMATION);\r
- return FALSE;\r
- }\r
- appData.timeDelay = fnumber;\r
- } else {\r
- appData.timeDelay = (float) -1.0;\r
- }\r
- appData.eloThreshold1 = GetDlgItemInt(hDlg, OPT_elo1, &ok, FALSE);\r
- appData.eloThreshold2 = GetDlgItemInt(hDlg, OPT_elo2, &ok, FALSE);\r
- appData.dateThreshold = GetDlgItemInt(hDlg, OPT_date, &ok, FALSE);\r
- appData.stretch = GetDlgItemInt(hDlg, OPT_Stretch, &ok, FALSE);\r
- appData.searchMode = LoadOptionsWhichRadio(hDlg);\r
- appData.ignoreColors = IsDlgButtonChecked(hDlg, OPT_Reversed);\r
- appData.findMirror = IsDlgButtonChecked(hDlg, OPT_Mirror);\r
- GetDlgItemText(hDlg, OPT_Counts, buf, MSG_SIZ);\r
- appData.minPieces = appData.maxPieces = 0;\r
- sscanf(buf, "%d-%d", &appData.minPieces, &appData.maxPieces);\r
- if(appData.maxPieces < appData.minPieces) appData.maxPieces = appData.minPieces;\r
- EndDialog(hDlg, TRUE);\r
- return TRUE;\r
-\r
- case IDCANCEL:\r
- EndDialog(hDlg, FALSE);\r
- return TRUE;\r
-\r
- default:\r
- SetLoadOptionEnables(hDlg);\r
- break;\r
- }\r
- break;\r
- }\r
- return FALSE;\r
-}\r
-\r
-\r
-VOID\r
-LoadOptionsPopup(HWND hwnd)\r
-{\r
- FARPROC lpProc = MakeProcInstance((FARPROC)LoadOptions, hInst);\r
- DialogBox(hInst, MAKEINTRESOURCE(DLG_LoadOptions), hwnd, (DLGPROC) lpProc);\r
- FreeProcInstance(lpProc);\r
-}\r
-\r
-/*---------------------------------------------------------------------------*\\r
- *\r
- * Save Options dialog functions\r
- *\r
-\*---------------------------------------------------------------------------*/\r
-\r
-VOID\r
-SetSaveOptionEnables(HWND hDlg)\r
-{\r
- UINT state;\r
-\r
- state = IsDlgButtonChecked(hDlg, OPT_Autosave);\r
- EnableWindow(GetDlgItem(hDlg, OPT_AVPrompt), state);\r
- EnableWindow(GetDlgItem(hDlg, OPT_AVToFile), state);\r
- if (state && !IsDlgButtonChecked(hDlg, OPT_AVPrompt) &&\r
- !IsDlgButtonChecked(hDlg, OPT_AVToFile)) {\r
- CheckRadioButton(hDlg, OPT_AVPrompt, OPT_AVToFile, OPT_AVPrompt);\r
- }\r
-\r
- state = state && IsDlgButtonChecked(hDlg, OPT_AVToFile);\r
- EnableWindow(GetDlgItem(hDlg, OPT_AVFilename), state);\r
- EnableWindow(GetDlgItem(hDlg, OPT_AVBrowse), state);\r
-}\r
-\r
-LRESULT CALLBACK\r
-SaveOptionsDialog(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)\r
-{\r
- char buf[MSG_SIZ];\r
- FILE *f;\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
- Translate(hDlg, DLG_SaveOptions);\r
- /* Initialize the dialog items */\r
- if (*appData.saveGameFile != NULLCHAR) {\r
- CheckDlgButton(hDlg, OPT_Autosave, (UINT) TRUE);\r
- CheckRadioButton(hDlg, OPT_AVPrompt, OPT_AVToFile, OPT_AVToFile);\r
- SetDlgItemText(hDlg, OPT_AVFilename, appData.saveGameFile);\r
- } else if (appData.autoSaveGames) {\r
- CheckDlgButton(hDlg, OPT_Autosave, (UINT) TRUE);\r
- CheckRadioButton(hDlg, OPT_AVPrompt, OPT_AVToFile, OPT_AVPrompt);\r
- } else {\r
- CheckDlgButton(hDlg, OPT_Autosave, (UINT) FALSE);\r
- }\r
- if (appData.oldSaveStyle) {\r
- CheckRadioButton(hDlg, OPT_PGN, OPT_Old, OPT_Old);\r
- } 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
- case WM_COMMAND: /* message: received a command */\r
- switch (LOWORD(wParam)) {\r
- case IDOK:\r
- /* Read changed options from the dialog box */\r
- if (IsDlgButtonChecked(hDlg, OPT_Autosave)) {\r
- appData.autoSaveGames = TRUE;\r
- if (IsDlgButtonChecked(hDlg, OPT_AVPrompt)) {\r
- ASSIGN(appData.saveGameFile, ""); // [HGM] make sure value is ALWAYS in allocated memory\r
- } else /*if (IsDlgButtonChecked(hDlg, OPT_AVToFile))*/ {\r
- GetDlgItemText(hDlg, OPT_AVFilename, buf, MSG_SIZ);\r
- if (*buf == NULLCHAR) {\r
- MessageBox(hDlg, _("Invalid save game file name"),\r
- _("Option Error"), MB_OK|MB_ICONEXCLAMATION);\r
- return FALSE;\r
- }\r
- FREE(appData.saveGameFile);\r
- appData.saveGameFile = InterpretFileName(buf, homeDir);\r
- }\r
- } else {\r
- appData.autoSaveGames = FALSE;\r
- ASSIGN(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
- case IDCANCEL:\r
- EndDialog(hDlg, FALSE);\r
- return TRUE;\r
-\r
- case OPT_AVBrowse:\r
- f = OpenFileDialog(hDlg, "a", NULL,\r
- appData.oldSaveStyle ? "gam" : "pgn",\r
- GAME_FILT, _("Browse for Auto Save File"),\r
- NULL, NULL, buf);\r
- if (f != NULL) {\r
- fclose(f);\r
- SetDlgItemText(hDlg, OPT_AVFilename, buf);\r
- }\r
- break;\r
-\r
- default:\r
- SetSaveOptionEnables(hDlg);\r
- break;\r
- }\r
- break;\r
- }\r
- return FALSE;\r
-}\r
-\r
-VOID\r
-SaveOptionsPopup(HWND hwnd)\r
-{\r
- FARPROC lpProc = MakeProcInstance((FARPROC)SaveOptionsDialog, hInst);\r
- DialogBox(hInst, MAKEINTRESOURCE(DLG_SaveOptions), hwnd, (DLGPROC) lpProc);\r
- FreeProcInstance(lpProc);\r
-}\r
-\r
-/*---------------------------------------------------------------------------*\\r
- *\r
- * Time Control Options dialog functions\r
- *\r
-\*---------------------------------------------------------------------------*/\r
-\r
-VOID\r
-SetTimeControlEnables(HWND hDlg)\r
-{\r
- UINT state;\r
-\r
- state = IsDlgButtonChecked(hDlg, OPT_TCUseMoves)\r
- + 2*IsDlgButtonChecked(hDlg, OPT_TCUseFixed);\r
- EnableWindow(GetDlgItem(hDlg, OPT_TCTime), state == 1);\r
- EnableWindow(GetDlgItem(hDlg, OPT_TCMoves), state == 1);\r
- EnableWindow(GetDlgItem(hDlg, OPT_TCtext1), state == 1);\r
- EnableWindow(GetDlgItem(hDlg, OPT_TCtext2), state == 1);\r
- EnableWindow(GetDlgItem(hDlg, OPT_TCTime2), !state);\r
- EnableWindow(GetDlgItem(hDlg, OPT_TCInc), !state);\r
- EnableWindow(GetDlgItem(hDlg, OPT_TCitext1), !state);\r
- EnableWindow(GetDlgItem(hDlg, OPT_TCitext2), !state);\r
- EnableWindow(GetDlgItem(hDlg, OPT_TCitext3), !state);\r
- EnableWindow(GetDlgItem(hDlg, OPT_TCFixed), state == 2);\r
- EnableWindow(GetDlgItem(hDlg, OPT_TCftext), state == 2);\r
-}\r
-\r
-\r
-LRESULT CALLBACK\r
-TimeControl(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)\r
-{\r
- char buf[MSG_SIZ], *tc;\r
- int mps, odds1, odds2, st;\r
- float increment;\r
- BOOL ok, ok2;\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
- Translate(hDlg, DLG_TimeControl);\r
- /* Initialize the dialog items */\r
- if (/*appData.clockMode &&*/ !appData.icsActive) { // [HGM] even if !clockMode, we could want to set it in tournament dialog\r
- if (searchTime) {\r
- CheckRadioButton(hDlg, OPT_TCUseMoves, OPT_TCUseFixed,\r
- OPT_TCUseFixed);\r
- SetDlgItemInt(hDlg, OPT_TCFixed, searchTime, FALSE);\r
- } else\r
- if (appData.timeIncrement == -1) {\r
- CheckRadioButton(hDlg, OPT_TCUseMoves, OPT_TCUseFixed,\r
- OPT_TCUseMoves);\r
- SetDlgItemText(hDlg, OPT_TCTime, appData.timeControl);\r
- SetDlgItemInt(hDlg, OPT_TCMoves, appData.movesPerSession,\r
- FALSE);\r
- SetDlgItemText(hDlg, OPT_TCTime2, "");\r
- SetDlgItemText(hDlg, OPT_TCInc, "");\r
- } else {\r
- int i = appData.timeIncrement;\r
- if(i == appData.timeIncrement) snprintf(buf, MSG_SIZ, "%d", i);\r
- else snprintf(buf, MSG_SIZ, "%4.2f", appData.timeIncrement);\r
- CheckRadioButton(hDlg, OPT_TCUseMoves, OPT_TCUseFixed,\r
- OPT_TCUseInc);\r
- SetDlgItemText(hDlg, OPT_TCTime, "");\r
- SetDlgItemText(hDlg, OPT_TCMoves, "");\r
- SetDlgItemText(hDlg, OPT_TCTime2, appData.timeControl);\r
- SetDlgItemText(hDlg, OPT_TCInc, buf);\r
- }\r
- SetDlgItemInt(hDlg, OPT_TCOdds1, 1, FALSE);\r
- SetDlgItemInt(hDlg, OPT_TCOdds2, 1, FALSE);\r
- SetTimeControlEnables(hDlg);\r
- }\r
- return TRUE;\r
-\r
- case WM_COMMAND: /* message: received a command */\r
- switch (LOWORD(wParam)) {\r
- case IDOK:\r
- mps = appData.movesPerSession;\r
- increment = appData.timeIncrement;\r
- tc = appData.timeControl;\r
- st = 0;\r
- /* Read changed options from the dialog box */\r
- if (IsDlgButtonChecked(hDlg, OPT_TCUseFixed)) {\r
- st = GetDlgItemInt(hDlg, OPT_TCFixed, &ok, FALSE);\r
- if (!ok || st <= 0) {\r
- MessageBox(hDlg, _("Invalid max time per move"),\r
- _("Option Error"), MB_OK|MB_ICONEXCLAMATION);\r
- return FALSE;\r
- }\r
- } else\r
- if (IsDlgButtonChecked(hDlg, OPT_TCUseMoves)) {\r
- increment = -1;\r
- mps = GetDlgItemInt(hDlg, OPT_TCMoves, &ok, FALSE);\r
- if (!ok || mps <= 0) {\r
- MessageBox(hDlg, _("Invalid moves per time control"),\r
- _("Option Error"), MB_OK|MB_ICONEXCLAMATION);\r
- return FALSE;\r
- }\r
- GetDlgItemText(hDlg, OPT_TCTime, buf, MSG_SIZ);\r
- if (!ParseTimeControl(buf, increment, mps)) {\r
- MessageBox(hDlg, _("Invalid minutes per time control"),\r
- _("Option Error"), MB_OK|MB_ICONEXCLAMATION);\r
- return FALSE;\r
- }\r
- tc = buf;\r
- } else {\r
- GetDlgItemText(hDlg, OPT_TCInc, buf, MSG_SIZ);\r
- ok = (sscanf(buf, "%f%c", &increment, buf) == 1);\r
- if (!ok || increment < 0) {\r
- MessageBox(hDlg, _("Invalid increment"),\r
- _("Option Error"), MB_OK|MB_ICONEXCLAMATION);\r
- return FALSE;\r
- }\r
- GetDlgItemText(hDlg, OPT_TCTime2, buf, MSG_SIZ);\r
- if (!ParseTimeControl(buf, increment, mps)) {\r
- MessageBox(hDlg, _("Invalid initial time"),\r
- _("Option Error"), MB_OK|MB_ICONEXCLAMATION);\r
- return FALSE;\r
- }\r
- tc = buf;\r
- }\r
- odds1 = GetDlgItemInt(hDlg, OPT_TCOdds1, &ok, FALSE);\r
- odds2 = GetDlgItemInt(hDlg, OPT_TCOdds2, &ok2, FALSE);\r
- if (!ok || !ok2 || odds1 <= 0 || odds2 <= 0) {\r
- MessageBox(hDlg, _("Invalid time-odds factor"),\r
- _("Option Error"), MB_OK|MB_ICONEXCLAMATION);\r
- return FALSE;\r
- }\r
- searchTime = st;\r
- appData.timeControl = strdup(tc);\r
- appData.movesPerSession = mps;\r
- appData.timeIncrement = increment;\r
- appData.firstTimeOdds = first.timeOdds = odds1;\r
- appData.secondTimeOdds = second.timeOdds = odds2;\r
- Reset(TRUE, TRUE);\r
- EndDialog(hDlg, TRUE);\r
- return TRUE;\r
-\r
- case IDCANCEL:\r
- EndDialog(hDlg, FALSE);\r
- return TRUE;\r
-\r
- default:\r
- SetTimeControlEnables(hDlg);\r
- break;\r
- }\r
- break;\r
- }\r
- return FALSE;\r
-}\r
-\r
-VOID\r
-TimeControlOptionsPopup(HWND hwnd)\r
-{\r
- if (gameMode != BeginningOfGame) {\r
- DisplayError(_("Changing time control during a game is not implemented"), 0);\r
- } else {\r
- FARPROC lpProc = MakeProcInstance((FARPROC)TimeControl, hInst);\r
- DialogBox(hInst, MAKEINTRESOURCE(DLG_TimeControl), hwnd, (DLGPROC) lpProc);\r
- FreeProcInstance(lpProc);\r
- }\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
- Translate(hDlg, DLG_EnginePlayOptions);\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
- CHECK_BOX(IDC_ScoreAbs1, appData.firstScoreIsAbsolute);\r
- CHECK_BOX(IDC_ScoreAbs2, appData.secondScoreIsAbsolute);\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
- appData.hideThinkingFromHuman= IS_CHECKED(IDC_EpHideThinkingHuman); // [HGM] thinking: moved up\r
- appData.showThinking = IS_CHECKED(IDC_EpShowThinking);\r
- ShowThinkingEvent(); // [HGM] thinking: tests all options that need thinking output\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
- first.scoreIsAbsolute = appData.firstScoreIsAbsolute = IS_CHECKED(IDC_ScoreAbs1);\r
- second.scoreIsAbsolute = appData.secondScoreIsAbsolute = IS_CHECKED(IDC_ScoreAbs2);\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
-INT CALLBACK BrowseCallbackProc(HWND hwnd, \r
- UINT uMsg,\r
- LPARAM lp, \r
- LPARAM pData) \r
-{\r
- switch(uMsg) \r
- {\r
- case BFFM_INITIALIZED: \r
- SendMessage(hwnd, BFFM_SETSELECTION, TRUE, (LPARAM)pData);\r
- break;\r
- }\r
- return 0;\r
-}\r
-\r
-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
- bi.lpfn = BrowseCallbackProc;\r
- bi.lParam = (LPARAM) path;\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
-int\r
-IsMultiFormat(char *s)\r
-{\r
- char *p = strchr(s, ':');\r
- return p && p != s+1;\r
-}\r
-\r
-LRESULT CALLBACK UciOptionsDialog(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)\r
-{\r
- char buf[MAX_PATH];\r
- int oldCores;\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
- Translate(hDlg, DLG_OptionsUCI);\r
-\r
- /* Initialize the dialog items */\r
- SetDlgItemText( hDlg, IDC_PolyglotDir, appData.polyglotDir );\r
- SetDlgItemInt( hDlg, IDC_HashSize, appData.defaultHashSize, TRUE );\r
- if(appData.defaultPathEGTB[0])\r
- SetDlgItemText( hDlg, IDC_PathToEGTB, appData.defaultPathEGTB );\r
- else\r
- SetDlgItemText( hDlg, IDC_PathToEGTB, appData.egtFormats );\r
- SetDlgItemInt( hDlg, IDC_SizeOfEGTB, appData.defaultCacheSizeEGTB, TRUE );\r
- CheckDlgButton( hDlg, IDC_UseBook, (BOOL) appData.usePolyglotBook );\r
- SetDlgItemText( hDlg, IDC_BookFile, appData.polyglotBook );\r
- // [HGM] smp: input field for nr of cores:\r
- SetDlgItemInt( hDlg, IDC_Cores, appData.smpCores, TRUE );\r
- // [HGM] book: tick boxes for own book use\r
- CheckDlgButton( hDlg, IDC_OwnBook1, (BOOL) appData.firstHasOwnBookUCI );\r
- CheckDlgButton( hDlg, IDC_OwnBook2, (BOOL) appData.secondHasOwnBookUCI );\r
- SetDlgItemInt( hDlg, IDC_BookDep, appData.bookDepth, TRUE );\r
- SetDlgItemInt( hDlg, IDC_BookStr, appData.bookStrength, TRUE );\r
- SetDlgItemInt( hDlg, IDC_Games, appData.defaultMatchGames, TRUE );\r
-\r
- SendDlgItemMessage( hDlg, IDC_PolyglotDir, EM_SETSEL, 0, -1 );\r
- // [HGM] Yet another ponder duplicate\r
- CheckDlgButton( hDlg, OPT_PonderNextMove, (BOOL) appData.ponderNextMove );\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
- if(IsMultiFormat(buf)) {\r
- ASSIGN(appData.egtFormats, buf);\r
- } else {\r
- ASSIGN(appData.defaultPathEGTB, buf);\r
- }\r
- GetDlgItemText( hDlg, IDC_BookFile, buf, sizeof(buf) );\r
- appData.polyglotBook = strdup(buf);\r
- appData.usePolyglotBook = (Boolean) IsDlgButtonChecked( hDlg, IDC_UseBook );\r
- // [HGM] smp: get nr of cores and ponder:\r
- oldCores = appData.smpCores;\r
- appData.smpCores = GetDlgItemInt(hDlg, IDC_Cores, NULL, FALSE );\r
- if(appData.smpCores != oldCores) NewSettingEvent(FALSE, &(first.maxCores), "cores", appData.smpCores);\r
- PonderNextMoveEvent((Boolean) IsDlgButtonChecked( hDlg, OPT_PonderNextMove ));\r
- // [HGM] book: read tick boxes for own book use\r
- appData.firstHasOwnBookUCI = (Boolean) IsDlgButtonChecked( hDlg, IDC_OwnBook1 );\r
- appData.secondHasOwnBookUCI = (Boolean) IsDlgButtonChecked( hDlg, IDC_OwnBook2 );\r
- appData.bookDepth = GetDlgItemInt(hDlg, IDC_BookDep, NULL, FALSE );\r
- appData.bookStrength = GetDlgItemInt(hDlg, IDC_BookStr, NULL, FALSE );\r
- appData.defaultMatchGames = GetDlgItemInt(hDlg, IDC_Games, NULL, FALSE );\r
-\r
- if(gameMode == BeginningOfGame) Reset(TRUE, TRUE);\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
- safeStrCpy( buf, "" , sizeof( buf)/sizeof( buf[0]) );\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
-\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