changes from H.G. Muller; version 4.3.14
[xboard.git] / winboard / woptions.c
1 /*\r
2  * woptions.c -- Options dialog box routines for WinBoard\r
3  * $Id: woptions.c,v 2.1 2003/10/27 19:21:02 mann Exp $\r
4  *\r
5  * Copyright 2000 Free Software Foundation, Inc.\r
6  *\r
7  * ------------------------------------------------------------------------\r
8  * This program is free software; you can redistribute it and/or modify\r
9  * it under the terms of the GNU General Public License as published by\r
10  * the Free Software Foundation; either version 2 of the License, or\r
11  * (at your option) any later version.\r
12  *\r
13  * This program is distributed in the hope that it will be useful,\r
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
16  * GNU General Public License for more details.\r
17  *\r
18  * You should have received a copy of the GNU General Public License\r
19  * along with this program; if not, write to the Free Software\r
20  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.\r
21  * ------------------------------------------------------------------------\r
22  */\r
23 \r
24 #include "config.h"\r
25 \r
26 #include <windows.h>   /* required for all Windows applications */\r
27 #include <stdio.h>\r
28 #include <stdlib.h>\r
29 #include <shlobj.h>    /* [AS] Requires NT 4.0 or Win95 */\r
30 \r
31 #include "common.h"\r
32 #include "winboard.h"\r
33 #include "backend.h"\r
34 #include "woptions.h"\r
35 #include "defaults.h"\r
36 #include "wedittags.h"\r
37 #include <richedit.h>\r
38 \r
39 #if __GNUC__\r
40 #include <errno.h>\r
41 #include <string.h>\r
42 #endif\r
43 \r
44 /* Imports from winboard.c */\r
45 \r
46 extern MyFont *font[NUM_SIZES][NUM_FONTS];\r
47 extern HINSTANCE hInst;          /* current instance */\r
48 extern HWND hwndMain;            /* root window*/\r
49 extern BOOLEAN alwaysOnTop;\r
50 extern RECT boardRect;\r
51 extern COLORREF lightSquareColor, darkSquareColor, whitePieceColor, \r
52   blackPieceColor, highlightSquareColor, premoveHighlightColor;\r
53 extern HPALETTE hPal;\r
54 extern BoardSize boardSize;\r
55 extern COLORREF consoleBackgroundColor;\r
56 extern MyColorizeAttribs colorizeAttribs[]; /* do I need the size? */\r
57 extern MyTextAttribs textAttribs[];\r
58 extern MySound sounds[];\r
59 extern ColorClass currentColorClass;\r
60 extern HWND hwndConsole;\r
61 extern char *defaultTextAttribs[];\r
62 extern HWND commentDialog;\r
63 extern HWND moveHistoryDialog;\r
64 extern char installDir[];\r
65 extern HWND hCommPort;    /* currently open comm port */\r
66 extern DCB dcb;\r
67 extern BOOLEAN chessProgram;\r
68 extern startedFromPositionFile; /* [HGM] loadPos */\r
69 \r
70 /* types */\r
71 \r
72 typedef struct {\r
73   char *label;\r
74   unsigned value;\r
75 } ComboData;\r
76 \r
77 typedef struct {\r
78   char *label;\r
79   char *name;\r
80 } SoundComboData;\r
81 \r
82 /* module prototypes */\r
83 \r
84 LRESULT CALLBACK GeneralOptions(HWND, UINT, WPARAM, LPARAM);\r
85 LRESULT CALLBACK BoardOptions(HWND, UINT, WPARAM, LPARAM);\r
86 LRESULT CALLBACK NewVariant(HWND, UINT, WPARAM, LPARAM);\r
87 LRESULT CALLBACK IcsOptions(HWND, UINT, WPARAM, LPARAM);\r
88 LRESULT CALLBACK FontOptions(HWND, UINT, WPARAM, LPARAM);\r
89 LRESULT CALLBACK CommPortOptions(HWND, UINT, WPARAM, LPARAM);\r
90 LRESULT CALLBACK LoadOptions(HWND, UINT, WPARAM, LPARAM);\r
91 LRESULT CALLBACK SaveOptions(HWND, UINT, WPARAM, LPARAM);\r
92 LRESULT CALLBACK TimeControl(HWND, UINT, WPARAM, LPARAM);\r
93 VOID ChangeBoardSize(BoardSize newSize);\r
94 VOID PaintSampleSquare(\r
95     HWND     hwnd, \r
96     int      ctrlid, \r
97     COLORREF squareColor, \r
98     COLORREF pieceColor,\r
99     COLORREF squareOutlineColor,\r
100     COLORREF pieceDetailColor,\r
101     BOOL     isWhitePiece,\r
102     BOOL     isMono,\r
103     HBITMAP  pieces[3] \r
104     );\r
105 VOID PaintColorBlock(HWND hwnd, int ctrlid, COLORREF color);\r
106 VOID SetBoardOptionEnables(HWND hDlg);\r
107 BoardSize BoardOptionsWhichRadio(HWND hDlg);\r
108 BOOL APIENTRY MyCreateFont(HWND hwnd, MyFont *font);\r
109 VOID UpdateSampleText(HWND hDlg, int id, MyColorizeAttribs *mca);\r
110 LRESULT CALLBACK ColorizeTextDialog(HWND , UINT, WPARAM, LPARAM);\r
111 VOID ColorizeTextPopup(HWND hwnd, ColorClass cc);\r
112 VOID SetIcsOptionEnables(HWND hDlg);\r
113 VOID SetSampleFontText(HWND hwnd, int id, const MyFont *mf);\r
114 VOID CopyFont(MyFont *dest, const MyFont *src);\r
115 void InitSoundComboData(SoundComboData *scd);\r
116 void ResetSoundComboData(SoundComboData *scd);\r
117 void InitSoundCombo(HWND hwndCombo, SoundComboData *scd);\r
118 int SoundDialogWhichRadio(HWND hDlg);\r
119 VOID SoundDialogSetEnables(HWND hDlg, int radio);\r
120 char * SoundDialogGetName(HWND hDlg, int radio);\r
121 void DisplaySelectedSound(HWND hDlg, HWND hCombo, const char *name);\r
122 VOID ParseCommSettings(char *arg, DCB *dcb);\r
123 VOID PrintCommSettings(FILE *f, char *name, DCB *dcb);\r
124 void InitCombo(HANDLE hwndCombo, ComboData *cd);\r
125 void SelectComboValue(HANDLE hwndCombo, ComboData *cd, unsigned value);\r
126 VOID SetLoadOptionEnables(HWND hDlg);\r
127 VOID SetSaveOptionEnables(HWND hDlg);\r
128 VOID SetTimeControlEnables(HWND hDlg);\r
129 \r
130 /*---------------------------------------------------------------------------*\\r
131  *\r
132  * General Options Dialog functions\r
133  *\r
134 \*---------------------------------------------------------------------------*/\r
135 \r
136 \r
137 LRESULT CALLBACK\r
138 GeneralOptionsDialog(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)\r
139 {\r
140   static Boolean oldShowCoords;\r
141   static Boolean oldBlindfold;\r
142   static Boolean oldShowButtonBar;\r
143 \r
144   switch (message) {\r
145   case WM_INITDIALOG: /* message: initialize dialog box */\r
146     oldShowCoords = appData.showCoords;\r
147     oldBlindfold  = appData.blindfold;\r
148     oldShowButtonBar = appData.showButtonBar;\r
149 \r
150     /* Center the dialog over the application window */\r
151     CenterWindow (hDlg, GetWindow (hDlg, GW_OWNER));\r
152 \r
153     /* Initialize the dialog items */\r
154 #define CHECK_BOX(x,y) CheckDlgButton(hDlg, (x), (BOOL)(y))\r
155 \r
156     CHECK_BOX(OPT_AlwaysOnTop, alwaysOnTop);\r
157     CHECK_BOX(OPT_AlwaysQueen, appData.alwaysPromoteToQueen);\r
158     CHECK_BOX(OPT_AnimateDragging, appData.animateDragging);\r
159     CHECK_BOX(OPT_AnimateMoving, appData.animate);\r
160     CHECK_BOX(OPT_AutoFlag, appData.autoCallFlag);\r
161     CHECK_BOX(OPT_AutoFlipView, appData.autoFlipView);\r
162     CHECK_BOX(OPT_AutoRaiseBoard, appData.autoRaiseBoard);\r
163     CHECK_BOX(OPT_Blindfold, appData.blindfold);\r
164     CHECK_BOX(OPT_HighlightDragging, appData.highlightDragging);\r
165     CHECK_BOX(OPT_HighlightLastMove, appData.highlightLastMove);\r
166     CHECK_BOX(OPT_PeriodicUpdates, appData.periodicUpdates);\r
167     CHECK_BOX(OPT_PonderNextMove, appData.ponderNextMove);\r
168     CHECK_BOX(OPT_PopupExitMessage, appData.popupExitMessage);\r
169     CHECK_BOX(OPT_PopupMoveErrors, appData.popupMoveErrors);\r
170     CHECK_BOX(OPT_ShowButtonBar, appData.showButtonBar);\r
171     CHECK_BOX(OPT_ShowCoordinates, appData.showCoords);\r
172     CHECK_BOX(OPT_ShowThinking, appData.showThinking);\r
173     CHECK_BOX(OPT_TestLegality, appData.testLegality);\r
174     CHECK_BOX(OPT_HideThinkFromHuman, appData.hideThinkingFromHuman);\r
175     CHECK_BOX(OPT_SaveExtPGN, appData.saveExtendedInfoInPGN);\r
176     CHECK_BOX(OPT_ExtraInfoInMoveHistory, appData.showEvalInMoveHistory);\r
177     CHECK_BOX(OPT_HighlightMoveArrow, appData.highlightMoveWithArrow);\r
178 \r
179 #undef CHECK_BOX\r
180 \r
181     EnableWindow(GetDlgItem(hDlg, OPT_AutoFlag),\r
182                  appData.icsActive || !appData.noChessProgram);\r
183     EnableWindow(GetDlgItem(hDlg, OPT_AutoFlipView),\r
184                  appData.icsActive || !appData.noChessProgram);\r
185     EnableWindow(GetDlgItem(hDlg, OPT_PonderNextMove),\r
186                  !appData.noChessProgram);\r
187     EnableWindow(GetDlgItem(hDlg, OPT_PeriodicUpdates), \r
188                  !appData.noChessProgram && !appData.icsActive);\r
189     EnableWindow(GetDlgItem(hDlg, OPT_ShowThinking), \r
190                  !appData.noChessProgram);\r
191     return TRUE;\r
192 \r
193 \r
194   case WM_COMMAND: /* message: received a command */\r
195     switch (LOWORD(wParam)) {\r
196     case IDOK:\r
197       /* Read changed options from the dialog box */\r
198       \r
199 #define IS_CHECKED(x) (Boolean)IsDlgButtonChecked(hDlg, (x))\r
200 \r
201       alwaysOnTop                  = IS_CHECKED(OPT_AlwaysOnTop);\r
202       appData.alwaysPromoteToQueen = IS_CHECKED(OPT_AlwaysQueen);\r
203       appData.animateDragging      = IS_CHECKED(OPT_AnimateDragging);\r
204       appData.animate              = IS_CHECKED(OPT_AnimateMoving);\r
205       appData.autoCallFlag         = IS_CHECKED(OPT_AutoFlag);\r
206       appData.autoFlipView         = IS_CHECKED(OPT_AutoFlipView);\r
207       appData.autoRaiseBoard       = IS_CHECKED(OPT_AutoRaiseBoard);\r
208       appData.blindfold            = IS_CHECKED(OPT_Blindfold);\r
209       appData.highlightDragging    = IS_CHECKED(OPT_HighlightDragging);\r
210       appData.highlightLastMove    = IS_CHECKED(OPT_HighlightLastMove);\r
211       PeriodicUpdatesEvent(          IS_CHECKED(OPT_PeriodicUpdates));\r
212       PonderNextMoveEvent(           IS_CHECKED(OPT_PonderNextMove));\r
213       appData.popupExitMessage     = IS_CHECKED(OPT_PopupExitMessage);\r
214       appData.popupMoveErrors      = IS_CHECKED(OPT_PopupMoveErrors);\r
215       appData.showButtonBar        = IS_CHECKED(OPT_ShowButtonBar);\r
216       appData.showCoords           = IS_CHECKED(OPT_ShowCoordinates);\r
217       ShowThinkingEvent(             IS_CHECKED(OPT_ShowThinking));\r
218       appData.testLegality         = IS_CHECKED(OPT_TestLegality);\r
219       appData.hideThinkingFromHuman= IS_CHECKED(OPT_HideThinkFromHuman);\r
220       appData.saveExtendedInfoInPGN= IS_CHECKED(OPT_SaveExtPGN);\r
221       appData.showEvalInMoveHistory= IS_CHECKED(OPT_ExtraInfoInMoveHistory);\r
222       appData.highlightMoveWithArrow=IS_CHECKED(OPT_HighlightMoveArrow);\r
223 \r
224 #undef IS_CHECKED\r
225 \r
226       SetWindowPos(hwndMain, alwaysOnTop ? HWND_TOPMOST : HWND_NOTOPMOST,\r
227                    0, 0, 0, 0, SWP_NOMOVE|SWP_NOSIZE);\r
228 #if AOT_CONSOLE\r
229       if (hwndConsole) {\r
230         SetWindowPos(hwndConsole, alwaysOnTop ? HWND_TOPMOST : HWND_NOTOPMOST,\r
231                      0, 0, 0, 0, SWP_NOMOVE|SWP_NOSIZE);\r
232       }\r
233 #endif\r
234       if (!appData.highlightLastMove) {\r
235         ClearHighlights();\r
236         DrawPosition(FALSE, NULL);\r
237       }\r
238       /* \r
239        * for some reason the redraw seems smoother when we invalidate\r
240        * the board rect after the call to EndDialog()\r
241        */\r
242       EndDialog(hDlg, TRUE);\r
243 \r
244       if (oldShowButtonBar != appData.showButtonBar) {\r
245         InitDrawingSizes(boardSize, 0);\r
246       } else if ((oldShowCoords != appData.showCoords) || \r
247                  (oldBlindfold != appData.blindfold)) {\r
248         InvalidateRect(hwndMain, &boardRect, FALSE);\r
249       }\r
250 \r
251       return TRUE;\r
252 \r
253     case IDCANCEL:\r
254       EndDialog(hDlg, FALSE);\r
255       return TRUE;\r
256 \r
257     }\r
258     break;\r
259   }\r
260   return FALSE;\r
261 }\r
262 \r
263 VOID \r
264 GeneralOptionsPopup(HWND hwnd)\r
265 {\r
266   FARPROC lpProc;\r
267 \r
268   lpProc = MakeProcInstance((FARPROC)GeneralOptionsDialog, hInst);\r
269   DialogBox(hInst, MAKEINTRESOURCE(DLG_GeneralOptions), hwnd,\r
270             (DLGPROC) lpProc);\r
271   FreeProcInstance(lpProc);\r
272 }\r
273 /*---------------------------------------------------------------------------*\\r
274  *\r
275  * Board Options Dialog functions\r
276  *\r
277 \*---------------------------------------------------------------------------*/\r
278 \r
279 const int SAMPLE_SQ_SIZE = 54;\r
280 \r
281 VOID\r
282 ChangeBoardSize(BoardSize newSize)\r
283 {\r
284   if (newSize != boardSize) {\r
285     boardSize = newSize;\r
286     InitDrawingSizes(boardSize, 0);\r
287   }\r
288 }\r
289 \r
290 VOID\r
291 PaintSampleSquare(\r
292     HWND     hwnd, \r
293     int      ctrlid, \r
294     COLORREF squareColor, \r
295     COLORREF pieceColor,\r
296     COLORREF squareOutlineColor,\r
297     COLORREF pieceDetailColor,\r
298     BOOL     isWhitePiece,\r
299     BOOL     isMono,\r
300     HBITMAP  pieces[3] \r
301     )\r
302 {\r
303   HBRUSH  brushSquare;\r
304   HBRUSH  brushSquareOutline;\r
305   HBRUSH  brushPiece;\r
306   HBRUSH  brushPieceDetail;\r
307   HBRUSH  oldBrushPiece;\r
308   HBRUSH  oldBrushSquare;\r
309   HBITMAP oldBitmapMem;\r
310   HBITMAP oldBitmapTemp;\r
311   HBITMAP bufferBitmap;\r
312   RECT    rect;\r
313   HDC     hdcScreen, hdcMem, hdcTemp;\r
314   HPEN    pen, oldPen;\r
315   HWND    hCtrl = GetDlgItem(hwnd, ctrlid);\r
316   int     x, y;\r
317 \r
318   const int SOLID   = 0;\r
319   const int WHITE   = 1;\r
320   const int OUTLINE = 2;\r
321   const int BORDER  = 4;\r
322 \r
323   InvalidateRect(hCtrl, NULL, TRUE);\r
324   UpdateWindow(hCtrl);\r
325   GetClientRect(hCtrl, &rect);\r
326   x = rect.left + (BORDER / 2);\r
327   y = rect.top  + (BORDER / 2);\r
328   hdcScreen = GetDC(hCtrl);\r
329   hdcMem  = CreateCompatibleDC(hdcScreen);\r
330   hdcTemp = CreateCompatibleDC(hdcScreen);\r
331 \r
332   bufferBitmap = CreateCompatibleBitmap(hdcScreen, rect.right-rect.left+1,\r
333                                         rect.bottom-rect.top+1);\r
334   oldBitmapMem = SelectObject(hdcMem, bufferBitmap);\r
335   if (!isMono) {\r
336     SelectPalette(hdcMem, hPal, FALSE);\r
337   }\r
338   brushSquare         = CreateSolidBrush(squareColor);\r
339   brushSquareOutline  = CreateSolidBrush(squareOutlineColor);\r
340   brushPiece          = CreateSolidBrush(pieceColor);\r
341   brushPieceDetail    = CreateSolidBrush(pieceDetailColor);\r
342 \r
343   /* \r
344    * first draw the rectangle \r
345    */\r
346   pen      = CreatePen(PS_SOLID, BORDER, squareOutlineColor);\r
347   oldPen   = (HPEN)  SelectObject(hdcMem, pen);\r
348   oldBrushSquare = (HBRUSH)SelectObject(hdcMem, brushSquare);\r
349   Rectangle(hdcMem, rect.left, rect.top, rect.right, rect.bottom);\r
350 \r
351   /* \r
352    * now draw the piece\r
353    */\r
354   if (isMono) {\r
355     oldBitmapTemp = SelectObject(hdcTemp, pieces[OUTLINE]);\r
356     BitBlt(hdcMem, x, y, SAMPLE_SQ_SIZE, SAMPLE_SQ_SIZE, hdcTemp, 0, 0,\r
357            isWhitePiece ? SRCCOPY : NOTSRCCOPY);\r
358     SelectObject(hdcTemp, oldBitmapTemp);\r
359   } else {\r
360     if (isWhitePiece) {\r
361       oldBitmapTemp = SelectObject(hdcTemp, pieces[WHITE]);\r
362       oldBrushPiece = SelectObject(hdcMem, brushPiece);\r
363       BitBlt(hdcMem, x, y, SAMPLE_SQ_SIZE, SAMPLE_SQ_SIZE, \r
364              hdcTemp, 0, 0, 0x00B8074A);\r
365 #if 0\r
366       /* Use pieceDetailColor for outline of white pieces */\r
367       SelectObject(hdcTemp, pieces[OUTLINE]);\r
368       SelectObject(hdcMem, brushPieceDetail);\r
369       BitBlt(hdcMem, x, y, SAMPLE_SQ_SIZE, SAMPLE_SQ_SIZE, \r
370              hdcTemp, 0, 0, 0x00B8074A);\r
371 #else\r
372       /* Use black for outline of white pieces */\r
373       SelectObject(hdcTemp, pieces[OUTLINE]);\r
374       BitBlt(hdcMem, x, y, SAMPLE_SQ_SIZE, SAMPLE_SQ_SIZE, \r
375              hdcTemp, 0, 0, SRCAND);\r
376 #endif\r
377     } else {\r
378 #if 0\r
379       /* Use pieceDetailColor for details of black pieces */\r
380       /* Requires filled-in solid bitmaps (BLACK_PIECE class); the\r
381          WHITE_PIECE ones aren't always the right shape. */\r
382       oldBitmapTemp = SelectObject(hdcTemp, pieces[BLACK]);\r
383       oldBrushPiece = SelectObject(hdcMem, brushPieceDetail);\r
384       BitBlt(hdcMem, x, y, SAMPLE_SQ_SIZE, SAMPLE_SQ_SIZE, \r
385              hdcTemp, 0, 0, 0x00B8074A);\r
386       SelectObject(hdcTemp, pieces[SOLID]);\r
387       SelectObject(hdcMem, brushPiece);\r
388       BitBlt(hdcMem, x, y, SAMPLE_SQ_SIZE, SAMPLE_SQ_SIZE, \r
389              hdcTemp, 0, 0, 0x00B8074A);\r
390 #else\r
391       /* Use square color for details of black pieces */\r
392       oldBitmapTemp = SelectObject(hdcTemp, pieces[SOLID]);\r
393       oldBrushPiece = SelectObject(hdcMem, brushPiece);\r
394       BitBlt(hdcMem, x, y, SAMPLE_SQ_SIZE, SAMPLE_SQ_SIZE, \r
395              hdcTemp, 0, 0, 0x00B8074A);\r
396 #endif\r
397     }\r
398     SelectObject(hdcMem, oldBrushPiece);\r
399     SelectObject(hdcTemp, oldBitmapTemp);\r
400   }\r
401   /* \r
402    * copy the memory dc to the screen\r
403    */\r
404   SelectObject(hdcMem, bufferBitmap);\r
405   BitBlt(hdcScreen, rect.left, rect.top,\r
406          rect.right - rect.left,\r
407          rect.bottom - rect.top,\r
408          hdcMem, rect.left, rect.top, SRCCOPY);\r
409   SelectObject(hdcMem, oldBitmapMem);\r
410   /* \r
411    * clean up\r
412    */\r
413   SelectObject(hdcMem, oldBrushPiece);\r
414   SelectObject(hdcMem, oldPen);\r
415   DeleteObject(brushPiece);\r
416   DeleteObject(brushPieceDetail);\r
417   DeleteObject(brushSquare);\r
418   DeleteObject(brushSquareOutline);\r
419   DeleteObject(pen);\r
420   DeleteDC(hdcTemp);\r
421   DeleteDC(hdcMem);\r
422   ReleaseDC(hCtrl, hdcScreen);\r
423 }\r
424 \r
425 \r
426 VOID\r
427 PaintColorBlock(HWND hwnd, int ctrlid, COLORREF color)\r
428 {\r
429   HDC    hdc;\r
430   HBRUSH brush, oldBrush;\r
431   RECT   rect;\r
432   HWND   hCtrl = GetDlgItem(hwnd, ctrlid);\r
433 \r
434   hdc = GetDC(hCtrl);\r
435   InvalidateRect(hCtrl, NULL, TRUE);\r
436   UpdateWindow(hCtrl);\r
437   GetClientRect(hCtrl, &rect);\r
438   brush = CreateSolidBrush(color);\r
439   oldBrush = (HBRUSH)SelectObject(hdc, brush);\r
440   Rectangle(hdc, rect.left, rect.top, rect.right, rect.bottom);\r
441   SelectObject(hdc, oldBrush);\r
442   DeleteObject(brush);\r
443   ReleaseDC(hCtrl, hdc);\r
444 }\r
445 \r
446 \r
447 VOID\r
448 SetBoardOptionEnables(HWND hDlg)\r
449 {\r
450   if (IsDlgButtonChecked(hDlg, OPT_Monochrome)) {\r
451     ShowWindow(GetDlgItem(hDlg, OPT_LightSquareColor), SW_HIDE);\r
452     ShowWindow(GetDlgItem(hDlg, OPT_DarkSquareColor), SW_HIDE);\r
453     ShowWindow(GetDlgItem(hDlg, OPT_WhitePieceColor), SW_HIDE);\r
454     ShowWindow(GetDlgItem(hDlg, OPT_BlackPieceColor), SW_HIDE);\r
455 \r
456     EnableWindow(GetDlgItem(hDlg, OPT_ChooseLightSquareColor), FALSE);\r
457     EnableWindow(GetDlgItem(hDlg, OPT_ChooseDarkSquareColor), FALSE);\r
458     EnableWindow(GetDlgItem(hDlg, OPT_ChooseWhitePieceColor), FALSE);\r
459     EnableWindow(GetDlgItem(hDlg, OPT_ChooseBlackPieceColor), FALSE);\r
460   } else {\r
461     ShowWindow(GetDlgItem(hDlg, OPT_LightSquareColor), SW_SHOW);\r
462     ShowWindow(GetDlgItem(hDlg, OPT_DarkSquareColor), SW_SHOW);\r
463     ShowWindow(GetDlgItem(hDlg, OPT_WhitePieceColor), SW_SHOW);\r
464     ShowWindow(GetDlgItem(hDlg, OPT_BlackPieceColor), SW_SHOW);\r
465 \r
466     EnableWindow(GetDlgItem(hDlg, OPT_ChooseLightSquareColor), TRUE);\r
467     EnableWindow(GetDlgItem(hDlg, OPT_ChooseDarkSquareColor), TRUE);\r
468     EnableWindow(GetDlgItem(hDlg, OPT_ChooseWhitePieceColor), TRUE);\r
469     EnableWindow(GetDlgItem(hDlg, OPT_ChooseBlackPieceColor), TRUE);\r
470   }\r
471 }\r
472 \r
473 BoardSize \r
474 BoardOptionsWhichRadio(HWND hDlg)\r
475 {\r
476   return (IsDlgButtonChecked(hDlg, OPT_SizeTiny) ? SizeTiny :\r
477          (IsDlgButtonChecked(hDlg, OPT_SizeTeeny) ? SizeTeeny :\r
478          (IsDlgButtonChecked(hDlg, OPT_SizeDinky) ? SizeDinky :\r
479          (IsDlgButtonChecked(hDlg, OPT_SizePetite) ? SizePetite :\r
480          (IsDlgButtonChecked(hDlg, OPT_SizeSlim) ? SizeSlim :\r
481          (IsDlgButtonChecked(hDlg, OPT_SizeSmall) ? SizeSmall :\r
482          (IsDlgButtonChecked(hDlg, OPT_SizeMediocre) ? SizeMediocre :\r
483          (IsDlgButtonChecked(hDlg, OPT_SizeMiddling) ? SizeMiddling :\r
484          (IsDlgButtonChecked(hDlg, OPT_SizeAverage) ? SizeAverage :\r
485          (IsDlgButtonChecked(hDlg, OPT_SizeModerate) ? SizeModerate :\r
486          (IsDlgButtonChecked(hDlg, OPT_SizeMedium) ? SizeMedium :\r
487          (IsDlgButtonChecked(hDlg, OPT_SizeBulky) ? SizeBulky :\r
488          (IsDlgButtonChecked(hDlg, OPT_SizeLarge) ? SizeLarge :\r
489          (IsDlgButtonChecked(hDlg, OPT_SizeBig) ? SizeBig :\r
490          (IsDlgButtonChecked(hDlg, OPT_SizeHuge) ? SizeHuge :\r
491          (IsDlgButtonChecked(hDlg, OPT_SizeGiant) ? SizeGiant :\r
492          (IsDlgButtonChecked(hDlg, OPT_SizeColossal) ? SizeColossal :\r
493           SizeTitanic )))))))))))))))));\r
494 }\r
495 \r
496 LRESULT CALLBACK\r
497 BoardOptionsDialog(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)\r
498 {\r
499   static Boolean  mono, white, flip;\r
500   static BoardSize size;\r
501   static COLORREF lsc, dsc, wpc, bpc, hsc, phc;\r
502   static HBITMAP pieces[3];\r
503 \r
504   switch (message) {\r
505   case WM_INITDIALOG: /* message: initialize dialog box */\r
506     /* Center the dialog over the application window */\r
507     CenterWindow (hDlg, GetWindow (hDlg, GW_OWNER));\r
508     /* Initialize the dialog items */\r
509     switch (boardSize) {\r
510     case SizeTiny:\r
511       CheckDlgButton(hDlg, OPT_SizeTiny, TRUE);\r
512       break;\r
513     case SizeTeeny:\r
514       CheckDlgButton(hDlg, OPT_SizeTeeny, TRUE);\r
515       break;\r
516     case SizeDinky:\r
517       CheckDlgButton(hDlg, OPT_SizeDinky, TRUE);\r
518       break;\r
519     case SizePetite:\r
520       CheckDlgButton(hDlg, OPT_SizePetite, TRUE);\r
521       break;\r
522     case SizeSlim:\r
523       CheckDlgButton(hDlg, OPT_SizeSlim, TRUE);\r
524       break;\r
525     case SizeSmall:\r
526       CheckDlgButton(hDlg, OPT_SizeSmall, TRUE);\r
527       break;\r
528     case SizeMediocre:\r
529       CheckDlgButton(hDlg, OPT_SizeMediocre, TRUE);\r
530       break;\r
531     case SizeMiddling:\r
532       CheckDlgButton(hDlg, OPT_SizeMiddling, TRUE);\r
533       break;\r
534     case SizeAverage:\r
535       CheckDlgButton(hDlg, OPT_SizeAverage, TRUE);\r
536       break;\r
537     case SizeModerate:\r
538       CheckDlgButton(hDlg, OPT_SizeModerate, TRUE);\r
539       break;\r
540     case SizeMedium:\r
541       CheckDlgButton(hDlg, OPT_SizeMedium, TRUE);\r
542       break;\r
543     case SizeBulky:\r
544       CheckDlgButton(hDlg, OPT_SizeBulky, TRUE);\r
545       break;\r
546     case SizeLarge:\r
547       CheckDlgButton(hDlg, OPT_SizeLarge, TRUE);\r
548       break;\r
549     case SizeBig:\r
550       CheckDlgButton(hDlg, OPT_SizeBig, TRUE);\r
551       break;\r
552     case SizeHuge:\r
553       CheckDlgButton(hDlg, OPT_SizeHuge, TRUE);\r
554       break;\r
555     case SizeGiant:\r
556       CheckDlgButton(hDlg, OPT_SizeGiant, TRUE);\r
557       break;\r
558     case SizeColossal:\r
559       CheckDlgButton(hDlg, OPT_SizeColossal, TRUE);\r
560       break;\r
561     case SizeTitanic:\r
562       CheckDlgButton(hDlg, OPT_SizeTitanic, TRUE);\r
563     }\r
564 \r
565     if (appData.monoMode)\r
566       CheckDlgButton(hDlg, OPT_Monochrome, TRUE);\r
567 \r
568     if (appData.allWhite)\r
569       CheckDlgButton(hDlg, OPT_AllWhite, TRUE);\r
570 \r
571     if (appData.upsideDown)\r
572       CheckDlgButton(hDlg, OPT_UpsideDown, TRUE);\r
573 \r
574     pieces[0] = DoLoadBitmap(hInst, "n", SAMPLE_SQ_SIZE, "s");\r
575     pieces[1] = DoLoadBitmap(hInst, "n", SAMPLE_SQ_SIZE, "w");\r
576     pieces[2] = DoLoadBitmap(hInst, "n", SAMPLE_SQ_SIZE, "o");\r
577         \r
578     lsc = lightSquareColor;\r
579     dsc = darkSquareColor;\r
580     wpc = whitePieceColor;\r
581     bpc = blackPieceColor;\r
582     hsc = highlightSquareColor;\r
583     phc = premoveHighlightColor;\r
584     mono = appData.monoMode;\r
585     white= appData.allWhite;\r
586     flip = appData.upsideDown;\r
587     size = boardSize;\r
588 \r
589     SetBoardOptionEnables(hDlg);\r
590     return TRUE;\r
591 \r
592   case WM_PAINT:\r
593     PaintColorBlock(hDlg, OPT_LightSquareColor, lsc);\r
594     PaintColorBlock(hDlg, OPT_DarkSquareColor,  dsc);\r
595     PaintColorBlock(hDlg, OPT_WhitePieceColor,  wpc);\r
596     PaintColorBlock(hDlg, OPT_BlackPieceColor,  bpc);\r
597     PaintColorBlock(hDlg, OPT_HighlightSquareColor, hsc);\r
598     PaintColorBlock(hDlg, OPT_PremoveHighlightColor, phc);\r
599     PaintSampleSquare(hDlg, OPT_SampleLightSquare, lsc, wpc, hsc, bpc,\r
600         TRUE, mono, pieces);\r
601     PaintSampleSquare(hDlg, OPT_SampleDarkSquare, dsc, bpc, phc, wpc,\r
602         FALSE, mono, pieces);\r
603 \r
604     return FALSE;\r
605 \r
606   case WM_COMMAND: /* message: received a command */\r
607     switch (LOWORD(wParam)) {\r
608     case IDOK:\r
609       /* \r
610        * if we call EndDialog() after the call to ChangeBoardSize(),\r
611        * then ChangeBoardSize() does not take effect, although the new\r
612        * boardSize is saved. Go figure...\r
613        */\r
614       EndDialog(hDlg, TRUE);\r
615 \r
616       size = BoardOptionsWhichRadio(hDlg);\r
617 \r
618       /*\r
619        * did any settings change?\r
620        */\r
621       if (size != boardSize) {\r
622         ChangeBoardSize(size);\r
623       }\r
624 \r
625       if ((mono != appData.monoMode) ||\r
626           (lsc  != lightSquareColor) ||\r
627           (dsc  != darkSquareColor) ||\r
628           (wpc  != whitePieceColor) ||\r
629           (bpc  != blackPieceColor) ||\r
630           (hsc  != highlightSquareColor) ||\r
631           (flip != appData.upsideDown) ||\r
632           (white != appData.allWhite) ||\r
633           (phc  != premoveHighlightColor)) {\r
634 \r
635           lightSquareColor = lsc;\r
636           darkSquareColor = dsc;\r
637           whitePieceColor = wpc;\r
638           blackPieceColor = bpc;\r
639           highlightSquareColor = hsc;\r
640           premoveHighlightColor = phc;\r
641           appData.monoMode = mono;\r
642           appData.allWhite = white;\r
643           appData.upsideDown = flip;\r
644 \r
645           InitDrawingColors();\r
646           InitDrawingSizes(boardSize, 0);\r
647           InvalidateRect(hwndMain, &boardRect, FALSE);\r
648       }\r
649       DeleteObject(pieces[0]);\r
650       DeleteObject(pieces[1]);\r
651       DeleteObject(pieces[2]);\r
652       return TRUE;\r
653 \r
654     case IDCANCEL:\r
655       DeleteObject(pieces[0]);\r
656       DeleteObject(pieces[1]);\r
657       DeleteObject(pieces[2]);\r
658       EndDialog(hDlg, FALSE);\r
659       return TRUE;\r
660 \r
661     case OPT_ChooseLightSquareColor:\r
662       if (ChangeColor(hDlg, &lsc)) \r
663         PaintColorBlock(hDlg, OPT_LightSquareColor, lsc);\r
664         PaintSampleSquare(hDlg, OPT_SampleLightSquare, lsc, wpc, hsc, bpc,\r
665             TRUE, mono, pieces);\r
666       break;\r
667 \r
668     case OPT_ChooseDarkSquareColor:\r
669       if (ChangeColor(hDlg, &dsc)) \r
670         PaintColorBlock(hDlg, OPT_DarkSquareColor, dsc);\r
671         PaintSampleSquare(hDlg, OPT_SampleDarkSquare, dsc, bpc, phc, wpc,\r
672             FALSE, mono, pieces);\r
673       break;\r
674 \r
675     case OPT_ChooseWhitePieceColor:\r
676       if (ChangeColor(hDlg, &wpc)) \r
677         PaintColorBlock(hDlg, OPT_WhitePieceColor, wpc);\r
678         PaintSampleSquare(hDlg, OPT_SampleLightSquare, lsc, wpc, hsc, bpc,\r
679             TRUE, mono, pieces);\r
680       break;\r
681 \r
682     case OPT_ChooseBlackPieceColor:\r
683       if (ChangeColor(hDlg, &bpc)) \r
684         PaintColorBlock(hDlg, OPT_BlackPieceColor, bpc);\r
685         PaintSampleSquare(hDlg, OPT_SampleDarkSquare, dsc, bpc, phc, wpc,\r
686             FALSE, mono, pieces);\r
687       break;\r
688 \r
689     case OPT_ChooseHighlightSquareColor:\r
690       if (ChangeColor(hDlg, &hsc)) \r
691         PaintColorBlock(hDlg, OPT_HighlightSquareColor, hsc);\r
692         PaintSampleSquare(hDlg, OPT_SampleLightSquare, lsc, wpc, hsc, bpc,\r
693             TRUE, mono, pieces);\r
694       break;\r
695 \r
696     case OPT_ChoosePremoveHighlightColor:\r
697       if (ChangeColor(hDlg, &phc)) \r
698         PaintColorBlock(hDlg, OPT_PremoveHighlightColor, phc);\r
699         PaintSampleSquare(hDlg, OPT_SampleDarkSquare, dsc, bpc, phc, wpc,\r
700             FALSE, mono, pieces);\r
701       break;\r
702 \r
703     case OPT_DefaultBoardColors:\r
704       lsc = ParseColorName(LIGHT_SQUARE_COLOR);\r
705       dsc = ParseColorName(DARK_SQUARE_COLOR);\r
706       wpc = ParseColorName(WHITE_PIECE_COLOR);\r
707       bpc = ParseColorName(BLACK_PIECE_COLOR);\r
708       hsc = ParseColorName(HIGHLIGHT_SQUARE_COLOR);\r
709       phc = ParseColorName(PREMOVE_HIGHLIGHT_COLOR);\r
710       mono = FALSE;\r
711       white= FALSE;\r
712       flip = FALSE;\r
713       CheckDlgButton(hDlg, OPT_Monochrome, FALSE);\r
714       CheckDlgButton(hDlg, OPT_AllWhite,   FALSE);\r
715       CheckDlgButton(hDlg, OPT_UpsideDown, FALSE);\r
716       PaintColorBlock(hDlg, OPT_LightSquareColor, lsc);\r
717       PaintColorBlock(hDlg, OPT_DarkSquareColor,  dsc);\r
718       PaintColorBlock(hDlg, OPT_WhitePieceColor,  wpc);\r
719       PaintColorBlock(hDlg, OPT_BlackPieceColor,  bpc);\r
720       PaintColorBlock(hDlg, OPT_HighlightSquareColor, hsc);\r
721       PaintColorBlock(hDlg, OPT_PremoveHighlightColor, phc);\r
722       SetBoardOptionEnables(hDlg);\r
723       PaintSampleSquare(hDlg, OPT_SampleLightSquare, lsc, wpc, hsc, bpc,\r
724           TRUE, mono, pieces);\r
725       PaintSampleSquare(hDlg, OPT_SampleDarkSquare, dsc, bpc, phc, wpc,\r
726           FALSE, mono, pieces);\r
727       break;\r
728 \r
729     case OPT_Monochrome:\r
730       mono = !mono;\r
731       SetBoardOptionEnables(hDlg);\r
732       break;\r
733 \r
734     case OPT_AllWhite:\r
735       white = !white;\r
736       SetBoardOptionEnables(hDlg);\r
737       break;\r
738 \r
739     case OPT_UpsideDown:\r
740       flip = !flip;\r
741       SetBoardOptionEnables(hDlg);\r
742       break;\r
743     }\r
744     break;\r
745   }\r
746   return FALSE;\r
747 }\r
748 \r
749 \r
750 VOID\r
751 BoardOptionsPopup(HWND hwnd)\r
752 {\r
753   FARPROC lpProc = MakeProcInstance((FARPROC)BoardOptionsDialog, hInst);\r
754   DialogBox(hInst, MAKEINTRESOURCE(DLG_BoardOptions), hwnd,\r
755           (DLGPROC) lpProc);\r
756   FreeProcInstance(lpProc);\r
757 }\r
758 \r
759 VariantClass\r
760 VariantWhichRadio(HWND hDlg)\r
761 {\r
762   return (IsDlgButtonChecked(hDlg, OPT_VariantFairy) ? VariantFairy :\r
763          (IsDlgButtonChecked(hDlg, OPT_VariantGothic) ? VariantGothic :\r
764          (IsDlgButtonChecked(hDlg, OPT_VariantCrazyhouse) ? VariantCrazyhouse :\r
765          (IsDlgButtonChecked(hDlg, OPT_VariantBughouse) ? VariantBughouse :\r
766          (IsDlgButtonChecked(hDlg, OPT_VariantCourier) ? VariantCourier :\r
767          (IsDlgButtonChecked(hDlg, OPT_VariantShatranj) ? VariantShatranj :\r
768          (IsDlgButtonChecked(hDlg, OPT_VariantShogi) ? VariantShogi :\r
769          (IsDlgButtonChecked(hDlg, OPT_VariantXiangqi) ? VariantXiangqi :\r
770          (IsDlgButtonChecked(hDlg, OPT_VariantCapablanca) ? VariantCapablanca :\r
771          (IsDlgButtonChecked(hDlg, OPT_VariantTwoKings) ? VariantTwoKings :\r
772          (IsDlgButtonChecked(hDlg, OPT_VariantKnightmate) ? VariantKnightmate :\r
773          (IsDlgButtonChecked(hDlg, OPT_VariantLosers) ? VariantLosers :\r
774          (IsDlgButtonChecked(hDlg, OPT_VariantSuicide) ? VariantSuicide :\r
775          (IsDlgButtonChecked(hDlg, OPT_VariantAtomic) ? VariantAtomic :\r
776          (IsDlgButtonChecked(hDlg, OPT_VariantShatranj) ? VariantShatranj :\r
777          (IsDlgButtonChecked(hDlg, OPT_VariantFRC) ? VariantFischeRandom :\r
778          (IsDlgButtonChecked(hDlg, OPT_VariantCylinder) ? VariantCylinder :\r
779          (IsDlgButtonChecked(hDlg, OPT_VariantFalcon) ? VariantFalcon :\r
780          (IsDlgButtonChecked(hDlg, OPT_VariantCRC) ? VariantCapaRandom :\r
781          (IsDlgButtonChecked(hDlg, OPT_Variant3Checks) ? Variant3Check :\r
782          (IsDlgButtonChecked(hDlg, OPT_VariantBerolina) ? VariantBerolina :\r
783          (IsDlgButtonChecked(hDlg, OPT_VariantJanus) ? VariantJanus :\r
784          (IsDlgButtonChecked(hDlg, OPT_VariantWildcastle) ? VariantWildCastle :\r
785          (IsDlgButtonChecked(hDlg, OPT_VariantNocastle) ? VariantNoCastle :\r
786           VariantNormal ))))))))))))))))))))))));\r
787 }\r
788 \r
789 LRESULT CALLBACK\r
790 NewVariantDialog(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)\r
791 {\r
792   static Boolean  mono;\r
793   static VariantClass v;\r
794   static COLORREF lsc, dsc, wpc, bpc, hsc, phc;\r
795   static HBITMAP pieces[3];\r
796   static int n1_ok, n2_ok, n3_ok;\r
797 \r
798   switch (message) {\r
799   case WM_INITDIALOG: /* message: initialize dialog box */\r
800     /* Center the dialog over the application window */\r
801     CenterWindow (hDlg, GetWindow (hDlg, GW_OWNER));\r
802     /* Initialize the dialog items */\r
803     switch (gameInfo.variant) {\r
804     case VariantNormal:\r
805       CheckDlgButton(hDlg, OPT_VariantNormal, TRUE);\r
806       break;\r
807     case VariantCrazyhouse:\r
808       CheckDlgButton(hDlg, OPT_VariantCrazyhouse, TRUE);\r
809       break;\r
810     case VariantBughouse:\r
811       CheckDlgButton(hDlg, OPT_VariantBughouse, TRUE);\r
812       break;\r
813     case VariantShogi:\r
814       CheckDlgButton(hDlg, OPT_VariantShogi, TRUE);\r
815       break;\r
816     case VariantXiangqi:\r
817       CheckDlgButton(hDlg, OPT_VariantXiangqi, TRUE);\r
818       break;\r
819     case VariantCapablanca:\r
820       CheckDlgButton(hDlg, OPT_VariantCapablanca, TRUE);\r
821       break;\r
822     case VariantGothic:\r
823       CheckDlgButton(hDlg, OPT_VariantGothic, TRUE);\r
824       break;\r
825     case VariantCourier:\r
826       CheckDlgButton(hDlg, OPT_VariantCourier, TRUE);\r
827       break;\r
828     case VariantKnightmate:\r
829       CheckDlgButton(hDlg, OPT_VariantKnightmate, TRUE);\r
830       break;\r
831     case VariantTwoKings:\r
832       CheckDlgButton(hDlg, OPT_VariantTwoKings, TRUE);\r
833       break;\r
834     case VariantFairy:\r
835       CheckDlgButton(hDlg, OPT_VariantFairy, TRUE);\r
836       break;\r
837     case VariantAtomic:\r
838       CheckDlgButton(hDlg, OPT_VariantAtomic, TRUE);\r
839       break;\r
840     case VariantSuicide:\r
841       CheckDlgButton(hDlg, OPT_VariantSuicide, TRUE);\r
842       break;\r
843     case VariantLosers:\r
844       CheckDlgButton(hDlg, OPT_VariantLosers, TRUE);\r
845       break;\r
846     case VariantShatranj:\r
847       CheckDlgButton(hDlg, OPT_VariantShatranj, TRUE);\r
848       break;\r
849     case VariantFischeRandom:\r
850       CheckDlgButton(hDlg, OPT_VariantFRC, TRUE);\r
851       break;\r
852     case VariantCapaRandom:\r
853       CheckDlgButton(hDlg, OPT_VariantCRC, TRUE);\r
854       break;\r
855     case VariantFalcon:\r
856       CheckDlgButton(hDlg, OPT_VariantFalcon, TRUE);\r
857       break;\r
858     case VariantCylinder:\r
859       CheckDlgButton(hDlg, OPT_VariantCylinder, TRUE);\r
860       break;\r
861     case Variant3Check:\r
862       CheckDlgButton(hDlg, OPT_Variant3Checks, TRUE);\r
863       break;\r
864     case VariantBerolina:\r
865       CheckDlgButton(hDlg, OPT_VariantBerolina, TRUE);\r
866       break;\r
867     case VariantJanus:\r
868       CheckDlgButton(hDlg, OPT_VariantJanus, TRUE);\r
869       break;\r
870     case VariantWildCastle:\r
871       CheckDlgButton(hDlg, OPT_VariantWildcastle, TRUE);\r
872       break;\r
873     case VariantNoCastle:\r
874       CheckDlgButton(hDlg, OPT_VariantNocastle, TRUE);\r
875       break;\r
876     }\r
877 \r
878     SetDlgItemInt( hDlg, IDC_Files, -1, TRUE );\r
879     SendDlgItemMessage( hDlg, IDC_Files, EM_SETSEL, 0, -1 );\r
880 \r
881     SetDlgItemInt( hDlg, IDC_Ranks, -1, TRUE );\r
882     SendDlgItemMessage( hDlg, IDC_Ranks, EM_SETSEL, 0, -1 );\r
883 \r
884     SetDlgItemInt( hDlg, IDC_Holdings, -1, TRUE );\r
885     SendDlgItemMessage( hDlg, IDC_Ranks, EM_SETSEL, 0, -1 );\r
886 \r
887     n1_ok = n2_ok = n3_ok = FALSE;\r
888 \r
889     return TRUE;\r
890 \r
891   case WM_COMMAND: /* message: received a command */\r
892     switch (LOWORD(wParam)) {\r
893     case IDOK:\r
894       /* \r
895        * if we call EndDialog() after the call to ChangeBoardSize(),\r
896        * then ChangeBoardSize() does not take effect, although the new\r
897        * boardSize is saved. Go figure...\r
898        */\r
899       EndDialog(hDlg, TRUE);\r
900 \r
901       v = VariantWhichRadio(hDlg);\r
902 \r
903       gameInfo.variant = v;\r
904       appData.variant = VariantName(v);\r
905 \r
906       appData.NrFiles = (int) GetDlgItemInt(hDlg, IDC_Files, NULL, FALSE );\r
907       appData.NrRanks = (int) GetDlgItemInt(hDlg, IDC_Ranks, NULL, FALSE );\r
908       appData.holdingsSize = (int) GetDlgItemInt(hDlg, IDC_Holdings, NULL, FALSE );\r
909 \r
910       if(!n1_ok) appData.NrFiles = -1;\r
911       if(!n2_ok) appData.NrRanks = -1;\r
912       if(!n3_ok) appData.holdingsSize = -1;\r
913 \r
914       shuffleOpenings = FALSE; /* [HGM] shuffle: possible shuffle reset when we switch */\r
915       startedFromPositionFile = FALSE; /* [HGM] loadPos: no longer valid in new variant */\r
916       appData.pieceToCharTable = NULL;\r
917       Reset(TRUE, TRUE);\r
918 \r
919       return TRUE;\r
920 \r
921     case IDCANCEL:\r
922       EndDialog(hDlg, FALSE);\r
923       return TRUE;\r
924 \r
925     case IDC_Ranks:\r
926     case IDC_Files:\r
927     case IDC_Holdings:\r
928         if( HIWORD(wParam) == EN_CHANGE ) {\r
929 \r
930             GetDlgItemInt(hDlg, IDC_Files, &n1_ok, FALSE );\r
931             GetDlgItemInt(hDlg, IDC_Ranks, &n2_ok, FALSE );\r
932             GetDlgItemInt(hDlg, IDC_Holdings, &n3_ok, FALSE );\r
933 \r
934             /*EnableWindow( GetDlgItem(hDlg, IDOK), n1_ok && n2_ok && n3_ok ? TRUE : FALSE );*/\r
935         }\r
936         return TRUE;\r
937     }\r
938     break;\r
939   }\r
940   return FALSE;\r
941 }\r
942 \r
943 \r
944 VOID\r
945 NewVariantPopup(HWND hwnd)\r
946 {\r
947   FARPROC lpProc = MakeProcInstance((FARPROC)NewVariantDialog, hInst);\r
948   DialogBox(hInst, MAKEINTRESOURCE(DLG_NewVariant), hwnd,\r
949           (DLGPROC) lpProc);\r
950   FreeProcInstance(lpProc);\r
951 }\r
952 \r
953 /*---------------------------------------------------------------------------*\\r
954  *\r
955  * ICS Options Dialog functions\r
956  *\r
957 \*---------------------------------------------------------------------------*/\r
958 \r
959 BOOL APIENTRY\r
960 MyCreateFont(HWND hwnd, MyFont *font)\r
961 {\r
962   CHOOSEFONT cf;\r
963   HFONT hf;\r
964 \r
965   /* Initialize members of the CHOOSEFONT structure. */\r
966   cf.lStructSize = sizeof(CHOOSEFONT);\r
967   cf.hwndOwner = hwnd;\r
968   cf.hDC = (HDC)NULL;\r
969   cf.lpLogFont = &font->lf;\r
970   cf.iPointSize = 0;\r
971   cf.Flags = CF_SCREENFONTS|/*CF_ANSIONLY|*/CF_INITTOLOGFONTSTRUCT;\r
972   cf.rgbColors = RGB(0,0,0);\r
973   cf.lCustData = 0L;\r
974   cf.lpfnHook = (LPCFHOOKPROC)NULL;\r
975   cf.lpTemplateName = (LPSTR)NULL;\r
976   cf.hInstance = (HINSTANCE) NULL;\r
977   cf.lpszStyle = (LPSTR)NULL;\r
978   cf.nFontType = SCREEN_FONTTYPE;\r
979   cf.nSizeMin = 0;\r
980   cf.nSizeMax = 0;\r
981 \r
982   /* Display the CHOOSEFONT common-dialog box. */\r
983   if (!ChooseFont(&cf)) {\r
984     return FALSE;\r
985   }\r
986 \r
987   /* Create a logical font based on the user's   */\r
988   /* selection and return a handle identifying   */\r
989   /* that font. */\r
990   hf = CreateFontIndirect(cf.lpLogFont);\r
991   if (hf == NULL) {\r
992     return FALSE;\r
993   }\r
994 \r
995   font->hf = hf;\r
996   font->mfp.pointSize = (float) (cf.iPointSize / 10.0);\r
997   font->mfp.bold = (font->lf.lfWeight >= FW_BOLD);\r
998   font->mfp.italic = font->lf.lfItalic;\r
999   font->mfp.underline = font->lf.lfUnderline;\r
1000   font->mfp.strikeout = font->lf.lfStrikeOut;\r
1001   strcpy(font->mfp.faceName, font->lf.lfFaceName);\r
1002   return TRUE;\r
1003 }\r
1004 \r
1005 \r
1006 VOID\r
1007 UpdateSampleText(HWND hDlg, int id, MyColorizeAttribs *mca)\r
1008 {\r
1009   CHARFORMAT cf;\r
1010   cf.cbSize = sizeof(CHARFORMAT);\r
1011   cf.dwMask = \r
1012     CFM_COLOR|CFM_BOLD|CFM_ITALIC|CFM_UNDERLINE|CFM_STRIKEOUT|CFM_FACE|CFM_SIZE;\r
1013   cf.crTextColor = mca->color;\r
1014   cf.dwEffects = mca->effects;\r
1015   strcpy(cf.szFaceName, font[boardSize][CONSOLE_FONT]->mfp.faceName);\r
1016   /* \r
1017    * The 20.0 below is in fact documented. yHeight is expressed in twips.\r
1018    * A twip is 1/20 of a font's point size. See documentation of CHARFORMAT.\r
1019    * --msw\r
1020    */\r
1021   cf.yHeight = (int)(font[boardSize][CONSOLE_FONT]->mfp.pointSize * 20.0 + 0.5);\r
1022   cf.bCharSet = DEFAULT_CHARSET; /* should be ignored anyway */\r
1023   cf.bPitchAndFamily = DEFAULT_PITCH|FF_DONTCARE;\r
1024   SendDlgItemMessage(hDlg, id, EM_SETCHARFORMAT, SCF_ALL, (LPARAM)&cf);\r
1025 }\r
1026 \r
1027 LRESULT CALLBACK\r
1028 ColorizeTextDialog(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)\r
1029 {\r
1030   static MyColorizeAttribs mca;\r
1031   static ColorClass cc;\r
1032   COLORREF background = (COLORREF)0;\r
1033 \r
1034   switch (message) {\r
1035   case WM_INITDIALOG:\r
1036     cc = (ColorClass)lParam;\r
1037     mca = colorizeAttribs[cc];\r
1038     /* Center the dialog over the application window */\r
1039     CenterWindow (hDlg, GetWindow (hDlg, GW_OWNER));\r
1040     /* Initialize the dialog items */\r
1041     CheckDlgButton(hDlg, OPT_Bold, (mca.effects & CFE_BOLD) != 0);\r
1042     CheckDlgButton(hDlg, OPT_Italic, (mca.effects & CFE_ITALIC) != 0);\r
1043     CheckDlgButton(hDlg, OPT_Underline, (mca.effects & CFE_UNDERLINE) != 0);\r
1044     CheckDlgButton(hDlg, OPT_Strikeout, (mca.effects & CFE_STRIKEOUT) != 0);\r
1045 \r
1046     /* get the current background color from the parent window */\r
1047     SendMessage(GetWindow(hDlg, GW_OWNER),WM_COMMAND, \r
1048                 (WPARAM)WM_USER_GetConsoleBackground, \r
1049                 (LPARAM)&background);\r
1050 \r
1051     /* set the background color */\r
1052     SendDlgItemMessage(hDlg, OPT_Sample, EM_SETBKGNDCOLOR, FALSE, background);\r
1053 \r
1054     SetDlgItemText(hDlg, OPT_Sample, mca.name);\r
1055     UpdateSampleText(hDlg, OPT_Sample, &mca);\r
1056     return TRUE;\r
1057 \r
1058   case WM_COMMAND: /* message: received a command */\r
1059     switch (LOWORD(wParam)) {\r
1060     case IDOK:\r
1061       /* Read changed options from the dialog box */\r
1062       colorizeAttribs[cc] = mca;\r
1063       textAttribs[cc].color = mca.color;\r
1064       textAttribs[cc].effects = mca.effects;\r
1065       Colorize(currentColorClass, TRUE);\r
1066       if (cc == ColorNormal) {\r
1067         CHARFORMAT cf;\r
1068         cf.cbSize = sizeof(CHARFORMAT);\r
1069         cf.dwMask = CFM_COLOR;\r
1070         cf.crTextColor = mca.color;\r
1071         SendDlgItemMessage(hwndConsole, OPT_ConsoleInput, \r
1072           EM_SETCHARFORMAT, SCF_ALL, (LPARAM)&cf);\r
1073       }\r
1074       EndDialog(hDlg, TRUE);\r
1075       return TRUE;\r
1076 \r
1077     case IDCANCEL:\r
1078       EndDialog(hDlg, FALSE);\r
1079       return TRUE;\r
1080 \r
1081     case OPT_ChooseColor:\r
1082       ChangeColor(hDlg, &mca.color);\r
1083       UpdateSampleText(hDlg, OPT_Sample, &mca);\r
1084       return TRUE;\r
1085 \r
1086     default:\r
1087       mca.effects =\r
1088         (IsDlgButtonChecked(hDlg, OPT_Bold) ? CFE_BOLD : 0) |\r
1089         (IsDlgButtonChecked(hDlg, OPT_Italic) ? CFE_ITALIC : 0) |\r
1090         (IsDlgButtonChecked(hDlg, OPT_Underline) ? CFE_UNDERLINE : 0) |\r
1091         (IsDlgButtonChecked(hDlg, OPT_Strikeout) ? CFE_STRIKEOUT : 0);\r
1092       UpdateSampleText(hDlg, OPT_Sample, &mca);\r
1093       break;\r
1094     }\r
1095     break;\r
1096   }\r
1097   return FALSE;\r
1098 }\r
1099 \r
1100 VOID\r
1101 ColorizeTextPopup(HWND hwnd, ColorClass cc)\r
1102 {\r
1103   FARPROC lpProc;\r
1104 \r
1105   lpProc = MakeProcInstance((FARPROC)ColorizeTextDialog, hInst);\r
1106   DialogBoxParam(hInst, MAKEINTRESOURCE(DLG_Colorize),\r
1107     hwnd, (DLGPROC)lpProc, (LPARAM) cc);\r
1108   FreeProcInstance(lpProc);\r
1109 }\r
1110 \r
1111 VOID\r
1112 SetIcsOptionEnables(HWND hDlg)\r
1113 {\r
1114 #define ENABLE_DLG_ITEM(x,y) EnableWindow(GetDlgItem(hDlg,(x)), (y))\r
1115 \r
1116   UINT state = IsDlgButtonChecked(hDlg, OPT_Premove);\r
1117   ENABLE_DLG_ITEM(OPT_PremoveWhite, state);\r
1118   ENABLE_DLG_ITEM(OPT_PremoveWhiteText, state);\r
1119   ENABLE_DLG_ITEM(OPT_PremoveBlack, state);\r
1120   ENABLE_DLG_ITEM(OPT_PremoveBlackText, state);\r
1121 \r
1122   ENABLE_DLG_ITEM(OPT_IcsAlarmTime, IsDlgButtonChecked(hDlg, OPT_IcsAlarm));\r
1123 \r
1124 #undef ENABLE_DLG_ITEM\r
1125 }\r
1126 \r
1127 \r
1128 LRESULT CALLBACK\r
1129 IcsOptionsDialog(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)\r
1130 {\r
1131   char buf[MSG_SIZ];\r
1132   int number;\r
1133   int i;\r
1134   static COLORREF cbc;\r
1135   static MyColorizeAttribs *mca;\r
1136   COLORREF *colorref;\r
1137 \r
1138   switch (message) {\r
1139   case WM_INITDIALOG: /* message: initialize dialog box */\r
1140 \r
1141     mca = colorizeAttribs;\r
1142 \r
1143     for (i=0; i < NColorClasses - 1; i++) {\r
1144       mca[i].color   = textAttribs[i].color;\r
1145       mca[i].effects = textAttribs[i].effects;\r
1146     }\r
1147     cbc = consoleBackgroundColor;\r
1148 \r
1149     /* Center the dialog over the application window */\r
1150     CenterWindow (hDlg, GetWindow (hDlg, GW_OWNER));\r
1151 \r
1152     /* Initialize the dialog items */\r
1153 #define CHECK_BOX(x,y) CheckDlgButton(hDlg, (x), (BOOL)(y))\r
1154 \r
1155     CHECK_BOX(OPT_AutoComment, appData.autoComment);\r
1156     CHECK_BOX(OPT_AutoObserve, appData.autoObserve);\r
1157     CHECK_BOX(OPT_GetMoveList, appData.getMoveList);\r
1158     CHECK_BOX(OPT_LocalLineEditing, appData.localLineEditing);\r
1159     CHECK_BOX(OPT_QuietPlay, appData.quietPlay);\r
1160     CHECK_BOX(OPT_Premove, appData.premove);\r
1161     CHECK_BOX(OPT_PremoveWhite, appData.premoveWhite);\r
1162     CHECK_BOX(OPT_PremoveBlack, appData.premoveBlack);\r
1163     CHECK_BOX(OPT_IcsAlarm, appData.icsAlarm);\r
1164     CHECK_BOX(OPT_DontColorize, !appData.colorize);\r
1165 \r
1166 #undef CHECK_BOX\r
1167 \r
1168     sprintf(buf, "%d", appData.icsAlarmTime / 1000);\r
1169     SetDlgItemText(hDlg, OPT_IcsAlarmTime, buf);\r
1170     SetDlgItemText(hDlg, OPT_PremoveWhiteText, appData.premoveWhiteText);\r
1171     SetDlgItemText(hDlg, OPT_PremoveBlackText, appData.premoveBlackText);\r
1172 \r
1173     SendDlgItemMessage(hDlg, OPT_SampleShout,     EM_SETBKGNDCOLOR, 0, cbc);\r
1174     SendDlgItemMessage(hDlg, OPT_SampleSShout,    EM_SETBKGNDCOLOR, 0, cbc);\r
1175     SendDlgItemMessage(hDlg, OPT_SampleChannel1,  EM_SETBKGNDCOLOR, 0, cbc);\r
1176     SendDlgItemMessage(hDlg, OPT_SampleChannel,   EM_SETBKGNDCOLOR, 0, cbc);\r
1177     SendDlgItemMessage(hDlg, OPT_SampleKibitz,    EM_SETBKGNDCOLOR, 0, cbc);\r
1178     SendDlgItemMessage(hDlg, OPT_SampleTell,      EM_SETBKGNDCOLOR, 0, cbc);\r
1179     SendDlgItemMessage(hDlg, OPT_SampleChallenge, EM_SETBKGNDCOLOR, 0, cbc);\r
1180     SendDlgItemMessage(hDlg, OPT_SampleRequest,   EM_SETBKGNDCOLOR, 0, cbc);\r
1181     SendDlgItemMessage(hDlg, OPT_SampleSeek,      EM_SETBKGNDCOLOR, 0, cbc);\r
1182     SendDlgItemMessage(hDlg, OPT_SampleNormal,    EM_SETBKGNDCOLOR, 0, cbc);\r
1183 \r
1184     SetDlgItemText(hDlg, OPT_SampleShout,     mca[ColorShout].name);\r
1185     SetDlgItemText(hDlg, OPT_SampleSShout,    mca[ColorSShout].name);\r
1186     SetDlgItemText(hDlg, OPT_SampleChannel1,  mca[ColorChannel1].name);\r
1187     SetDlgItemText(hDlg, OPT_SampleChannel,   mca[ColorChannel].name);\r
1188     SetDlgItemText(hDlg, OPT_SampleKibitz,    mca[ColorKibitz].name);\r
1189     SetDlgItemText(hDlg, OPT_SampleTell,      mca[ColorTell].name);\r
1190     SetDlgItemText(hDlg, OPT_SampleChallenge, mca[ColorChallenge].name);\r
1191     SetDlgItemText(hDlg, OPT_SampleRequest,   mca[ColorRequest].name);\r
1192     SetDlgItemText(hDlg, OPT_SampleSeek,      mca[ColorSeek].name);\r
1193     SetDlgItemText(hDlg, OPT_SampleNormal,    mca[ColorNormal].name);\r
1194 \r
1195     UpdateSampleText(hDlg, OPT_SampleShout,     &mca[ColorShout]);\r
1196     UpdateSampleText(hDlg, OPT_SampleSShout,    &mca[ColorSShout]);\r
1197     UpdateSampleText(hDlg, OPT_SampleChannel1,  &mca[ColorChannel1]);\r
1198     UpdateSampleText(hDlg, OPT_SampleChannel,   &mca[ColorChannel]);\r
1199     UpdateSampleText(hDlg, OPT_SampleKibitz,    &mca[ColorKibitz]);\r
1200     UpdateSampleText(hDlg, OPT_SampleTell,      &mca[ColorTell]);\r
1201     UpdateSampleText(hDlg, OPT_SampleChallenge, &mca[ColorChallenge]);\r
1202     UpdateSampleText(hDlg, OPT_SampleRequest,   &mca[ColorRequest]);\r
1203     UpdateSampleText(hDlg, OPT_SampleSeek,      &mca[ColorSeek]);\r
1204     UpdateSampleText(hDlg, OPT_SampleNormal,    &mca[ColorNormal]);\r
1205 \r
1206     SetIcsOptionEnables(hDlg);\r
1207     return TRUE;\r
1208 \r
1209   case WM_COMMAND: /* message: received a command */\r
1210     switch (LOWORD(wParam)) {\r
1211 \r
1212     case WM_USER_GetConsoleBackground: \r
1213       /* the ColorizeTextDialog needs the current background color */\r
1214       colorref = (COLORREF *)lParam;\r
1215       *colorref = cbc;\r
1216       return FALSE;\r
1217 \r
1218     case IDOK:\r
1219       /* Read changed options from the dialog box */\r
1220       GetDlgItemText(hDlg, OPT_IcsAlarmTime, buf, MSG_SIZ);\r
1221       if (sscanf(buf, "%d", &number) != 1 || (number < 0)){\r
1222           MessageBox(hDlg, "Invalid ICS Alarm Time",\r
1223                      "Option Error", MB_OK|MB_ICONEXCLAMATION);\r
1224           return FALSE;\r
1225       }\r
1226 \r
1227 #define IS_CHECKED(x) (Boolean)IsDlgButtonChecked(hDlg, (x))\r
1228 \r
1229       appData.icsAlarm         = IS_CHECKED(OPT_IcsAlarm);\r
1230       appData.premove          = IS_CHECKED(OPT_Premove);\r
1231       appData.premoveWhite     = IS_CHECKED(OPT_PremoveWhite);\r
1232       appData.premoveBlack     = IS_CHECKED(OPT_PremoveBlack);\r
1233       appData.autoComment      = IS_CHECKED(OPT_AutoComment);\r
1234       appData.autoObserve      = IS_CHECKED(OPT_AutoObserve);\r
1235       appData.getMoveList      = IS_CHECKED(OPT_GetMoveList);\r
1236       appData.localLineEditing = IS_CHECKED(OPT_LocalLineEditing);\r
1237       appData.quietPlay        = IS_CHECKED(OPT_QuietPlay);\r
1238 \r
1239 #undef IS_CHECKED\r
1240 \r
1241       appData.icsAlarmTime = number * 1000;\r
1242       GetDlgItemText(hDlg, OPT_PremoveWhiteText, appData.premoveWhiteText, 5);\r
1243       GetDlgItemText(hDlg, OPT_PremoveBlackText, appData.premoveBlackText, 5);\r
1244 \r
1245       if (appData.localLineEditing) {\r
1246         DontEcho();\r
1247         EchoOn();\r
1248       } else {\r
1249         DoEcho();\r
1250         EchoOff();\r
1251       }\r
1252 \r
1253       appData.colorize =\r
1254         (Boolean)!IsDlgButtonChecked(hDlg, OPT_DontColorize);\r
1255 \r
1256       if (!appData.colorize) {\r
1257         CHARFORMAT cf;\r
1258         COLORREF background = ParseColorName(COLOR_BKGD);\r
1259         /*\r
1260         SetDefaultTextAttribs();\r
1261         Colorize(currentColorClass);\r
1262         */\r
1263         cf.cbSize = sizeof(CHARFORMAT);\r
1264         cf.dwMask = CFM_COLOR;\r
1265         cf.crTextColor = ParseColorName(COLOR_NORMAL);\r
1266 \r
1267         SendDlgItemMessage(hwndConsole, OPT_ConsoleInput, \r
1268           EM_SETCHARFORMAT, SCF_ALL, (LPARAM)&cf);\r
1269         SendDlgItemMessage(hwndConsole, OPT_ConsoleText, \r
1270           EM_SETBKGNDCOLOR, FALSE, background);\r
1271         SendDlgItemMessage(hwndConsole, OPT_ConsoleInput, \r
1272           EM_SETBKGNDCOLOR, FALSE, background);\r
1273       }\r
1274 \r
1275       if (cbc != consoleBackgroundColor) {\r
1276         consoleBackgroundColor = cbc;\r
1277         if (appData.colorize) {\r
1278           SendDlgItemMessage(hwndConsole, OPT_ConsoleText, \r
1279             EM_SETBKGNDCOLOR, FALSE, consoleBackgroundColor);\r
1280           SendDlgItemMessage(hwndConsole, OPT_ConsoleInput, \r
1281             EM_SETBKGNDCOLOR, FALSE, consoleBackgroundColor);\r
1282         }\r
1283       }\r
1284 \r
1285       for (i=0; i < NColorClasses - 1; i++) {\r
1286         textAttribs[i].color   = mca[i].color;\r
1287         textAttribs[i].effects = mca[i].effects;\r
1288       }\r
1289 \r
1290       EndDialog(hDlg, TRUE);\r
1291       return TRUE;\r
1292 \r
1293     case IDCANCEL:\r
1294       EndDialog(hDlg, FALSE);\r
1295       return TRUE;\r
1296 \r
1297     case OPT_ChooseShoutColor:\r
1298       ColorizeTextPopup(hDlg, ColorShout);\r
1299       UpdateSampleText(hDlg, OPT_SampleShout, &mca[ColorShout]);\r
1300       break;\r
1301 \r
1302     case OPT_ChooseSShoutColor:\r
1303       ColorizeTextPopup(hDlg, ColorSShout);\r
1304       UpdateSampleText(hDlg, OPT_SampleSShout, &mca[ColorSShout]);\r
1305       break;\r
1306 \r
1307     case OPT_ChooseChannel1Color:\r
1308       ColorizeTextPopup(hDlg, ColorChannel1);\r
1309       UpdateSampleText(hDlg, OPT_SampleChannel1, \r
1310                        &colorizeAttribs[ColorChannel1]);\r
1311       break;\r
1312 \r
1313     case OPT_ChooseChannelColor:\r
1314       ColorizeTextPopup(hDlg, ColorChannel);\r
1315       UpdateSampleText(hDlg, OPT_SampleChannel, &mca[ColorChannel]);\r
1316       break;\r
1317 \r
1318     case OPT_ChooseKibitzColor:\r
1319       ColorizeTextPopup(hDlg, ColorKibitz);\r
1320       UpdateSampleText(hDlg, OPT_SampleKibitz, &mca[ColorKibitz]);\r
1321       break;\r
1322 \r
1323     case OPT_ChooseTellColor:\r
1324       ColorizeTextPopup(hDlg, ColorTell);\r
1325       UpdateSampleText(hDlg, OPT_SampleTell, &mca[ColorTell]);\r
1326       break;\r
1327 \r
1328     case OPT_ChooseChallengeColor:\r
1329       ColorizeTextPopup(hDlg, ColorChallenge);\r
1330       UpdateSampleText(hDlg, OPT_SampleChallenge, &mca[ColorChallenge]);\r
1331       break;\r
1332 \r
1333     case OPT_ChooseRequestColor:\r
1334       ColorizeTextPopup(hDlg, ColorRequest);\r
1335       UpdateSampleText(hDlg, OPT_SampleRequest, &mca[ColorRequest]);\r
1336       break;\r
1337 \r
1338     case OPT_ChooseSeekColor:\r
1339       ColorizeTextPopup(hDlg, ColorSeek);\r
1340       UpdateSampleText(hDlg, OPT_SampleSeek, &mca[ColorSeek]);\r
1341       break;\r
1342 \r
1343     case OPT_ChooseNormalColor:\r
1344       ColorizeTextPopup(hDlg, ColorNormal);\r
1345       UpdateSampleText(hDlg, OPT_SampleNormal, &mca[ColorNormal]);\r
1346       break;\r
1347 \r
1348     case OPT_ChooseBackgroundColor:\r
1349       if (ChangeColor(hDlg, &cbc)) {\r
1350         SendDlgItemMessage(hDlg, OPT_SampleShout,     EM_SETBKGNDCOLOR, 0, cbc);\r
1351         SendDlgItemMessage(hDlg, OPT_SampleSShout,    EM_SETBKGNDCOLOR, 0, cbc);\r
1352         SendDlgItemMessage(hDlg, OPT_SampleChannel1,  EM_SETBKGNDCOLOR, 0, cbc);\r
1353         SendDlgItemMessage(hDlg, OPT_SampleChannel,   EM_SETBKGNDCOLOR, 0, cbc);\r
1354         SendDlgItemMessage(hDlg, OPT_SampleKibitz,    EM_SETBKGNDCOLOR, 0, cbc);\r
1355         SendDlgItemMessage(hDlg, OPT_SampleTell,      EM_SETBKGNDCOLOR, 0, cbc);\r
1356         SendDlgItemMessage(hDlg, OPT_SampleChallenge, EM_SETBKGNDCOLOR, 0, cbc);\r
1357         SendDlgItemMessage(hDlg, OPT_SampleRequest,   EM_SETBKGNDCOLOR, 0, cbc);\r
1358         SendDlgItemMessage(hDlg, OPT_SampleSeek,      EM_SETBKGNDCOLOR, 0, cbc);\r
1359         SendDlgItemMessage(hDlg, OPT_SampleNormal,    EM_SETBKGNDCOLOR, 0, cbc);\r
1360       }\r
1361       break;\r
1362 \r
1363     case OPT_DefaultColors:\r
1364       for (i=0; i < NColorClasses - 1; i++)\r
1365         ParseAttribs(&mca[i].color, \r
1366                      &mca[i].effects,\r
1367                      defaultTextAttribs[i]);\r
1368 \r
1369       cbc = ParseColorName(COLOR_BKGD);\r
1370       SendDlgItemMessage(hDlg, OPT_SampleShout,     EM_SETBKGNDCOLOR, 0, cbc);\r
1371       SendDlgItemMessage(hDlg, OPT_SampleSShout,    EM_SETBKGNDCOLOR, 0, cbc);\r
1372       SendDlgItemMessage(hDlg, OPT_SampleChannel1,  EM_SETBKGNDCOLOR, 0, cbc);\r
1373       SendDlgItemMessage(hDlg, OPT_SampleChannel,   EM_SETBKGNDCOLOR, 0, cbc);\r
1374       SendDlgItemMessage(hDlg, OPT_SampleKibitz,    EM_SETBKGNDCOLOR, 0, cbc);\r
1375       SendDlgItemMessage(hDlg, OPT_SampleTell,      EM_SETBKGNDCOLOR, 0, cbc);\r
1376       SendDlgItemMessage(hDlg, OPT_SampleChallenge, EM_SETBKGNDCOLOR, 0, cbc);\r
1377       SendDlgItemMessage(hDlg, OPT_SampleRequest,   EM_SETBKGNDCOLOR, 0, cbc);\r
1378       SendDlgItemMessage(hDlg, OPT_SampleSeek,      EM_SETBKGNDCOLOR, 0, cbc);\r
1379       SendDlgItemMessage(hDlg, OPT_SampleNormal,    EM_SETBKGNDCOLOR, 0, cbc);\r
1380 \r
1381       UpdateSampleText(hDlg, OPT_SampleShout,     &mca[ColorShout]);\r
1382       UpdateSampleText(hDlg, OPT_SampleSShout,    &mca[ColorSShout]);\r
1383       UpdateSampleText(hDlg, OPT_SampleChannel1,  &mca[ColorChannel1]);\r
1384       UpdateSampleText(hDlg, OPT_SampleChannel,   &mca[ColorChannel]);\r
1385       UpdateSampleText(hDlg, OPT_SampleKibitz,    &mca[ColorKibitz]);\r
1386       UpdateSampleText(hDlg, OPT_SampleTell,      &mca[ColorTell]);\r
1387       UpdateSampleText(hDlg, OPT_SampleChallenge, &mca[ColorChallenge]);\r
1388       UpdateSampleText(hDlg, OPT_SampleRequest,   &mca[ColorRequest]);\r
1389       UpdateSampleText(hDlg, OPT_SampleSeek,      &mca[ColorSeek]);\r
1390       UpdateSampleText(hDlg, OPT_SampleNormal,    &mca[ColorNormal]);\r
1391       break;\r
1392 \r
1393     default:\r
1394       SetIcsOptionEnables(hDlg);\r
1395       break;\r
1396     }\r
1397     break;\r
1398   }\r
1399   return FALSE;\r
1400 }\r
1401 \r
1402 VOID\r
1403 IcsOptionsPopup(HWND hwnd)\r
1404 {\r
1405   FARPROC lpProc = MakeProcInstance((FARPROC)IcsOptionsDialog, hInst);\r
1406   DialogBox(hInst, MAKEINTRESOURCE(DLG_IcsOptions), hwnd,\r
1407             (DLGPROC) lpProc);\r
1408   FreeProcInstance(lpProc);\r
1409 }\r
1410 \r
1411 /*---------------------------------------------------------------------------*\\r
1412  *\r
1413  * Fonts Dialog functions\r
1414  *\r
1415 \*---------------------------------------------------------------------------*/\r
1416 \r
1417 VOID\r
1418 SetSampleFontText(HWND hwnd, int id, const MyFont *mf)\r
1419 {\r
1420   char buf[MSG_SIZ];\r
1421   HWND hControl;\r
1422   HDC hdc;\r
1423   CHARFORMAT cf;\r
1424   SIZE size;\r
1425   RECT rectClient, rectFormat;\r
1426   HFONT oldFont;\r
1427   POINT center;\r
1428   int len;\r
1429 \r
1430   len = sprintf(buf, "%.0f pt. %s%s%s\n",\r
1431                 mf->mfp.pointSize, mf->mfp.faceName,\r
1432                 mf->mfp.bold ? " bold" : "",\r
1433                 mf->mfp.italic ? " italic" : "");\r
1434   SetDlgItemText(hwnd, id, buf);\r
1435 \r
1436   hControl = GetDlgItem(hwnd, id);\r
1437   hdc = GetDC(hControl);\r
1438   SetMapMode(hdc, MM_TEXT);     /* 1 pixel == 1 logical unit */\r
1439   oldFont = SelectObject(hdc, mf->hf);\r
1440   \r
1441   /* get number of logical units necessary to display font name */\r
1442   GetTextExtentPoint32(hdc, buf, len, &size);\r
1443 \r
1444   /* calculate formatting rectangle in the rich edit control.  \r
1445    * May be larger or smaller than the actual control.\r
1446    */\r
1447   GetClientRect(hControl, &rectClient);\r
1448   center.x = (rectClient.left + rectClient.right) / 2;\r
1449   center.y = (rectClient.top  + rectClient.bottom) / 2;\r
1450   rectFormat.top    = center.y - (size.cy / 2) - 1;\r
1451   rectFormat.bottom = center.y + (size.cy / 2) + 1;\r
1452   rectFormat.left   = center.x - (size.cx / 2) - 1;\r
1453   rectFormat.right  = center.x + (size.cx / 2) + 1;\r
1454 \r
1455 #if 0\r
1456   fprintf(debugFP, "\nfont: %s\n"\r
1457                    "center.x   %d, centerY %d\n"\r
1458                    "size.cx    %d, size.cy %d\n"\r
1459                    "client.top %d, bottom %d, left %d, right %d\n"\r
1460                    "format.top %d, bottom %d, left %d, right %d\n",\r
1461                    buf,\r
1462                    center.x, center.y,\r
1463                    size.cx, size.cy,\r
1464                    rectClient.top, rectClient.bottom, rectClient.left,\r
1465                    rectClient.right,\r
1466                    rectFormat.top, rectFormat.bottom, rectFormat.left,\r
1467                    rectFormat.right);\r
1468 #endif\r
1469 \r
1470   cf.cbSize = sizeof(CHARFORMAT);\r
1471   cf.dwMask = CFM_FACE|CFM_SIZE|CFM_CHARSET|CFM_BOLD|CFM_ITALIC;\r
1472   cf.dwEffects = 0;\r
1473   if (mf->lf.lfWeight == FW_BOLD) cf.dwEffects |= CFE_BOLD;\r
1474   if (mf->lf.lfItalic) cf.dwEffects |= CFE_ITALIC;\r
1475   strcpy(cf.szFaceName, mf->mfp.faceName);\r
1476   /*\r
1477    * yHeight is expressed in twips.  A twip is 1/20 of a font's point\r
1478    * size. See documentation of CHARFORMAT.  --msw\r
1479    */\r
1480   cf.yHeight = (int)(mf->mfp.pointSize * 20.0 + 0.5);\r
1481   cf.bCharSet = mf->lf.lfCharSet;\r
1482   cf.bPitchAndFamily = mf->lf.lfPitchAndFamily;\r
1483 \r
1484   /* format the text in the rich edit control */\r
1485   SendMessage(hControl, EM_SETCHARFORMAT, SCF_ALL, (LPARAM) &cf);\r
1486   SendMessage(hControl, EM_SETRECT, (WPARAM)0, (LPARAM) &rectFormat);\r
1487 \r
1488   /* clean up */\r
1489   SelectObject(hdc, oldFont);\r
1490   ReleaseDC(hControl, hdc);\r
1491 }\r
1492 \r
1493 VOID\r
1494 CopyFont(MyFont *dest, const MyFont *src)\r
1495 {\r
1496   dest->mfp.pointSize = src->mfp.pointSize;\r
1497   dest->mfp.bold      = src->mfp.bold;\r
1498   dest->mfp.italic    = src->mfp.italic;\r
1499   dest->mfp.underline = src->mfp.underline;\r
1500   dest->mfp.strikeout = src->mfp.strikeout;\r
1501   lstrcpy(dest->mfp.faceName, src->mfp.faceName);\r
1502   CreateFontInMF(dest);\r
1503 }\r
1504 \r
1505 \r
1506 LRESULT CALLBACK\r
1507 FontOptionsDialog(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)\r
1508 {\r
1509   static MyFont workFont[NUM_FONTS];\r
1510   static BOOL firstPaint;\r
1511   int i;\r
1512   RECT rect;\r
1513 \r
1514   switch (message) {\r
1515   case WM_INITDIALOG:\r
1516 \r
1517     /* copy the current font settings into a working copy */\r
1518     for (i=0; i < NUM_FONTS; i++)\r
1519       CopyFont(&workFont[i], font[boardSize][i]);\r
1520 \r
1521     if (!appData.icsActive)\r
1522       EnableWindow(GetDlgItem(hDlg, OPT_ChooseConsoleFont), FALSE);\r
1523 \r
1524     firstPaint = TRUE;  /* see rant below */\r
1525 \r
1526     /* If I don't call SetFocus(), the dialog won't respond to the keyboard\r
1527      * when first drawn. Why is this the only dialog that behaves this way? Is\r
1528      * is the WM_PAINT stuff below?? Sigh...\r
1529      */\r
1530     SetFocus(GetDlgItem(hDlg, IDOK));\r
1531     break;\r
1532 \r
1533   case WM_PAINT:\r
1534     /* This should not be necessary. However, if SetSampleFontText() is called\r
1535      * in response to WM_INITDIALOG, the strings are not properly centered in\r
1536      * the controls when the dialog first appears. I can't figure out why, so\r
1537      * this is the workaround.  --msw\r
1538      */\r
1539     if (firstPaint) {\r
1540       SetSampleFontText(hDlg, OPT_SampleClockFont, &workFont[CLOCK_FONT]);\r
1541       SetSampleFontText(hDlg, OPT_SampleMessageFont, &workFont[MESSAGE_FONT]);\r
1542       SetSampleFontText(hDlg, OPT_SampleCoordFont, &workFont[COORD_FONT]);\r
1543       SetSampleFontText(hDlg, OPT_SampleTagFont, &workFont[EDITTAGS_FONT]);\r
1544       SetSampleFontText(hDlg, OPT_SampleCommentsFont, &workFont[COMMENT_FONT]);\r
1545       SetSampleFontText(hDlg, OPT_SampleConsoleFont, &workFont[CONSOLE_FONT]);\r
1546       SetSampleFontText(hDlg, OPT_SampleMoveHistoryFont, &workFont[MOVEHISTORY_FONT]);\r
1547       firstPaint = FALSE;\r
1548     }\r
1549     break;\r
1550 \r
1551   case WM_COMMAND: /* message: received a command */\r
1552     switch (LOWORD(wParam)) {\r
1553 \r
1554     case IDOK:\r
1555       /* again, it seems to avoid redraw problems if we call EndDialog first */\r
1556       EndDialog(hDlg, FALSE);\r
1557 \r
1558       /* copy modified settings back to the fonts array */\r
1559       for (i=0; i < NUM_FONTS; i++)\r
1560         CopyFont(font[boardSize][i], &workFont[i]);\r
1561 \r
1562       /* a sad necessity due to the original design of having a separate\r
1563        * console font, tags font, and comment font for each board size.  IMHO\r
1564        * these fonts should not be dependent on the current board size.  I'm\r
1565        * running out of time, so I am doing this hack rather than redesign the\r
1566        * data structure. Besides, I think if I redesigned the data structure, I\r
1567        * might break backwards compatibility with old winboard.ini files.\r
1568        * --msw\r
1569        */\r
1570       for (i=0; i < NUM_SIZES; i++) {\r
1571         CopyFont(font[i][EDITTAGS_FONT], &workFont[EDITTAGS_FONT]);\r
1572         CopyFont(font[i][CONSOLE_FONT],  &workFont[CONSOLE_FONT]);\r
1573         CopyFont(font[i][COMMENT_FONT],  &workFont[COMMENT_FONT]);\r
1574         CopyFont(font[i][MOVEHISTORY_FONT],  &workFont[MOVEHISTORY_FONT]);\r
1575       }\r
1576       /* end sad necessity */\r
1577 \r
1578       InitDrawingSizes(boardSize, 0);\r
1579       InvalidateRect(hwndMain, NULL, TRUE);\r
1580 \r
1581       if (commentDialog) {\r
1582         SendDlgItemMessage(commentDialog, OPT_CommentText,\r
1583           WM_SETFONT, (WPARAM)font[boardSize][COMMENT_FONT]->hf, \r
1584           MAKELPARAM(TRUE, 0));\r
1585         GetClientRect(GetDlgItem(commentDialog, OPT_CommentText), &rect);\r
1586         InvalidateRect(commentDialog, &rect, TRUE);\r
1587       }\r
1588 \r
1589       if (editTagsDialog) {\r
1590         SendDlgItemMessage(editTagsDialog, OPT_TagsText,\r
1591           WM_SETFONT, (WPARAM)font[boardSize][EDITTAGS_FONT]->hf, \r
1592           MAKELPARAM(TRUE, 0));\r
1593         GetClientRect(GetDlgItem(editTagsDialog, OPT_TagsText), &rect);\r
1594         InvalidateRect(editTagsDialog, &rect, TRUE);\r
1595       }\r
1596 \r
1597       if( moveHistoryDialog != NULL ) {\r
1598         SendDlgItemMessage(moveHistoryDialog, IDC_MoveHistory,\r
1599           WM_SETFONT, (WPARAM)font[boardSize][MOVEHISTORY_FONT]->hf, \r
1600           MAKELPARAM(TRUE, 0));\r
1601         InvalidateRect(editTagsDialog, NULL, TRUE);\r
1602       }\r
1603 \r
1604       if (hwndConsole) {\r
1605         ChangedConsoleFont();\r
1606       }\r
1607 \r
1608       for (i=0; i<NUM_FONTS; i++)\r
1609         DeleteObject(&workFont[i].hf);\r
1610 \r
1611       return TRUE;\r
1612 \r
1613     case IDCANCEL:\r
1614       for (i=0; i<NUM_FONTS; i++)\r
1615         DeleteObject(&workFont[i].hf);\r
1616       EndDialog(hDlg, FALSE);\r
1617       return TRUE;\r
1618 \r
1619     case OPT_ChooseClockFont:\r
1620       MyCreateFont(hDlg, &workFont[CLOCK_FONT]);\r
1621       SetSampleFontText(hDlg, OPT_SampleClockFont, &workFont[CLOCK_FONT]);\r
1622       break;\r
1623 \r
1624     case OPT_ChooseMessageFont:\r
1625       MyCreateFont(hDlg, &workFont[MESSAGE_FONT]);\r
1626       SetSampleFontText(hDlg, OPT_SampleMessageFont, &workFont[MESSAGE_FONT]);\r
1627       break;\r
1628 \r
1629     case OPT_ChooseCoordFont:\r
1630       MyCreateFont(hDlg, &workFont[COORD_FONT]);\r
1631       SetSampleFontText(hDlg, OPT_SampleCoordFont, &workFont[COORD_FONT]);\r
1632       break;\r
1633 \r
1634     case OPT_ChooseTagFont:\r
1635       MyCreateFont(hDlg, &workFont[EDITTAGS_FONT]);\r
1636       SetSampleFontText(hDlg, OPT_SampleTagFont, &workFont[EDITTAGS_FONT]);\r
1637       break;\r
1638 \r
1639     case OPT_ChooseCommentsFont:\r
1640       MyCreateFont(hDlg, &workFont[COMMENT_FONT]);\r
1641       SetSampleFontText(hDlg, OPT_SampleCommentsFont, &workFont[COMMENT_FONT]);\r
1642       break;\r
1643 \r
1644     case OPT_ChooseConsoleFont:\r
1645       MyCreateFont(hDlg, &workFont[CONSOLE_FONT]);\r
1646       SetSampleFontText(hDlg, OPT_SampleConsoleFont, &workFont[CONSOLE_FONT]);\r
1647       break;\r
1648 \r
1649     case OPT_ChooseMoveHistoryFont:\r
1650       MyCreateFont(hDlg, &workFont[MOVEHISTORY_FONT]);\r
1651       SetSampleFontText(hDlg, OPT_SampleMoveHistoryFont, &workFont[MOVEHISTORY_FONT]);\r
1652       break;\r
1653 \r
1654     case OPT_DefaultFonts:\r
1655       for (i=0; i<NUM_FONTS; i++) {\r
1656         DeleteObject(&workFont[i].hf);\r
1657         ParseFontName(font[boardSize][i]->def, &workFont[i].mfp);\r
1658         CreateFontInMF(&workFont[i]);\r
1659       }\r
1660       SetSampleFontText(hDlg, OPT_SampleClockFont, &workFont[CLOCK_FONT]);\r
1661       SetSampleFontText(hDlg, OPT_SampleMessageFont, &workFont[MESSAGE_FONT]);\r
1662       SetSampleFontText(hDlg, OPT_SampleCoordFont, &workFont[COORD_FONT]);\r
1663       SetSampleFontText(hDlg, OPT_SampleTagFont, &workFont[EDITTAGS_FONT]);\r
1664       SetSampleFontText(hDlg, OPT_SampleCommentsFont, &workFont[COMMENT_FONT]);\r
1665       SetSampleFontText(hDlg, OPT_SampleConsoleFont, &workFont[CONSOLE_FONT]);\r
1666       SetSampleFontText(hDlg, OPT_SampleMoveHistoryFont, &workFont[MOVEHISTORY_FONT]);\r
1667       break;\r
1668     }\r
1669   }\r
1670   return FALSE;\r
1671 }\r
1672 \r
1673 VOID\r
1674 FontsOptionsPopup(HWND hwnd)\r
1675 {\r
1676   FARPROC lpProc = MakeProcInstance((FARPROC)FontOptionsDialog, hInst);\r
1677   DialogBox(hInst, MAKEINTRESOURCE(DLG_Fonts), hwnd,\r
1678           (DLGPROC) lpProc);\r
1679   FreeProcInstance(lpProc);\r
1680 }\r
1681 \r
1682 /*---------------------------------------------------------------------------*\\r
1683  *\r
1684  * Sounds Dialog functions\r
1685  *\r
1686 \*---------------------------------------------------------------------------*/\r
1687 \r
1688 \r
1689 SoundComboData soundComboData[] = {\r
1690   {"Move", NULL},\r
1691   {"Bell", NULL},\r
1692   {"ICS Alarm", NULL},\r
1693   {"ICS Win", NULL},\r
1694   {"ICS Loss", NULL},\r
1695   {"ICS Draw", NULL},\r
1696   {"ICS Unfinished", NULL},\r
1697   {"Shout", NULL},\r
1698   {"SShout/CShout", NULL},\r
1699   {"Channel 1", NULL},\r
1700   {"Channel", NULL},\r
1701   {"Kibitz", NULL},\r
1702   {"Tell", NULL},\r
1703   {"Challenge", NULL},\r
1704   {"Request", NULL},\r
1705   {"Seek", NULL},\r
1706   {NULL, NULL},\r
1707 };\r
1708 \r
1709 \r
1710 void\r
1711 InitSoundComboData(SoundComboData *scd)\r
1712 {\r
1713   SoundClass sc;\r
1714   ColorClass cc;\r
1715   int index;\r
1716 \r
1717   /* copy current sound settings to combo array */\r
1718 \r
1719   for ( sc = (SoundClass)0; sc < NSoundClasses; sc++) {\r
1720     scd[sc].name = strdup(sounds[sc].name);\r
1721   }\r
1722   for ( cc = (ColorClass)0; cc < NColorClasses - 2; cc++) {\r
1723     index = (int)cc + (int)NSoundClasses;\r
1724     scd[index].name = strdup(textAttribs[cc].sound.name);\r
1725   }\r
1726 }\r
1727 \r
1728 \r
1729 void\r
1730 ResetSoundComboData(SoundComboData *scd)\r
1731 {\r
1732   while (scd->label) {\r
1733     if (scd->name != NULL) {\r
1734       free (scd->name);\r
1735       scd->name = NULL;\r
1736     }\r
1737     scd++;\r
1738   }\r
1739 }\r
1740 \r
1741 void\r
1742 InitSoundCombo(HWND hwndCombo, SoundComboData *scd)\r
1743 {\r
1744   char buf[255];\r
1745   DWORD err;\r
1746   DWORD cnt = 0;\r
1747   SendMessage(hwndCombo, CB_RESETCONTENT, 0, 0);\r
1748 \r
1749   /* send the labels to the combo box */\r
1750   while (scd->label) {\r
1751     err = SendMessage(hwndCombo, CB_ADDSTRING, 0, (LPARAM) scd->label);\r
1752     if (err != cnt++) {\r
1753       sprintf(buf, "InitSoundCombo(): err '%d', cnt '%d'\n",\r
1754           err, cnt);\r
1755       MessageBox(NULL, buf, NULL, MB_OK);\r
1756     }\r
1757     scd++;\r
1758   }\r
1759   SendMessage(hwndCombo, CB_SETCURSEL, (WPARAM) 0, (LPARAM) 0);\r
1760 }\r
1761 \r
1762 int\r
1763 SoundDialogWhichRadio(HWND hDlg)\r
1764 {\r
1765   if (IsDlgButtonChecked(hDlg, OPT_NoSound)) return OPT_NoSound;\r
1766   if (IsDlgButtonChecked(hDlg, OPT_DefaultBeep)) return OPT_DefaultBeep;\r
1767   if (IsDlgButtonChecked(hDlg, OPT_BuiltInSound)) return OPT_BuiltInSound;\r
1768   if (IsDlgButtonChecked(hDlg, OPT_WavFile)) return OPT_WavFile;\r
1769   return -1;\r
1770 }\r
1771 \r
1772 VOID\r
1773 SoundDialogSetEnables(HWND hDlg, int radio)\r
1774 {\r
1775   EnableWindow(GetDlgItem(hDlg, OPT_BuiltInSoundName),\r
1776                radio == OPT_BuiltInSound);\r
1777   EnableWindow(GetDlgItem(hDlg, OPT_WavFileName), radio == OPT_WavFile);\r
1778   EnableWindow(GetDlgItem(hDlg, OPT_BrowseSound), radio == OPT_WavFile);\r
1779 }\r
1780 \r
1781 char *\r
1782 SoundDialogGetName(HWND hDlg, int radio)\r
1783 {\r
1784   static char buf[MSG_SIZ], buf2[MSG_SIZ], buf3[MSG_SIZ];\r
1785   char *dummy, *ret;\r
1786   switch (radio) {\r
1787   case OPT_NoSound:\r
1788   default:\r
1789     return "";\r
1790   case OPT_DefaultBeep:\r
1791     return "$";\r
1792   case OPT_BuiltInSound:\r
1793     buf[0] = '!';\r
1794     GetDlgItemText(hDlg, OPT_BuiltInSoundName, buf + 1, sizeof(buf) - 1);\r
1795     return buf;\r
1796   case OPT_WavFile:\r
1797     GetDlgItemText(hDlg, OPT_WavFileName, buf, sizeof(buf));\r
1798     GetCurrentDirectory(MSG_SIZ, buf3);\r
1799     SetCurrentDirectory(installDir);\r
1800     if (GetFullPathName(buf, MSG_SIZ, buf2, &dummy)) {\r
1801       ret = buf2;\r
1802     } else {\r
1803       ret = buf;\r
1804     }\r
1805     SetCurrentDirectory(buf3);\r
1806     return ret;\r
1807   }\r
1808 }\r
1809 \r
1810 void\r
1811 DisplaySelectedSound(HWND hDlg, HWND hCombo, const char *name)\r
1812 {\r
1813   int radio;\r
1814   /* \r
1815    * I think it's best to clear the combo and edit boxes. It looks stupid\r
1816    * to have a value from another sound event sitting there grayed out.\r
1817    */\r
1818   SetDlgItemText(hDlg, OPT_WavFileName, "");\r
1819   SendMessage(hCombo, CB_SETCURSEL, (WPARAM) -1, (LPARAM) 0);\r
1820 \r
1821   if (appData.debugMode)\r
1822       fprintf(debugFP, "DisplaySelectedSound(,,'%s'):\n", name);\r
1823   switch (name[0]) {\r
1824   case NULLCHAR:\r
1825     radio = OPT_NoSound;\r
1826     break;\r
1827   case '$':\r
1828     if (name[1] == NULLCHAR) {\r
1829       radio = OPT_DefaultBeep;\r
1830     } else {\r
1831       radio = OPT_WavFile;\r
1832       SetDlgItemText(hDlg, OPT_WavFileName, name);\r
1833     }\r
1834     break;\r
1835   case '!':\r
1836     if (name[1] == NULLCHAR) {\r
1837       radio = OPT_NoSound;\r
1838     } else {\r
1839       radio = OPT_BuiltInSound;\r
1840       if (SendMessage(hCombo, CB_SELECTSTRING, (WPARAM) -1, \r
1841                       (LPARAM) (name + 1)) == CB_ERR) {\r
1842         SendMessage(hCombo, CB_SETCURSEL, (WPARAM) -1, (LPARAM) 0);\r
1843         SendMessage(hCombo, WM_SETTEXT, (WPARAM) 0, (LPARAM) (name + 1));\r
1844       }\r
1845     }\r
1846     break;\r
1847   default:\r
1848     radio = OPT_WavFile;\r
1849     SetDlgItemText(hDlg, OPT_WavFileName, name);\r
1850     break;\r
1851   }\r
1852   SoundDialogSetEnables(hDlg, radio);\r
1853   CheckRadioButton(hDlg, OPT_NoSound, OPT_WavFile, radio);\r
1854 }\r
1855     \r
1856 \r
1857 char *builtInSoundNames[] = BUILT_IN_SOUND_NAMES;\r
1858 \r
1859 LRESULT CALLBACK\r
1860 SoundOptionsDialog(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)\r
1861 {\r
1862   static HWND hSoundCombo;\r
1863   static DWORD index;\r
1864   static HWND hBISN;\r
1865   int radio;\r
1866   MySound tmp;\r
1867   FILE *f;\r
1868   char buf[MSG_SIZ];\r
1869   char *newName;\r
1870   SoundClass sc;\r
1871   ColorClass cc;\r
1872   SoundComboData *scd;\r
1873 \r
1874   switch (message) {\r
1875   case WM_INITDIALOG:\r
1876     /* Center the dialog over the application window */\r
1877     CenterWindow (hDlg, GetWindow (hDlg, GW_OWNER));\r
1878 \r
1879     /* Initialize the built-in sounds combo */\r
1880     hBISN = GetDlgItem(hDlg, OPT_BuiltInSoundName);\r
1881      InitComboStrings(hBISN, builtInSoundNames);\r
1882 \r
1883     /* Initialize the  sound events combo */\r
1884     index = 0;\r
1885     InitSoundComboData(soundComboData);\r
1886     hSoundCombo = GetDlgItem(hDlg, CBO_Sounds);\r
1887     InitSoundCombo(hSoundCombo, soundComboData);\r
1888 \r
1889     /* update the dialog */\r
1890     DisplaySelectedSound(hDlg, hBISN, soundComboData[index].name);\r
1891     return TRUE;\r
1892 \r
1893   case WM_COMMAND: /* message: received a command */\r
1894 \r
1895     if (((HWND)lParam == hSoundCombo) && \r
1896         (HIWORD(wParam) == CBN_SELCHANGE)) {\r
1897       /* \r
1898        * the user has selected a new sound event. We must store the name for\r
1899        * the previously selected event, then retrieve the name for the\r
1900        * newly selected event and update the dialog. \r
1901        */\r
1902       radio = SoundDialogWhichRadio(hDlg);\r
1903       newName = strdup(SoundDialogGetName(hDlg, radio));\r
1904       \r
1905       if (strcmp(newName, soundComboData[index].name) != 0) {\r
1906         free(soundComboData[index].name);\r
1907         soundComboData[index].name = newName;\r
1908       } else {\r
1909         free(newName);\r
1910         newName = NULL;\r
1911       }\r
1912       /* now get the settings for the newly selected event */\r
1913       index = SendMessage(hSoundCombo, CB_GETCURSEL, (WPARAM)0, (LPARAM)0);\r
1914       DisplaySelectedSound(hDlg, hBISN, soundComboData[index].name);\r
1915       \r
1916       return TRUE;\r
1917     }\r
1918     switch (LOWORD(wParam)) {\r
1919     case IDOK:\r
1920       /* \r
1921        * save the name for the currently selected sound event \r
1922        */\r
1923       radio = SoundDialogWhichRadio(hDlg);\r
1924       newName = strdup(SoundDialogGetName(hDlg, radio));\r
1925 \r
1926       if (strcmp(soundComboData[index].name, newName) != 0) {\r
1927         free(soundComboData[index].name);\r
1928         soundComboData[index].name = newName;\r
1929       } else {\r
1930         free(newName);\r
1931         newName = NULL;\r
1932       }\r
1933 \r
1934       /* save all the sound names that changed and load the sounds */\r
1935 \r
1936       for ( sc = (SoundClass)0; sc < NSoundClasses; sc++) {\r
1937         if (strcmp(soundComboData[sc].name, sounds[sc].name) != 0) {\r
1938           free(sounds[sc].name);\r
1939           sounds[sc].name = strdup(soundComboData[sc].name);\r
1940           MyLoadSound(&sounds[sc]);\r
1941         }\r
1942       }\r
1943       for ( cc = (ColorClass)0; cc < NColorClasses - 2; cc++) {\r
1944         index = (int)cc + (int)NSoundClasses;\r
1945         if (strcmp(soundComboData[index].name, \r
1946                    textAttribs[cc].sound.name) != 0) {\r
1947           free(textAttribs[cc].sound.name);\r
1948           textAttribs[cc].sound.name = strdup(soundComboData[index].name);\r
1949           MyLoadSound(&textAttribs[cc].sound);\r
1950         }\r
1951       }\r
1952 \r
1953       ResetSoundComboData(soundComboData);\r
1954       EndDialog(hDlg, TRUE);\r
1955       return TRUE;\r
1956 \r
1957     case IDCANCEL:\r
1958       ResetSoundComboData(soundComboData);\r
1959       EndDialog(hDlg, FALSE);\r
1960       return TRUE;\r
1961 \r
1962     case OPT_DefaultSounds:\r
1963       /* can't use SetDefaultSounds() because we need to be able to "undo" if\r
1964        * user selects "Cancel" later on. So we do it the hard way here.\r
1965        */\r
1966       scd = &soundComboData[0];\r
1967       while (scd->label != NULL) {\r
1968         if (scd->name != NULL) free(scd->name);\r
1969         scd->name = strdup("");\r
1970         scd++;\r
1971       }\r
1972       free(soundComboData[(int)SoundBell].name);\r
1973       soundComboData[(int)SoundBell].name = strdup(SOUND_BELL);\r
1974       DisplaySelectedSound(hDlg, hBISN, soundComboData[index].name);\r
1975       break;\r
1976 \r
1977     case OPT_PlaySound:\r
1978       radio = SoundDialogWhichRadio(hDlg);\r
1979       tmp.name = strdup(SoundDialogGetName(hDlg, radio));\r
1980       tmp.data = NULL;\r
1981       MyLoadSound(&tmp);\r
1982       MyPlaySound(&tmp);\r
1983       if (tmp.data  != NULL) free(tmp.data);\r
1984       if (tmp.name != NULL) free(tmp.name);\r
1985       return TRUE;\r
1986 \r
1987     case OPT_BrowseSound:\r
1988       f = OpenFileDialog(hDlg, "rb", NULL, "wav", SOUND_FILT,\r
1989         "Browse for Sound File", NULL, NULL, buf);\r
1990       if (f != NULL) {\r
1991         fclose(f);\r
1992         SetDlgItemText(hDlg, OPT_WavFileName, buf);\r
1993       }\r
1994       return TRUE;\r
1995 \r
1996     default:\r
1997       radio = SoundDialogWhichRadio(hDlg);\r
1998       SoundDialogSetEnables(hDlg, radio);\r
1999       break;\r
2000     }\r
2001     break;\r
2002   }\r
2003   return FALSE;\r
2004 }\r
2005 \r
2006 \r
2007 VOID SoundOptionsPopup(HWND hwnd)\r
2008 {\r
2009   FARPROC lpProc;\r
2010 \r
2011   lpProc = MakeProcInstance((FARPROC)SoundOptionsDialog, hInst);\r
2012   DialogBox(hInst, MAKEINTRESOURCE(DLG_Sound), hwnd, (DLGPROC)lpProc);\r
2013   FreeProcInstance(lpProc);\r
2014 }\r
2015 \r
2016 \r
2017 /*---------------------------------------------------------------------------*\\r
2018  *\r
2019  * Comm Port dialog functions\r
2020  *\r
2021 \*---------------------------------------------------------------------------*/\r
2022 \r
2023 \r
2024 #define FLOW_NONE   0\r
2025 #define FLOW_XOFF   1\r
2026 #define FLOW_CTS    2\r
2027 #define FLOW_DSR    3\r
2028 \r
2029 #define PORT_NONE\r
2030 \r
2031 ComboData cdPort[]     = { {"None", PORT_NONE}, {"COM1", 1}, {"COM2", 2},\r
2032                            {"COM3", 3}, {"COM4", 4}, {NULL, 0} };\r
2033 ComboData cdDataRate[] = { {"110", 110}, {"300", 300}, {"600", 600}, {"1200", 1200},\r
2034                            {"2400", 2400}, {"4800", 4800}, {"9600", 9600}, {"19200", 19200},\r
2035                            {"38400", 38400}, {NULL, 0} };\r
2036 ComboData cdDataBits[] = { {"5", 5}, {"6", 6}, {"7", 7}, {"8", 8}, {NULL, 0} };\r
2037 ComboData cdParity[]   = { {"None", NOPARITY}, {"Odd", ODDPARITY}, {"Even", EVENPARITY},\r
2038                            {"Mark", MARKPARITY}, {"Space", SPACEPARITY}, {NULL, 0} };\r
2039 ComboData cdStopBits[] = { {"1", ONESTOPBIT}, {"1.5", ONE5STOPBITS},\r
2040                            {"2", TWOSTOPBITS}, {NULL, 0} };\r
2041 ComboData cdFlow[]     = { {"None", FLOW_NONE}, {"Xoff/Xon", FLOW_XOFF}, {"CTS", FLOW_CTS},\r
2042                            {"DSR", FLOW_DSR}, {NULL, 0} };\r
2043 \r
2044 \r
2045 VOID\r
2046 ParseCommSettings(char *arg, DCB *dcb)\r
2047 {\r
2048   int dataRate, count;\r
2049   char bits[MSG_SIZ], parity[MSG_SIZ], stopBits[MSG_SIZ], flow[MSG_SIZ];\r
2050   ComboData *cd;\r
2051   count = sscanf(arg, "%d%*[, ]%[^, ]%*[, ]%[^, ]%*[, ]%[^, ]%*[, ]%[^, ]",\r
2052     &dataRate, bits, parity, stopBits, flow);\r
2053   if (count != 5) goto cant_parse;\r
2054   dcb->BaudRate = dataRate;\r
2055   cd = cdDataBits;\r
2056   while (cd->label != NULL) {\r
2057     if (StrCaseCmp(cd->label, bits) == 0) {\r
2058       dcb->ByteSize = cd->value;\r
2059       break;\r
2060     }\r
2061     cd++;\r
2062   }\r
2063   if (cd->label == NULL) goto cant_parse;\r
2064   cd = cdParity;\r
2065   while (cd->label != NULL) {\r
2066     if (StrCaseCmp(cd->label, parity) == 0) {\r
2067       dcb->Parity = cd->value;\r
2068       break;\r
2069     }\r
2070     cd++;\r
2071   }\r
2072   if (cd->label == NULL) goto cant_parse;\r
2073   cd = cdStopBits;\r
2074   while (cd->label != NULL) {\r
2075     if (StrCaseCmp(cd->label, stopBits) == 0) {\r
2076       dcb->StopBits = cd->value;\r
2077       break;\r
2078     }\r
2079     cd++;\r
2080   }\r
2081   cd = cdFlow;\r
2082   if (cd->label == NULL) goto cant_parse;\r
2083   while (cd->label != NULL) {\r
2084     if (StrCaseCmp(cd->label, flow) == 0) {\r
2085       switch (cd->value) {\r
2086       case FLOW_NONE:\r
2087         dcb->fOutX = FALSE;\r
2088         dcb->fOutxCtsFlow = FALSE;\r
2089         dcb->fOutxDsrFlow = FALSE;\r
2090         break;\r
2091       case FLOW_CTS:\r
2092         dcb->fOutX = FALSE;\r
2093         dcb->fOutxCtsFlow = TRUE;\r
2094         dcb->fOutxDsrFlow = FALSE;\r
2095         break;\r
2096       case FLOW_DSR:\r
2097         dcb->fOutX = FALSE;\r
2098         dcb->fOutxCtsFlow = FALSE;\r
2099         dcb->fOutxDsrFlow = TRUE;\r
2100         break;\r
2101       case FLOW_XOFF:\r
2102         dcb->fOutX = TRUE;\r
2103         dcb->fOutxCtsFlow = FALSE;\r
2104         dcb->fOutxDsrFlow = FALSE;\r
2105         break;\r
2106       }\r
2107       break;\r
2108     }\r
2109     cd++;\r
2110   }\r
2111   if (cd->label == NULL) goto cant_parse;\r
2112   return;\r
2113 cant_parse:\r
2114     ExitArgError("Can't parse com port settings", arg);\r
2115 }\r
2116 \r
2117 \r
2118 VOID PrintCommSettings(FILE *f, char *name, DCB *dcb)\r
2119 {\r
2120   char *flow = "??", *parity = "??", *stopBits = "??";\r
2121   ComboData *cd;\r
2122   \r
2123   cd = cdParity;\r
2124   while (cd->label != NULL) {\r
2125     if (dcb->Parity == cd->value) {\r
2126       parity = cd->label;\r
2127       break;\r
2128     }\r
2129     cd++;\r
2130   }\r
2131   cd = cdStopBits;\r
2132   while (cd->label != NULL) {\r
2133     if (dcb->StopBits == cd->value) {\r
2134       stopBits = cd->label;\r
2135       break;\r
2136     }\r
2137     cd++;\r
2138   }\r
2139   if (dcb->fOutX) {\r
2140     flow = cdFlow[FLOW_XOFF].label;\r
2141   } else if (dcb->fOutxCtsFlow) {\r
2142     flow = cdFlow[FLOW_CTS].label;\r
2143   } else if (dcb->fOutxDsrFlow) {\r
2144     flow = cdFlow[FLOW_DSR].label;\r
2145   } else {\r
2146     flow = cdFlow[FLOW_NONE].label;\r
2147   }\r
2148   fprintf(f, "/%s=%d,%d,%s,%s,%s\n", name,\r
2149     dcb->BaudRate, dcb->ByteSize, parity, stopBits, flow);\r
2150 }\r
2151 \r
2152 \r
2153 void\r
2154 InitCombo(HANDLE hwndCombo, ComboData *cd)\r
2155 {\r
2156   SendMessage(hwndCombo, CB_RESETCONTENT, 0, 0);\r
2157 \r
2158   while (cd->label != NULL) {\r
2159     SendMessage(hwndCombo, CB_ADDSTRING, 0, (LPARAM) cd->label);\r
2160     cd++;\r
2161   }\r
2162 }\r
2163 \r
2164 void\r
2165 SelectComboValue(HANDLE hwndCombo, ComboData *cd, unsigned value)\r
2166 {\r
2167   int i;\r
2168 \r
2169   i = 0;\r
2170   while (cd->label != NULL) {\r
2171     if (cd->value == value) {\r
2172       SendMessage(hwndCombo, CB_SETCURSEL, (WPARAM) i, (LPARAM) 0);\r
2173       return;\r
2174     }\r
2175     cd++;\r
2176     i++;\r
2177   }\r
2178 }\r
2179 \r
2180 LRESULT CALLBACK\r
2181 CommPortOptionsDialog(HWND hDlg, UINT message, WPARAM wParam,   LPARAM lParam)\r
2182 {\r
2183   char buf[MSG_SIZ];\r
2184   HANDLE hwndCombo;\r
2185   char *p;\r
2186   LRESULT index;\r
2187   unsigned value;\r
2188   int err;\r
2189 \r
2190   switch (message) {\r
2191   case WM_INITDIALOG: /* message: initialize dialog box */\r
2192     /* Center the dialog over the application window */\r
2193     CenterWindow (hDlg, GetWindow(hDlg, GW_OWNER));\r
2194     /* Initialize the dialog items */\r
2195     /* !! There should probably be some synchronization\r
2196        in accessing hCommPort and dcb.  Or does modal nature\r
2197        of this dialog box do it for us?\r
2198        */\r
2199     hwndCombo = GetDlgItem(hDlg, OPT_Port);\r
2200     InitCombo(hwndCombo, cdPort);\r
2201     p = strrchr(appData.icsCommPort, '\\');\r
2202     if (p++ == NULL) p = appData.icsCommPort;\r
2203     if ((*p == '\0') ||\r
2204         (SendMessage(hwndCombo, CB_SELECTSTRING, (WPARAM) -1, (LPARAM) p) == CB_ERR)) {\r
2205       SendMessage(hwndCombo, CB_SELECTSTRING, (WPARAM) -1, (LPARAM) "None");\r
2206     }\r
2207     EnableWindow(hwndCombo, hCommPort == NULL); /*!! don't allow change for now*/\r
2208 \r
2209     hwndCombo = GetDlgItem(hDlg, OPT_DataRate);\r
2210     InitCombo(hwndCombo, cdDataRate);\r
2211     sprintf(buf, "%u", dcb.BaudRate);\r
2212     if (SendMessage(hwndCombo, CB_SELECTSTRING, (WPARAM) -1, (LPARAM) buf) == CB_ERR) {\r
2213       SendMessage(hwndCombo, CB_SETCURSEL, (WPARAM) -1, (LPARAM) 0);\r
2214       SendMessage(hwndCombo, WM_SETTEXT, (WPARAM) 0, (LPARAM) buf);\r
2215     }\r
2216 \r
2217     hwndCombo = GetDlgItem(hDlg, OPT_Bits);\r
2218     InitCombo(hwndCombo, cdDataBits);\r
2219     SelectComboValue(hwndCombo, cdDataBits, dcb.ByteSize);\r
2220 \r
2221     hwndCombo = GetDlgItem(hDlg, OPT_Parity);\r
2222     InitCombo(hwndCombo, cdParity);\r
2223     SelectComboValue(hwndCombo, cdParity, dcb.Parity);\r
2224 \r
2225     hwndCombo = GetDlgItem(hDlg, OPT_StopBits);\r
2226     InitCombo(hwndCombo, cdStopBits);\r
2227     SelectComboValue(hwndCombo, cdStopBits, dcb.StopBits);\r
2228 \r
2229     hwndCombo = GetDlgItem(hDlg, OPT_Flow);\r
2230     InitCombo(hwndCombo, cdFlow);\r
2231     if (dcb.fOutX) {\r
2232       SelectComboValue(hwndCombo, cdFlow, FLOW_XOFF);\r
2233     } else if (dcb.fOutxCtsFlow) {\r
2234       SelectComboValue(hwndCombo, cdFlow, FLOW_CTS);\r
2235     } else if (dcb.fOutxDsrFlow) {\r
2236       SelectComboValue(hwndCombo, cdFlow, FLOW_DSR);\r
2237     } else {\r
2238       SelectComboValue(hwndCombo, cdFlow, FLOW_NONE);\r
2239     }\r
2240     return TRUE;\r
2241 \r
2242   case WM_COMMAND: /* message: received a command */\r
2243     switch (LOWORD(wParam)) {\r
2244     case IDOK:\r
2245       /* Read changed options from the dialog box */\r
2246 #ifdef NOTDEF\r
2247       /* !! Currently we can't change comm ports in midstream */\r
2248       hwndCombo = GetDlgItem(hDlg, OPT_Port);\r
2249       index = SendMessage(hwndCombo, CB_GETCURSEL, (WPARAM) 0, (LPARAM) 0);\r
2250       if (index == PORT_NONE) {\r
2251         appData.icsCommPort = "";\r
2252         if (hCommPort != NULL) {\r
2253           CloseHandle(hCommPort);\r
2254           hCommPort = NULL;\r
2255         }\r
2256         EndDialog(hDlg, TRUE);\r
2257         return TRUE;\r
2258       }\r
2259       SendMessage(hwndCombo, WM_GETTEXT, (WPARAM) MSG_SIZ, (LPARAM) buf);\r
2260       appData.icsCommPort = strdup(buf);\r
2261       if (hCommPort != NULL) {\r
2262         CloseHandle(hCommPort);\r
2263         hCommPort = NULL;\r
2264       }\r
2265       /* now what?? can't really do this; have to fix up the ChildProc\r
2266          and InputSource records for the comm port that we gave to the\r
2267          back end. */\r
2268 #endif /*NOTDEF*/\r
2269 \r
2270       hwndCombo = GetDlgItem(hDlg, OPT_DataRate);\r
2271       SendMessage(hwndCombo, WM_GETTEXT, (WPARAM) MSG_SIZ, (LPARAM) buf);\r
2272       if (sscanf(buf, "%u", &value) != 1) {\r
2273         MessageBox(hDlg, "Invalid data rate",\r
2274                    "Option Error", MB_OK|MB_ICONEXCLAMATION);\r
2275         return TRUE;\r
2276       }\r
2277       dcb.BaudRate = value;\r
2278 \r
2279       hwndCombo = GetDlgItem(hDlg, OPT_Bits);\r
2280       index = SendMessage(hwndCombo, CB_GETCURSEL, (WPARAM) 0, (LPARAM) 0);\r
2281       dcb.ByteSize = cdDataBits[index].value;\r
2282 \r
2283       hwndCombo = GetDlgItem(hDlg, OPT_Parity);\r
2284       index = SendMessage(hwndCombo, CB_GETCURSEL, (WPARAM) 0, (LPARAM) 0);\r
2285       dcb.Parity = cdParity[index].value;\r
2286 \r
2287       hwndCombo = GetDlgItem(hDlg, OPT_StopBits);\r
2288       index = SendMessage(hwndCombo, CB_GETCURSEL, (WPARAM) 0, (LPARAM) 0);\r
2289       dcb.StopBits = cdStopBits[index].value;\r
2290 \r
2291       hwndCombo = GetDlgItem(hDlg, OPT_Flow);\r
2292       index = SendMessage(hwndCombo, CB_GETCURSEL, (WPARAM) 0, (LPARAM) 0);\r
2293       switch (cdFlow[index].value) {\r
2294       case FLOW_NONE:\r
2295         dcb.fOutX = FALSE;\r
2296         dcb.fOutxCtsFlow = FALSE;\r
2297         dcb.fOutxDsrFlow = FALSE;\r
2298         break;\r
2299       case FLOW_CTS:\r
2300         dcb.fOutX = FALSE;\r
2301         dcb.fOutxCtsFlow = TRUE;\r
2302         dcb.fOutxDsrFlow = FALSE;\r
2303         break;\r
2304       case FLOW_DSR:\r
2305         dcb.fOutX = FALSE;\r
2306         dcb.fOutxCtsFlow = FALSE;\r
2307         dcb.fOutxDsrFlow = TRUE;\r
2308         break;\r
2309       case FLOW_XOFF:\r
2310         dcb.fOutX = TRUE;\r
2311         dcb.fOutxCtsFlow = FALSE;\r
2312         dcb.fOutxDsrFlow = FALSE;\r
2313         break;\r
2314       }\r
2315       if (!SetCommState(hCommPort, (LPDCB) &dcb)) {\r
2316         err = GetLastError();\r
2317         switch(MessageBox(hDlg, \r
2318                          "Failed to set comm port state;\r\ninvalid options?",\r
2319                          "Option Error", MB_ABORTRETRYIGNORE|MB_ICONQUESTION)) {\r
2320         case IDABORT:\r
2321           DisplayFatalError("Failed to set comm port state", err, 1);\r
2322           exit(1);  /*is it ok to do this from here?*/\r
2323 \r
2324         case IDRETRY:\r
2325           return TRUE;\r
2326 \r
2327         case IDIGNORE:\r
2328           EndDialog(hDlg, TRUE);\r
2329           return TRUE;\r
2330         }\r
2331       }\r
2332 \r
2333       EndDialog(hDlg, TRUE);\r
2334       return TRUE;\r
2335 \r
2336     case IDCANCEL:\r
2337       EndDialog(hDlg, FALSE);\r
2338       return TRUE;\r
2339 \r
2340     default:\r
2341       break;\r
2342     }\r
2343     break;\r
2344   }\r
2345   return FALSE;\r
2346 }\r
2347 \r
2348 VOID\r
2349 CommPortOptionsPopup(HWND hwnd)\r
2350 {\r
2351   FARPROC lpProc = MakeProcInstance((FARPROC)CommPortOptionsDialog, hInst);\r
2352   DialogBox(hInst, MAKEINTRESOURCE(DLG_CommPort), hwnd, (DLGPROC) lpProc);\r
2353   FreeProcInstance(lpProc);\r
2354 }\r
2355 \r
2356 /*---------------------------------------------------------------------------*\\r
2357  *\r
2358  * Load Options dialog functions\r
2359  *\r
2360 \*---------------------------------------------------------------------------*/\r
2361 \r
2362 VOID\r
2363 SetLoadOptionEnables(HWND hDlg)\r
2364 {\r
2365   UINT state;\r
2366 \r
2367   state = IsDlgButtonChecked(hDlg, OPT_Autostep);\r
2368   EnableWindow(GetDlgItem(hDlg, OPT_ASTimeDelay), state);\r
2369   EnableWindow(GetDlgItem(hDlg, OPT_AStext1), state);\r
2370 }\r
2371 \r
2372 LRESULT CALLBACK\r
2373 LoadOptions(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)\r
2374 {\r
2375   char buf[MSG_SIZ];\r
2376   float fnumber;\r
2377 \r
2378   switch (message) {\r
2379   case WM_INITDIALOG: /* message: initialize dialog box */\r
2380     /* Center the dialog over the application window */\r
2381     CenterWindow (hDlg, GetWindow (hDlg, GW_OWNER));\r
2382     /* Initialize the dialog items */\r
2383     if (appData.timeDelay >= 0.0) {\r
2384       CheckDlgButton(hDlg, OPT_Autostep, TRUE);\r
2385       sprintf(buf, "%.2g", appData.timeDelay);\r
2386       SetDlgItemText(hDlg, OPT_ASTimeDelay, buf);\r
2387     } else {\r
2388       CheckDlgButton(hDlg, OPT_Autostep, FALSE);\r
2389     }\r
2390     SetLoadOptionEnables(hDlg);\r
2391     return TRUE;\r
2392 \r
2393   case WM_COMMAND: /* message: received a command */\r
2394     switch (LOWORD(wParam)) {\r
2395     case IDOK:\r
2396       /* Read changed options from the dialog box */\r
2397       if (IsDlgButtonChecked(hDlg, OPT_Autostep)) {\r
2398         GetDlgItemText(hDlg, OPT_ASTimeDelay, buf, MSG_SIZ);\r
2399         if (sscanf(buf, "%f", &fnumber) != 1) {\r
2400           MessageBox(hDlg, "Invalid load game step rate",\r
2401                      "Option Error", MB_OK|MB_ICONEXCLAMATION);\r
2402           return FALSE;\r
2403         }\r
2404         appData.timeDelay = fnumber;\r
2405       } else {\r
2406         appData.timeDelay = (float) -1.0;\r
2407       }\r
2408       EndDialog(hDlg, TRUE);\r
2409       return TRUE;\r
2410 \r
2411     case IDCANCEL:\r
2412       EndDialog(hDlg, FALSE);\r
2413       return TRUE;\r
2414 \r
2415     default:\r
2416       SetLoadOptionEnables(hDlg);\r
2417       break;\r
2418     }\r
2419     break;\r
2420   }\r
2421   return FALSE;\r
2422 }\r
2423 \r
2424 \r
2425 VOID \r
2426 LoadOptionsPopup(HWND hwnd)\r
2427 {\r
2428   FARPROC lpProc = MakeProcInstance((FARPROC)LoadOptions, hInst);\r
2429   DialogBox(hInst, MAKEINTRESOURCE(DLG_LoadOptions), hwnd, (DLGPROC) lpProc);\r
2430   FreeProcInstance(lpProc);\r
2431 }\r
2432 \r
2433 /*---------------------------------------------------------------------------*\\r
2434  *\r
2435  * Save Options dialog functions\r
2436  *\r
2437 \*---------------------------------------------------------------------------*/\r
2438 \r
2439 VOID\r
2440 SetSaveOptionEnables(HWND hDlg)\r
2441 {\r
2442   UINT state;\r
2443 \r
2444   state = IsDlgButtonChecked(hDlg, OPT_Autosave);\r
2445   EnableWindow(GetDlgItem(hDlg, OPT_AVPrompt), state);\r
2446   EnableWindow(GetDlgItem(hDlg, OPT_AVToFile), state);\r
2447   if (state && !IsDlgButtonChecked(hDlg, OPT_AVPrompt) &&\r
2448       !IsDlgButtonChecked(hDlg, OPT_AVToFile)) {\r
2449     CheckRadioButton(hDlg, OPT_AVPrompt, OPT_AVToFile, OPT_AVPrompt);\r
2450   }\r
2451 \r
2452   state = state && IsDlgButtonChecked(hDlg, OPT_AVToFile);\r
2453   EnableWindow(GetDlgItem(hDlg, OPT_AVFilename), state);\r
2454   EnableWindow(GetDlgItem(hDlg, OPT_AVBrowse), state);\r
2455 }\r
2456 \r
2457 LRESULT CALLBACK\r
2458 SaveOptionsDialog(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)\r
2459 {\r
2460   char buf[MSG_SIZ];\r
2461   FILE *f;\r
2462 \r
2463   switch (message) {\r
2464   case WM_INITDIALOG: /* message: initialize dialog box */\r
2465     /* Center the dialog over the application window */\r
2466     CenterWindow (hDlg, GetWindow (hDlg, GW_OWNER));\r
2467     /* Initialize the dialog items */\r
2468     if (*appData.saveGameFile != NULLCHAR) {\r
2469       CheckDlgButton(hDlg, OPT_Autosave, (UINT) TRUE);\r
2470       CheckRadioButton(hDlg, OPT_AVPrompt, OPT_AVToFile, OPT_AVToFile);\r
2471       SetDlgItemText(hDlg, OPT_AVFilename, appData.saveGameFile);\r
2472     } else if (appData.autoSaveGames) {\r
2473       CheckDlgButton(hDlg, OPT_Autosave, (UINT) TRUE);\r
2474       CheckRadioButton(hDlg, OPT_AVPrompt, OPT_AVToFile, OPT_AVPrompt);\r
2475     } else {\r
2476       CheckDlgButton(hDlg, OPT_Autosave, (UINT) FALSE);\r
2477     }\r
2478     if (appData.oldSaveStyle) {\r
2479       CheckRadioButton(hDlg, OPT_PGN, OPT_Old, OPT_Old);\r
2480     } else {\r
2481       CheckRadioButton(hDlg, OPT_PGN, OPT_Old, OPT_PGN);\r
2482     }\r
2483     CheckDlgButton( hDlg, OPT_OutOfBookInfo, appData.saveOutOfBookInfo );\r
2484     SetSaveOptionEnables(hDlg);\r
2485     return TRUE;\r
2486 \r
2487   case WM_COMMAND: /* message: received a command */\r
2488     switch (LOWORD(wParam)) {\r
2489     case IDOK:\r
2490       /* Read changed options from the dialog box */\r
2491       if (IsDlgButtonChecked(hDlg, OPT_Autosave)) {\r
2492         appData.autoSaveGames = TRUE;\r
2493         if (IsDlgButtonChecked(hDlg, OPT_AVPrompt)) {\r
2494           appData.saveGameFile = "";\r
2495         } else /*if (IsDlgButtonChecked(hDlg, OPT_AVToFile))*/ {\r
2496           GetDlgItemText(hDlg, OPT_AVFilename, buf, MSG_SIZ);\r
2497           if (*buf == NULLCHAR) {\r
2498             MessageBox(hDlg, "Invalid save game file name",\r
2499                        "Option Error", MB_OK|MB_ICONEXCLAMATION);\r
2500             return FALSE;\r
2501           }\r
2502           if ((isalpha(buf[0]) && buf[1] == ':') ||\r
2503             (buf[0] == '\\' && buf[1] == '\\')) {\r
2504             appData.saveGameFile = strdup(buf);\r
2505           } else {\r
2506             char buf2[MSG_SIZ], buf3[MSG_SIZ];\r
2507             char *dummy;\r
2508             GetCurrentDirectory(MSG_SIZ, buf3);\r
2509             SetCurrentDirectory(installDir);\r
2510             if (GetFullPathName(buf, MSG_SIZ, buf2, &dummy)) {\r
2511               appData.saveGameFile = strdup(buf2);\r
2512             } else {\r
2513               appData.saveGameFile = strdup(buf);\r
2514             }\r
2515             SetCurrentDirectory(buf3);\r
2516           }\r
2517         }\r
2518       } else {\r
2519         appData.autoSaveGames = FALSE;\r
2520         appData.saveGameFile = "";\r
2521       }\r
2522       appData.oldSaveStyle = IsDlgButtonChecked(hDlg, OPT_Old);\r
2523       appData.saveOutOfBookInfo = IsDlgButtonChecked( hDlg, OPT_OutOfBookInfo );\r
2524       EndDialog(hDlg, TRUE);\r
2525       return TRUE;\r
2526 \r
2527     case IDCANCEL:\r
2528       EndDialog(hDlg, FALSE);\r
2529       return TRUE;\r
2530 \r
2531     case OPT_AVBrowse:\r
2532       f = OpenFileDialog(hDlg, "a", NULL, \r
2533                          appData.oldSaveStyle ? "gam" : "pgn", \r
2534                          GAME_FILT, "Browse for Auto Save File", \r
2535                          NULL, NULL, buf);\r
2536       if (f != NULL) {\r
2537         fclose(f);\r
2538         SetDlgItemText(hDlg, OPT_AVFilename, buf);\r
2539       }\r
2540       break;\r
2541 \r
2542     default:\r
2543       SetSaveOptionEnables(hDlg);\r
2544       break;\r
2545     }\r
2546     break;\r
2547   }\r
2548   return FALSE;\r
2549 }\r
2550 \r
2551 VOID\r
2552 SaveOptionsPopup(HWND hwnd)\r
2553 {\r
2554   FARPROC lpProc = MakeProcInstance((FARPROC)SaveOptionsDialog, hInst);\r
2555   DialogBox(hInst, MAKEINTRESOURCE(DLG_SaveOptions), hwnd, (DLGPROC) lpProc);\r
2556   FreeProcInstance(lpProc);\r
2557 }\r
2558 \r
2559 /*---------------------------------------------------------------------------*\\r
2560  *\r
2561  * Time Control Options dialog functions\r
2562  *\r
2563 \*---------------------------------------------------------------------------*/\r
2564 \r
2565 VOID\r
2566 SetTimeControlEnables(HWND hDlg)\r
2567 {\r
2568   UINT state;\r
2569 \r
2570   state = IsDlgButtonChecked(hDlg, OPT_TCUseMoves);\r
2571   EnableWindow(GetDlgItem(hDlg, OPT_TCTime), state);\r
2572   EnableWindow(GetDlgItem(hDlg, OPT_TCMoves), state);\r
2573   EnableWindow(GetDlgItem(hDlg, OPT_TCtext1), state);\r
2574   EnableWindow(GetDlgItem(hDlg, OPT_TCtext2), state);\r
2575   EnableWindow(GetDlgItem(hDlg, OPT_TCTime2), !state);\r
2576   EnableWindow(GetDlgItem(hDlg, OPT_TCInc), !state);\r
2577   EnableWindow(GetDlgItem(hDlg, OPT_TCitext1), !state);\r
2578   EnableWindow(GetDlgItem(hDlg, OPT_TCitext2), !state);\r
2579   EnableWindow(GetDlgItem(hDlg, OPT_TCitext3), !state);\r
2580 }\r
2581 \r
2582 \r
2583 LRESULT CALLBACK\r
2584 TimeControl(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)\r
2585 {\r
2586   char buf[MSG_SIZ];\r
2587   int mps, increment;\r
2588   BOOL ok;\r
2589 \r
2590   switch (message) {\r
2591   case WM_INITDIALOG: /* message: initialize dialog box */\r
2592     /* Center the dialog over the application window */\r
2593     CenterWindow (hDlg, GetWindow (hDlg, GW_OWNER));\r
2594     /* Initialize the dialog items */\r
2595     if (appData.clockMode && !appData.icsActive) {\r
2596       if (appData.timeIncrement == -1) {\r
2597         CheckRadioButton(hDlg, OPT_TCUseMoves, OPT_TCUseInc,\r
2598                          OPT_TCUseMoves);\r
2599         SetDlgItemText(hDlg, OPT_TCTime, appData.timeControl);\r
2600         SetDlgItemInt(hDlg, OPT_TCMoves, appData.movesPerSession,\r
2601                       FALSE);\r
2602         SetDlgItemText(hDlg, OPT_TCTime2, "");\r
2603         SetDlgItemText(hDlg, OPT_TCInc, "");\r
2604       } else {\r
2605         CheckRadioButton(hDlg, OPT_TCUseMoves, OPT_TCUseInc,\r
2606                          OPT_TCUseInc);\r
2607         SetDlgItemText(hDlg, OPT_TCTime, "");\r
2608         SetDlgItemText(hDlg, OPT_TCMoves, "");\r
2609         SetDlgItemText(hDlg, OPT_TCTime2, appData.timeControl);\r
2610         SetDlgItemInt(hDlg, OPT_TCInc, appData.timeIncrement, FALSE);\r
2611       }\r
2612       SetTimeControlEnables(hDlg);\r
2613     }\r
2614     return TRUE;\r
2615 \r
2616   case WM_COMMAND: /* message: received a command */\r
2617     switch (LOWORD(wParam)) {\r
2618     case IDOK:\r
2619       /* Read changed options from the dialog box */\r
2620       if (IsDlgButtonChecked(hDlg, OPT_TCUseMoves)) {\r
2621         increment = -1;\r
2622         mps = GetDlgItemInt(hDlg, OPT_TCMoves, &ok, FALSE);\r
2623         if (!ok || mps <= 0) {\r
2624           MessageBox(hDlg, "Invalid moves per time control",\r
2625                      "Option Error", MB_OK|MB_ICONEXCLAMATION);\r
2626           return FALSE;\r
2627         }\r
2628         GetDlgItemText(hDlg, OPT_TCTime, buf, MSG_SIZ);\r
2629         if (!ParseTimeControl(buf, increment, mps)) {\r
2630           MessageBox(hDlg, "Invalid minutes per time control",\r
2631                      "Option Error", MB_OK|MB_ICONEXCLAMATION);\r
2632           return FALSE;\r
2633         }\r
2634       } else {\r
2635         increment = GetDlgItemInt(hDlg, OPT_TCInc, &ok, FALSE);\r
2636         mps = appData.movesPerSession;\r
2637         if (!ok || increment < 0) {\r
2638           MessageBox(hDlg, "Invalid increment",\r
2639                      "Option Error", MB_OK|MB_ICONEXCLAMATION);\r
2640           return FALSE;\r
2641         }\r
2642         GetDlgItemText(hDlg, OPT_TCTime2, buf, MSG_SIZ);\r
2643         if (!ParseTimeControl(buf, increment, mps)) {\r
2644           MessageBox(hDlg, "Invalid initial time",\r
2645                      "Option Error", MB_OK|MB_ICONEXCLAMATION);\r
2646           return FALSE;\r
2647         }\r
2648       }\r
2649       appData.timeControl = strdup(buf);\r
2650       appData.movesPerSession = mps;\r
2651       appData.timeIncrement = increment;\r
2652       Reset(TRUE, TRUE);\r
2653       EndDialog(hDlg, TRUE);\r
2654       return TRUE;\r
2655 \r
2656     case IDCANCEL:\r
2657       EndDialog(hDlg, FALSE);\r
2658       return TRUE;\r
2659 \r
2660     default:\r
2661       SetTimeControlEnables(hDlg);\r
2662       break;\r
2663     }\r
2664     break;\r
2665   }\r
2666   return FALSE;\r
2667 }\r
2668 \r
2669 VOID\r
2670 TimeControlOptionsPopup(HWND hwnd)\r
2671 {\r
2672   if (gameMode != BeginningOfGame) {\r
2673     DisplayError("Changing time control during a game is not implemented", 0);\r
2674   } else {\r
2675     FARPROC lpProc = MakeProcInstance((FARPROC)TimeControl, hInst);\r
2676     DialogBox(hInst, MAKEINTRESOURCE(DLG_TimeControl), hwnd, (DLGPROC) lpProc);\r
2677     FreeProcInstance(lpProc);\r
2678   }\r
2679 }\r
2680 \r
2681 /*---------------------------------------------------------------------------*\\r
2682  *\r
2683  * Engine Options Dialog functions\r
2684  *\r
2685 \*---------------------------------------------------------------------------*/\r
2686 #define CHECK_BOX(x,y) CheckDlgButton(hDlg, (x), (BOOL)(y))\r
2687 #define IS_CHECKED(x) (Boolean)IsDlgButtonChecked(hDlg, (x))\r
2688 \r
2689 #define INT_ABS( n )    ((n) >= 0 ? (n) : -(n))\r
2690 \r
2691 LRESULT CALLBACK EnginePlayOptionsDialog(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)\r
2692 {\r
2693   switch (message) {\r
2694   case WM_INITDIALOG: /* message: initialize dialog box */\r
2695 \r
2696     /* Center the dialog over the application window */\r
2697     CenterWindow (hDlg, GetWindow (hDlg, GW_OWNER));\r
2698 \r
2699     /* Initialize the dialog items */\r
2700     CHECK_BOX(IDC_EpPeriodicUpdates, appData.periodicUpdates);\r
2701     CHECK_BOX(IDC_EpPonder, appData.ponderNextMove);\r
2702     CHECK_BOX(IDC_EpShowThinking, appData.showThinking);\r
2703     CHECK_BOX(IDC_EpHideThinkingHuman, appData.hideThinkingFromHuman);\r
2704 \r
2705     CHECK_BOX(IDC_TestClaims, appData.testClaims);\r
2706     CHECK_BOX(IDC_DetectMates, appData.checkMates);\r
2707     CHECK_BOX(IDC_MaterialDraws, appData.materialDraws);\r
2708     CHECK_BOX(IDC_TrivialDraws, appData.trivialDraws);\r
2709 \r
2710     SetDlgItemInt( hDlg, IDC_EpDrawMoveCount, appData.adjudicateDrawMoves, TRUE );\r
2711     SendDlgItemMessage( hDlg, IDC_EpDrawMoveCount, EM_SETSEL, 0, -1 );\r
2712 \r
2713     SetDlgItemInt( hDlg, IDC_EpAdjudicationThreshold, INT_ABS(appData.adjudicateLossThreshold), TRUE );\r
2714     SendDlgItemMessage( hDlg, IDC_EpAdjudicationThreshold, EM_SETSEL, 0, -1 );\r
2715 \r
2716     SetDlgItemInt( hDlg, IDC_RuleMoves, appData.ruleMoves, TRUE );\r
2717     SendDlgItemMessage( hDlg, IDC_RuleMoves, EM_SETSEL, 0, -1 );\r
2718 \r
2719     SetDlgItemInt( hDlg, IDC_DrawRepeats, INT_ABS(appData.drawRepeats), TRUE );\r
2720     SendDlgItemMessage( hDlg, IDC_DrawRepeats, EM_SETSEL, 0, -1 );\r
2721 \r
2722     return TRUE;\r
2723 \r
2724   case WM_COMMAND: /* message: received a command */\r
2725     switch (LOWORD(wParam)) {\r
2726     case IDOK:\r
2727       /* Read changed options from the dialog box */\r
2728       PeriodicUpdatesEvent(          IS_CHECKED(IDC_EpPeriodicUpdates));\r
2729       PonderNextMoveEvent(           IS_CHECKED(IDC_EpPonder));\r
2730       ShowThinkingEvent(             IS_CHECKED(IDC_EpShowThinking));\r
2731       appData.hideThinkingFromHuman= IS_CHECKED(IDC_EpHideThinkingHuman);\r
2732       appData.testClaims    = IS_CHECKED(IDC_TestClaims);\r
2733       appData.checkMates    = IS_CHECKED(IDC_DetectMates);\r
2734       appData.materialDraws = IS_CHECKED(IDC_MaterialDraws);\r
2735       appData.trivialDraws  = IS_CHECKED(IDC_TrivialDraws);\r
2736 \r
2737       appData.adjudicateDrawMoves = GetDlgItemInt(hDlg, IDC_EpDrawMoveCount, NULL, FALSE );\r
2738       appData.adjudicateLossThreshold = - (int) GetDlgItemInt(hDlg, IDC_EpAdjudicationThreshold, NULL, FALSE );\r
2739       appData.ruleMoves = GetDlgItemInt(hDlg, IDC_RuleMoves, NULL, FALSE );\r
2740       appData.drawRepeats = (int) GetDlgItemInt(hDlg, IDC_DrawRepeats, NULL, FALSE );\r
2741 \r
2742       EndDialog(hDlg, TRUE);\r
2743       return TRUE;\r
2744 \r
2745     case IDCANCEL:\r
2746       EndDialog(hDlg, FALSE);\r
2747       return TRUE;\r
2748 \r
2749     case IDC_EpDrawMoveCount:\r
2750     case IDC_EpAdjudicationThreshold:\r
2751     case IDC_DrawRepeats:\r
2752     case IDC_RuleMoves:\r
2753         if( HIWORD(wParam) == EN_CHANGE ) {\r
2754             int n1_ok;\r
2755             int n2_ok;\r
2756             int n3_ok;\r
2757             int n4_ok;\r
2758 \r
2759             GetDlgItemInt(hDlg, IDC_EpDrawMoveCount, &n1_ok, FALSE );\r
2760             GetDlgItemInt(hDlg, IDC_EpAdjudicationThreshold, &n2_ok, FALSE );\r
2761             GetDlgItemInt(hDlg, IDC_RuleMoves, &n3_ok, FALSE );\r
2762             GetDlgItemInt(hDlg, IDC_DrawRepeats, &n4_ok, FALSE );\r
2763 \r
2764             EnableWindow( GetDlgItem(hDlg, IDOK), n1_ok && n2_ok && n3_ok && n4_ok ? TRUE : FALSE );\r
2765         }\r
2766         return TRUE;\r
2767     }\r
2768     break;\r
2769   }\r
2770   return FALSE;\r
2771 }\r
2772 \r
2773 VOID EnginePlayOptionsPopup(HWND hwnd)\r
2774 {\r
2775   FARPROC lpProc;\r
2776 \r
2777   lpProc = MakeProcInstance((FARPROC)EnginePlayOptionsDialog, hInst);\r
2778   DialogBox(hInst, MAKEINTRESOURCE(DLG_EnginePlayOptions), hwnd, (DLGPROC) lpProc);\r
2779   FreeProcInstance(lpProc);\r
2780 }\r
2781 \r
2782 /*---------------------------------------------------------------------------*\\r
2783  *\r
2784  * UCI Options Dialog functions\r
2785  *\r
2786 \*---------------------------------------------------------------------------*/\r
2787 static BOOL BrowseForFolder( const char * title, char * path )\r
2788 {\r
2789     BOOL result = FALSE;\r
2790     BROWSEINFO bi;\r
2791     LPITEMIDLIST pidl;\r
2792 \r
2793     ZeroMemory( &bi, sizeof(bi) );\r
2794 \r
2795     bi.lpszTitle = title == 0 ? "Choose Folder" : title;\r
2796     bi.ulFlags = BIF_RETURNONLYFSDIRS;\r
2797 \r
2798     pidl = SHBrowseForFolder( &bi );\r
2799 \r
2800     if( pidl != 0 ) {\r
2801         IMalloc * imalloc = 0;\r
2802 \r
2803         if( SHGetPathFromIDList( pidl, path ) ) {\r
2804             result = TRUE;\r
2805         }\r
2806 \r
2807         if( SUCCEEDED( SHGetMalloc ( &imalloc ) ) ) {\r
2808             imalloc->lpVtbl->Free(imalloc,pidl);\r
2809             imalloc->lpVtbl->Release(imalloc);\r
2810         }\r
2811     }\r
2812 \r
2813     return result;\r
2814 }\r
2815 \r
2816 LRESULT CALLBACK UciOptionsDialog(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)\r
2817 {\r
2818   char buf[MAX_PATH];\r
2819 \r
2820   switch (message) {\r
2821   case WM_INITDIALOG: /* message: initialize dialog box */\r
2822 \r
2823     /* Center the dialog over the application window */\r
2824     CenterWindow (hDlg, GetWindow (hDlg, GW_OWNER));\r
2825 \r
2826     /* Initialize the dialog items */\r
2827     SetDlgItemText( hDlg, IDC_PolyglotDir, appData.polyglotDir );\r
2828     SetDlgItemInt( hDlg, IDC_HashSize, appData.defaultHashSize, TRUE );\r
2829     SetDlgItemText( hDlg, IDC_PathToEGTB, appData.defaultPathEGTB );\r
2830     SetDlgItemInt( hDlg, IDC_SizeOfEGTB, appData.defaultCacheSizeEGTB, TRUE );\r
2831     CheckDlgButton( hDlg, IDC_UseBook, (BOOL) appData.usePolyglotBook );\r
2832     SetDlgItemText( hDlg, IDC_BookFile, appData.polyglotBook );\r
2833 \r
2834     SendDlgItemMessage( hDlg, IDC_PolyglotDir, EM_SETSEL, 0, -1 );\r
2835 \r
2836     return TRUE;\r
2837 \r
2838   case WM_COMMAND: /* message: received a command */\r
2839     switch (LOWORD(wParam)) {\r
2840     case IDOK:\r
2841       GetDlgItemText( hDlg, IDC_PolyglotDir, buf, sizeof(buf) );\r
2842       appData.polyglotDir = strdup(buf);\r
2843       appData.defaultHashSize = GetDlgItemInt(hDlg, IDC_HashSize, NULL, FALSE );\r
2844       appData.defaultCacheSizeEGTB = GetDlgItemInt(hDlg, IDC_SizeOfEGTB, NULL, FALSE );\r
2845       GetDlgItemText( hDlg, IDC_PathToEGTB, buf, sizeof(buf) );\r
2846       appData.defaultPathEGTB = strdup(buf);\r
2847       GetDlgItemText( hDlg, IDC_BookFile, buf, sizeof(buf) );\r
2848       appData.polyglotBook = strdup(buf);\r
2849       appData.usePolyglotBook = (Boolean) IsDlgButtonChecked( hDlg, IDC_UseBook );\r
2850 \r
2851       EndDialog(hDlg, TRUE);\r
2852       return TRUE;\r
2853 \r
2854     case IDCANCEL:\r
2855       EndDialog(hDlg, FALSE);\r
2856       return TRUE;\r
2857 \r
2858     case IDC_BrowseForBook:\r
2859       {\r
2860           char filter[] = { \r
2861               'A','l','l',' ','F','i','l','e','s', 0,\r
2862               '*','.','*', 0,\r
2863               'B','I','N',' ','F','i','l','e','s', 0,\r
2864               '*','.','b','i','n', 0,\r
2865               0 };\r
2866 \r
2867           OPENFILENAME ofn;\r
2868 \r
2869           strcpy( buf, "" );\r
2870 \r
2871           ZeroMemory( &ofn, sizeof(ofn) );\r
2872 \r
2873           ofn.lStructSize = sizeof(ofn);\r
2874           ofn.hwndOwner = hDlg;\r
2875           ofn.hInstance = hInst;\r
2876           ofn.lpstrFilter = filter;\r
2877           ofn.lpstrFile = buf;\r
2878           ofn.nMaxFile = sizeof(buf);\r
2879           ofn.lpstrTitle = "Choose Book";\r
2880           ofn.Flags = OFN_FILEMUSTEXIST | OFN_LONGNAMES | OFN_HIDEREADONLY;\r
2881 \r
2882           if( GetOpenFileName( &ofn ) ) {\r
2883               SetDlgItemText( hDlg, IDC_BookFile, buf );\r
2884           }\r
2885       }\r
2886       return TRUE;\r
2887 \r
2888     case IDC_BrowseForPolyglotDir:\r
2889       if( BrowseForFolder( "Choose Polyglot Directory", buf ) ) {\r
2890         SetDlgItemText( hDlg, IDC_PolyglotDir, buf );\r
2891 \r
2892         strcat( buf, "\\polyglot.exe" );\r
2893 \r
2894         if( GetFileAttributes(buf) == 0xFFFFFFFF ) {\r
2895             MessageBox( hDlg, "Polyglot was not found in the specified folder!", "Warning", MB_OK | MB_ICONWARNING );\r
2896         }\r
2897       }\r
2898       return TRUE;\r
2899 \r
2900     case IDC_BrowseForEGTB:\r
2901       if( BrowseForFolder( "Choose EGTB Directory:", buf ) ) {\r
2902         SetDlgItemText( hDlg, IDC_PathToEGTB, buf );\r
2903       }\r
2904       return TRUE;\r
2905 \r
2906     case IDC_HashSize:\r
2907     case IDC_SizeOfEGTB:\r
2908         if( HIWORD(wParam) == EN_CHANGE ) {\r
2909             int n1_ok;\r
2910             int n2_ok;\r
2911 \r
2912             GetDlgItemInt(hDlg, IDC_HashSize, &n1_ok, FALSE );\r
2913             GetDlgItemInt(hDlg, IDC_SizeOfEGTB, &n2_ok, FALSE );\r
2914 \r
2915             EnableWindow( GetDlgItem(hDlg, IDOK), n1_ok && n2_ok ? TRUE : FALSE );\r
2916         }\r
2917         return TRUE;\r
2918     }\r
2919     break;\r
2920   }\r
2921   return FALSE;\r
2922 }\r
2923 \r
2924 VOID UciOptionsPopup(HWND hwnd)\r
2925 {\r
2926   FARPROC lpProc;\r
2927 \r
2928   lpProc = MakeProcInstance((FARPROC)UciOptionsDialog, hInst);\r
2929   DialogBox(hInst, MAKEINTRESOURCE(DLG_OptionsUCI), hwnd, (DLGPROC) lpProc);\r
2930   FreeProcInstance(lpProc);\r
2931 }\r