Merge commit 'v4.3.16'
[xboard.git] / xboard.c
1 /*\r
2  * xboard.c -- X front end for XBoard\r
3  * $Id: xboard.c,v 2.2 2003/11/06 07:22:14 mann Exp $\r
4  *\r
5  * Copyright 1991 by Digital Equipment Corporation, Maynard, Massachusetts.\r
6  * Enhancements Copyright 1992-2001 Free Software Foundation, Inc.\r
7  *\r
8  * The following terms apply to Digital Equipment Corporation's copyright\r
9  * interest in XBoard:\r
10  * ------------------------------------------------------------------------\r
11  * All Rights Reserved\r
12  *\r
13  * Permission to use, copy, modify, and distribute this software and its\r
14  * documentation for any purpose and without fee is hereby granted,\r
15  * provided that the above copyright notice appear in all copies and that\r
16  * both that copyright notice and this permission notice appear in\r
17  * supporting documentation, and that the name of Digital not be\r
18  * used in advertising or publicity pertaining to distribution of the\r
19  * software without specific, written prior permission.\r
20  *\r
21  * DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING\r
22  * ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL\r
23  * DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR\r
24  * ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,\r
25  * WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,\r
26  * ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS\r
27  * SOFTWARE.\r
28  * ------------------------------------------------------------------------\r
29  *\r
30  * The following terms apply to the enhanced version of XBoard distributed\r
31  * by the Free Software Foundation:\r
32  * ------------------------------------------------------------------------\r
33  * This program is free software; you can redistribute it and/or modify\r
34  * it under the terms of the GNU General Public License as published by\r
35  * the Free Software Foundation; either version 2 of the License, or\r
36  * (at your option) any later version.\r
37  *\r
38  * This program is distributed in the hope that it will be useful,\r
39  * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
40  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
41  * GNU General Public License for more details.\r
42  *\r
43  * You should have received a copy of the GNU General Public License\r
44  * along with this program; if not, write to the Free Software\r
45  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\r
46  * ------------------------------------------------------------------------\r
47  *\r
48  * See the file ChangeLog for a revision history.\r
49  */\r
50 \r
51 #include "config.h"\r
52 \r
53 #include <stdio.h>\r
54 #include <ctype.h>\r
55 #include <signal.h>\r
56 #include <errno.h>\r
57 #include <sys/types.h>\r
58 #include <sys/stat.h>\r
59 #include <pwd.h>\r
60 \r
61 #if !OMIT_SOCKETS\r
62 # if HAVE_SYS_SOCKET_H\r
63 #  include <sys/socket.h>\r
64 #  include <netinet/in.h>\r
65 #  include <netdb.h>\r
66 # else /* not HAVE_SYS_SOCKET_H */\r
67 #  if HAVE_LAN_SOCKET_H\r
68 #   include <lan/socket.h>\r
69 #   include <lan/in.h>\r
70 #   include <lan/netdb.h>\r
71 #  else /* not HAVE_LAN_SOCKET_H */\r
72 #   define OMIT_SOCKETS 1\r
73 #  endif /* not HAVE_LAN_SOCKET_H */\r
74 # endif /* not HAVE_SYS_SOCKET_H */\r
75 #endif /* !OMIT_SOCKETS */\r
76 \r
77 #if STDC_HEADERS\r
78 # include <stdlib.h>\r
79 # include <string.h>\r
80 #else /* not STDC_HEADERS */\r
81 extern char *getenv();\r
82 # if HAVE_STRING_H\r
83 #  include <string.h>\r
84 # else /* not HAVE_STRING_H */\r
85 #  include <strings.h>\r
86 # endif /* not HAVE_STRING_H */\r
87 #endif /* not STDC_HEADERS */\r
88 \r
89 #if HAVE_SYS_FCNTL_H\r
90 # include <sys/fcntl.h>\r
91 #else /* not HAVE_SYS_FCNTL_H */\r
92 # if HAVE_FCNTL_H\r
93 #  include <fcntl.h>\r
94 # endif /* HAVE_FCNTL_H */\r
95 #endif /* not HAVE_SYS_FCNTL_H */\r
96 \r
97 #if HAVE_SYS_SYSTEMINFO_H\r
98 # include <sys/systeminfo.h>\r
99 #endif /* HAVE_SYS_SYSTEMINFO_H */\r
100 \r
101 #if TIME_WITH_SYS_TIME\r
102 # include <sys/time.h>\r
103 # include <time.h>\r
104 #else\r
105 # if HAVE_SYS_TIME_H\r
106 #  include <sys/time.h>\r
107 # else\r
108 #  include <time.h>\r
109 # endif\r
110 #endif\r
111 \r
112 #if HAVE_UNISTD_H\r
113 # include <unistd.h>\r
114 #endif\r
115 \r
116 #if HAVE_SYS_WAIT_H\r
117 # include <sys/wait.h>\r
118 #endif\r
119 \r
120 #if HAVE_DIRENT_H\r
121 # include <dirent.h>\r
122 # define NAMLEN(dirent) strlen((dirent)->d_name)\r
123 # define HAVE_DIR_STRUCT\r
124 #else\r
125 # define dirent direct\r
126 # define NAMLEN(dirent) (dirent)->d_namlen\r
127 # if HAVE_SYS_NDIR_H\r
128 #  include <sys/ndir.h>\r
129 #  define HAVE_DIR_STRUCT\r
130 # endif\r
131 # if HAVE_SYS_DIR_H\r
132 #  include <sys/dir.h>\r
133 #  define HAVE_DIR_STRUCT\r
134 # endif\r
135 # if HAVE_NDIR_H\r
136 #  include <ndir.h>\r
137 #  define HAVE_DIR_STRUCT\r
138 # endif\r
139 #endif\r
140 \r
141 #include <X11/Intrinsic.h>\r
142 #include <X11/StringDefs.h>\r
143 #include <X11/Shell.h>\r
144 #include <X11/cursorfont.h>\r
145 #include <X11/Xatom.h>\r
146 #if USE_XAW3D\r
147 #include <X11/Xaw3d/Dialog.h>\r
148 #include <X11/Xaw3d/Form.h>\r
149 #include <X11/Xaw3d/List.h>\r
150 #include <X11/Xaw3d/Label.h>\r
151 #include <X11/Xaw3d/SimpleMenu.h>\r
152 #include <X11/Xaw3d/SmeBSB.h>\r
153 #include <X11/Xaw3d/SmeLine.h>\r
154 #include <X11/Xaw3d/Box.h>\r
155 #include <X11/Xaw3d/MenuButton.h>\r
156 #include <X11/Xaw3d/Text.h>\r
157 #include <X11/Xaw3d/AsciiText.h>\r
158 #else\r
159 #include <X11/Xaw/Dialog.h>\r
160 #include <X11/Xaw/Form.h>\r
161 #include <X11/Xaw/List.h>\r
162 #include <X11/Xaw/Label.h>\r
163 #include <X11/Xaw/SimpleMenu.h>\r
164 #include <X11/Xaw/SmeBSB.h>\r
165 #include <X11/Xaw/SmeLine.h>\r
166 #include <X11/Xaw/Box.h>\r
167 #include <X11/Xaw/MenuButton.h>\r
168 #include <X11/Xaw/Text.h>\r
169 #include <X11/Xaw/AsciiText.h>\r
170 #endif\r
171 \r
172 // [HGM] bitmaps: put before incuding the bitmaps / pixmaps, to know how many piece types there are.\r
173 #include "common.h"\r
174 \r
175 #if HAVE_LIBXPM\r
176 #include <X11/xpm.h>\r
177 #include "pixmaps/pixmaps.h"\r
178 #define IMAGE_EXT "xpm"\r
179 #else\r
180 #define IMAGE_EXT "xim"\r
181 #include "bitmaps/bitmaps.h"\r
182 #endif\r
183 \r
184 #include "bitmaps/icon_white.bm"\r
185 #include "bitmaps/icon_black.bm"\r
186 #include "bitmaps/checkmark.bm"\r
187 \r
188 #include "frontend.h"\r
189 #include "backend.h"\r
190 #include "moves.h"\r
191 #include "xboard.h"\r
192 #include "childio.h"\r
193 #include "xgamelist.h"\r
194 #include "xhistory.h"\r
195 #include "xedittags.h"\r
196 #include "gettext.h"\r
197 \r
198 // must be moved to xengineoutput.h\r
199 \r
200 void EngineOutputProc P((Widget w, XEvent *event,\r
201  String *prms, Cardinal *nprms));\r
202 \r
203 void EngineOutputPopDown();\r
204 \r
205 \r
206 #ifdef __EMX__\r
207 #ifndef HAVE_USLEEP\r
208 #define HAVE_USLEEP\r
209 #endif\r
210 #define usleep(t)   _sleep2(((t)+500)/1000)\r
211 #endif\r
212 \r
213 #ifdef ENABLE_NLS\r
214 # define  _(s) gettext (s)\r
215 # define N_(s) gettext_noop (s)\r
216 #else\r
217 # define  _(s) (s)\r
218 # define N_(s)  s\r
219 #endif\r
220 \r
221 typedef struct {\r
222     String string;\r
223     XtActionProc proc;\r
224 } MenuItem;\r
225 \r
226 typedef struct {\r
227     String name;\r
228     MenuItem *mi;\r
229 } Menu;\r
230 \r
231 int main P((int argc, char **argv));\r
232 RETSIGTYPE CmailSigHandler P((int sig));\r
233 RETSIGTYPE IntSigHandler P((int sig));\r
234 void CreateGCs P((void));\r
235 void CreateXIMPieces P((void));\r
236 void CreateXPMPieces P((void));\r
237 void CreatePieces P((void));\r
238 void CreatePieceMenus P((void));\r
239 Widget CreateMenuBar P((Menu *mb));\r
240 Widget CreateButtonBar P ((MenuItem *mi));\r
241 char *FindFont P((char *pattern, int targetPxlSize));\r
242 void PieceMenuPopup P((Widget w, XEvent *event,\r
243                        String *params, Cardinal *num_params));\r
244 static void PieceMenuSelect P((Widget w, ChessSquare piece, caddr_t junk));\r
245 static void DropMenuSelect P((Widget w, ChessSquare piece, caddr_t junk));\r
246 void ReadBitmap P((Pixmap *pm, String name, unsigned char bits[],\r
247                    u_int wreq, u_int hreq));\r
248 void CreateGrid P((void));\r
249 int EventToSquare P((int x, int limit));\r
250 void DrawSquare P((int row, int column, ChessSquare piece, int do_flash));\r
251 void EventProc P((Widget widget, caddr_t unused, XEvent *event));\r
252 void HandleUserMove P((Widget w, XEvent *event,\r
253                      String *prms, Cardinal *nprms));\r
254 void AnimateUserMove P((Widget w, XEvent * event,\r
255                      String * params, Cardinal * nParams));\r
256 void WhiteClock P((Widget w, XEvent *event,\r
257                    String *prms, Cardinal *nprms));\r
258 void BlackClock P((Widget w, XEvent *event,\r
259                    String *prms, Cardinal *nprms));\r
260 void DrawPositionProc P((Widget w, XEvent *event,\r
261                      String *prms, Cardinal *nprms));\r
262 void XDrawPosition P((Widget w, /*Boolean*/int repaint, \r
263                      Board board));\r
264 void CommentPopUp P((char *title, char *label));\r
265 void CommentPopDown P((void));\r
266 void CommentCallback P((Widget w, XtPointer client_data,\r
267                         XtPointer call_data));\r
268 void ICSInputBoxPopUp P((void));\r
269 void ICSInputBoxPopDown P((void));\r
270 void FileNamePopUp P((char *label, char *def,\r
271                       FileProc proc, char *openMode));\r
272 void FileNamePopDown P((void));\r
273 void FileNameCallback P((Widget w, XtPointer client_data,\r
274                          XtPointer call_data));\r
275 void FileNameAction P((Widget w, XEvent *event,\r
276                        String *prms, Cardinal *nprms));\r
277 void AskQuestionReplyAction P((Widget w, XEvent *event,\r
278                           String *prms, Cardinal *nprms));\r
279 void AskQuestionProc P((Widget w, XEvent *event,\r
280                           String *prms, Cardinal *nprms));\r
281 void AskQuestionPopDown P((void));\r
282 void PromotionPopUp P((void));\r
283 void PromotionPopDown P((void));\r
284 void PromotionCallback P((Widget w, XtPointer client_data,\r
285                           XtPointer call_data));\r
286 void EditCommentPopDown P((void));\r
287 void EditCommentCallback P((Widget w, XtPointer client_data,\r
288                             XtPointer call_data));\r
289 void SelectCommand P((Widget w, XtPointer client_data, XtPointer call_data));\r
290 void ResetProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms));\r
291 void LoadGameProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms));\r
292 void LoadNextGameProc P((Widget w, XEvent *event, String *prms,\r
293                          Cardinal *nprms));\r
294 void LoadPrevGameProc P((Widget w, XEvent *event, String *prms,\r
295                          Cardinal *nprms));\r
296 void ReloadGameProc P((Widget w, XEvent *event, String *prms,\r
297                        Cardinal *nprms));\r
298 void LoadPositionProc P((Widget w, XEvent *event,\r
299                          String *prms, Cardinal *nprms));\r
300 void LoadNextPositionProc P((Widget w, XEvent *event, String *prms,\r
301                          Cardinal *nprms));\r
302 void LoadPrevPositionProc P((Widget w, XEvent *event, String *prms,\r
303                          Cardinal *nprms));\r
304 void ReloadPositionProc P((Widget w, XEvent *event, String *prms,\r
305                        Cardinal *nprms));\r
306 void CopyPositionProc P((Widget w, XEvent *event, String *prms,\r
307                          Cardinal *nprms));\r
308 void PastePositionProc P((Widget w, XEvent *event, String *prms,\r
309                           Cardinal *nprms));\r
310 void CopyGameProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms));\r
311 void PasteGameProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms));\r
312 void SaveGameProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms));\r
313 void SavePositionProc P((Widget w, XEvent *event,\r
314                          String *prms, Cardinal *nprms));\r
315 void MailMoveProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms));\r
316 void ReloadCmailMsgProc P((Widget w, XEvent *event, String *prms,\r
317                             Cardinal *nprms));\r
318 void QuitProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms));\r
319 void PauseProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms));\r
320 void MachineBlackProc P((Widget w, XEvent *event, String *prms,\r
321                          Cardinal *nprms));\r
322 void MachineWhiteProc P((Widget w, XEvent *event,\r
323                          String *prms, Cardinal *nprms));\r
324 void AnalyzeModeProc P((Widget w, XEvent *event,\r
325                          String *prms, Cardinal *nprms));\r
326 void AnalyzeFileProc P((Widget w, XEvent *event,\r
327                          String *prms, Cardinal *nprms));\r
328 void TwoMachinesProc P((Widget w, XEvent *event, String *prms,\r
329                         Cardinal *nprms));\r
330 void IcsClientProc P((Widget w, XEvent *event, String *prms,\r
331                       Cardinal *nprms));\r
332 void EditGameProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms));\r
333 void EditPositionProc P((Widget w, XEvent *event,\r
334                          String *prms, Cardinal *nprms));\r
335 void TrainingProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms));\r
336 void EditCommentProc P((Widget w, XEvent *event,\r
337                         String *prms, Cardinal *nprms));\r
338 void IcsInputBoxProc P((Widget w, XEvent *event,\r
339                         String *prms, Cardinal *nprms));\r
340 void AcceptProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms));\r
341 void DeclineProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms));\r
342 void RematchProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms));\r
343 void CallFlagProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms));\r
344 void DrawProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms));\r
345 void AbortProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms));\r
346 void AdjournProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms));\r
347 void ResignProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms));\r
348 void EnterKeyProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms));\r
349 void StopObservingProc P((Widget w, XEvent *event, String *prms,\r
350                           Cardinal *nprms));\r
351 void StopExaminingProc P((Widget w, XEvent *event, String *prms,\r
352                           Cardinal *nprms));\r
353 void BackwardProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms));\r
354 void ForwardProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms));\r
355 void ToStartProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms));\r
356 void ToEndProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms));\r
357 void RevertProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms));\r
358 void TruncateGameProc P((Widget w, XEvent *event, String *prms,\r
359                          Cardinal *nprms));\r
360 void RetractMoveProc P((Widget w, XEvent *event, String *prms,\r
361                         Cardinal *nprms));\r
362 void MoveNowProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms));\r
363 void AlwaysQueenProc P((Widget w, XEvent *event, String *prms,\r
364                         Cardinal *nprms));\r
365 void AnimateDraggingProc P((Widget w, XEvent *event, String *prms,\r
366                          Cardinal *nprms));\r
367 void AnimateMovingProc P((Widget w, XEvent *event, String *prms,\r
368                          Cardinal *nprms));\r
369 void AutocommProc P((Widget w, XEvent *event, String *prms,\r
370                      Cardinal *nprms));\r
371 void AutoflagProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms));\r
372 void AutoflipProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms));\r
373 void AutobsProc P((Widget w, XEvent *event, String *prms,\r
374                         Cardinal *nprms));\r
375 void AutoraiseProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms));\r
376 void AutosaveProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms));\r
377 void BlindfoldProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms));\r
378 void FlashMovesProc P((Widget w, XEvent *event, String *prms,\r
379                        Cardinal *nprms));\r
380 void FlipViewProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms));\r
381 void GetMoveListProc P((Widget w, XEvent *event, String *prms,\r
382                         Cardinal *nprms));\r
383 void HighlightDraggingProc P((Widget w, XEvent *event, String *prms,\r
384                               Cardinal *nprms));\r
385 void HighlightLastMoveProc P((Widget w, XEvent *event, String *prms,\r
386                               Cardinal *nprms));\r
387 void MoveSoundProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms));\r
388 void IcsAlarmProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms));\r
389 void OldSaveStyleProc P((Widget w, XEvent *event, String *prms,\r
390                          Cardinal *nprms));\r
391 void PeriodicUpdatesProc P((Widget w, XEvent *event, String *prms,\r
392                          Cardinal *nprms));\r
393 void PonderNextMoveProc P((Widget w, XEvent *event, String *prms,\r
394                            Cardinal *nprms));\r
395 void PopupMoveErrorsProc P((Widget w, XEvent *event, String *prms,\r
396                         Cardinal *nprms));\r
397 void PopupExitMessageProc P((Widget w, XEvent *event, String *prms,\r
398                              Cardinal *nprms));\r
399 void PremoveProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms));\r
400 void QuietPlayProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms));\r
401 void ShowCoordsProc P((Widget w, XEvent *event, String *prms,\r
402                        Cardinal *nprms));\r
403 void ShowThinkingProc P((Widget w, XEvent *event, String *prms,\r
404                          Cardinal *nprms));\r
405 void HideThinkingProc P((Widget w, XEvent *event, String *prms,\r
406                          Cardinal *nprms));\r
407 void TestLegalityProc P((Widget w, XEvent *event, String *prms,\r
408                           Cardinal *nprms));\r
409 void InfoProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms));\r
410 void ManProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms));\r
411 void HintProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms));\r
412 void BookProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms));\r
413 void AboutGameProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms));\r
414 void AboutProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms));\r
415 void DebugProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms));\r
416 void NothingProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms));\r
417 void Iconify P((Widget w, XEvent *event, String *prms, Cardinal *nprms));\r
418 void DisplayMove P((int moveNumber));\r
419 void DisplayTitle P((char *title));\r
420 void ICSInitScript P((void));\r
421 int LoadGamePopUp P((FILE *f, int gameNumber, char *title));\r
422 void ErrorPopUp P((char *title, char *text, int modal));\r
423 void ErrorPopDown P((void));\r
424 static char *ExpandPathName P((char *path));\r
425 static void CreateAnimVars P((void));\r
426 static void DragPieceBegin P((int x, int y));\r
427 static void DragPieceMove P((int x, int y));\r
428 static void DragPieceEnd P((int x, int y));\r
429 static void DrawDragPiece P((void));\r
430 char *ModeToWidgetName P((GameMode mode));\r
431 void EngineOutputUpdate( FrontEndProgramStats * stats );\r
432 void ShuffleMenuProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms));\r
433 void EngineMenuProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms));\r
434 void UciMenuProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms));\r
435 void TimeControlProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms));\r
436 void NewVariantProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms));\r
437 void FirstSettingsProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms));\r
438 void SecondSettingsProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms));\r
439 void ShufflePopDown P(());\r
440 void EnginePopDown P(());\r
441 void UciPopDown P(());\r
442 void TimeControlPopDown P(());\r
443 void NewVariantPopDown P(());\r
444 void SettingsPopDown P(());\r
445 /*\r
446 * XBoard depends on Xt R4 or higher\r
447 */\r
448 int xtVersion = XtSpecificationRelease;\r
449 \r
450 int xScreen;\r
451 Display *xDisplay;\r
452 Window xBoardWindow;\r
453 Pixel lightSquareColor, darkSquareColor, whitePieceColor, blackPieceColor,\r
454   jailSquareColor, highlightSquareColor, premoveHighlightColor;\r
455 GC lightSquareGC, darkSquareGC, jailSquareGC, lineGC, wdPieceGC, wlPieceGC,\r
456   bdPieceGC, blPieceGC, wbPieceGC, bwPieceGC, coordGC, highlineGC,\r
457   wjPieceGC, bjPieceGC, prelineGC, countGC;\r
458 Pixmap iconPixmap, wIconPixmap, bIconPixmap, xMarkPixmap;\r
459 Widget shellWidget, layoutWidget, formWidget, boardWidget, messageWidget, \r
460   whiteTimerWidget, blackTimerWidget, titleWidget, widgetList[16], \r
461   commentShell, promotionShell, whitePieceMenu, blackPieceMenu, dropMenu,\r
462   menuBarWidget, buttonBarWidget, editShell, errorShell, analysisShell,\r
463   ICSInputShell, fileNameShell, askQuestionShell;\r
464 XSegment gridSegments[(BOARD_SIZE + 1) * 2];\r
465 XSegment jailGridSegments[(BOARD_SIZE + 3) * 2];\r
466 Font clockFontID, coordFontID, countFontID;\r
467 XFontStruct *clockFontStruct, *coordFontStruct, *countFontStruct;\r
468 XtAppContext appContext;\r
469 char *layoutName;\r
470 char *oldICSInteractionTitle;\r
471 \r
472 FileProc fileProc;\r
473 char *fileOpenMode;\r
474 char installDir[] = "."; // [HGM] UCI: needed for UCI; probably needs run-time initializtion\r
475 \r
476 Position commentX = -1, commentY = -1;\r
477 Dimension commentW, commentH;\r
478 \r
479 int squareSize, smallLayout = 0, tinyLayout = 0,\r
480   marginW, marginH, // [HGM] for run-time resizing\r
481   fromX = -1, fromY = -1, toX, toY, commentUp = False, analysisUp = False,\r
482   ICSInputBoxUp = False, askQuestionUp = False,\r
483   filenameUp = False, promotionUp = False, pmFromX = -1, pmFromY = -1,\r
484   editUp = False, errorUp = False, errorExitStatus = -1, lineGap;\r
485 Pixel timerForegroundPixel, timerBackgroundPixel;\r
486 Pixel buttonForegroundPixel, buttonBackgroundPixel;\r
487 char *chessDir, *programName, *programVersion,\r
488   *gameCopyFilename, *gamePasteFilename;\r
489 \r
490 #define SOLID 0\r
491 #define OUTLINE 1\r
492 Pixmap pieceBitmap[2][(int)BlackPawn];\r
493 Pixmap xpmPieceBitmap[4][(int)BlackPawn];       /* LL, LD, DL, DD */\r
494 Pixmap xpmLightSquare, xpmDarkSquare, xpmJailSquare;\r
495 int useImages, useImageSqs;\r
496 XImage *ximPieceBitmap[4][(int)BlackPawn];      /* LL, LD, DL, DD */\r
497 Pixmap ximMaskPm[(int)BlackPawn];            /* clipmasks, used for XIM pieces */\r
498 XImage *ximLightSquare, *ximDarkSquare;\r
499 XImage *xim_Cross;\r
500 \r
501 #define pieceToSolid(piece) &pieceBitmap[SOLID][((int)(piece)) % (int)BlackPawn]\r
502 #define pieceToOutline(piece) &pieceBitmap[OUTLINE][((int)(piece)) % (int)BlackPawn]\r
503 \r
504 #define White(piece) ((int)(piece) < (int)BlackPawn)\r
505 \r
506 /* Variables for doing smooth animation. This whole thing\r
507    would be much easier if the board was double-buffered,\r
508    but that would require a fairly major rewrite.       */\r
509 \r
510 typedef struct {\r
511         Pixmap  saveBuf;\r
512         Pixmap  newBuf;\r
513         GC      blitGC, pieceGC, outlineGC;\r
514         XPoint  startSquare, prevFrame, mouseDelta;\r
515         int     startColor;\r
516         int     dragPiece;\r
517         Boolean dragActive;\r
518         int     startBoardX, startBoardY;\r
519     } AnimState;\r
520 \r
521 /* There can be two pieces being animated at once: a player\r
522    can begin dragging a piece before the remote opponent has moved. */\r
523 \r
524 static AnimState game, player;\r
525 \r
526 /* Bitmaps for use as masks when drawing XPM pieces.\r
527    Need one for each black and white piece.             */\r
528 static Pixmap xpmMask[BlackKing + 1];\r
529 \r
530 /* This magic number is the number of intermediate frames used\r
531    in each half of the animation. For short moves it's reduced\r
532    by 1. The total number of frames will be factor * 2 + 1.  */\r
533 #define kFactor    4\r
534 \r
535 SizeDefaults sizeDefaults[] = SIZE_DEFAULTS;\r
536 \r
537 MenuItem fileMenu[] = {\r
538     {N_("New Game"), ResetProc},\r
539     {N_("New Shuffle Game ..."), ShuffleMenuProc},\r
540     {N_("New Variant ..."), NewVariantProc},      // [HGM] variant: not functional yet\r
541     {"----", NothingProc},\r
542     {N_("Load Game"), LoadGameProc},\r
543     {N_("Load Next Game"), LoadNextGameProc},\r
544     {N_("Load Previous Game"), LoadPrevGameProc},\r
545     {N_("Reload Same Game"), ReloadGameProc},\r
546     {N_("Save Game"), SaveGameProc},\r
547     {"----", NothingProc},\r
548     {N_("Copy Game"), CopyGameProc},\r
549     {N_("Paste Game"), PasteGameProc},\r
550     {"----", NothingProc},\r
551     {N_("Load Position"), LoadPositionProc},\r
552     {N_("Load Next Position"), LoadNextPositionProc},\r
553     {N_("Load Previous Position"), LoadPrevPositionProc},\r
554     {N_("Reload Same Position"), ReloadPositionProc},\r
555     {N_("Save Position"), SavePositionProc},\r
556     {"----", NothingProc},\r
557     {N_("Copy Position"), CopyPositionProc},\r
558     {N_("Paste Position"), PastePositionProc},\r
559     {"----", NothingProc},\r
560     {N_("Mail Move"), MailMoveProc},\r
561     {N_("Reload CMail Message"), ReloadCmailMsgProc},\r
562     {"----", NothingProc},\r
563     {N_("Exit"), QuitProc},\r
564     {NULL, NULL}\r
565 };\r
566 \r
567 MenuItem modeMenu[] = {\r
568     {N_("Machine White"), MachineWhiteProc},\r
569     {N_("Machine Black"), MachineBlackProc},\r
570     {N_("Two Machines"), TwoMachinesProc},\r
571     {N_("Analysis Mode"), AnalyzeModeProc},\r
572     {N_("Analyze File"), AnalyzeFileProc },\r
573     {N_("ICS Client"), IcsClientProc},\r
574     {N_("Edit Game"), EditGameProc},\r
575     {N_("Edit Position"), EditPositionProc},\r
576     {N_("Training"), TrainingProc},\r
577     {"----", NothingProc},\r
578     {N_("Show Engine Output"), EngineOutputProc},\r
579     {N_("Show Evaluation Graph"), NothingProc}, // [HGM] evalgr: not functional yet\r
580     {N_("Show Game List"), ShowGameListProc},\r
581     {"Show Move History", HistoryShowProc}, // [HGM] hist: activate 4.2.7 code\r
582     {"----", NothingProc},\r
583     {N_("Edit Tags"), EditTagsProc},\r
584     {N_("Edit Comment"), EditCommentProc},\r
585     {N_("ICS Input Box"), IcsInputBoxProc},\r
586     {N_("Pause"), PauseProc},\r
587     {NULL, NULL}\r
588 };\r
589 \r
590 MenuItem actionMenu[] = {\r
591     {N_("Accept"), AcceptProc},\r
592     {N_("Decline"), DeclineProc},\r
593     {N_("Rematch"), RematchProc},\r
594     {"----", NothingProc},    \r
595     {N_("Call Flag"), CallFlagProc},\r
596     {N_("Draw"), DrawProc},\r
597     {N_("Adjourn"), AdjournProc},\r
598     {N_("Abort"), AbortProc},\r
599     {N_("Resign"), ResignProc},\r
600     {"----", NothingProc},    \r
601     {N_("Stop Observing"), StopObservingProc},\r
602     {N_("Stop Examining"), StopExaminingProc},\r
603     {NULL, NULL}\r
604 };\r
605 \r
606 MenuItem stepMenu[] = {\r
607     {N_("Backward"), BackwardProc},\r
608     {N_("Forward"), ForwardProc},\r
609     {N_("Back to Start"), ToStartProc},\r
610     {N_("Forward to End"), ToEndProc},\r
611     {N_("Revert"), RevertProc},\r
612     {N_("Truncate Game"), TruncateGameProc},\r
613     {"----", NothingProc},    \r
614     {N_("Move Now"), MoveNowProc},\r
615     {N_("Retract Move"), RetractMoveProc},\r
616     {NULL, NULL}\r
617 };    \r
618 \r
619 MenuItem optionsMenu[] = {\r
620     {N_("Flip View"), FlipViewProc},\r
621     {"----", NothingProc},    \r
622     {N_("Adjudications ..."), EngineMenuProc},    \r
623     {N_("General Settings ..."), UciMenuProc},    \r
624     {N_("Engine #1 Settings ..."), FirstSettingsProc},    \r
625     {N_("Engine #2 Settings ..."), SecondSettingsProc},    \r
626     {N_("Time Control ..."), TimeControlProc},    \r
627     {"----", NothingProc},    \r
628     {N_("Always Queen"), AlwaysQueenProc},\r
629     {N_("Animate Dragging"), AnimateDraggingProc},\r
630     {N_("Animate Moving"), AnimateMovingProc},\r
631     {N_("Auto Comment"), AutocommProc},\r
632     {N_("Auto Flag"), AutoflagProc},\r
633     {N_("Auto Flip View"), AutoflipProc},\r
634     {N_("Auto Observe"), AutobsProc},\r
635     {N_("Auto Raise Board"), AutoraiseProc},\r
636     {N_("Auto Save"), AutosaveProc},\r
637     {N_("Blindfold"), BlindfoldProc},\r
638     {N_("Flash Moves"), FlashMovesProc},\r
639     {N_("Get Move List"), GetMoveListProc},\r
640 #if HIGHDRAG\r
641     {N_("Highlight Dragging"), HighlightDraggingProc},\r
642 #endif\r
643     {N_("Highlight Last Move"), HighlightLastMoveProc},\r
644     {N_("Move Sound"), MoveSoundProc},\r
645     {N_("ICS Alarm"), IcsAlarmProc},\r
646     {N_("Old Save Style"), OldSaveStyleProc},\r
647     {N_("Periodic Updates"), PeriodicUpdatesProc},      \r
648     {N_("Ponder Next Move"), PonderNextMoveProc},\r
649     {N_("Popup Exit Message"), PopupExitMessageProc},   \r
650     {N_("Popup Move Errors"), PopupMoveErrorsProc},     \r
651     {N_("Premove"), PremoveProc},\r
652     {N_("Quiet Play"), QuietPlayProc},\r
653     {N_("Show Coords"), ShowCoordsProc},\r
654     {N_("Hide Thinking"), HideThinkingProc},\r
655     {N_("Test Legality"), TestLegalityProc},\r
656     {NULL, NULL}\r
657 };\r
658 \r
659 MenuItem helpMenu[] = {\r
660     {N_("Info XBoard"), InfoProc},\r
661     {N_("Man XBoard"), ManProc},\r
662     {"----", NothingProc},\r
663     {N_("Hint"), HintProc},\r
664     {N_("Book"), BookProc},\r
665     {"----", NothingProc},\r
666     {N_("About XBoard"), AboutProc},\r
667     {NULL, NULL}\r
668 };\r
669 \r
670 Menu menuBar[] = {\r
671     {N_("File"), fileMenu},\r
672     {N_("Mode"), modeMenu},\r
673     {N_("Action"), actionMenu},\r
674     {N_("Step"), stepMenu},\r
675     {N_("Options"), optionsMenu},\r
676     {N_("Help"), helpMenu},\r
677     {NULL, NULL}\r
678 };\r
679 \r
680 #define PAUSE_BUTTON N_("P")\r
681 MenuItem buttonBar[] = {\r
682     {"<<", ToStartProc},\r
683     {"<", BackwardProc},\r
684     {PAUSE_BUTTON, PauseProc},\r
685     {">", ForwardProc},\r
686     {">>", ToEndProc},\r
687     {NULL, NULL}\r
688 };\r
689 \r
690 #define PIECE_MENU_SIZE 11\r
691 String pieceMenuStrings[2][PIECE_MENU_SIZE] = {\r
692     { N_("White"), "----", N_("Pawn"), N_("Knight"), N_("Bishop"), N_("Rook"),\r
693       N_("Queen"), N_("King"), "----", N_("Empty square"), N_("Clear board") },\r
694     { N_("Black"), "----", N_("Pawn"), N_("Knight"), N_("Bishop"), N_("Rook"),\r
695       N_("Queen"), N_("King"), "----", N_("Empty square"), N_("Clear board") },  \r
696 };\r
697 /* must be in same order as PieceMenuStrings! */\r
698 ChessSquare pieceMenuTranslation[2][PIECE_MENU_SIZE] = {\r
699     { WhitePlay, (ChessSquare) 0, WhitePawn, WhiteKnight, WhiteBishop,\r
700         WhiteRook, WhiteQueen, WhiteKing,\r
701         (ChessSquare) 0, EmptySquare, ClearBoard },\r
702     { BlackPlay, (ChessSquare) 0, BlackPawn, BlackKnight, BlackBishop,\r
703         BlackRook, BlackQueen, BlackKing,\r
704         (ChessSquare) 0, EmptySquare, ClearBoard },\r
705 };\r
706 \r
707 #define DROP_MENU_SIZE 6\r
708 String dropMenuStrings[DROP_MENU_SIZE] = {\r
709     "----", N_("Pawn"), N_("Knight"), N_("Bishop"), N_("Rook"), N_("Queen")\r
710   };\r
711 /* must be in same order as PieceMenuStrings! */\r
712 ChessSquare dropMenuTranslation[DROP_MENU_SIZE] = {\r
713     (ChessSquare) 0, WhitePawn, WhiteKnight, WhiteBishop,\r
714     WhiteRook, WhiteQueen\r
715 };\r
716 \r
717 typedef struct {\r
718     char piece;\r
719     char* widget;\r
720 } DropMenuEnables;\r
721 \r
722 DropMenuEnables dmEnables[] = {\r
723     { 'P', "Pawn" },\r
724     { 'N', "Knight" },\r
725     { 'B', "Bishop" },\r
726     { 'R', "Rook" },\r
727     { 'Q', "Queen" }\r
728 };\r
729 \r
730 Arg shellArgs[] = {\r
731     { XtNwidth, 0 },\r
732     { XtNheight, 0 },\r
733     { XtNminWidth, 0 },\r
734     { XtNminHeight, 0 },\r
735     { XtNmaxWidth, 0 },\r
736     { XtNmaxHeight, 0 }\r
737 };\r
738 \r
739 Arg layoutArgs[] = {\r
740     { XtNborderWidth, 0 },\r
741     { XtNdefaultDistance, 0 },\r
742 };\r
743 \r
744 Arg formArgs[] = {\r
745     { XtNborderWidth, 0 },\r
746     { XtNresizable, (XtArgVal) True },\r
747 };\r
748 \r
749 Arg boardArgs[] = {\r
750     { XtNborderWidth, 0 },\r
751     { XtNwidth, 0 },\r
752     { XtNheight, 0 }\r
753 };\r
754 \r
755 Arg titleArgs[] = {\r
756     { XtNjustify, (XtArgVal) XtJustifyRight },\r
757     { XtNlabel, (XtArgVal) "..." },\r
758     { XtNresizable, (XtArgVal) True },\r
759     { XtNresize, (XtArgVal) False }\r
760 };\r
761 \r
762 Arg messageArgs[] = {\r
763     { XtNjustify, (XtArgVal) XtJustifyLeft },\r
764     { XtNlabel, (XtArgVal) "..." },\r
765     { XtNresizable, (XtArgVal) True },\r
766     { XtNresize, (XtArgVal) False }\r
767 };\r
768 \r
769 Arg timerArgs[] = {\r
770     { XtNborderWidth, 0 },\r
771     { XtNjustify, (XtArgVal) XtJustifyLeft }\r
772 };\r
773 \r
774 XtResource clientResources[] = {\r
775     { "whitePieceColor", "whitePieceColor", XtRString, sizeof(String),\r
776         XtOffset(AppDataPtr, whitePieceColor), XtRString,\r
777         WHITE_PIECE_COLOR },\r
778     { "blackPieceColor", "blackPieceColor", XtRString, sizeof(String),\r
779         XtOffset(AppDataPtr, blackPieceColor), XtRString,\r
780         BLACK_PIECE_COLOR },\r
781     { "lightSquareColor", "lightSquareColor", XtRString,\r
782         sizeof(String), XtOffset(AppDataPtr, lightSquareColor),\r
783         XtRString, LIGHT_SQUARE_COLOR }, \r
784     { "darkSquareColor", "darkSquareColor", XtRString, sizeof(String),\r
785         XtOffset(AppDataPtr, darkSquareColor), XtRString,\r
786         DARK_SQUARE_COLOR },\r
787     { "highlightSquareColor", "highlightSquareColor", XtRString,\r
788         sizeof(String), XtOffset(AppDataPtr, highlightSquareColor),\r
789         XtRString, HIGHLIGHT_SQUARE_COLOR },\r
790     { "premoveHighlightColor", "premoveHighlightColor", XtRString,\r
791         sizeof(String), XtOffset(AppDataPtr, premoveHighlightColor),\r
792         XtRString, PREMOVE_HIGHLIGHT_COLOR },\r
793     { "movesPerSession", "movesPerSession", XtRInt, sizeof(int),\r
794         XtOffset(AppDataPtr, movesPerSession), XtRImmediate,\r
795         (XtPointer) MOVES_PER_SESSION },\r
796     { "timeIncrement", "timeIncrement", XtRInt, sizeof(int),\r
797         XtOffset(AppDataPtr, timeIncrement), XtRImmediate,\r
798         (XtPointer) TIME_INCREMENT },\r
799     { "initString", "initString", XtRString, sizeof(String),\r
800         XtOffset(AppDataPtr, initString), XtRString, INIT_STRING },\r
801     { "secondInitString", "secondInitString", XtRString, sizeof(String),\r
802         XtOffset(AppDataPtr, secondInitString), XtRString, INIT_STRING },\r
803     { "firstComputerString", "firstComputerString", XtRString,\r
804         sizeof(String), XtOffset(AppDataPtr, firstComputerString), XtRString,\r
805       COMPUTER_STRING },\r
806     { "secondComputerString", "secondComputerString", XtRString,\r
807         sizeof(String), XtOffset(AppDataPtr, secondComputerString), XtRString,\r
808       COMPUTER_STRING },\r
809     { "firstChessProgram", "firstChessProgram", XtRString,\r
810         sizeof(String), XtOffset(AppDataPtr, firstChessProgram),\r
811         XtRString, FIRST_CHESS_PROGRAM },\r
812     { "secondChessProgram", "secondChessProgram", XtRString,\r
813         sizeof(String), XtOffset(AppDataPtr, secondChessProgram),\r
814         XtRString, SECOND_CHESS_PROGRAM },\r
815     { "firstPlaysBlack", "firstPlaysBlack", XtRBoolean,\r
816         sizeof(Boolean), XtOffset(AppDataPtr, firstPlaysBlack),\r
817         XtRImmediate, (XtPointer) False },\r
818     { "noChessProgram", "noChessProgram", XtRBoolean,\r
819         sizeof(Boolean), XtOffset(AppDataPtr, noChessProgram),\r
820         XtRImmediate, (XtPointer) False },\r
821     { "firstHost", "firstHost", XtRString, sizeof(String),\r
822         XtOffset(AppDataPtr, firstHost), XtRString, FIRST_HOST },\r
823     { "secondHost", "secondHost", XtRString, sizeof(String),\r
824         XtOffset(AppDataPtr, secondHost), XtRString, SECOND_HOST },\r
825     { "firstDirectory", "firstDirectory", XtRString, sizeof(String),\r
826         XtOffset(AppDataPtr, firstDirectory), XtRString, "." },\r
827     { "secondDirectory", "secondDirectory", XtRString, sizeof(String),\r
828         XtOffset(AppDataPtr, secondDirectory), XtRString, "." },\r
829     { "bitmapDirectory", "bitmapDirectory", XtRString,\r
830         sizeof(String), XtOffset(AppDataPtr, bitmapDirectory),\r
831         XtRString, "" },\r
832     { "remoteShell", "remoteShell", XtRString, sizeof(String),\r
833         XtOffset(AppDataPtr, remoteShell), XtRString, REMOTE_SHELL },\r
834     { "remoteUser", "remoteUser", XtRString, sizeof(String),\r
835         XtOffset(AppDataPtr, remoteUser), XtRString, "" },\r
836     { "timeDelay", "timeDelay", XtRFloat, sizeof(float),\r
837         XtOffset(AppDataPtr, timeDelay), XtRString,\r
838         (XtPointer) TIME_DELAY_QUOTE },\r
839     { "timeControl", "timeControl", XtRString, sizeof(String),\r
840         XtOffset(AppDataPtr, timeControl), XtRString,\r
841         (XtPointer) TIME_CONTROL },\r
842     { "internetChessServerMode", "internetChessServerMode",\r
843         XtRBoolean, sizeof(Boolean),\r
844         XtOffset(AppDataPtr, icsActive), XtRImmediate,\r
845         (XtPointer) False },\r
846     { "internetChessServerHost", "internetChessServerHost",\r
847         XtRString, sizeof(String),\r
848         XtOffset(AppDataPtr, icsHost),\r
849         XtRString, (XtPointer) ICS_HOST },\r
850     { "internetChessServerPort", "internetChessServerPort",\r
851         XtRString, sizeof(String),\r
852         XtOffset(AppDataPtr, icsPort), XtRString,\r
853         (XtPointer) ICS_PORT },\r
854     { "internetChessServerCommPort", "internetChessServerCommPort",\r
855         XtRString, sizeof(String),\r
856         XtOffset(AppDataPtr, icsCommPort), XtRString,\r
857         ICS_COMM_PORT },\r
858     { "internetChessServerLogonScript", "internetChessServerLogonScript",\r
859         XtRString, sizeof(String),\r
860         XtOffset(AppDataPtr, icsLogon), XtRString,\r
861         ICS_LOGON },\r
862     { "internetChessServerHelper", "internetChessServerHelper",\r
863         XtRString, sizeof(String),\r
864         XtOffset(AppDataPtr, icsHelper), XtRString, "" },\r
865     { "internetChessServerInputBox", "internetChessServerInputBox",\r
866         XtRBoolean, sizeof(Boolean),\r
867         XtOffset(AppDataPtr, icsInputBox), XtRImmediate,\r
868         (XtPointer) False },\r
869     { "icsAlarm", "icsAlarm",\r
870         XtRBoolean, sizeof(Boolean),\r
871         XtOffset(AppDataPtr, icsAlarm), XtRImmediate,\r
872         (XtPointer) True },\r
873     { "icsAlarmTime", "icsAlarmTime",\r
874         XtRInt, sizeof(int),\r
875         XtOffset(AppDataPtr, icsAlarmTime), XtRImmediate,\r
876         (XtPointer) 5000 },\r
877     { "useTelnet", "useTelnet", XtRBoolean, sizeof(Boolean),\r
878         XtOffset(AppDataPtr, useTelnet), XtRImmediate,\r
879         (XtPointer) False },\r
880     { "telnetProgram", "telnetProgram", XtRString, sizeof(String),\r
881         XtOffset(AppDataPtr, telnetProgram), XtRString, TELNET_PROGRAM },\r
882     { "gateway", "gateway", XtRString, sizeof(String),\r
883         XtOffset(AppDataPtr, gateway), XtRString, "" },\r
884     { "loadGameFile", "loadGameFile", XtRString, sizeof(String),\r
885         XtOffset(AppDataPtr, loadGameFile), XtRString, "" },\r
886     { "loadGameIndex", "loadGameIndex",\r
887         XtRInt, sizeof(int),\r
888         XtOffset(AppDataPtr, loadGameIndex), XtRImmediate,\r
889         (XtPointer) 0 },\r
890     { "saveGameFile", "saveGameFile", XtRString, sizeof(String),\r
891         XtOffset(AppDataPtr, saveGameFile), XtRString, "" },\r
892     { "autoRaiseBoard", "autoRaiseBoard", XtRBoolean,\r
893         sizeof(Boolean), XtOffset(AppDataPtr, autoRaiseBoard),\r
894         XtRImmediate, (XtPointer) True },\r
895     { "autoSaveGames", "autoSaveGames", XtRBoolean,\r
896         sizeof(Boolean), XtOffset(AppDataPtr, autoSaveGames),\r
897         XtRImmediate, (XtPointer) False },\r
898     { "blindfold", "blindfold", XtRBoolean,\r
899         sizeof(Boolean), XtOffset(AppDataPtr, blindfold),\r
900         XtRImmediate, (XtPointer) False },\r
901     { "loadPositionFile", "loadPositionFile", XtRString,\r
902         sizeof(String), XtOffset(AppDataPtr, loadPositionFile),\r
903         XtRString, "" },\r
904     { "loadPositionIndex", "loadPositionIndex",\r
905         XtRInt, sizeof(int),\r
906         XtOffset(AppDataPtr, loadPositionIndex), XtRImmediate,\r
907         (XtPointer) 1 },\r
908     { "savePositionFile", "savePositionFile", XtRString,\r
909         sizeof(String), XtOffset(AppDataPtr, savePositionFile),\r
910         XtRString, "" },\r
911     { "matchMode", "matchMode", XtRBoolean, sizeof(Boolean),\r
912         XtOffset(AppDataPtr, matchMode), XtRImmediate, (XtPointer) False },\r
913     { "matchGames", "matchGames", XtRInt, sizeof(int),\r
914         XtOffset(AppDataPtr, matchGames), XtRImmediate,\r
915         (XtPointer) 0 },\r
916     { "monoMode", "monoMode", XtRBoolean, sizeof(Boolean),\r
917         XtOffset(AppDataPtr, monoMode), XtRImmediate,\r
918         (XtPointer) False },\r
919     { "debugMode", "debugMode", XtRBoolean, sizeof(Boolean),\r
920         XtOffset(AppDataPtr, debugMode), XtRImmediate,\r
921         (XtPointer) False },\r
922     { "clockMode", "clockMode", XtRBoolean, sizeof(Boolean),\r
923         XtOffset(AppDataPtr, clockMode), XtRImmediate,\r
924         (XtPointer) True },\r
925     { "boardSize", "boardSize", XtRString, sizeof(String),\r
926         XtOffset(AppDataPtr, boardSize), XtRString, "" },\r
927     { "searchTime", "searchTime", XtRString, sizeof(String),\r
928         XtOffset(AppDataPtr, searchTime), XtRString,\r
929         (XtPointer) "" },\r
930     { "searchDepth", "searchDepth", XtRInt, sizeof(int),\r
931         XtOffset(AppDataPtr, searchDepth), XtRImmediate, \r
932         (XtPointer) 0 },\r
933     { "showCoords", "showCoords", XtRBoolean, sizeof(Boolean),\r
934         XtOffset(AppDataPtr, showCoords), XtRImmediate,\r
935         (XtPointer) False },\r
936     { "showJail", "showJail", XtRInt, sizeof(int),\r
937         XtOffset(AppDataPtr, showJail), XtRImmediate,\r
938         (XtPointer) 0 },\r
939     { "showThinking", "showThinking", XtRBoolean, sizeof(Boolean),\r
940         XtOffset(AppDataPtr, showThinking), XtRImmediate,\r
941         (XtPointer) True },\r
942     { "ponderNextMove", "ponderNextMove", XtRBoolean, sizeof(Boolean),\r
943         XtOffset(AppDataPtr, ponderNextMove), XtRImmediate,\r
944         (XtPointer) True },\r
945     { "periodicUpdates", "periodicUpdates", XtRBoolean, sizeof(Boolean),\r
946         XtOffset(AppDataPtr, periodicUpdates), XtRImmediate,\r
947         (XtPointer) True },\r
948     { "clockFont", "clockFont", XtRString, sizeof(String),\r
949         XtOffset(AppDataPtr, clockFont), XtRString, CLOCK_FONT },\r
950     { "coordFont", "coordFont", XtRString, sizeof(String),\r
951         XtOffset(AppDataPtr, coordFont), XtRString, COORD_FONT },\r
952     { "font", "font", XtRString, sizeof(String),\r
953         XtOffset(AppDataPtr, font), XtRString, DEFAULT_FONT },\r
954     { "ringBellAfterMoves", "ringBellAfterMoves",\r
955         XtRBoolean, sizeof(Boolean),\r
956         XtOffset(AppDataPtr, ringBellAfterMoves),\r
957         XtRImmediate, (XtPointer) False },\r
958     { "autoCallFlag", "autoCallFlag", XtRBoolean,\r
959         sizeof(Boolean), XtOffset(AppDataPtr, autoCallFlag),\r
960         XtRImmediate, (XtPointer) False },\r
961     { "autoFlipView", "autoFlipView", XtRBoolean,\r
962         sizeof(Boolean), XtOffset(AppDataPtr, autoFlipView),\r
963         XtRImmediate, (XtPointer) True },\r
964     { "autoObserve", "autoObserve", XtRBoolean,\r
965         sizeof(Boolean), XtOffset(AppDataPtr, autoObserve),\r
966         XtRImmediate, (XtPointer) False },\r
967     { "autoComment", "autoComment", XtRBoolean,\r
968         sizeof(Boolean), XtOffset(AppDataPtr, autoComment),\r
969         XtRImmediate, (XtPointer) False },\r
970     { "getMoveList", "getMoveList", XtRBoolean,\r
971         sizeof(Boolean), XtOffset(AppDataPtr, getMoveList),\r
972         XtRImmediate, (XtPointer) True },\r
973 #if HIGHDRAG\r
974     { "highlightDragging", "highlightDragging", XtRBoolean,\r
975         sizeof(Boolean), XtOffset(AppDataPtr, highlightDragging),\r
976         XtRImmediate, (XtPointer) False },\r
977 #endif\r
978     { "highlightLastMove", "highlightLastMove", XtRBoolean,\r
979         sizeof(Boolean), XtOffset(AppDataPtr, highlightLastMove),\r
980         XtRImmediate, (XtPointer) False },\r
981     { "premove", "premove", XtRBoolean,\r
982         sizeof(Boolean), XtOffset(AppDataPtr, premove),\r
983         XtRImmediate, (XtPointer) True },\r
984     { "testLegality", "testLegality", XtRBoolean,\r
985         sizeof(Boolean), XtOffset(AppDataPtr, testLegality),\r
986         XtRImmediate, (XtPointer) True },\r
987     { "flipView", "flipView", XtRBoolean,\r
988         sizeof(Boolean), XtOffset(AppDataPtr, flipView),\r
989         XtRImmediate, (XtPointer) False },\r
990     { "cmail", "cmailGameName", XtRString, sizeof(String),\r
991         XtOffset(AppDataPtr, cmailGameName), XtRString, "" },\r
992     { "alwaysPromoteToQueen", "alwaysPromoteToQueen", XtRBoolean,\r
993         sizeof(Boolean), XtOffset(AppDataPtr, alwaysPromoteToQueen),\r
994         XtRImmediate, (XtPointer) False },\r
995     { "oldSaveStyle", "oldSaveStyle", XtRBoolean,\r
996         sizeof(Boolean), XtOffset(AppDataPtr, oldSaveStyle),\r
997         XtRImmediate, (XtPointer) False },\r
998     { "quietPlay", "quietPlay", XtRBoolean,\r
999         sizeof(Boolean), XtOffset(AppDataPtr, quietPlay),\r
1000         XtRImmediate, (XtPointer) False },\r
1001     { "titleInWindow", "titleInWindow", XtRBoolean,\r
1002         sizeof(Boolean), XtOffset(AppDataPtr, titleInWindow),\r
1003         XtRImmediate, (XtPointer) False },\r
1004     { "localLineEditing", "localLineEditing", XtRBoolean,\r
1005         sizeof(Boolean), XtOffset(AppDataPtr, localLineEditing),\r
1006         XtRImmediate, (XtPointer) True }, /* not implemented, must be True */\r
1007 #ifdef ZIPPY\r
1008     { "zippyTalk", "zippyTalk", XtRBoolean,\r
1009         sizeof(Boolean), XtOffset(AppDataPtr, zippyTalk),\r
1010         XtRImmediate, (XtPointer) ZIPPY_TALK },\r
1011     { "zippyPlay", "zippyPlay", XtRBoolean,\r
1012         sizeof(Boolean), XtOffset(AppDataPtr, zippyPlay),\r
1013         XtRImmediate, (XtPointer) ZIPPY_PLAY },\r
1014     { "zippyLines", "zippyLines", XtRString, sizeof(String),\r
1015         XtOffset(AppDataPtr, zippyLines), XtRString, ZIPPY_LINES },\r
1016     { "zippyPinhead", "zippyPinhead", XtRString, sizeof(String),\r
1017         XtOffset(AppDataPtr, zippyPinhead), XtRString, ZIPPY_PINHEAD },\r
1018     { "zippyPassword", "zippyPassword", XtRString, sizeof(String),\r
1019         XtOffset(AppDataPtr, zippyPassword), XtRString, ZIPPY_PASSWORD },\r
1020     { "zippyPassword2", "zippyPassword2", XtRString, sizeof(String),\r
1021         XtOffset(AppDataPtr, zippyPassword2), XtRString, ZIPPY_PASSWORD2 },\r
1022     { "zippyWrongPassword", "zippyWrongPassword", XtRString, sizeof(String),\r
1023         XtOffset(AppDataPtr, zippyWrongPassword), XtRString,\r
1024         ZIPPY_WRONG_PASSWORD },\r
1025     { "zippyAcceptOnly", "zippyAcceptOnly", XtRString, sizeof(String),\r
1026         XtOffset(AppDataPtr, zippyAcceptOnly), XtRString, ZIPPY_ACCEPT_ONLY },\r
1027     { "zippyUseI", "zippyUseI", XtRBoolean,\r
1028         sizeof(Boolean), XtOffset(AppDataPtr, zippyUseI),\r
1029         XtRImmediate, (XtPointer) ZIPPY_USE_I },\r
1030     { "zippyBughouse", "zippyBughouse", XtRInt,\r
1031         sizeof(int), XtOffset(AppDataPtr, zippyBughouse),\r
1032         XtRImmediate, (XtPointer) ZIPPY_BUGHOUSE },\r
1033     { "zippyNoplayCrafty", "zippyNoplayCrafty", XtRBoolean,\r
1034         sizeof(Boolean), XtOffset(AppDataPtr, zippyNoplayCrafty),\r
1035         XtRImmediate, (XtPointer) ZIPPY_NOPLAY_CRAFTY },\r
1036     { "zippyGameEnd", "zippyGameEnd", XtRString, sizeof(String),\r
1037         XtOffset(AppDataPtr, zippyGameEnd), XtRString, ZIPPY_GAME_END },\r
1038     { "zippyGameStart", "zippyGameStart", XtRString, sizeof(String),\r
1039         XtOffset(AppDataPtr, zippyGameStart), XtRString, ZIPPY_GAME_START },\r
1040     { "zippyAdjourn", "zippyAdjourn", XtRBoolean,\r
1041         sizeof(Boolean), XtOffset(AppDataPtr, zippyAdjourn),\r
1042         XtRImmediate, (XtPointer) ZIPPY_ADJOURN },\r
1043     { "zippyAbort", "zippyAbort", XtRBoolean,\r
1044         sizeof(Boolean), XtOffset(AppDataPtr, zippyAbort),\r
1045         XtRImmediate, (XtPointer) ZIPPY_ABORT },\r
1046     { "zippyVariants", "zippyVariants", XtRString, sizeof(String),\r
1047         XtOffset(AppDataPtr, zippyVariants), XtRString, ZIPPY_VARIANTS },\r
1048     { "zippyMaxGames", "zippyMaxGames", XtRInt, sizeof(int),\r
1049         XtOffset(AppDataPtr, zippyMaxGames), XtRImmediate,\r
1050         (XtPointer) ZIPPY_MAX_GAMES },\r
1051     { "zippyReplayTimeout", "zippyReplayTimeout", XtRInt, sizeof(int),\r
1052         XtOffset(AppDataPtr, zippyReplayTimeout), XtRImmediate,\r
1053         (XtPointer) ZIPPY_REPLAY_TIMEOUT },\r
1054 #endif\r
1055     { "flashCount", "flashCount", XtRInt, sizeof(int),\r
1056         XtOffset(AppDataPtr, flashCount), XtRImmediate,\r
1057         (XtPointer) FLASH_COUNT  },\r
1058     { "flashRate", "flashRate", XtRInt, sizeof(int),\r
1059         XtOffset(AppDataPtr, flashRate), XtRImmediate,\r
1060         (XtPointer) FLASH_RATE },\r
1061     { "pixmapDirectory", "pixmapDirectory", XtRString,\r
1062         sizeof(String), XtOffset(AppDataPtr, pixmapDirectory),\r
1063         XtRString, "" },\r
1064     { "msLoginDelay", "msLoginDelay", XtRInt, sizeof(int),\r
1065         XtOffset(AppDataPtr, msLoginDelay), XtRImmediate,\r
1066         (XtPointer) MS_LOGIN_DELAY },\r
1067     { "colorizeMessages", "colorizeMessages", XtRBoolean,\r
1068         sizeof(Boolean), XtOffset(AppDataPtr, colorize),\r
1069         XtRImmediate, (XtPointer) False },      \r
1070     { "colorShout", "colorShout", XtRString,\r
1071         sizeof(String), XtOffset(AppDataPtr, colorShout),\r
1072         XtRString, COLOR_SHOUT },\r
1073     { "colorSShout", "colorSShout", XtRString,\r
1074         sizeof(String), XtOffset(AppDataPtr, colorSShout),\r
1075         XtRString, COLOR_SSHOUT },\r
1076     { "colorChannel1", "colorChannel1", XtRString,\r
1077         sizeof(String), XtOffset(AppDataPtr, colorChannel1),\r
1078         XtRString, COLOR_CHANNEL1 },\r
1079     { "colorChannel", "colorChannel", XtRString,\r
1080         sizeof(String), XtOffset(AppDataPtr, colorChannel),\r
1081         XtRString, COLOR_CHANNEL },\r
1082     { "colorKibitz", "colorKibitz", XtRString,\r
1083         sizeof(String), XtOffset(AppDataPtr, colorKibitz),\r
1084         XtRString, COLOR_KIBITZ },\r
1085     { "colorTell", "colorTell", XtRString,\r
1086         sizeof(String), XtOffset(AppDataPtr, colorTell),\r
1087         XtRString, COLOR_TELL },\r
1088     { "colorChallenge", "colorChallenge", XtRString,\r
1089         sizeof(String), XtOffset(AppDataPtr, colorChallenge),\r
1090         XtRString, COLOR_CHALLENGE },\r
1091     { "colorRequest", "colorRequest", XtRString,\r
1092         sizeof(String), XtOffset(AppDataPtr, colorRequest),\r
1093         XtRString, COLOR_REQUEST },\r
1094     { "colorSeek", "colorSeek", XtRString,\r
1095         sizeof(String), XtOffset(AppDataPtr, colorSeek),\r
1096         XtRString, COLOR_SEEK },\r
1097     { "colorNormal", "colorNormal", XtRString,\r
1098         sizeof(String), XtOffset(AppDataPtr, colorNormal),\r
1099         XtRString, COLOR_NORMAL },      \r
1100     { "soundProgram", "soundProgram", XtRString,\r
1101       sizeof(String), XtOffset(AppDataPtr, soundProgram),\r
1102       XtRString, "play" },\r
1103     { "soundShout", "soundShout", XtRString,\r
1104       sizeof(String), XtOffset(AppDataPtr, soundShout),\r
1105       XtRString, "" },\r
1106     { "soundSShout", "soundSShout", XtRString,\r
1107       sizeof(String), XtOffset(AppDataPtr, soundSShout),\r
1108       XtRString, "" },\r
1109     { "soundChannel1", "soundChannel1", XtRString,\r
1110       sizeof(String), XtOffset(AppDataPtr, soundChannel1),\r
1111       XtRString, "" },\r
1112     { "soundChannel", "soundChannel", XtRString,\r
1113       sizeof(String), XtOffset(AppDataPtr, soundChannel),\r
1114       XtRString, "" },\r
1115     { "soundKibitz", "soundKibitz", XtRString,\r
1116       sizeof(String), XtOffset(AppDataPtr, soundKibitz),\r
1117       XtRString, "" },\r
1118     { "soundTell", "soundTell", XtRString,\r
1119       sizeof(String), XtOffset(AppDataPtr, soundTell),\r
1120       XtRString, "" },\r
1121     { "soundChallenge", "soundChallenge", XtRString,\r
1122       sizeof(String), XtOffset(AppDataPtr, soundChallenge),\r
1123       XtRString, "" },\r
1124     { "soundRequest", "soundRequest", XtRString,\r
1125       sizeof(String), XtOffset(AppDataPtr, soundRequest),\r
1126       XtRString, "" },\r
1127     { "soundSeek", "soundSeek", XtRString,\r
1128       sizeof(String), XtOffset(AppDataPtr, soundSeek),\r
1129       XtRString, "" },\r
1130     { "soundMove", "soundMove", XtRString,\r
1131       sizeof(String), XtOffset(AppDataPtr, soundMove),\r
1132       XtRString, "$" },\r
1133     { "soundIcsWin", "soundIcsWin", XtRString,\r
1134       sizeof(String), XtOffset(AppDataPtr, soundIcsWin),\r
1135       XtRString, "" },\r
1136     { "soundIcsLoss", "soundIcsLoss", XtRString,\r
1137       sizeof(String), XtOffset(AppDataPtr, soundIcsLoss),\r
1138       XtRString, "" },\r
1139     { "soundIcsDraw", "soundIcsDraw", XtRString,\r
1140       sizeof(String), XtOffset(AppDataPtr, soundIcsDraw),\r
1141       XtRString, "" },\r
1142     { "soundIcsUnfinished", "soundIcsUnfinished", XtRString,\r
1143       sizeof(String), XtOffset(AppDataPtr, soundIcsUnfinished),\r
1144       XtRString, "" },\r
1145     { "soundIcsAlarm", "soundIcsAlarm", XtRString,\r
1146       sizeof(String), XtOffset(AppDataPtr, soundIcsAlarm),\r
1147       XtRString, "$" },\r
1148     { "reuseFirst", "reuseFirst", XtRBoolean,\r
1149         sizeof(Boolean), XtOffset(AppDataPtr, reuseFirst),\r
1150         XtRImmediate, (XtPointer) True },\r
1151     { "reuseSecond", "reuseSecond", XtRBoolean,\r
1152         sizeof(Boolean), XtOffset(AppDataPtr, reuseSecond),\r
1153         XtRImmediate, (XtPointer) True },\r
1154     { "animateDragging", "animateDragging", XtRBoolean,\r
1155         sizeof(Boolean), XtOffset(AppDataPtr, animateDragging),\r
1156         XtRImmediate, (XtPointer) True },\r
1157     { "animateMoving", "animateMoving", XtRBoolean,\r
1158         sizeof(Boolean), XtOffset(AppDataPtr, animate),\r
1159         XtRImmediate, (XtPointer) True },\r
1160     { "animateSpeed", "animateSpeed", XtRInt,\r
1161         sizeof(int), XtOffset(AppDataPtr, animSpeed),\r
1162         XtRImmediate, (XtPointer)10 },\r
1163     { "popupExitMessage", "popupExitMessage", XtRBoolean,\r
1164         sizeof(Boolean), XtOffset(AppDataPtr, popupExitMessage),\r
1165         XtRImmediate, (XtPointer) True },\r
1166     { "popupMoveErrors", "popupMoveErrors", XtRBoolean,\r
1167         sizeof(Boolean), XtOffset(AppDataPtr, popupMoveErrors),\r
1168         XtRImmediate, (XtPointer) False },\r
1169     { "fontSizeTolerance", "fontSizeTolerance", XtRInt,\r
1170         sizeof(int), XtOffset(AppDataPtr, fontSizeTolerance),\r
1171         XtRImmediate, (XtPointer)4 },\r
1172     { "initialMode", "initialMode", XtRString,\r
1173         sizeof(String), XtOffset(AppDataPtr, initialMode),\r
1174         XtRImmediate, (XtPointer) "" },\r
1175     { "variant", "variant", XtRString,\r
1176         sizeof(String), XtOffset(AppDataPtr, variant),\r
1177         XtRImmediate, (XtPointer) "normal" },\r
1178     { "firstProtocolVersion", "firstProtocolVersion", XtRInt,\r
1179         sizeof(int), XtOffset(AppDataPtr, firstProtocolVersion),\r
1180         XtRImmediate, (XtPointer)PROTOVER },\r
1181     { "secondProtocolVersion", "secondProtocolVersion", XtRInt,\r
1182         sizeof(int), XtOffset(AppDataPtr, secondProtocolVersion),\r
1183         XtRImmediate, (XtPointer)PROTOVER },\r
1184     { "showButtonBar", "showButtonBar", XtRBoolean,\r
1185         sizeof(Boolean), XtOffset(AppDataPtr, showButtonBar),\r
1186         XtRImmediate, (XtPointer) True },\r
1187     {"icsEngineAnalyze", "icsEngineAnalyze", XtRBoolean,        /* [DM] icsEngineAnalyze */\r
1188         sizeof(Boolean), XtOffset(AppDataPtr, icsEngineAnalyze),\r
1189         XtRImmediate, (XtPointer) False },\r
1190     { "firstScoreAbs", "firstScoreAbs", XtRBoolean,\r
1191         sizeof(Boolean), XtOffset(AppDataPtr, firstScoreIsAbsolute),\r
1192         XtRImmediate, (XtPointer) False },\r
1193     { "secondScoreAbs", "secondScoreAbs", XtRBoolean,\r
1194         sizeof(Boolean), XtOffset(AppDataPtr, secondScoreIsAbsolute),\r
1195         XtRImmediate, (XtPointer) False },\r
1196     { "pgnExtendedInfo", "pgnExtendedInfo", XtRBoolean,\r
1197         sizeof(Boolean), XtOffset(AppDataPtr, saveExtendedInfoInPGN),\r
1198         XtRImmediate, (XtPointer) False },\r
1199     { "hideThinkingFromHuman", "hideThinkingFromHuman", XtRBoolean,\r
1200         sizeof(Boolean), XtOffset(AppDataPtr, hideThinkingFromHuman),\r
1201         XtRImmediate, (XtPointer) True },\r
1202     { "adjudicateLossThreshold", "adjudicateLossThreshold", XtRInt,\r
1203         sizeof(int), XtOffset(AppDataPtr, adjudicateLossThreshold),\r
1204         XtRImmediate, (XtPointer) 0},\r
1205     { "pgnEventHeader", "pgnEventHeader", XtRString,\r
1206         sizeof(String), XtOffset(AppDataPtr, pgnEventHeader),\r
1207         XtRImmediate, (XtPointer) "Computer Chess Game" },    \r
1208     { "defaultFrcPosition", "defaultFrcPositon", XtRInt,\r
1209         sizeof(int), XtOffset(AppDataPtr, defaultFrcPosition),\r
1210         XtRImmediate, (XtPointer) -1},\r
1211 \r
1212     // [HGM] 4.3.xx options\r
1213     { "boardWidth", "boardWidth", XtRInt,\r
1214         sizeof(int), XtOffset(AppDataPtr, NrFiles),\r
1215         XtRImmediate, (XtPointer) -1},\r
1216     { "boardHeight", "boardHeight", XtRInt,\r
1217         sizeof(int), XtOffset(AppDataPtr, NrRanks),\r
1218         XtRImmediate, (XtPointer) -1},\r
1219     { "matchPause", "matchPause", XtRInt,\r
1220         sizeof(int), XtOffset(AppDataPtr, matchPause),\r
1221         XtRImmediate, (XtPointer) 10000},\r
1222     { "holdingsSize", "holdingsSize", XtRInt,\r
1223         sizeof(int), XtOffset(AppDataPtr, holdingsSize),\r
1224         XtRImmediate, (XtPointer) -1},\r
1225     { "flipBlack", "flipBlack", XtRBoolean,\r
1226         sizeof(Boolean), XtOffset(AppDataPtr, upsideDown),\r
1227         XtRImmediate, (XtPointer) False},\r
1228     { "allWhite", "allWhite", XtRBoolean,\r
1229         sizeof(Boolean), XtOffset(AppDataPtr, allWhite),\r
1230         XtRImmediate, (XtPointer) False},\r
1231     { "pieceToCharTable", "pieceToCharTable", XtRString,\r
1232         sizeof(String), XtOffset(AppDataPtr, pieceToCharTable),\r
1233         XtRImmediate, (XtPointer) 0},\r
1234     { "alphaRank", "alphaRank", XtRBoolean,\r
1235         sizeof(Boolean), XtOffset(AppDataPtr, alphaRank),\r
1236         XtRImmediate, (XtPointer) False},\r
1237     { "testClaims", "testClaims", XtRBoolean,\r
1238         sizeof(Boolean), XtOffset(AppDataPtr, testClaims),\r
1239         XtRImmediate, (XtPointer) True},\r
1240     { "checkMates", "checkMates", XtRBoolean,\r
1241         sizeof(Boolean), XtOffset(AppDataPtr, checkMates),\r
1242         XtRImmediate, (XtPointer) True},\r
1243     { "materialDraws", "materialDraws", XtRBoolean,\r
1244         sizeof(Boolean), XtOffset(AppDataPtr, materialDraws),\r
1245         XtRImmediate, (XtPointer) True},\r
1246     { "trivialDraws", "trivialDraws", XtRBoolean,\r
1247         sizeof(Boolean), XtOffset(AppDataPtr, trivialDraws),\r
1248         XtRImmediate, (XtPointer) False},\r
1249     { "ruleMoves", "ruleMoves", XtRInt,\r
1250         sizeof(int), XtOffset(AppDataPtr, ruleMoves),\r
1251         XtRImmediate, (XtPointer) 51},\r
1252     { "repeatsToDraw", "repeatsToDraw", XtRInt,\r
1253         sizeof(int), XtOffset(AppDataPtr, drawRepeats),\r
1254         XtRImmediate, (XtPointer) 6},\r
1255     { "engineDebugOutput", "engineDebugOutput", XtRInt,\r
1256         sizeof(int), XtOffset(AppDataPtr, engineComments),\r
1257         XtRImmediate, (XtPointer) 1},\r
1258     { "userName", "userName", XtRString,\r
1259         sizeof(int), XtOffset(AppDataPtr, userName),\r
1260         XtRImmediate, (XtPointer) 0},\r
1261     { "autoKibitz", "autoKibitz", XtRBoolean,\r
1262         sizeof(Boolean), XtOffset(AppDataPtr, autoKibitz),\r
1263         XtRImmediate, (XtPointer) False},\r
1264     { "firstTimeOdds", "firstTimeOdds", XtRInt,\r
1265         sizeof(int), XtOffset(AppDataPtr, firstTimeOdds),\r
1266         XtRImmediate, (XtPointer) 1},\r
1267     { "secondTimeOdds", "secondTimeOdds", XtRInt,\r
1268         sizeof(int), XtOffset(AppDataPtr, secondTimeOdds),\r
1269         XtRImmediate, (XtPointer) 1},\r
1270     { "timeOddsMode", "timeOddsMode", XtRInt,\r
1271         sizeof(int), XtOffset(AppDataPtr, timeOddsMode),\r
1272         XtRImmediate, (XtPointer) 0},\r
1273     { "firstAccumulateTC", "firstAccumulateTC", XtRInt,\r
1274         sizeof(int), XtOffset(AppDataPtr, firstAccumulateTC),\r
1275         XtRImmediate, (XtPointer) 1},\r
1276     { "secondAccumulateTC", "secondAccumulateTC", XtRInt,\r
1277         sizeof(int), XtOffset(AppDataPtr, secondAccumulateTC),\r
1278         XtRImmediate, (XtPointer) 1},\r
1279     { "firstNPS", "firstNPS", XtRInt,\r
1280         sizeof(int), XtOffset(AppDataPtr, firstNPS),\r
1281         XtRImmediate, (XtPointer) -1},\r
1282     { "secondNPS", "secondNPS", XtRInt,\r
1283         sizeof(int), XtOffset(AppDataPtr, secondNPS),\r
1284         XtRImmediate, (XtPointer) -1},\r
1285     { "serverMoves", "serverMoves", XtRString,\r
1286         sizeof(String), XtOffset(AppDataPtr, serverMovesName),\r
1287         XtRImmediate, (XtPointer) 0},\r
1288     { "serverPause", "serverPause", XtRInt,\r
1289         sizeof(int), XtOffset(AppDataPtr, serverPause),\r
1290         XtRImmediate, (XtPointer) 0},\r
1291     { "suppressLoadMoves", "suppressLoadMoves", XtRBoolean,\r
1292         sizeof(Boolean), XtOffset(AppDataPtr, suppressLoadMoves),\r
1293         XtRImmediate, (XtPointer) False},\r
1294     { "userName", "userName", XtRString,\r
1295         sizeof(String), XtOffset(AppDataPtr, userName),\r
1296         XtRImmediate, (XtPointer) 0},\r
1297     { "egtFormats", "egtFormats", XtRString,\r
1298         sizeof(String), XtOffset(AppDataPtr, egtFormats),\r
1299         XtRImmediate, (XtPointer) 0},\r
1300     { "rewindIndex", "rewindIndex", XtRInt,\r
1301         sizeof(int), XtOffset(AppDataPtr, rewindIndex),\r
1302         XtRImmediate, (XtPointer) 0},\r
1303     { "sameColorGames", "sameColorGames", XtRInt,\r
1304         sizeof(int), XtOffset(AppDataPtr, sameColorGames),\r
1305         XtRImmediate, (XtPointer) 0},\r
1306     { "smpCores", "smpCores", XtRInt,\r
1307         sizeof(int), XtOffset(AppDataPtr, smpCores),\r
1308         XtRImmediate, (XtPointer) 1},\r
1309     { "niceEngines", "niceEngines", XtRInt,\r
1310         sizeof(int), XtOffset(AppDataPtr, niceEngines),\r
1311         XtRImmediate, (XtPointer) 0},\r
1312 \r
1313     // [HGM] Winboard_x UCI options\r
1314     { "firstIsUCI", "firstIsUCI", XtRBoolean,\r
1315         sizeof(Boolean), XtOffset(AppDataPtr, firstIsUCI),\r
1316         XtRImmediate, (XtPointer) False},\r
1317     { "secondIsUCI", "secondIsUCI", XtRBoolean,\r
1318         sizeof(Boolean), XtOffset(AppDataPtr, secondIsUCI),\r
1319         XtRImmediate, (XtPointer) False},\r
1320     { "firstHasOwnBookUCI", "firstHasOwnBookUCI", XtRBoolean,\r
1321         sizeof(Boolean), XtOffset(AppDataPtr, firstHasOwnBookUCI),\r
1322         XtRImmediate, (XtPointer) True},\r
1323     { "secondHasOwnBookUCI", "secondHasOwnBookUCI", XtRBoolean,\r
1324         sizeof(Boolean), XtOffset(AppDataPtr, secondHasOwnBookUCI),\r
1325         XtRImmediate, (XtPointer) True},\r
1326     { "usePolyglotBook", "usePolyglotBook", XtRBoolean,\r
1327         sizeof(Boolean), XtOffset(AppDataPtr, usePolyglotBook),\r
1328         XtRImmediate, (XtPointer) False},\r
1329     { "defaultHashSize", "defaultHashSize", XtRInt,\r
1330         sizeof(int), XtOffset(AppDataPtr, defaultHashSize),\r
1331         XtRImmediate, (XtPointer) 64},\r
1332     { "defaultCacheSizeEGTB", "defaultCacheSizeEGTB", XtRInt,\r
1333         sizeof(int), XtOffset(AppDataPtr, defaultCacheSizeEGTB),\r
1334         XtRImmediate, (XtPointer) 4},\r
1335     { "polyglotDir", "polyglotDir", XtRString,\r
1336         sizeof(String), XtOffset(AppDataPtr, polyglotDir),\r
1337         XtRImmediate, (XtPointer) "." },\r
1338     { "polyglotBook", "polyglotBook", XtRString,\r
1339         sizeof(String), XtOffset(AppDataPtr, polyglotBook),\r
1340         XtRImmediate, (XtPointer) "" },    \r
1341     { "defaultPathEGTB", "defaultPathEGTB", XtRString,\r
1342         sizeof(String), XtOffset(AppDataPtr, defaultPathEGTB),\r
1343         XtRImmediate, (XtPointer) "/usr/local/share/egtb"},\r
1344     { "delayBeforeQuit", "delayBeforeQuit", XtRInt,\r
1345         sizeof(int), XtOffset(AppDataPtr, delayBeforeQuit),\r
1346         XtRImmediate, (XtPointer) 0},\r
1347     { "delayAfterQuit", "delayAfterQuit", XtRInt,\r
1348         sizeof(int), XtOffset(AppDataPtr, delayAfterQuit),\r
1349         XtRImmediate, (XtPointer) 0},\r
1350     { "nameOfDebugFile", "nameOfDebugFile", XtRString,\r
1351         sizeof(String), XtOffset(AppDataPtr, nameOfDebugFile),\r
1352         XtRImmediate, (XtPointer) "xboard.debug"},\r
1353     { "noGUI", "noGUI", XtRBoolean,\r
1354         sizeof(Boolean), XtOffset(AppDataPtr, noGUI),\r
1355         XtRImmediate, (XtPointer) 0},\r
1356 };\r
1357 \r
1358 XrmOptionDescRec shellOptions[] = {\r
1359     { "-whitePieceColor", "whitePieceColor", XrmoptionSepArg, NULL },\r
1360     { "-blackPieceColor", "blackPieceColor", XrmoptionSepArg, NULL },\r
1361     { "-lightSquareColor", "lightSquareColor", XrmoptionSepArg, NULL },\r
1362     { "-darkSquareColor", "darkSquareColor", XrmoptionSepArg, NULL },\r
1363     { "-highlightSquareColor", "highlightSquareColor", XrmoptionSepArg, NULL },\r
1364     { "-premoveHighlightColor", "premoveHighlightColor", XrmoptionSepArg,NULL},\r
1365     { "-movesPerSession", "movesPerSession", XrmoptionSepArg, NULL },\r
1366     { "-mps", "movesPerSession", XrmoptionSepArg, NULL },\r
1367     { "-timeIncrement", "timeIncrement", XrmoptionSepArg, NULL },\r
1368     { "-inc", "timeIncrement", XrmoptionSepArg, NULL },\r
1369     { "-initString", "initString", XrmoptionSepArg, NULL },\r
1370     { "-firstInitString", "initString", XrmoptionSepArg, NULL },\r
1371     { "-secondInitString", "secondInitString", XrmoptionSepArg, NULL },\r
1372     { "-firstComputerString", "firstComputerString", XrmoptionSepArg, NULL },\r
1373     { "-secondComputerString", "secondComputerString", XrmoptionSepArg, NULL },\r
1374     { "-firstChessProgram", "firstChessProgram", XrmoptionSepArg, NULL },\r
1375     { "-fcp", "firstChessProgram", XrmoptionSepArg, NULL },\r
1376     { "-secondChessProgram", "secondChessProgram", XrmoptionSepArg, NULL },\r
1377     { "-scp", "secondChessProgram", XrmoptionSepArg, NULL },\r
1378     { "-firstPlaysBlack", "firstPlaysBlack", XrmoptionSepArg, NULL },\r
1379     { "-fb", "firstPlaysBlack", XrmoptionNoArg, "True" },\r
1380     { "-xfb", "firstPlaysBlack", XrmoptionNoArg, "False" },\r
1381     { "-noChessProgram", "noChessProgram", XrmoptionSepArg, NULL },\r
1382     { "-ncp", "noChessProgram", XrmoptionNoArg, "True" },\r
1383     { "-xncp", "noChessProgram", XrmoptionNoArg, "False" },\r
1384     { "-firstHost", "firstHost", XrmoptionSepArg, NULL },\r
1385     { "-fh", "firstHost", XrmoptionSepArg, NULL },\r
1386     { "-secondHost", "secondHost", XrmoptionSepArg, NULL },\r
1387     { "-sh", "secondHost", XrmoptionSepArg, NULL },\r
1388     { "-firstDirectory", "firstDirectory", XrmoptionSepArg, NULL },\r
1389     { "-fd", "firstDirectory", XrmoptionSepArg, NULL },\r
1390     { "-secondDirectory", "secondDirectory", XrmoptionSepArg, NULL },\r
1391     { "-sd", "secondDirectory", XrmoptionSepArg, NULL },\r
1392     { "-bitmapDirectory", "bitmapDirectory", XrmoptionSepArg, NULL },\r
1393     { "-bm", "bitmapDirectory", XrmoptionSepArg, NULL },\r
1394     { "-remoteShell", "remoteShell", XrmoptionSepArg, NULL },\r
1395     { "-rsh", "remoteShell", XrmoptionSepArg, NULL },\r
1396     { "-remoteUser", "remoteUser", XrmoptionSepArg, NULL },\r
1397     { "-ruser", "remoteUser", XrmoptionSepArg, NULL },\r
1398     { "-timeDelay", "timeDelay", XrmoptionSepArg, NULL },\r
1399     { "-td", "timeDelay", XrmoptionSepArg, NULL },\r
1400     { "-timeControl", "timeControl", XrmoptionSepArg, NULL },\r
1401     { "-tc", "timeControl", XrmoptionSepArg, NULL },\r
1402     { "-internetChessServerMode", "internetChessServerMode",\r
1403         XrmoptionSepArg, NULL },\r
1404     { "-ics", "internetChessServerMode", XrmoptionNoArg, "True" },\r
1405     { "-xics", "internetChessServerMode", XrmoptionNoArg, "False" },\r
1406     { "-internetChessServerHost", "internetChessServerHost",\r
1407         XrmoptionSepArg, NULL },\r
1408     { "-icshost", "internetChessServerHost", XrmoptionSepArg, NULL },\r
1409     { "-internetChessServerPort", "internetChessServerPort",\r
1410         XrmoptionSepArg, NULL },\r
1411     { "-icsport", "internetChessServerPort", XrmoptionSepArg, NULL },\r
1412     { "-internetChessServerCommPort", "internetChessServerCommPort",\r
1413         XrmoptionSepArg, NULL },\r
1414     { "-icscomm", "internetChessServerCommPort", XrmoptionSepArg, NULL },\r
1415     { "-internetChessServerLogonScript", "internetChessServerLogonScript",\r
1416         XrmoptionSepArg, NULL },\r
1417     { "-icslogon", "internetChessServerLogonScript", XrmoptionSepArg, NULL },\r
1418     { "-internetChessServerHelper", "internetChessServerHelper",\r
1419         XrmoptionSepArg, NULL },\r
1420     { "-icshelper", "internetChessServerHelper", XrmoptionSepArg, NULL },\r
1421     { "-internetChessServerInputBox", "internetChessServerInputBox",\r
1422         XrmoptionSepArg, NULL },\r
1423     { "-icsinput", "internetChessServerInputBox", XrmoptionNoArg, "True" },\r
1424     { "-xicsinput", "internetChessServerInputBox", XrmoptionNoArg, "False" },\r
1425     { "-icsAlarm", "icsAlarm", XrmoptionSepArg, NULL },\r
1426     { "-alarm", "icsAlarm", XrmoptionNoArg, "True" },\r
1427     { "-xalarm", "icsAlarm", XrmoptionNoArg, "False" },\r
1428     { "-icsAlarmTime", "icsAlarmTime", XrmoptionSepArg, NULL },\r
1429     { "-useTelnet", "useTelnet", XrmoptionSepArg, NULL },\r
1430     { "-telnet", "useTelnet", XrmoptionNoArg, "True" },\r
1431     { "-xtelnet", "useTelnet", XrmoptionNoArg, "False" },\r
1432     { "-telnetProgram", "telnetProgram", XrmoptionSepArg, NULL },\r
1433     { "-gateway", "gateway", XrmoptionSepArg, NULL },\r
1434     { "-loadGameFile", "loadGameFile", XrmoptionSepArg, NULL },\r
1435     { "-lgf", "loadGameFile", XrmoptionSepArg, NULL },\r
1436     { "-loadGameIndex", "loadGameIndex", XrmoptionSepArg, NULL },\r
1437     { "-lgi", "loadGameIndex", XrmoptionSepArg, NULL },\r
1438     { "-saveGameFile", "saveGameFile", XrmoptionSepArg, NULL },\r
1439     { "-sgf", "saveGameFile", XrmoptionSepArg, NULL },\r
1440     { "-autoSaveGames", "autoSaveGames", XrmoptionSepArg, NULL },\r
1441     { "-autosave", "autoSaveGames", XrmoptionNoArg, "True" },\r
1442     { "-xautosave", "autoSaveGames", XrmoptionNoArg, "False" },\r
1443     { "-autoRaiseBoard", "autoRaiseBoard", XrmoptionSepArg, NULL },\r
1444     { "-autoraise", "autoRaiseBoard", XrmoptionNoArg, "True" },\r
1445     { "-xautoraise", "autoRaiseBoard", XrmoptionNoArg, "False" },\r
1446     { "-blindfold", "blindfold", XrmoptionSepArg, NULL },\r
1447     { "-blind", "blindfold", XrmoptionNoArg, "True" },\r
1448     { "-xblind", "blindfold", XrmoptionNoArg, "False" },\r
1449     { "-loadPositionFile", "loadPositionFile", XrmoptionSepArg, NULL },\r
1450     { "-lpf", "loadPositionFile", XrmoptionSepArg, NULL },\r
1451     { "-loadPositionIndex", "loadPositionIndex", XrmoptionSepArg, NULL },\r
1452     { "-lpi", "loadPositionIndex", XrmoptionSepArg, NULL },\r
1453     { "-savePositionFile", "savePositionFile", XrmoptionSepArg, NULL },\r
1454     { "-spf", "savePositionFile", XrmoptionSepArg, NULL },\r
1455     { "-matchMode", "matchMode", XrmoptionSepArg, NULL },\r
1456     { "-mm", "matchMode", XrmoptionNoArg, "True" },\r
1457     { "-xmm", "matchMode", XrmoptionNoArg, "False" },\r
1458     { "-matchGames", "matchGames", XrmoptionSepArg, NULL },\r
1459     { "-mg", "matchGames", XrmoptionSepArg, NULL },\r
1460     { "-monoMode", "monoMode", XrmoptionSepArg, NULL },\r
1461     { "-mono", "monoMode", XrmoptionNoArg, "True" },\r
1462     { "-xmono", "monoMode", XrmoptionNoArg, "False" },\r
1463     { "-debugMode", "debugMode", XrmoptionSepArg, NULL },\r
1464     { "-debug", "debugMode", XrmoptionNoArg, "True" },\r
1465     { "-xdebug", "debugMode", XrmoptionNoArg, "False" },\r
1466     { "-clockMode", "clockMode", XrmoptionSepArg, NULL },\r
1467     { "-clock", "clockMode", XrmoptionNoArg, "True" },\r
1468     { "-xclock", "clockMode", XrmoptionNoArg, "False" },\r
1469     { "-boardSize", "boardSize", XrmoptionSepArg, NULL },\r
1470     { "-size", "boardSize", XrmoptionSepArg, NULL },\r
1471     { "-searchTime", "searchTime", XrmoptionSepArg, NULL },\r
1472     { "-st", "searchTime", XrmoptionSepArg, NULL },\r
1473     { "-searchDepth", "searchDepth", XrmoptionSepArg, NULL },\r
1474     { "-depth", "searchDepth", XrmoptionSepArg, NULL },\r
1475     { "-showCoords", "showCoords", XrmoptionSepArg, NULL },\r
1476     { "-coords", "showCoords", XrmoptionNoArg, "True" },\r
1477     { "-xcoords", "showCoords", XrmoptionNoArg, "False" },\r
1478 #if JAIL\r
1479     { "-showJail", "showJail", XrmoptionSepArg, NULL },\r
1480     { "-jail", "showJail", XrmoptionNoArg, "1" },\r
1481     { "-sidejail", "showJail", XrmoptionNoArg, "2" },\r
1482     { "-xjail", "showJail", XrmoptionNoArg, "0" },\r
1483 #endif\r
1484     { "-showThinking", "showThinking", XrmoptionSepArg, NULL },\r
1485     { "-thinking", "showThinking", XrmoptionNoArg, "True" },\r
1486     { "-xthinking", "showThinking", XrmoptionNoArg, "False" },\r
1487     { "-ponderNextMove", "ponderNextMove", XrmoptionSepArg, NULL },\r
1488     { "-ponder", "ponderNextMove", XrmoptionNoArg, "True" },\r
1489     { "-xponder", "ponderNextMove", XrmoptionNoArg, "False" },\r
1490     { "-periodicUpdates", "periodicUpdates", XrmoptionSepArg, NULL },\r
1491     { "-periodic", "periodicUpdates", XrmoptionNoArg, "True" },\r
1492     { "-xperiodic", "periodicUpdates", XrmoptionNoArg, "False" },\r
1493     { "-clockFont", "clockFont", XrmoptionSepArg, NULL },\r
1494     { "-coordFont", "coordFont", XrmoptionSepArg, NULL },\r
1495     { "-font", "font", XrmoptionSepArg, NULL },\r
1496     { "-ringBellAfterMoves", "ringBellAfterMoves", XrmoptionSepArg, NULL },\r
1497     { "-bell", "ringBellAfterMoves", XrmoptionNoArg, "True" },\r
1498     { "-xbell", "ringBellAfterMoves", XrmoptionNoArg, "False" },\r
1499     { "-movesound", "ringBellAfterMoves", XrmoptionNoArg, "True" },\r
1500     { "-xmovesound", "ringBellAfterMoves", XrmoptionNoArg, "False" },\r
1501     { "-autoCallFlag", "autoCallFlag", XrmoptionSepArg, NULL },\r
1502     { "-autoflag", "autoCallFlag", XrmoptionNoArg, "True" },\r
1503     { "-xautoflag", "autoCallFlag", XrmoptionNoArg, "False" },\r
1504     { "-autoFlipView", "autoFlipView", XrmoptionSepArg, NULL },\r
1505     { "-autoflip", "autoFlipView", XrmoptionNoArg, "True" },\r
1506     { "-xautoflip", "autoFlipView", XrmoptionNoArg, "False" },\r
1507     { "-autoObserve", "autoObserve", XrmoptionSepArg, NULL },\r
1508     { "-autobs", "autoObserve", XrmoptionNoArg, "True" },\r
1509     { "-xautobs", "autoObserve", XrmoptionNoArg, "False" },\r
1510     { "-autoComment", "autoComment", XrmoptionSepArg, NULL },\r
1511     { "-autocomm", "autoComment", XrmoptionNoArg, "True" },\r
1512     { "-xautocomm", "autoComment", XrmoptionNoArg, "False" },\r
1513     { "-getMoveList", "getMoveList", XrmoptionSepArg, NULL },\r
1514     { "-moves", "getMoveList", XrmoptionNoArg, "True" },\r
1515     { "-xmoves", "getMoveList", XrmoptionNoArg, "False" },\r
1516 #if HIGHDRAG\r
1517     { "-highlightDragging", "highlightDragging", XrmoptionSepArg, NULL },\r
1518     { "-highdrag", "highlightDragging", XrmoptionNoArg, "True" },\r
1519     { "-xhighdrag", "highlightDragging", XrmoptionNoArg, "False" },\r
1520 #endif\r
1521     { "-highlightLastMove", "highlightLastMove", XrmoptionSepArg, NULL },\r
1522     { "-highlight", "highlightLastMove", XrmoptionNoArg, "True" },\r
1523     { "-xhighlight", "highlightLastMove", XrmoptionNoArg, "False" },\r
1524     { "-premove", "premove", XrmoptionSepArg, NULL },\r
1525     { "-pre", "premove", XrmoptionNoArg, "True" },\r
1526     { "-xpre", "premove", XrmoptionNoArg, "False" },\r
1527     { "-testLegality", "testLegality", XrmoptionSepArg, NULL },\r
1528     { "-legal", "testLegality", XrmoptionNoArg, "True" },\r
1529     { "-xlegal", "testLegality", XrmoptionNoArg, "False" },\r
1530     { "-flipView", "flipView", XrmoptionSepArg, NULL },\r
1531     { "-flip", "flipView", XrmoptionNoArg, "True" },\r
1532     { "-xflip", "flipView", XrmoptionNoArg, "False" },\r
1533     { "-cmail", "cmailGameName", XrmoptionSepArg, NULL },\r
1534     { "-alwaysPromoteToQueen", "alwaysPromoteToQueen",\r
1535         XrmoptionSepArg, NULL },\r
1536     { "-queen", "alwaysPromoteToQueen", XrmoptionNoArg, "True" },\r
1537     { "-xqueen", "alwaysPromoteToQueen", XrmoptionNoArg, "False" },\r
1538     { "-oldSaveStyle", "oldSaveStyle", XrmoptionSepArg, NULL },\r
1539     { "-oldsave", "oldSaveStyle", XrmoptionNoArg, "True" },\r
1540     { "-xoldsave", "oldSaveStyle", XrmoptionNoArg, "False" },\r
1541     { "-quietPlay", "quietPlay", XrmoptionSepArg, NULL },\r
1542     { "-quiet", "quietPlay", XrmoptionNoArg, "True" },\r
1543     { "-xquiet", "quietPlay", XrmoptionNoArg, "False" },\r
1544     { "-titleInWindow", "titleInWindow", XrmoptionSepArg, NULL },\r
1545     { "-title", "titleInWindow", XrmoptionNoArg, "True" },\r
1546     { "-xtitle", "titleInWindow", XrmoptionNoArg, "False" },\r
1547 #ifdef ZIPPY\r
1548     { "-zippyTalk", "zippyTalk", XrmoptionSepArg, NULL },\r
1549     { "-zt", "zippyTalk", XrmoptionNoArg, "True" },\r
1550     { "-xzt", "zippyTalk", XrmoptionNoArg, "False" },\r
1551     { "-zippyPlay", "zippyPlay", XrmoptionSepArg, NULL },\r
1552     { "-zp", "zippyPlay", XrmoptionNoArg, "True" },\r
1553     { "-xzp", "zippyPlay", XrmoptionNoArg, "False" },\r
1554     { "-zippyLines", "zippyLines", XrmoptionSepArg, NULL },\r
1555     { "-zippyPinhead", "zippyPinhead", XrmoptionSepArg, NULL },\r
1556     { "-zippyPassword", "zippyPassword", XrmoptionSepArg, NULL },\r
1557     { "-zippyPassword2", "zippyPassword2", XrmoptionSepArg, NULL },\r
1558     { "-zippyWrongPassword", "zippyWrongPassword", XrmoptionSepArg, NULL },\r
1559     { "-zippyAcceptOnly", "zippyAcceptOnly", XrmoptionSepArg, NULL },\r
1560     { "-zippyUseI", "zippyUseI", XrmoptionSepArg, NULL },\r
1561     { "-zui", "zippyUseI", XrmoptionNoArg, "True" },\r
1562     { "-xzui", "zippyUseI", XrmoptionNoArg, "False" },\r
1563     { "-zippyBughouse", "zippyBughouse", XrmoptionSepArg, NULL },\r
1564     { "-zippyNoplayCrafty", "zippyNoplayCrafty", XrmoptionSepArg, NULL },\r
1565     { "-znc", "zippyNoplayCrafty", XrmoptionNoArg, "True" },\r
1566     { "-xznc", "zippyNoplayCrafty", XrmoptionNoArg, "False" },\r
1567     { "-zippyGameEnd", "zippyGameEnd", XrmoptionSepArg, NULL },\r
1568     { "-zippyGameStart", "zippyGameStart", XrmoptionSepArg, NULL },\r
1569     { "-zippyAdjourn", "zippyAdjourn", XrmoptionSepArg, NULL },\r
1570     { "-zadj", "zippyAdjourn", XrmoptionNoArg, "True" },\r
1571     { "-xzadj", "zippyAdjourn", XrmoptionNoArg, "False" },\r
1572     { "-zippyAbort", "zippyAbort", XrmoptionSepArg, NULL },\r
1573     { "-zab", "zippyAbort", XrmoptionNoArg, "True" },\r
1574     { "-xzab", "zippyAbort", XrmoptionNoArg, "False" },\r
1575     { "-zippyVariants", "zippyVariants", XrmoptionSepArg, NULL },\r
1576     { "-zippyMaxGames", "zippyMaxGames", XrmoptionSepArg, NULL },\r
1577     { "-zippyReplayTimeout", "zippyReplayTimeout", XrmoptionSepArg, NULL },\r
1578 #endif\r
1579     { "-flashCount", "flashCount", XrmoptionSepArg, NULL },\r
1580     { "-flash", "flashCount", XrmoptionNoArg, "3" },\r
1581     { "-xflash", "flashCount", XrmoptionNoArg, "0" },\r
1582     { "-flashRate", "flashRate", XrmoptionSepArg, NULL },\r
1583     { "-pixmapDirectory", "pixmapDirectory", XrmoptionSepArg, NULL },\r
1584     { "-msLoginDelay", "msLoginDelay", XrmoptionSepArg, NULL },\r
1585     { "-pixmap", "pixmapDirectory", XrmoptionSepArg, NULL },\r
1586     { "-colorizeMessages", "colorizeMessages", XrmoptionSepArg, NULL },\r
1587     { "-colorize", "colorizeMessages", XrmoptionNoArg, "True" },\r
1588     { "-xcolorize", "colorizeMessages", XrmoptionNoArg, "False" },\r
1589     { "-colorShout", "colorShout", XrmoptionSepArg, NULL },\r
1590     { "-colorSShout", "colorSShout", XrmoptionSepArg, NULL },\r
1591     { "-colorCShout", "colorSShout", XrmoptionSepArg, NULL }, /*FICS name*/\r
1592     { "-colorChannel1", "colorChannel1", XrmoptionSepArg, NULL },\r
1593     { "-colorChannel", "colorChannel", XrmoptionSepArg, NULL },\r
1594     { "-colorKibitz", "colorKibitz", XrmoptionSepArg, NULL },\r
1595     { "-colorTell", "colorTell", XrmoptionSepArg, NULL },\r
1596     { "-colorChallenge", "colorChallenge", XrmoptionSepArg, NULL },\r
1597     { "-colorRequest", "colorRequest", XrmoptionSepArg, NULL },\r
1598     { "-colorSeek", "colorSeek", XrmoptionSepArg, NULL },\r
1599     { "-colorNormal", "colorNormal", XrmoptionSepArg, NULL },\r
1600     { "-soundProgram", "soundProgram", XrmoptionSepArg, NULL },\r
1601     { "-soundShout", "soundShout", XrmoptionSepArg, NULL },\r
1602     { "-soundSShout", "soundSShout", XrmoptionSepArg, NULL },\r
1603     { "-soundCShout", "soundSShout", XrmoptionSepArg, NULL }, /*FICS name*/\r
1604     { "-soundChannel1", "soundChannel1", XrmoptionSepArg, NULL },\r
1605     { "-soundChannel", "soundChannel", XrmoptionSepArg, NULL },\r
1606     { "-soundKibitz", "soundKibitz", XrmoptionSepArg, NULL },\r
1607     { "-soundTell", "soundTell", XrmoptionSepArg, NULL },\r
1608     { "-soundChallenge", "soundChallenge", XrmoptionSepArg, NULL },\r
1609     { "-soundRequest", "soundRequest", XrmoptionSepArg, NULL },\r
1610     { "-soundSeek", "soundSeek", XrmoptionSepArg, NULL },\r
1611     { "-soundMove", "soundMove", XrmoptionSepArg, NULL },\r
1612     { "-soundIcsWin", "soundIcsWin", XrmoptionSepArg, NULL },\r
1613     { "-soundIcsLoss", "soundIcsLoss", XrmoptionSepArg, NULL },\r
1614     { "-soundIcsDraw", "soundIcsDraw", XrmoptionSepArg, NULL },\r
1615     { "-soundIcsUnfinished", "soundIcsUnfinished", XrmoptionSepArg, NULL },\r
1616     { "-soundIcsAlarm", "soundIcsAlarm", XrmoptionSepArg, NULL },\r
1617     { "-reuseFirst", "reuseFirst", XrmoptionSepArg, NULL },\r
1618     { "-reuseChessPrograms", "reuseFirst", XrmoptionSepArg, NULL }, /*compat*/\r
1619     { "-reuse", "reuseFirst", XrmoptionNoArg, "True" },\r
1620     { "-xreuse", "reuseFirst", XrmoptionNoArg, "False" },\r
1621     { "-reuseSecond", "reuseSecond", XrmoptionSepArg, NULL },\r
1622     { "-reuse2", "reuseSecond", XrmoptionNoArg, "True" },\r
1623     { "-xreuse2", "reuseSecond", XrmoptionNoArg, "False" },\r
1624     { "-animateMoving", "animateMoving", XrmoptionSepArg, NULL },\r
1625     { "-animate", "animateMoving", XrmoptionNoArg, "True" },\r
1626     { "-xanimate", "animateMoving", XrmoptionNoArg, "False" },\r
1627     { "-animateDragging", "animateDragging", XrmoptionSepArg, NULL },\r
1628     { "-drag", "animateDragging", XrmoptionNoArg, "True" },\r
1629     { "-xdrag", "animateDragging", XrmoptionNoArg, "False" },\r
1630     { "-animateSpeed", "animateSpeed", XrmoptionSepArg, NULL },\r
1631     { "-popupExitMessage", "popupExitMessage", XrmoptionSepArg, NULL },\r
1632     { "-exit", "popupExitMessage", XrmoptionNoArg, "True" },\r
1633     { "-xexit", "popupExitMessage", XrmoptionNoArg, "False" },\r
1634     { "-popupMoveErrors", "popupMoveErrors", XrmoptionSepArg, NULL },\r
1635     { "-popup", "popupMoveErrors", XrmoptionNoArg, "True" },\r
1636     { "-xpopup", "popupMoveErrors", XrmoptionNoArg, "False" },\r
1637     { "-fontSizeTolerance", "fontSizeTolerance", XrmoptionSepArg, NULL },\r
1638     { "-initialMode", "initialMode", XrmoptionSepArg, NULL },\r
1639     { "-mode", "initialMode", XrmoptionSepArg, NULL },\r
1640     { "-variant", "variant", XrmoptionSepArg, NULL },\r
1641     { "-firstProtocolVersion", "firstProtocolVersion", XrmoptionSepArg, NULL },\r
1642     { "-secondProtocolVersion","secondProtocolVersion",XrmoptionSepArg, NULL },\r
1643     { "-showButtonBar", "showButtonBar", XrmoptionSepArg, NULL },\r
1644     { "-buttons", "showButtonBar", XrmoptionNoArg, "True" },\r
1645     { "-xbuttons", "showButtonBar", XrmoptionNoArg, "False" },\r
1646     /* [AS,HR] New features */\r
1647     { "-firstScoreAbs", "firstScoreAbs", XrmoptionSepArg, NULL },\r
1648     { "-secondScoreAbs", "secondScoreAbs", XrmoptionSepArg, NULL },\r
1649     { "-pgnExtendedInfo", "pgnExtendedInfo", XrmoptionSepArg, NULL },\r
1650     { "-hideThinkingFromHuman", "hideThinkingFromHuman", XrmoptionSepArg, NULL },\r
1651     { "-adjudicateLossThreshold", "adjudicateLossThreshold", XrmoptionSepArg, NULL },\r
1652     { "-pgnEventHeader", "pgnEventHeader", XrmoptionSepArg, NULL },\r
1653     { "-firstIsUCI", "firstIsUCI", XrmoptionSepArg, NULL },\r
1654     { "-secondIsUCI", "secondIsUCI", XrmoptionSepArg, NULL },\r
1655     { "-fUCI", "firstIsUCI", XrmoptionNoArg, "True" },\r
1656     { "-sUCI", "secondIsUCI", XrmoptionNoArg, "True" },\r
1657     { "-firstHasOwnBookUCI", "firstHasOwnBookUCI", XrmoptionSepArg, NULL },\r
1658     { "-secondHasOwnBookUCI", "secondHasOwnBookUCI", XrmoptionSepArg, NULL },\r
1659     { "-fNoOwnBookUCI", "firstHasOwnBookUCI", XrmoptionNoArg, "False" },\r
1660     { "-sNoOwnBookUCI", "secondHasOwnBookUCI", XrmoptionNoArg, "False" },\r
1661     { "-polyglotDir", "polyglotDir", XrmoptionSepArg, NULL },\r
1662     { "-usePolyglotBook", "usePolyglotBook", XrmoptionSepArg, NULL },\r
1663     { "-polyglotBook", "polyglotBook", XrmoptionSepArg, NULL },\r
1664     { "-defaultHashSize", "defaultHashSize", XrmoptionSepArg, NULL },\r
1665     { "-defaultCacheSizeEGTB", "defaultCacheSizeEGTB", XrmoptionSepArg, NULL },\r
1666     { "-defaultPathEGTB", "defaultPathEGTB", XrmoptionSepArg, NULL },\r
1667     { "-defaultFrcPosition", "defaultFrcPosition", XrmoptionSepArg, NULL },\r
1668     // [HGM] I am sure AS added many more options, but we have to fish them out, from the list in winboard.c\r
1669 \r
1670     /* [HGM,HR] User-selectable board size */\r
1671     { "-boardWidth", "boardWidth", XrmoptionSepArg, NULL }, \r
1672     { "-boardHeight", "boardHeight", XrmoptionSepArg, NULL }, \r
1673     { "-matchPause", "matchPause", XrmoptionSepArg, NULL }, \r
1674 \r
1675     /* [HGM] new arguments of 4.3.xx. All except first three are back-end options, which should work immediately */\r
1676     { "-holdingsSize", "holdingsSize", XrmoptionSepArg, NULL }, // requires extensive front-end changes to work\r
1677     { "-flipBlack", "flipBlack", XrmoptionSepArg, NULL },       // requires front-end changes to work\r
1678     { "-allWhite", "allWhite", XrmoptionSepArg, NULL },         // requires front-end changes to work\r
1679     { "-pieceToCharTable", "pieceToCharTable", XrmoptionSepArg, NULL }, \r
1680     { "-alphaRank", "alphaRank", XrmoptionSepArg, NULL }, \r
1681     { "-testClaims", "testClaims", XrmoptionSepArg, NULL }, \r
1682     { "-checkMates", "checkMates", XrmoptionSepArg, NULL }, \r
1683     { "-materialDraws", "materialDraws", XrmoptionSepArg, NULL }, \r
1684     { "-trivialDraws", "trivialDraws", XrmoptionSepArg, NULL }, \r
1685     { "-ruleMoves", "ruleMoves", XrmoptionSepArg, NULL }, \r
1686     { "-repeatsToDraw", "repeatsToDraw", XrmoptionSepArg, NULL },\r
1687     { "-engineDebugOutput", "engineDebugOutput", XrmoptionSepArg, NULL }, \r
1688     { "-userName", "userName", XrmoptionSepArg, NULL }, \r
1689     { "-autoKibitz", "autoKibitz", XrmoptionNoArg, "True" }, \r
1690     { "-firstTimeOdds", "firstTimeOdds", XrmoptionSepArg, NULL }, \r
1691     { "-secondTimeOdds", "secondTimeOdds", XrmoptionSepArg, NULL }, \r
1692     { "-timeOddsMode", "timeOddsMode", XrmoptionSepArg, NULL }, \r
1693     { "-firstAccumulateTC", "firstAccumulateTC", XrmoptionSepArg, NULL }, \r
1694     { "-secondAccumulateTC", "secondAccumulateTC", XrmoptionSepArg, NULL }, \r
1695     { "-firstNPS", "firstNPS", XrmoptionSepArg, NULL }, \r
1696     { "-secondNPS", "secondNPS", XrmoptionSepArg, NULL }, \r
1697     { "-serverMoves", "serverMoves", XrmoptionSepArg, NULL }, \r
1698     { "-serverPause", "serverPause", XrmoptionSepArg, NULL }, \r
1699     { "-suppressLoadMoves", "suppressLoadMoves", XrmoptionSepArg, NULL }, \r
1700     { "-egtFormats", "egtFormats", XrmoptionSepArg, NULL }, \r
1701     { "-userName", "userName", XrmoptionSepArg, NULL }, \r
1702     { "-smpCores", "smpCores", XrmoptionSepArg, NULL }, \r
1703     { "-sameColorGames", "sameColorGames", XrmoptionSepArg, NULL }, \r
1704     { "-rewindIndex", "rewindIndex", XrmoptionSepArg, NULL }, \r
1705     { "-niceEngines", "niceEngines", XrmoptionSepArg, NULL }, \r
1706     { "-delayBeforeQuit", "delayBeforeQuit", XrmoptionSepArg, NULL }, \r
1707     { "-delayAfterQuit", "delayAfterQuit", XrmoptionSepArg, NULL }, \r
1708     { "-nameOfDebugFile", "nameOfDebugFile", XrmoptionSepArg, NULL }, \r
1709     { "-noGUI", "noGUI", XrmoptionNoArg, "True" }, \r
1710 };\r
1711 \r
1712 \r
1713 XtActionsRec boardActions[] = {\r
1714     { "DrawPosition", DrawPositionProc },\r
1715     { "HandleUserMove", HandleUserMove },\r
1716     { "AnimateUserMove", AnimateUserMove },\r
1717     { "FileNameAction", FileNameAction },\r
1718     { "AskQuestionProc", AskQuestionProc },\r
1719     { "AskQuestionReplyAction", AskQuestionReplyAction },\r
1720     { "PieceMenuPopup", PieceMenuPopup },\r
1721     { "WhiteClock", WhiteClock },\r
1722     { "BlackClock", BlackClock },\r
1723     { "Iconify", Iconify },\r
1724     { "ResetProc", ResetProc },\r
1725     { "LoadGameProc", LoadGameProc },\r
1726     { "LoadNextGameProc", LoadNextGameProc },\r
1727     { "LoadPrevGameProc", LoadPrevGameProc },\r
1728     { "LoadSelectedProc", LoadSelectedProc },\r
1729     { "ReloadGameProc", ReloadGameProc },\r
1730     { "LoadPositionProc", LoadPositionProc },\r
1731     { "LoadNextPositionProc", LoadNextPositionProc },\r
1732     { "LoadPrevPositionProc", LoadPrevPositionProc },\r
1733     { "ReloadPositionProc", ReloadPositionProc },\r
1734     { "CopyPositionProc", CopyPositionProc },\r
1735     { "PastePositionProc", PastePositionProc },\r
1736     { "CopyGameProc", CopyGameProc },\r
1737     { "PasteGameProc", PasteGameProc },\r
1738     { "SaveGameProc", SaveGameProc },\r
1739     { "SavePositionProc", SavePositionProc },\r
1740     { "MailMoveProc", MailMoveProc },\r
1741     { "ReloadCmailMsgProc", ReloadCmailMsgProc },\r
1742     { "QuitProc", QuitProc },\r
1743     { "MachineWhiteProc", MachineWhiteProc },\r
1744     { "MachineBlackProc", MachineBlackProc },\r
1745     { "AnalysisModeProc", AnalyzeModeProc },\r
1746     { "AnalyzeFileProc", AnalyzeFileProc },\r
1747     { "TwoMachinesProc", TwoMachinesProc },\r
1748     { "IcsClientProc", IcsClientProc },\r
1749     { "EditGameProc", EditGameProc },\r
1750     { "EditPositionProc", EditPositionProc },\r
1751     { "TrainingProc", EditPositionProc },\r
1752     { "EngineOutputProc", EngineOutputProc}, // [HGM] Winboard_x engine-output window\r
1753     { "ShowGameListProc", ShowGameListProc },\r
1754     { "ShowMoveListProc", HistoryShowProc},\r
1755     { "EditTagsProc", EditCommentProc },\r
1756     { "EditCommentProc", EditCommentProc },\r
1757     { "IcsAlarmProc", IcsAlarmProc },\r
1758     { "IcsInputBoxProc", IcsInputBoxProc },\r
1759     { "PauseProc", PauseProc },\r
1760     { "AcceptProc", AcceptProc },\r
1761     { "DeclineProc", DeclineProc },\r
1762     { "RematchProc", RematchProc },\r
1763     { "CallFlagProc", CallFlagProc },\r
1764     { "DrawProc", DrawProc },\r
1765     { "AdjournProc", AdjournProc },\r
1766     { "AbortProc", AbortProc },\r
1767     { "ResignProc", ResignProc },\r
1768     { "EnterKeyProc", EnterKeyProc },\r
1769     { "StopObservingProc", StopObservingProc },\r
1770     { "StopExaminingProc", StopExaminingProc },\r
1771     { "BackwardProc", BackwardProc },\r
1772     { "ForwardProc", ForwardProc },\r
1773     { "ToStartProc", ToStartProc },\r
1774     { "ToEndProc", ToEndProc },\r
1775     { "RevertProc", RevertProc },\r
1776     { "TruncateGameProc", TruncateGameProc },\r
1777     { "MoveNowProc", MoveNowProc },\r
1778     { "RetractMoveProc", RetractMoveProc },\r
1779     { "AlwaysQueenProc", AlwaysQueenProc },\r
1780     { "AnimateDraggingProc", AnimateDraggingProc },\r
1781     { "AnimateMovingProc", AnimateMovingProc },\r
1782     { "AutoflagProc", AutoflagProc },\r
1783     { "AutoflipProc", AutoflipProc },\r
1784     { "AutobsProc", AutobsProc },\r
1785     { "AutoraiseProc", AutoraiseProc },\r
1786     { "AutosaveProc", AutosaveProc },\r
1787     { "BlindfoldProc", BlindfoldProc },\r
1788     { "FlashMovesProc", FlashMovesProc },\r
1789     { "FlipViewProc", FlipViewProc },\r
1790     { "GetMoveListProc", GetMoveListProc },\r
1791 #if HIGHDRAG\r
1792     { "HighlightDraggingProc", HighlightDraggingProc },\r
1793 #endif\r
1794     { "HighlightLastMoveProc", HighlightLastMoveProc },\r
1795     { "IcsAlarmProc", IcsAlarmProc },\r
1796     { "MoveSoundProc", MoveSoundProc },\r
1797     { "OldSaveStyleProc", OldSaveStyleProc },\r
1798     { "PeriodicUpdatesProc", PeriodicUpdatesProc },     \r
1799     { "PonderNextMoveProc", PonderNextMoveProc },\r
1800     { "PopupExitMessageProc", PopupExitMessageProc },   \r
1801     { "PopupMoveErrorsProc", PopupMoveErrorsProc },     \r
1802     { "PremoveProc", PremoveProc },\r
1803     { "QuietPlayProc", QuietPlayProc },\r
1804     { "ShowCoordsProc", ShowCoordsProc },\r
1805     { "ShowThinkingProc", ShowThinkingProc },\r
1806     { "HideThinkingProc", HideThinkingProc },\r
1807     { "TestLegalityProc", TestLegalityProc },\r
1808     { "InfoProc", InfoProc },\r
1809     { "ManProc", ManProc },\r
1810     { "HintProc", HintProc },\r
1811     { "BookProc", BookProc },\r
1812     { "AboutGameProc", AboutGameProc },\r
1813     { "AboutProc", AboutProc },\r
1814     { "DebugProc", DebugProc },\r
1815     { "NothingProc", NothingProc },\r
1816     { "CommentPopDown", (XtActionProc) CommentPopDown },\r
1817     { "EditCommentPopDown", (XtActionProc) EditCommentPopDown },\r
1818     { "TagsPopDown", (XtActionProc) TagsPopDown },\r
1819     { "ErrorPopDown", (XtActionProc) ErrorPopDown },\r
1820     { "ICSInputBoxPopDown", (XtActionProc) ICSInputBoxPopDown },\r
1821     { "AnalysisPopDown", (XtActionProc) AnalysisPopDown },\r
1822     { "FileNamePopDown", (XtActionProc) FileNamePopDown },\r
1823     { "AskQuestionPopDown", (XtActionProc) AskQuestionPopDown },\r
1824     { "GameListPopDown", (XtActionProc) GameListPopDown },\r
1825     { "PromotionPopDown", (XtActionProc) PromotionPopDown },\r
1826     { "HistoryPopDown", (XtActionProc) HistoryPopDown },\r
1827     { "EngineOutputPopDown", (XtActionProc) EngineOutputPopDown },\r
1828     { "ShufflePopDown", (XtActionProc) ShufflePopDown },\r
1829     { "EnginePopDown", (XtActionProc) EnginePopDown },\r
1830     { "UciPopDown", (XtActionProc) UciPopDown },\r
1831     { "TimeControlPopDown", (XtActionProc) TimeControlPopDown },\r
1832     { "NewVariantPopDown", (XtActionProc) NewVariantPopDown },\r
1833     { "SettingsPopDown", (XtActionProc) SettingsPopDown },\r
1834 };\r
1835      \r
1836 char globalTranslations[] =\r
1837   ":<Key>R: ResignProc() \n \\r
1838    :<Key>r: ResetProc() \n \\r
1839    :<Key>g: LoadGameProc() \n \\r
1840    :<Key>N: LoadNextGameProc() \n \\r
1841    :<Key>P: LoadPrevGameProc() \n \\r
1842    :<Key>Q: QuitProc() \n \\r
1843    :<Key>F: ToEndProc() \n \\r
1844    :<Key>f: ForwardProc() \n \\r
1845    :<Key>B: ToStartProc() \n \\r
1846    :<Key>b: BackwardProc() \n \\r
1847    :<Key>p: PauseProc() \n \\r
1848    :<Key>d: DrawProc() \n \\r
1849    :<Key>t: CallFlagProc() \n \\r
1850    :<Key>i: Iconify() \n \\r
1851    :<Key>c: Iconify() \n \\r
1852    :<Key>v: FlipViewProc() \n \\r
1853    <KeyDown>Control_L: BackwardProc() \n \\r
1854    <KeyUp>Control_L: ForwardProc() \n \\r
1855    <KeyDown>Control_R: BackwardProc() \n \\r
1856    <KeyUp>Control_R: ForwardProc() \n \\r
1857    Shift<Key>1: AskQuestionProc(\"Direct command\",\\r
1858                                 \"Send to chess program:\",,1) \n \\r
1859    Shift<Key>2: AskQuestionProc(\"Direct command\",\\r
1860                                 \"Send to second chess program:\",,2) \n";\r
1861 \r
1862 char boardTranslations[] =\r
1863    "<Btn1Down>: HandleUserMove() \n \\r
1864    <Btn1Up>: HandleUserMove() \n \\r
1865    <Btn1Motion>: AnimateUserMove() \n \\r
1866    Shift<Btn2Down>: XawPositionSimpleMenu(menuB) XawPositionSimpleMenu(menuD)\\r
1867                  PieceMenuPopup(menuB) \n \\r
1868    Any<Btn2Down>: XawPositionSimpleMenu(menuW) XawPositionSimpleMenu(menuD) \\r
1869                  PieceMenuPopup(menuW) \n \\r
1870    Shift<Btn3Down>: XawPositionSimpleMenu(menuW) XawPositionSimpleMenu(menuD)\\r
1871                  PieceMenuPopup(menuW) \n \\r
1872    Any<Btn3Down>: XawPositionSimpleMenu(menuB) XawPositionSimpleMenu(menuD) \\r
1873                  PieceMenuPopup(menuB) \n";\r
1874      \r
1875 char whiteTranslations[] = "<BtnDown>: WhiteClock()\n";\r
1876 char blackTranslations[] = "<BtnDown>: BlackClock()\n";\r
1877      \r
1878 char ICSInputTranslations[] =\r
1879     "<Key>Return: EnterKeyProc() \n";\r
1880 \r
1881 String xboardResources[] = {\r
1882     "*fileName*value.translations: #override\\n <Key>Return: FileNameAction()",\r
1883     "*question*value.translations: #override\\n <Key>Return: AskQuestionReplyAction()",\r
1884     "*errorpopup*translations: #override\\n <Key>Return: ErrorPopDown()",\r
1885     NULL\r
1886   };\r
1887      \r
1888 \r
1889 /* Max possible square size */\r
1890 #define MAXSQSIZE 256\r
1891 \r
1892 static int xpm_avail[MAXSQSIZE];\r
1893 \r
1894 #ifdef HAVE_DIR_STRUCT\r
1895 \r
1896 /* Extract piece size from filename */\r
1897 static int\r
1898 xpm_getsize(name, len, ext)\r
1899      char *name;\r
1900      int len;\r
1901      char *ext;\r
1902 {\r
1903     char *p, *d;\r
1904     char buf[10];\r
1905   \r
1906     if (len < 4)\r
1907       return 0;\r
1908 \r
1909     if ((p=strchr(name, '.')) == NULL ||\r
1910         StrCaseCmp(p+1, ext) != 0)\r
1911       return 0;\r
1912   \r
1913     p = name + 3;\r
1914     d = buf;\r
1915 \r
1916     while (*p && isdigit(*p))\r
1917       *(d++) = *(p++);\r
1918 \r
1919     *d = 0;\r
1920     return atoi(buf);\r
1921 }\r
1922 \r
1923 /* Setup xpm_avail */\r
1924 static int\r
1925 xpm_getavail(dirname, ext)\r
1926      char *dirname;\r
1927      char *ext;\r
1928 {\r
1929     DIR *dir;\r
1930     struct dirent *ent;\r
1931     int  i;\r
1932 \r
1933     for (i=0; i<MAXSQSIZE; ++i)\r
1934       xpm_avail[i] = 0;\r
1935 \r
1936     if (appData.debugMode)\r
1937       fprintf(stderr, "XPM dir:%s:ext:%s:\n", dirname, ext);\r
1938   \r
1939     dir = opendir(dirname);\r
1940     if (!dir)\r
1941       {\r
1942           fprintf(stderr, _("%s: Can't access XPM directory %s\n"), \r
1943                   programName, dirname);\r
1944           exit(1);\r
1945       }\r
1946   \r
1947     while ((ent=readdir(dir)) != NULL) {\r
1948         i = xpm_getsize(ent->d_name, NAMLEN(ent), ext);\r
1949         if (i > 0 && i < MAXSQSIZE)\r
1950           xpm_avail[i] = 1;\r
1951     }\r
1952 \r
1953     closedir(dir);\r
1954 \r
1955     return 0;\r
1956 }\r
1957 \r
1958 void\r
1959 xpm_print_avail(fp, ext)\r
1960      FILE *fp;\r
1961      char *ext;\r
1962 {\r
1963     int i;\r
1964 \r
1965     fprintf(fp, _("Available `%s' sizes:\n"), ext);\r
1966     for (i=1; i<MAXSQSIZE; ++i) {\r
1967         if (xpm_avail[i])\r
1968           printf("%d\n", i);\r
1969     }\r
1970 }\r
1971 \r
1972 /* Return XPM piecesize closest to size */\r
1973 int\r
1974 xpm_closest_to(dirname, size, ext)\r
1975      char *dirname;\r
1976      int size;\r
1977      char *ext;\r
1978 {\r
1979     int i;\r
1980     int sm_diff = MAXSQSIZE;\r
1981     int sm_index = 0;\r
1982     int diff;\r
1983   \r
1984     xpm_getavail(dirname, ext);\r
1985 \r
1986     if (appData.debugMode)\r
1987       xpm_print_avail(stderr, ext);\r
1988   \r
1989     for (i=1; i<MAXSQSIZE; ++i) {\r
1990         if (xpm_avail[i]) {\r
1991             diff = size - i;\r
1992             diff = (diff<0) ? -diff : diff;\r
1993             if (diff < sm_diff) {\r
1994                 sm_diff = diff;\r
1995                 sm_index = i;\r
1996             }\r
1997         }\r
1998     }\r
1999 \r
2000     if (!sm_index) {\r
2001         fprintf(stderr, _("Error: No `%s' files!\n"), ext);\r
2002         exit(1);\r
2003     }\r
2004 \r
2005     return sm_index;\r
2006 }\r
2007 #else   /* !HAVE_DIR_STRUCT */\r
2008 /* If we are on a system without a DIR struct, we can't\r
2009    read the directory, so we can't collect a list of\r
2010    filenames, etc., so we can't do any size-fitting. */\r
2011 int\r
2012 xpm_closest_to(dirname, size, ext)\r
2013      char *dirname;\r
2014      int size;\r
2015      char *ext;\r
2016 {\r
2017     fprintf(stderr, _("\\r
2018 Warning: No DIR structure found on this system --\n\\r
2019          Unable to autosize for XPM/XIM pieces.\n\\r
2020    Please report this error to frankm@hiwaay.net.\n\\r
2021    Include system type & operating system in message.\n"));\r
2022     return size;\r
2023 }\r
2024 #endif /* HAVE_DIR_STRUCT */\r
2025 \r
2026 static char *cnames[9] = { "black", "red", "green", "yellow", "blue",\r
2027                              "magenta", "cyan", "white" };\r
2028 typedef struct {\r
2029     int attr, bg, fg;\r
2030 } TextColors;\r
2031 TextColors textColors[(int)NColorClasses];\r
2032 \r
2033 /* String is: "fg, bg, attr". Which is 0, 1, 2 */\r
2034 static int\r
2035 parse_color(str, which)\r
2036      char *str;\r
2037      int which;\r
2038 {\r
2039     char *p, buf[100], *d;\r
2040     int i;\r
2041   \r
2042     if (strlen(str) > 99)       /* watch bounds on buf */\r
2043       return -1;\r
2044 \r
2045     p = str;\r
2046     d = buf;\r
2047     for (i=0; i<which; ++i) {\r
2048         p = strchr(p, ',');\r
2049         if (!p)\r
2050           return -1;\r
2051         ++p;\r
2052     }\r
2053 \r
2054     /* Could be looking at something like:\r
2055        black, , 1\r
2056        .. in which case we want to stop on a comma also */\r
2057     while (*p && *p != ',' && !isalpha(*p) && !isdigit(*p))\r
2058       ++p;\r
2059 \r
2060     if (*p == ',') {\r
2061         return -1;              /* Use default for empty field */\r
2062     }\r
2063     \r
2064     if (which == 2 || isdigit(*p))\r
2065       return atoi(p);\r
2066  \r
2067     while (*p && isalpha(*p))\r
2068       *(d++) = *(p++);\r
2069 \r
2070     *d = 0;\r
2071 \r
2072     for (i=0; i<8; ++i) {\r
2073         if (!StrCaseCmp(buf, cnames[i]))\r
2074           return which? (i+40) : (i+30);\r
2075     }\r
2076     if (!StrCaseCmp(buf, "default")) return -1;\r
2077 \r
2078     fprintf(stderr, _("%s: unrecognized color %s\n"), programName, buf);\r
2079     return -2;\r
2080 }\r
2081 \r
2082 static int\r
2083 parse_cpair(cc, str)\r
2084      ColorClass cc;\r
2085      char *str;\r
2086 {\r
2087     if ((textColors[(int)cc].fg=parse_color(str, 0)) == -2) {\r
2088         fprintf(stderr, _("%s: can't parse foreground color in `%s'\n"),\r
2089                 programName, str);\r
2090         return -1;\r
2091     }\r
2092 \r
2093     /* bg and attr are optional */\r
2094     textColors[(int)cc].bg = parse_color(str, 1);\r
2095     if ((textColors[(int)cc].attr = parse_color(str, 2)) < 0) {\r
2096         textColors[(int)cc].attr = 0;\r
2097     }\r
2098     return 0;\r
2099 }\r
2100 \r
2101 \r
2102 /* Arrange to catch delete-window events */\r
2103 Atom wm_delete_window;\r
2104 void\r
2105 CatchDeleteWindow(Widget w, String procname)\r
2106 {\r
2107   char buf[MSG_SIZ];\r
2108   XSetWMProtocols(xDisplay, XtWindow(w), &wm_delete_window, 1);\r
2109   sprintf(buf, "<Message>WM_PROTOCOLS: %s() \n", procname);\r
2110   XtAugmentTranslations(w, XtParseTranslationTable(buf));\r
2111 }\r
2112 \r
2113 void\r
2114 BoardToTop()\r
2115 {\r
2116   Arg args[16];\r
2117   XtSetArg(args[0], XtNiconic, False);\r
2118   XtSetValues(shellWidget, args, 1);\r
2119 \r
2120   XtPopup(shellWidget, XtGrabNone); /* Raise if lowered  */\r
2121 }\r
2122 \r
2123 #ifdef IDSIZES\r
2124   // eventually, all layout determining code should go into a subroutine, but until then IDSIZE remains undefined\r
2125 #else\r
2126 #define BoardSize int\r
2127 void InitDrawingSizes(BoardSize boardSize, int flags)\r
2128 {   // [HGM] resize is functional now, but for board format changes only (nr of ranks, files)\r
2129     Dimension timerWidth, boardWidth, boardHeight, w, h, sep, bor, wr, hr;\r
2130     Arg args[16];\r
2131     XtGeometryResult gres;\r
2132     int i;\r
2133 \r
2134     if(!formWidget) return;\r
2135 \r
2136     /*\r
2137      * Enable shell resizing.\r
2138      */\r
2139     shellArgs[0].value = (XtArgVal) &w;\r
2140     shellArgs[1].value = (XtArgVal) &h;\r
2141     XtGetValues(shellWidget, shellArgs, 2);\r
2142 \r
2143     shellArgs[4].value = 2*w; shellArgs[2].value = 10;\r
2144     shellArgs[5].value = 2*h; shellArgs[3].value = 10;\r
2145     XtSetValues(shellWidget, &shellArgs[2], 4);\r
2146 \r
2147     XtSetArg(args[0], XtNdefaultDistance, &sep);\r
2148     XtGetValues(formWidget, args, 1);\r
2149 \r
2150     boardWidth = lineGap + BOARD_WIDTH * (squareSize + lineGap);\r
2151     boardHeight = lineGap + BOARD_HEIGHT * (squareSize + lineGap);\r
2152     CreateGrid();\r
2153 \r
2154     XtSetArg(args[0], XtNwidth, boardWidth);\r
2155     XtSetArg(args[1], XtNheight, boardHeight);\r
2156     XtSetValues(boardWidget, args, 2);\r
2157 \r
2158     timerWidth = (boardWidth - sep) / 2;\r
2159     XtSetArg(args[0], XtNwidth, timerWidth);\r
2160     XtSetValues(whiteTimerWidget, args, 1);\r
2161     XtSetValues(blackTimerWidget, args, 1);\r
2162 \r
2163     XawFormDoLayout(formWidget, False);\r
2164 \r
2165     if (appData.titleInWindow) {\r
2166         i = 0;\r
2167         XtSetArg(args[i], XtNborderWidth, &bor); i++;\r
2168         XtSetArg(args[i], XtNheight, &h);  i++;\r
2169         XtGetValues(titleWidget, args, i);\r
2170         if (smallLayout) {\r
2171             w = boardWidth - 2*bor;\r
2172         } else {\r
2173             XtSetArg(args[0], XtNwidth, &w);\r
2174             XtGetValues(menuBarWidget, args, 1);\r
2175             w = boardWidth - w - sep - 2*bor - 2; // WIDTH_FUDGE\r
2176         }\r
2177 \r
2178         gres = XtMakeResizeRequest(titleWidget, w, h, &wr, &hr);\r
2179         if (gres != XtGeometryYes && appData.debugMode) {\r
2180             fprintf(stderr,\r
2181                     _("%s: titleWidget geometry error %d %d %d %d %d\n"),\r
2182                     programName, gres, w, h, wr, hr);\r
2183         }\r
2184     }\r
2185 \r
2186     XawFormDoLayout(formWidget, True);\r
2187 \r
2188     /*\r
2189      * Inhibit shell resizing.\r
2190      */\r
2191     shellArgs[0].value = w = (XtArgVal) boardWidth + marginW;\r
2192     shellArgs[1].value = h = (XtArgVal) boardHeight + marginH;\r
2193     shellArgs[4].value = shellArgs[2].value = w;\r
2194     shellArgs[5].value = shellArgs[3].value = h;\r
2195     XtSetValues(shellWidget, &shellArgs[0], 6);\r
2196 }\r
2197 #endif\r
2198 \r
2199 int\r
2200 main(argc, argv)\r
2201      int argc;\r
2202      char **argv;\r
2203 {\r
2204     int i, j, clockFontPxlSize, coordFontPxlSize, fontPxlSize;\r
2205     XSetWindowAttributes window_attributes;\r
2206     Arg args[16];\r
2207     Dimension timerWidth, boardWidth, boardHeight, w, h, sep, bor, wr, hr;\r
2208     XrmValue vFrom, vTo;\r
2209     XtGeometryResult gres;\r
2210     char *p;\r
2211     XrmDatabase xdb;\r
2212     int forceMono = False;\r
2213 #define INDIRECTION\r
2214 #ifdef INDIRECTION\r
2215     // [HGM] before anything else, expand any indirection files amongst options\r
2216     char *argvCopy[1000]; // 1000 seems enough\r
2217     char newArgs[10000];  // holds actual characters\r
2218     int k = 0;\r
2219 \r
2220     srandom(time(0)); // [HGM] book: make random truly random\r
2221 \r
2222     j = 0;\r
2223     for(i=0; i<argc; i++) {\r
2224         if(j >= 1000-2) { printf(_("too many arguments\n")); exit(-1); }\r
2225 //fprintf(stderr, "arg %s\n", argv[i]);\r
2226         if(argv[i][0] != '@') argvCopy[j++] = argv[i]; else {\r
2227             char c;\r
2228             FILE *f = fopen(argv[i]+1, "rb");\r
2229             if(f == NULL) { fprintf(stderr, _("ignore %s\n"), argv[i]); continue; } // do not expand non-existing\r
2230             argvCopy[j++] = newArgs + k; // get ready for first argument from file\r
2231             while((c = fgetc(f)) != EOF) { // each line of file inserts 1 argument in the list\r
2232                 if(c == '\n') {\r
2233                     if(j >= 1000-2) { printf(_("too many arguments\n")); exit(-1); }\r
2234                     newArgs[k++] = 0;  // terminate current arg\r
2235                     if(k >= 10000-1) { printf(_("too long arguments\n")); exit(-1); }\r
2236                     argvCopy[j++] = newArgs + k; // get ready for next\r
2237                 } else {\r
2238                     if(k >= 10000-1) { printf(_("too long arguments\n")); exit(-1); }\r
2239                     newArgs[k++] = c;\r
2240                 }\r
2241             }\r
2242             newArgs[k] = 0;\r
2243             j--;\r
2244             fclose(f);\r
2245         }\r
2246     }\r
2247     argvCopy[j] = NULL;\r
2248     argv = argvCopy;\r
2249     argc = j;\r
2250 #if 0\r
2251     if(appData.debugMode,1) { // OK, appData is not initialized here yet...\r
2252         for(i=0; i<argc; i++) fprintf(stderr, "argv[%2d] = '%s'\n", i, argv[i]);\r
2253     }\r
2254 #endif\r
2255 #endif\r
2256 \r
2257 \r
2258     setbuf(stdout, NULL);\r
2259     setbuf(stderr, NULL);\r
2260     debugFP = stderr;\r
2261     \r
2262     programName = strrchr(argv[0], '/');\r
2263     if (programName == NULL)\r
2264       programName = argv[0];\r
2265     else\r
2266       programName++;\r
2267 \r
2268 #ifdef ENABLE_NLS\r
2269     XtSetLanguageProc(NULL, NULL, NULL);\r
2270     bindtextdomain(PRODUCT, LOCALEDIR);\r
2271     bind_textdomain_codeset(PRODUCT, "UTF-8");\r
2272     textdomain(PRODUCT);\r
2273 #endif\r
2274 \r
2275     shellWidget =\r
2276       XtAppInitialize(&appContext, "XBoard", shellOptions,\r
2277                       XtNumber(shellOptions),\r
2278                       &argc, argv, xboardResources, NULL, 0);\r
2279     if (argc > 1) {\r
2280         fprintf(stderr, _("%s: unrecognized argument %s\n"),\r
2281                 programName, argv[1]);\r
2282         exit(2);\r
2283     }\r
2284     \r
2285     if ((chessDir = (char *) getenv("CHESSDIR")) == NULL) {\r
2286         chessDir = ".";\r
2287     } else {\r
2288         if (chdir(chessDir) != 0) {\r
2289             fprintf(stderr, _("%s: can't cd to CHESSDIR: "), programName);\r
2290             perror(chessDir);\r
2291             exit(1);\r
2292         }\r
2293     }\r
2294     \r
2295     p = getenv("HOME");\r
2296     if (p == NULL) p = "/tmp";\r
2297     i = strlen(p) + strlen("/.xboardXXXXXx.pgn") + 1;\r
2298     gameCopyFilename = (char*) malloc(i);\r
2299     gamePasteFilename = (char*) malloc(i);\r
2300     sprintf(gameCopyFilename, "%s/.xboard%05uc.pgn", p, getpid());\r
2301     sprintf(gamePasteFilename, "%s/.xboard%05up.pgn", p, getpid());\r
2302 \r
2303     XtGetApplicationResources(shellWidget, (XtPointer) &appData,\r
2304                               clientResources, XtNumber(clientResources),\r
2305                               NULL, 0);\r
2306 \r
2307     if (appData.debugMode && appData.nameOfDebugFile && strcmp(appData.nameOfDebugFile, "stderr")) {\r
2308         /* [DM] debug info to file [HGM] make the filename a command-line option, and allow it to remain stderr */\r
2309         if ((debugFP = fopen(appData.nameOfDebugFile, "w")) == NULL)  {\r
2310            printf(_("Failed to open file '%s'\n"), appData.nameOfDebugFile);\r
2311            exit(errno);\r
2312         }\r
2313         setbuf(debugFP, NULL);\r
2314     }\r
2315     \r
2316     /* [HGM,HR] make sure board size is acceptable */\r
2317     if(appData.NrFiles > BOARD_SIZE ||\r
2318        appData.NrRanks > BOARD_SIZE   )\r
2319          DisplayFatalError(_("Recompile with BOARD_SIZE > 12, to support this size"), 0, 2);\r
2320 \r
2321 #if !HIGHDRAG\r
2322     /* This feature does not work; animation needs a rewrite */\r
2323     appData.highlightDragging = FALSE;\r
2324 #endif\r
2325     InitBackEnd1();\r
2326 \r
2327     xDisplay = XtDisplay(shellWidget);\r
2328     xScreen = DefaultScreen(xDisplay);\r
2329     wm_delete_window = XInternAtom(xDisplay, "WM_DELETE_WINDOW", True);\r
2330 \r
2331         gameInfo.variant = StringToVariant(appData.variant);\r
2332         InitPosition(FALSE);\r
2333 #if 0\r
2334     /*\r
2335      * Determine boardSize\r
2336      */\r
2337     gameInfo.boardWidth = gameInfo.boardHeight = 8; // [HGM] boardsize: make sure we start as 8x8\r
2338 \r
2339 //#ifndef IDSIZE\r
2340     // [HGM] as long as we have not created the possibility to change size while running, start with requested size\r
2341     gameInfo.boardWidth    = appData.NrFiles > 0 ? appData.NrFiles : 8; \r
2342     gameInfo.boardHeight   = appData.NrRanks > 0 ? appData.NrRanks : 8;\r
2343     gameInfo.holdingsWidth = appData.holdingsSize > 0 ? 2 : 0;\r
2344 #endif\r
2345 \r
2346 \r
2347 #ifdef IDSIZE\r
2348     InitDrawingSizes(-1, 0); // [HGM] initsize: make this into a subroutine\r
2349 #else\r
2350     if (isdigit(appData.boardSize[0])) {\r
2351         i = sscanf(appData.boardSize, "%d,%d,%d,%d,%d,%d,%d", &squareSize,\r
2352                    &lineGap, &clockFontPxlSize, &coordFontPxlSize,\r
2353                    &fontPxlSize, &smallLayout, &tinyLayout);\r
2354         if (i == 0) {\r
2355             fprintf(stderr, _("%s: bad boardSize syntax %s\n"),\r
2356                     programName, appData.boardSize);\r
2357             exit(2);\r
2358         }\r
2359         if (i < 7) {\r
2360             /* Find some defaults; use the nearest known size */\r
2361             SizeDefaults *szd, *nearest;\r
2362             int distance = 99999;\r
2363             nearest = szd = sizeDefaults;\r
2364             while (szd->name != NULL) {\r
2365                 if (abs(szd->squareSize - squareSize) < distance) {\r
2366                     nearest = szd;\r
2367                     distance = abs(szd->squareSize - squareSize);\r
2368                     if (distance == 0) break;\r
2369                 }\r
2370                 szd++;\r
2371             }\r
2372             if (i < 2) lineGap = nearest->lineGap;\r
2373             if (i < 3) clockFontPxlSize = nearest->clockFontPxlSize;\r
2374             if (i < 4) coordFontPxlSize = nearest->coordFontPxlSize;\r
2375             if (i < 5) fontPxlSize = nearest->fontPxlSize;\r
2376             if (i < 6) smallLayout = nearest->smallLayout;\r
2377             if (i < 7) tinyLayout = nearest->tinyLayout;\r
2378         }\r
2379     } else {\r
2380         SizeDefaults *szd = sizeDefaults;\r
2381         if (*appData.boardSize == NULLCHAR) {\r
2382             while (DisplayWidth(xDisplay, xScreen) < szd->minScreenSize ||\r
2383                    DisplayHeight(xDisplay, xScreen) < szd->minScreenSize) {\r
2384               szd++;\r
2385             }\r
2386             if (szd->name == NULL) szd--;\r
2387         } else {\r
2388             while (szd->name != NULL &&\r
2389                    StrCaseCmp(szd->name, appData.boardSize) != 0) szd++;\r
2390             if (szd->name == NULL) {\r
2391                 fprintf(stderr, _("%s: unrecognized boardSize name %s\n"),\r
2392                         programName, appData.boardSize);\r
2393                 exit(2);\r
2394             }\r
2395         }\r
2396         squareSize = szd->squareSize;\r
2397         lineGap = szd->lineGap;\r
2398         clockFontPxlSize = szd->clockFontPxlSize;\r
2399         coordFontPxlSize = szd->coordFontPxlSize;\r
2400         fontPxlSize = szd->fontPxlSize;\r
2401         smallLayout = szd->smallLayout;\r
2402         tinyLayout = szd->tinyLayout;\r
2403     }\r
2404 \r
2405     /* Now, using squareSize as a hint, find a good XPM/XIM set size */\r
2406     if (strlen(appData.pixmapDirectory) > 0) {\r
2407         p = ExpandPathName(appData.pixmapDirectory);\r
2408         if (!p) {\r
2409             fprintf(stderr, _("Error expanding path name \"%s\"\n"),\r
2410                    appData.pixmapDirectory);\r
2411             exit(1);\r
2412         }\r
2413         if (appData.debugMode) {\r
2414           fprintf(stderr, _("\\r
2415 XBoard square size (hint): %d\n\\r
2416 %s fulldir:%s:\n"), squareSize, IMAGE_EXT, p);\r
2417         }\r
2418         squareSize = xpm_closest_to(p, squareSize, IMAGE_EXT);\r
2419         if (appData.debugMode) {\r
2420             fprintf(stderr, _("Closest %s size: %d\n"), IMAGE_EXT, squareSize);\r
2421         }\r
2422     }\r
2423                 \r
2424     /* [HR] height treated separately (hacked) */\r
2425     boardWidth = lineGap + BOARD_WIDTH * (squareSize + lineGap);\r
2426     boardHeight = lineGap + BOARD_HEIGHT * (squareSize + lineGap);\r
2427     if (appData.showJail == 1) {\r
2428         /* Jail on top and bottom */\r
2429         XtSetArg(boardArgs[1], XtNwidth, boardWidth);\r
2430         XtSetArg(boardArgs[2], XtNheight,\r
2431                  boardHeight + 2*(lineGap + squareSize));\r
2432     } else if (appData.showJail == 2) {\r
2433         /* Jail on sides */\r
2434         XtSetArg(boardArgs[1], XtNwidth,\r
2435                  boardWidth + 2*(lineGap + squareSize));\r
2436         XtSetArg(boardArgs[2], XtNheight, boardHeight);\r
2437     } else {\r
2438         /* No jail */\r
2439         XtSetArg(boardArgs[1], XtNwidth, boardWidth);\r
2440         XtSetArg(boardArgs[2], XtNheight, boardHeight);\r
2441     }\r
2442 \r
2443     /*\r
2444      * Determine what fonts to use.\r
2445      */\r
2446     appData.clockFont = FindFont(appData.clockFont, clockFontPxlSize);\r
2447     clockFontID = XLoadFont(xDisplay, appData.clockFont);\r
2448     clockFontStruct = XQueryFont(xDisplay, clockFontID);\r
2449     appData.coordFont = FindFont(appData.coordFont, coordFontPxlSize);\r
2450     coordFontID = XLoadFont(xDisplay, appData.coordFont);\r
2451     coordFontStruct = XQueryFont(xDisplay, coordFontID);\r
2452     appData.font = FindFont(appData.font, fontPxlSize);\r
2453     countFontID = XLoadFont(xDisplay, appData.coordFont); // [HGM] holdings\r
2454     countFontStruct = XQueryFont(xDisplay, countFontID);\r
2455 //    appData.font = FindFont(appData.font, fontPxlSize);\r
2456 \r
2457     xdb = XtDatabase(xDisplay);\r
2458     XrmPutStringResource(&xdb, "*font", appData.font);\r
2459 \r
2460     /*\r
2461      * Detect if there are not enough colors available and adapt.\r
2462      */\r
2463     if (DefaultDepth(xDisplay, xScreen) <= 2) {\r
2464       appData.monoMode = True;\r
2465     }\r
2466 \r
2467     if (!appData.monoMode) {\r
2468         vFrom.addr = (caddr_t) appData.lightSquareColor;\r
2469         vFrom.size = strlen(appData.lightSquareColor);\r
2470         XtConvert(shellWidget, XtRString, &vFrom, XtRPixel, &vTo);\r
2471         if (vTo.addr == NULL) {\r
2472           appData.monoMode = True;\r
2473           forceMono = True;\r
2474         } else {\r
2475           lightSquareColor = *(Pixel *) vTo.addr;\r
2476         }\r
2477     }\r
2478     if (!appData.monoMode) {\r
2479         vFrom.addr = (caddr_t) appData.darkSquareColor;\r
2480         vFrom.size = strlen(appData.darkSquareColor);\r
2481         XtConvert(shellWidget, XtRString, &vFrom, XtRPixel, &vTo);\r
2482         if (vTo.addr == NULL) {\r
2483           appData.monoMode = True;\r
2484           forceMono = True;\r
2485         } else {\r
2486           darkSquareColor = *(Pixel *) vTo.addr;\r
2487         }\r
2488     }\r
2489     if (!appData.monoMode) {\r
2490         vFrom.addr = (caddr_t) appData.whitePieceColor;\r
2491         vFrom.size = strlen(appData.whitePieceColor);\r
2492         XtConvert(shellWidget, XtRString, &vFrom, XtRPixel, &vTo);\r
2493         if (vTo.addr == NULL) {\r
2494           appData.monoMode = True;\r
2495           forceMono = True;\r
2496         } else {\r
2497           whitePieceColor = *(Pixel *) vTo.addr;\r
2498         }\r
2499     }\r
2500     if (!appData.monoMode) {\r
2501         vFrom.addr = (caddr_t) appData.blackPieceColor;\r
2502         vFrom.size = strlen(appData.blackPieceColor);\r
2503         XtConvert(shellWidget, XtRString, &vFrom, XtRPixel, &vTo);\r
2504         if (vTo.addr == NULL) {\r
2505           appData.monoMode = True;\r
2506           forceMono = True;\r
2507         } else {\r
2508           blackPieceColor = *(Pixel *) vTo.addr;\r
2509         }\r
2510     }\r
2511 \r
2512     if (!appData.monoMode) {\r
2513         vFrom.addr = (caddr_t) appData.highlightSquareColor;\r
2514         vFrom.size = strlen(appData.highlightSquareColor);\r
2515         XtConvert(shellWidget, XtRString, &vFrom, XtRPixel, &vTo);\r
2516         if (vTo.addr == NULL) {\r
2517           appData.monoMode = True;\r
2518           forceMono = True;\r
2519         } else {\r
2520           highlightSquareColor = *(Pixel *) vTo.addr;\r
2521         }\r
2522     }\r
2523 \r
2524     if (!appData.monoMode) {\r
2525         vFrom.addr = (caddr_t) appData.premoveHighlightColor;\r
2526         vFrom.size = strlen(appData.premoveHighlightColor);\r
2527         XtConvert(shellWidget, XtRString, &vFrom, XtRPixel, &vTo);\r
2528         if (vTo.addr == NULL) {\r
2529           appData.monoMode = True;\r
2530           forceMono = True;\r
2531         } else {\r
2532           premoveHighlightColor = *(Pixel *) vTo.addr;\r
2533         }\r
2534     }\r
2535 \r
2536     if (forceMono) {\r
2537       fprintf(stderr, _("%s: too few colors available; trying monochrome mode\n"),\r
2538               programName);\r
2539     }\r
2540 \r
2541     if (appData.monoMode && appData.debugMode) {\r
2542         fprintf(stderr, _("white pixel = 0x%lx, black pixel = 0x%lx\n"),\r
2543                 (unsigned long) XWhitePixel(xDisplay, xScreen),\r
2544                 (unsigned long) XBlackPixel(xDisplay, xScreen));\r
2545     }\r
2546     \r
2547     if (parse_cpair(ColorShout, appData.colorShout) < 0 ||\r
2548         parse_cpair(ColorSShout, appData.colorSShout) < 0 ||\r
2549         parse_cpair(ColorChannel1, appData.colorChannel1) < 0  ||\r
2550         parse_cpair(ColorChannel, appData.colorChannel) < 0  ||\r
2551         parse_cpair(ColorKibitz, appData.colorKibitz) < 0 ||\r
2552         parse_cpair(ColorTell, appData.colorTell) < 0 ||\r
2553         parse_cpair(ColorChallenge, appData.colorChallenge) < 0  ||\r
2554         parse_cpair(ColorRequest, appData.colorRequest) < 0  ||\r
2555         parse_cpair(ColorSeek, appData.colorSeek) < 0  ||\r
2556         parse_cpair(ColorNormal, appData.colorNormal) < 0)\r
2557       {\r
2558           if (appData.colorize) {\r
2559               fprintf(stderr,\r
2560                       _("%s: can't parse color names; disabling colorization\n"),\r
2561                       programName);\r
2562           }\r
2563           appData.colorize = FALSE;\r
2564       }\r
2565     textColors[ColorNone].fg = textColors[ColorNone].bg = -1;\r
2566     textColors[ColorNone].attr = 0;\r
2567     \r
2568     XtAppAddActions(appContext, boardActions, XtNumber(boardActions));\r
2569     \r
2570     /*\r
2571      * widget hierarchy\r
2572      */\r
2573     if (tinyLayout) {\r
2574         layoutName = "tinyLayout";\r
2575     } else if (smallLayout) {\r
2576         layoutName = "smallLayout";\r
2577     } else {\r
2578         layoutName = "normalLayout";\r
2579     }\r
2580     /* Outer layoutWidget is there only to provide a name for use in\r
2581        resources that depend on the layout style */\r
2582     layoutWidget =\r
2583       XtCreateManagedWidget(layoutName, formWidgetClass, shellWidget,\r
2584                             layoutArgs, XtNumber(layoutArgs));\r
2585     formWidget =\r
2586       XtCreateManagedWidget("form", formWidgetClass, layoutWidget,\r
2587                             formArgs, XtNumber(formArgs));\r
2588     XtSetArg(args[0], XtNdefaultDistance, &sep);\r
2589     XtGetValues(formWidget, args, 1);\r
2590 \r
2591     j = 0;\r
2592     widgetList[j++] = menuBarWidget = CreateMenuBar(menuBar);\r
2593     XtSetArg(args[0], XtNtop,    XtChainTop);\r
2594     XtSetArg(args[1], XtNbottom, XtChainTop);\r
2595     XtSetValues(menuBarWidget, args, 2);\r
2596 \r
2597     widgetList[j++] = whiteTimerWidget =\r
2598       XtCreateWidget("whiteTime", labelWidgetClass,\r
2599                      formWidget, timerArgs, XtNumber(timerArgs));\r
2600     XtSetArg(args[0], XtNfont, clockFontStruct);\r
2601     XtSetArg(args[1], XtNtop,    XtChainTop);\r
2602     XtSetArg(args[2], XtNbottom, XtChainTop);\r
2603     XtSetValues(whiteTimerWidget, args, 3);\r
2604     \r
2605     widgetList[j++] = blackTimerWidget =\r
2606       XtCreateWidget("blackTime", labelWidgetClass,\r
2607                      formWidget, timerArgs, XtNumber(timerArgs));\r
2608     XtSetArg(args[0], XtNfont, clockFontStruct);\r
2609     XtSetArg(args[1], XtNtop,    XtChainTop);\r
2610     XtSetArg(args[2], XtNbottom, XtChainTop);\r
2611     XtSetValues(blackTimerWidget, args, 3);\r
2612     \r
2613     if (appData.titleInWindow) {\r
2614         widgetList[j++] = titleWidget = \r
2615           XtCreateWidget("title", labelWidgetClass, formWidget,\r
2616                          titleArgs, XtNumber(titleArgs));\r
2617         XtSetArg(args[0], XtNtop,    XtChainTop);\r
2618         XtSetArg(args[1], XtNbottom, XtChainTop);\r
2619         XtSetValues(titleWidget, args, 2);\r
2620     }\r
2621 \r
2622     if (appData.showButtonBar) {\r
2623       widgetList[j++] = buttonBarWidget = CreateButtonBar(buttonBar);\r
2624       XtSetArg(args[0], XtNleft,  XtChainRight); // [HGM] glue to right window edge\r
2625       XtSetArg(args[1], XtNright, XtChainRight); //       for good run-time sizing\r
2626       XtSetArg(args[2], XtNtop,    XtChainTop);\r
2627       XtSetArg(args[3], XtNbottom, XtChainTop);\r
2628       XtSetValues(buttonBarWidget, args, 4);\r
2629     }\r
2630 \r
2631     widgetList[j++] = messageWidget =\r
2632       XtCreateWidget("message", labelWidgetClass, formWidget,\r
2633                      messageArgs, XtNumber(messageArgs));\r
2634     XtSetArg(args[0], XtNtop,    XtChainTop);\r
2635     XtSetArg(args[1], XtNbottom, XtChainTop);\r
2636     XtSetValues(messageWidget, args, 2);\r
2637 \r
2638     widgetList[j++] = boardWidget =\r
2639       XtCreateWidget("board", widgetClass, formWidget, boardArgs,\r
2640                      XtNumber(boardArgs));\r
2641 \r
2642     XtManageChildren(widgetList, j);\r
2643     \r
2644     timerWidth = (boardWidth - sep) / 2;\r
2645     XtSetArg(args[0], XtNwidth, timerWidth);\r
2646     XtSetValues(whiteTimerWidget, args, 1);\r
2647     XtSetValues(blackTimerWidget, args, 1);\r
2648     \r
2649     XtSetArg(args[0], XtNbackground, &timerBackgroundPixel);\r
2650     XtSetArg(args[1], XtNforeground, &timerForegroundPixel);\r
2651     XtGetValues(whiteTimerWidget, args, 2);\r
2652     \r
2653     if (appData.showButtonBar) {\r
2654       XtSetArg(args[0], XtNbackground, &buttonBackgroundPixel);\r
2655       XtSetArg(args[1], XtNforeground, &buttonForegroundPixel);\r
2656       XtGetValues(XtNameToWidget(buttonBarWidget, PAUSE_BUTTON), args, 2);\r
2657     }\r
2658 \r
2659     /*\r
2660      * formWidget uses these constraints but they are stored\r
2661      * in the children.\r
2662      */\r
2663     i = 0;\r
2664     XtSetArg(args[i], XtNfromHoriz, 0); i++;\r
2665     XtSetValues(menuBarWidget, args, i);\r
2666     if (appData.titleInWindow) {\r
2667         if (smallLayout) {\r
2668             i = 0;\r
2669             XtSetArg(args[i], XtNfromVert, menuBarWidget); i++;\r
2670             XtSetValues(whiteTimerWidget, args, i);\r
2671             i = 0;\r
2672             XtSetArg(args[i], XtNfromVert, menuBarWidget); i++;\r
2673             XtSetArg(args[i], XtNfromHoriz, whiteTimerWidget); i++;\r
2674             XtSetValues(blackTimerWidget, args, i);\r
2675             i = 0;\r
2676             XtSetArg(args[i], XtNfromVert, whiteTimerWidget); i++;\r
2677             XtSetArg(args[i], XtNjustify, XtJustifyLeft); i++;\r
2678             XtSetValues(titleWidget, args, i);\r
2679             i = 0;\r
2680             XtSetArg(args[i], XtNfromVert, titleWidget); i++;\r
2681             XtSetArg(args[i], XtNresizable, (XtArgVal) True); i++;\r
2682             XtSetValues(messageWidget, args, i);\r
2683             if (appData.showButtonBar) {\r
2684               i = 0;\r
2685               XtSetArg(args[i], XtNfromVert, titleWidget); i++;\r
2686               XtSetArg(args[i], XtNfromHoriz, messageWidget); i++;\r
2687               XtSetValues(buttonBarWidget, args, i);\r
2688             }\r
2689         } else {\r
2690             i = 0;\r
2691             XtSetArg(args[i], XtNfromVert, titleWidget); i++;\r
2692             XtSetValues(whiteTimerWidget, args, i);\r
2693             i = 0;\r
2694             XtSetArg(args[i], XtNfromVert, titleWidget); i++;\r
2695             XtSetArg(args[i], XtNfromHoriz, whiteTimerWidget); i++;\r
2696             XtSetValues(blackTimerWidget, args, i);\r
2697             i = 0;\r
2698             XtSetArg(args[i], XtNfromHoriz, menuBarWidget); i++;\r
2699             XtSetValues(titleWidget, args, i);\r
2700             i = 0;\r
2701             XtSetArg(args[i], XtNfromVert, whiteTimerWidget); i++;\r
2702             XtSetArg(args[i], XtNresizable, (XtArgVal) True); i++;\r
2703             XtSetValues(messageWidget, args, i);\r
2704             if (appData.showButtonBar) {\r
2705               i = 0;\r
2706               XtSetArg(args[i], XtNfromVert, whiteTimerWidget); i++;\r
2707               XtSetArg(args[i], XtNfromHoriz, messageWidget); i++;\r
2708               XtSetValues(buttonBarWidget, args, i);\r
2709             }\r
2710         }\r
2711     } else {\r
2712         i = 0;\r
2713         XtSetArg(args[i], XtNfromVert, menuBarWidget); i++;\r
2714         XtSetValues(whiteTimerWidget, args, i);\r
2715         i = 0;\r
2716         XtSetArg(args[i], XtNfromVert, menuBarWidget); i++;\r
2717         XtSetArg(args[i], XtNfromHoriz, whiteTimerWidget); i++;\r
2718         XtSetValues(blackTimerWidget, args, i);\r
2719         i = 0;\r
2720         XtSetArg(args[i], XtNfromVert, whiteTimerWidget); i++;\r
2721         XtSetArg(args[i], XtNresizable, (XtArgVal) True); i++;\r
2722         XtSetValues(messageWidget, args, i);\r
2723         if (appData.showButtonBar) {\r
2724           i = 0;\r
2725           XtSetArg(args[i], XtNfromVert, whiteTimerWidget); i++;\r
2726           XtSetArg(args[i], XtNfromHoriz, messageWidget); i++;\r
2727           XtSetValues(buttonBarWidget, args, i);\r
2728         }\r
2729     }\r
2730     i = 0;\r
2731     XtSetArg(args[0], XtNfromVert, messageWidget);\r
2732     XtSetArg(args[1], XtNtop,    XtChainTop);\r
2733     XtSetArg(args[2], XtNbottom, XtChainBottom);\r
2734     XtSetArg(args[3], XtNleft,   XtChainLeft);\r
2735     XtSetArg(args[4], XtNright,  XtChainRight);\r
2736     XtSetValues(boardWidget, args, 5);\r
2737 \r
2738     XtRealizeWidget(shellWidget);\r
2739 \r
2740     /*\r
2741      * Correct the width of the message and title widgets.\r
2742      * It is not known why some systems need the extra fudge term.\r
2743      * The value "2" is probably larger than needed.\r
2744      */\r
2745     XawFormDoLayout(formWidget, False);\r
2746 \r
2747 #define WIDTH_FUDGE 2\r
2748     i = 0;\r
2749     XtSetArg(args[i], XtNborderWidth, &bor);  i++;\r
2750     XtSetArg(args[i], XtNheight, &h);  i++;\r
2751     XtGetValues(messageWidget, args, i);\r
2752     if (appData.showButtonBar) {\r
2753       i = 0;\r
2754       XtSetArg(args[i], XtNwidth, &w);  i++;\r
2755       XtGetValues(buttonBarWidget, args, i);\r
2756       w = boardWidth - w - sep - 2*bor - WIDTH_FUDGE;\r
2757     } else {\r
2758       w = boardWidth - 2*bor + 1; /*!! +1 compensates for kludge below */\r
2759     }\r
2760 \r
2761     gres = XtMakeResizeRequest(messageWidget, w, h, &wr, &hr);\r
2762     if (gres != XtGeometryYes && appData.debugMode) {\r
2763       fprintf(stderr, _("%s: messageWidget geometry error %d %d %d %d %d\n"),\r
2764               programName, gres, w, h, wr, hr);\r
2765     }\r
2766     \r
2767     /* !! Horrible hack to work around bug in XFree86 4.0.1 (X11R6.4.3) */\r
2768     /* The size used for the child widget in layout lags one resize behind\r
2769        its true size, so we resize a second time, 1 pixel smaller.  Yeech! */\r
2770     w--;\r
2771     gres = XtMakeResizeRequest(messageWidget, w, h, &wr, &hr);\r
2772     if (gres != XtGeometryYes && appData.debugMode) {\r
2773       fprintf(stderr, _("%s: messageWidget geometry error %d %d %d %d %d\n"),\r
2774               programName, gres, w, h, wr, hr);\r
2775     }\r
2776     /* !! end hack */\r
2777     XtSetArg(args[0], XtNleft,  XtChainLeft);  // [HGM] glue ends for good run-time sizing\r
2778     XtSetArg(args[1], XtNright, XtChainRight);\r
2779     XtSetValues(messageWidget, args, 2);\r
2780 \r
2781     if (appData.titleInWindow) {\r
2782         i = 0;\r
2783         XtSetArg(args[i], XtNborderWidth, &bor); i++;\r
2784         XtSetArg(args[i], XtNheight, &h);  i++;\r
2785         XtGetValues(titleWidget, args, i);\r
2786         if (smallLayout) {\r
2787             w = boardWidth - 2*bor;\r
2788         } else {\r
2789             XtSetArg(args[0], XtNwidth, &w);\r
2790             XtGetValues(menuBarWidget, args, 1);\r
2791             w = boardWidth - w - sep - 2*bor - WIDTH_FUDGE;\r
2792         }\r
2793 \r
2794         gres = XtMakeResizeRequest(titleWidget, w, h, &wr, &hr);\r
2795         if (gres != XtGeometryYes && appData.debugMode) {\r
2796             fprintf(stderr,\r
2797                     _("%s: titleWidget geometry error %d %d %d %d %d\n"),\r
2798                     programName, gres, w, h, wr, hr);\r
2799         }\r
2800     }\r
2801     XawFormDoLayout(formWidget, True);\r
2802 \r
2803     xBoardWindow = XtWindow(boardWidget);\r
2804 \r
2805     // [HGM] it seems the layout code ends here, but perhaps the color stuff is size independent and would\r
2806     //       not need to go into InitDrawingSizes().\r
2807 #endif    \r
2808 \r
2809     /* \r
2810      * Create X checkmark bitmap and initialize option menu checks.\r
2811      */\r
2812     ReadBitmap(&xMarkPixmap, "checkmark.bm",\r
2813                checkmark_bits, checkmark_width, checkmark_height);\r
2814     XtSetArg(args[0], XtNleftBitmap, xMarkPixmap);\r
2815     if (appData.alwaysPromoteToQueen) {\r
2816         XtSetValues(XtNameToWidget(menuBarWidget, "menuOptions.Always Queen"),\r
2817                     args, 1);\r
2818     }\r
2819     if (appData.animateDragging) {\r
2820         XtSetValues(XtNameToWidget(menuBarWidget,\r
2821                                    "menuOptions.Animate Dragging"),\r
2822                     args, 1);\r
2823     }\r
2824     if (appData.animate) {\r
2825         XtSetValues(XtNameToWidget(menuBarWidget, "menuOptions.Animate Moving"),\r
2826                     args, 1);\r
2827     }\r
2828     if (appData.autoComment) {\r
2829         XtSetValues(XtNameToWidget(menuBarWidget, "menuOptions.Auto Comment"),\r
2830                     args, 1);\r
2831     }\r
2832     if (appData.autoCallFlag) {\r
2833         XtSetValues(XtNameToWidget(menuBarWidget, "menuOptions.Auto Flag"),\r
2834                     args, 1);\r
2835     }\r
2836     if (appData.autoFlipView) {\r
2837         XtSetValues(XtNameToWidget(menuBarWidget,"menuOptions.Auto Flip View"),\r
2838                     args, 1);\r
2839     }\r
2840     if (appData.autoObserve) {\r
2841         XtSetValues(XtNameToWidget(menuBarWidget, "menuOptions.Auto Observe"),\r
2842                     args, 1);\r
2843     }\r
2844     if (appData.autoRaiseBoard) {\r
2845         XtSetValues(XtNameToWidget(menuBarWidget,\r
2846                                    "menuOptions.Auto Raise Board"), args, 1);\r
2847     }\r
2848     if (appData.autoSaveGames) {\r
2849         XtSetValues(XtNameToWidget(menuBarWidget, "menuOptions.Auto Save"),\r
2850                     args, 1);\r
2851     }\r
2852     if (appData.saveGameFile[0] != NULLCHAR) {\r
2853         /* Can't turn this off from menu */\r
2854         XtSetValues(XtNameToWidget(menuBarWidget, "menuOptions.Auto Save"),\r
2855                     args, 1);\r
2856         XtSetSensitive(XtNameToWidget(menuBarWidget, "menuOptions.Auto Save"),\r
2857                        False);\r
2858 \r
2859     }\r
2860     if (appData.blindfold) {\r
2861         XtSetValues(XtNameToWidget(menuBarWidget,\r
2862                                    "menuOptions.Blindfold"), args, 1);\r
2863     }\r
2864     if (appData.flashCount > 0) {\r
2865         XtSetValues(XtNameToWidget(menuBarWidget,\r
2866                                    "menuOptions.Flash Moves"),\r
2867                     args, 1);\r
2868     }\r
2869     if (appData.getMoveList) {\r
2870         XtSetValues(XtNameToWidget(menuBarWidget, "menuOptions.Get Move List"),\r
2871                     args, 1);\r
2872     }\r
2873 #if HIGHDRAG\r
2874     if (appData.highlightDragging) {\r
2875         XtSetValues(XtNameToWidget(menuBarWidget,\r
2876                                    "menuOptions.Highlight Dragging"),\r
2877                     args, 1);\r
2878     }\r
2879 #endif\r
2880     if (appData.highlightLastMove) {\r
2881         XtSetValues(XtNameToWidget(menuBarWidget,\r
2882                                    "menuOptions.Highlight Last Move"),\r
2883                     args, 1);\r
2884     }\r
2885     if (appData.icsAlarm) {\r
2886         XtSetValues(XtNameToWidget(menuBarWidget, "menuOptions.ICS Alarm"),\r
2887                     args, 1);\r
2888     }\r
2889     if (appData.ringBellAfterMoves) {\r
2890         XtSetValues(XtNameToWidget(menuBarWidget, "menuOptions.Move Sound"),\r
2891                     args, 1);\r
2892     }\r
2893     if (appData.oldSaveStyle) {\r
2894         XtSetValues(XtNameToWidget(menuBarWidget,\r
2895                                    "menuOptions.Old Save Style"), args, 1);\r
2896     }\r
2897     if (appData.periodicUpdates) {\r
2898         XtSetValues(XtNameToWidget(menuBarWidget,\r
2899                                    "menuOptions.Periodic Updates"), args, 1);\r
2900     }   \r
2901     if (appData.ponderNextMove) {\r
2902         XtSetValues(XtNameToWidget(menuBarWidget,\r
2903                                    "menuOptions.Ponder Next Move"), args, 1);\r
2904     }   \r
2905     if (appData.popupExitMessage) {\r
2906         XtSetValues(XtNameToWidget(menuBarWidget,\r
2907                                    "menuOptions.Popup Exit Message"), args, 1);\r
2908     }   \r
2909     if (appData.popupMoveErrors) {\r
2910         XtSetValues(XtNameToWidget(menuBarWidget,\r
2911                                    "menuOptions.Popup Move Errors"), args, 1);\r
2912     }   \r
2913     if (appData.premove) {\r
2914         XtSetValues(XtNameToWidget(menuBarWidget,\r
2915                                    "menuOptions.Premove"), args, 1);\r
2916     }\r
2917     if (appData.quietPlay) {\r
2918         XtSetValues(XtNameToWidget(menuBarWidget,\r
2919                                    "menuOptions.Quiet Play"), args, 1);\r
2920     }\r
2921     if (appData.showCoords) {\r
2922         XtSetValues(XtNameToWidget(menuBarWidget, "menuOptions.Show Coords"),\r
2923                     args, 1);\r
2924     }\r
2925     if (appData.hideThinkingFromHuman) {\r
2926         XtSetValues(XtNameToWidget(menuBarWidget, "menuOptions.Hide Thinking"),\r
2927                     args, 1);\r
2928     }\r
2929     if (appData.testLegality) {\r
2930         XtSetValues(XtNameToWidget(menuBarWidget,"menuOptions.Test Legality"),\r
2931                     args, 1);\r
2932     }\r
2933 \r
2934     /*\r
2935      * Create an icon.\r
2936      */\r
2937     ReadBitmap(&wIconPixmap, "icon_white.bm",\r
2938                icon_white_bits, icon_white_width, icon_white_height);\r
2939     ReadBitmap(&bIconPixmap, "icon_black.bm",\r
2940                icon_black_bits, icon_black_width, icon_black_height);\r
2941     iconPixmap = wIconPixmap;\r
2942     i = 0;\r
2943     XtSetArg(args[i], XtNiconPixmap, iconPixmap);  i++;\r
2944     XtSetValues(shellWidget, args, i);\r
2945     \r
2946     /*\r
2947      * Create a cursor for the board widget.\r
2948      */\r
2949     window_attributes.cursor = XCreateFontCursor(xDisplay, XC_hand2);\r
2950     XChangeWindowAttributes(xDisplay, xBoardWindow,\r
2951                             CWCursor, &window_attributes);\r
2952     \r
2953     /*\r
2954      * Inhibit shell resizing.\r
2955      */\r
2956     shellArgs[0].value = (XtArgVal) &w;\r
2957     shellArgs[1].value = (XtArgVal) &h;\r
2958     XtGetValues(shellWidget, shellArgs, 2);\r
2959     shellArgs[4].value = shellArgs[2].value = w;\r
2960     shellArgs[5].value = shellArgs[3].value = h;\r
2961     XtSetValues(shellWidget, &shellArgs[2], 4);\r
2962     marginW =  w - boardWidth; // [HGM] needed to set new shellWidget size when we resize board\r
2963     marginH =  h - boardHeight;\r
2964 \r
2965     CatchDeleteWindow(shellWidget, "QuitProc");\r
2966 \r
2967     CreateGCs();\r
2968     CreateGrid();\r
2969 #if HAVE_LIBXPM\r
2970     if (appData.bitmapDirectory[0] != NULLCHAR) {\r
2971       CreatePieces();\r
2972     } else {\r
2973       CreateXPMPieces();\r
2974     }\r
2975 #else\r
2976     CreateXIMPieces();\r
2977     /* Create regular pieces */\r
2978     if (!useImages) CreatePieces();\r
2979 #endif  \r
2980 \r
2981     CreatePieceMenus();\r
2982 \r
2983     if (appData.animate || appData.animateDragging)\r
2984       CreateAnimVars();\r
2985     \r
2986     XtAugmentTranslations(formWidget,\r
2987                           XtParseTranslationTable(globalTranslations));\r
2988     XtAugmentTranslations(boardWidget,\r
2989                           XtParseTranslationTable(boardTranslations));\r
2990     XtAugmentTranslations(whiteTimerWidget,\r
2991                           XtParseTranslationTable(whiteTranslations));\r
2992     XtAugmentTranslations(blackTimerWidget,\r
2993                           XtParseTranslationTable(blackTranslations));\r
2994 \r
2995     /* Why is the following needed on some versions of X instead\r
2996      * of a translation? */\r
2997     XtAddEventHandler(boardWidget, ExposureMask, False,\r
2998                       (XtEventHandler) EventProc, NULL);\r
2999     /* end why */\r
3000 \r
3001     InitBackEnd2();\r
3002     \r
3003     if (errorExitStatus == -1) {\r
3004         if (appData.icsActive) {\r
3005             /* We now wait until we see "login:" from the ICS before\r
3006                sending the logon script (problems with timestamp otherwise) */\r
3007             /*ICSInitScript();*/\r
3008             if (appData.icsInputBox) ICSInputBoxPopUp();\r
3009         }\r
3010 \r
3011         signal(SIGINT, IntSigHandler);\r
3012         signal(SIGTERM, IntSigHandler);\r
3013         if (*appData.cmailGameName != NULLCHAR) {\r
3014             signal(SIGUSR1, CmailSigHandler);\r
3015         }\r
3016     }\r
3017         InitPosition(TRUE);\r
3018 \r
3019     XtAppMainLoop(appContext);\r
3020     if (appData.debugMode) fclose(debugFP); // [DM] debug\r
3021     return 0;\r
3022 }\r
3023 \r
3024 void\r
3025 ShutDownFrontEnd()\r
3026 {\r
3027     if (appData.icsActive && oldICSInteractionTitle != NULL) {\r
3028         DisplayIcsInteractionTitle(oldICSInteractionTitle);\r
3029     }\r
3030     unlink(gameCopyFilename);\r
3031     unlink(gamePasteFilename);\r
3032 }\r
3033 \r
3034 RETSIGTYPE\r
3035 IntSigHandler(sig)\r
3036      int sig;\r
3037 {\r
3038     ExitEvent(sig);\r
3039 }\r
3040 \r
3041 RETSIGTYPE\r
3042 CmailSigHandler(sig)\r
3043      int sig;\r
3044 {\r
3045     int dummy = 0;\r
3046     int error;\r
3047 \r
3048     signal(SIGUSR1, SIG_IGN);   /* suspend handler     */\r
3049 \r
3050     /* Activate call-back function CmailSigHandlerCallBack()             */\r
3051     OutputToProcess(cmailPR, (char *)(&dummy), sizeof(int), &error);\r
3052 \r
3053     signal(SIGUSR1, CmailSigHandler); /* re-activate handler */\r
3054 }\r
3055 \r
3056 void\r
3057 CmailSigHandlerCallBack(isr, closure, message, count, error)\r
3058      InputSourceRef isr;\r
3059      VOIDSTAR closure;\r
3060      char *message;\r
3061      int count;\r
3062      int error;\r
3063 {\r
3064     BoardToTop();\r
3065     ReloadCmailMsgEvent(TRUE);  /* Reload cmail msg  */\r
3066 }\r
3067 /**** end signal code ****/\r
3068 \r
3069 \r
3070 void\r
3071 ICSInitScript()\r
3072 {\r
3073     FILE *f;\r
3074     char buf[MSG_SIZ];\r
3075     char *p;\r
3076 \r
3077     f = fopen(appData.icsLogon, "r");\r
3078     if (f == NULL) {\r
3079         p = getenv("HOME");\r
3080         if (p != NULL) {\r
3081             strcpy(buf, p);\r
3082             strcat(buf, "/");\r
3083             strcat(buf, appData.icsLogon);\r
3084             f = fopen(buf, "r");\r
3085         }\r
3086     }\r
3087     if (f != NULL)\r
3088       ProcessICSInitScript(f);\r
3089 }\r
3090 \r
3091 void\r
3092 ResetFrontEnd()\r
3093 {\r
3094     CommentPopDown();\r
3095     EditCommentPopDown();\r
3096     TagsPopDown();\r
3097     return;\r
3098 }\r
3099 \r
3100 typedef struct {\r
3101     char *name;\r
3102     Boolean value;\r
3103 } Enables;\r
3104 \r
3105 void\r
3106 SetMenuEnables(enab)\r
3107      Enables *enab;\r
3108 {\r
3109   Widget w;\r
3110   if (!menuBarWidget) return;\r
3111   while (enab->name != NULL) {\r
3112     w = XtNameToWidget(menuBarWidget, enab->name);\r
3113     if (w == NULL) {\r
3114       DisplayError(enab->name, 0);\r
3115     } else {\r
3116       XtSetSensitive(w, enab->value);\r
3117     }\r
3118     enab++;\r
3119   }\r
3120 }\r
3121 \r
3122 Enables icsEnables[] = {\r
3123     { "menuFile.Mail Move", False },\r
3124     { "menuFile.Reload CMail Message", False },\r
3125     { "menuMode.Machine Black", False },\r
3126     { "menuMode.Machine White", False },\r
3127     { "menuMode.Analysis Mode", False },\r
3128     { "menuMode.Analyze File", False },\r
3129     { "menuMode.Two Machines", False },\r
3130 #ifndef ZIPPY\r
3131     { "menuHelp.Hint", False },\r
3132     { "menuHelp.Book", False },\r
3133     { "menuStep.Move Now", False },\r
3134     { "menuOptions.Periodic Updates", False },  \r
3135     { "menuOptions.Hide Thinking", False },\r
3136     { "menuOptions.Ponder Next Move", False },\r
3137 #endif\r
3138     { NULL, False }\r
3139 };\r
3140 \r
3141 Enables ncpEnables[] = {    \r
3142     { "menuFile.Mail Move", False },\r
3143     { "menuFile.Reload CMail Message", False },\r
3144     { "menuMode.Machine White", False },\r
3145     { "menuMode.Machine Black", False },\r
3146     { "menuMode.Analysis Mode", False },\r
3147     { "menuMode.Analyze File", False },\r
3148     { "menuMode.Two Machines", False },\r
3149     { "menuMode.ICS Client", False },\r
3150     { "menuMode.ICS Input Box", False },\r
3151     { "Action", False },\r
3152     { "menuStep.Revert", False },\r
3153     { "menuStep.Move Now", False },\r
3154     { "menuStep.Retract Move", False },\r
3155     { "menuOptions.Auto Comment", False },\r
3156     { "menuOptions.Auto Flag", False },\r
3157     { "menuOptions.Auto Flip View", False },\r
3158     { "menuOptions.Auto Observe", False },\r
3159     { "menuOptions.Auto Raise Board", False },\r
3160     { "menuOptions.Get Move List", False },\r
3161     { "menuOptions.ICS Alarm", False },\r
3162     { "menuOptions.Move Sound", False },\r
3163     { "menuOptions.Quiet Play", False },\r
3164     { "menuOptions.Hide Thinking", False },\r
3165     { "menuOptions.Periodic Updates", False },  \r
3166     { "menuOptions.Ponder Next Move", False },\r
3167     { "menuHelp.Hint", False },\r
3168     { "menuHelp.Book", False },\r
3169     { NULL, False }\r
3170 };\r
3171 \r
3172 Enables gnuEnables[] = {    \r
3173     { "menuMode.ICS Client", False },\r
3174     { "menuMode.ICS Input Box", False },\r
3175     { "menuAction.Accept", False },\r
3176     { "menuAction.Decline", False },\r
3177     { "menuAction.Rematch", False },\r
3178     { "menuAction.Adjourn", False },\r
3179     { "menuAction.Stop Examining", False },\r
3180     { "menuAction.Stop Observing", False },\r
3181     { "menuStep.Revert", False },\r
3182     { "menuOptions.Auto Comment", False },\r
3183     { "menuOptions.Auto Observe", False },\r
3184     { "menuOptions.Auto Raise Board", False },\r
3185     { "menuOptions.Get Move List", False },\r
3186     { "menuOptions.Premove", False },\r
3187     { "menuOptions.Quiet Play", False },\r
3188 \r
3189     /* The next two options rely on SetCmailMode being called *after*    */\r
3190     /* SetGNUMode so that when GNU is being used to give hints these     */\r
3191     /* menu options are still available                                  */\r
3192 \r
3193     { "menuFile.Mail Move", False },\r
3194     {&nb