Refactor menu code, and move it to menu.c
[xboard.git] / xboard.c
index 8198376..f344499 100644 (file)
--- a/xboard.c
+++ b/xboard.c
@@ -5,7 +5,7 @@
  * Massachusetts.
  *
  * Enhancements Copyright 1992-2001, 2002, 2003, 2004, 2005, 2006,
- * 2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc.
+ * 2007, 2008, 2009, 2010, 2011, 2012 Free Software Foundation, Inc.
  *
  * The following terms apply to Digital Equipment Corporation's copyright
  * interest in XBoard:
@@ -203,15 +203,9 @@ extern char *getenv();
 #include "xgamelist.h"
 #include "xhistory.h"
 #include "xedittags.h"
+#include "menus.h"
 #include "gettext.h"
 
-// must be moved to xengineoutput.h
-
-void EngineOutputProc P((Widget w, XEvent *event,
-                        String *prms, Cardinal *nprms));
-void EvalGraphProc P((Widget w, XEvent *event,
-                     String *prms, Cardinal *nprms));
-
 
 #ifdef __EMX__
 #ifndef HAVE_USLEEP
@@ -228,18 +222,6 @@ void EvalGraphProc P((Widget w, XEvent *event,
 # define N_(s)  s
 #endif
 
-typedef struct {
-    String string;
-    String ref;
-    XtActionProc proc;
-} MenuItem;
-
-typedef struct {
-    String name;
-    String ref;
-    MenuItem *mi;
-} Menu;
-
 int main P((int argc, char **argv));
 FILE * XsraSelFile P((Widget w, char *prompt, char *ok, char *cancel, char *failed,
                char *init_path, char *filter, char *mode, int (*show_entry)(), char **name_return));
@@ -253,7 +235,7 @@ void CreateXPMPieces P((void));
 void CreateXPMBoard P((char *s, int n));
 void CreatePieces P((void));
 void CreatePieceMenus P((void));
-Widget CreateMenuBar P((Menu *mb));
+Widget CreateMenuBar P((Menu *mb, int boardWidth));
 Widget CreateButtonBar P ((MenuItem *mi));
 #if ENABLE_NLS
 char *InsertPxlSize P((char *pattern, int targetPxlSize));
@@ -271,6 +253,7 @@ void CreateGrid P((void));
 int EventToSquare P((int x, int limit));
 void DrawSquare P((int row, int column, ChessSquare piece, int do_flash));
 void EventProc P((Widget widget, caddr_t unused, XEvent *event));
+void DelayedDrag P((void));
 void MoveTypeInProc P((Widget widget, caddr_t unused, XEvent *event));
 void HandleUserMove P((Widget w, XEvent *event,
                     String *prms, Cardinal *nprms));
@@ -312,139 +295,16 @@ void PromotionPopDown P((void));
 void PromotionCallback P((Widget w, XtPointer client_data,
                          XtPointer call_data));
 void SelectCommand P((Widget w, XtPointer client_data, XtPointer call_data));
-void ResetProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms));
-void LoadGameProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms));
-void LoadNextGameProc P((Widget w, XEvent *event, String *prms,
-                        Cardinal *nprms));
-void LoadPrevGameProc P((Widget w, XEvent *event, String *prms,
-                        Cardinal *nprms));
-void ReloadGameProc P((Widget w, XEvent *event, String *prms,
-                      Cardinal *nprms));
-void LoadPositionProc P((Widget w, XEvent *event,
-                        String *prms, Cardinal *nprms));
-void LoadNextPositionProc P((Widget w, XEvent *event, String *prms,
-                        Cardinal *nprms));
-void LoadPrevPositionProc P((Widget w, XEvent *event, String *prms,
-                        Cardinal *nprms));
-void ReloadPositionProc P((Widget w, XEvent *event, String *prms,
-                      Cardinal *nprms));
-void CopyPositionProc P((Widget w, XEvent *event, String *prms,
-                        Cardinal *nprms));
-void PastePositionProc P((Widget w, XEvent *event, String *prms,
-                         Cardinal *nprms));
-void CopyGameProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms));
-void CopyGameListProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms));
-void PasteGameProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms));
-void SaveGameProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms));
-void SavePositionProc P((Widget w, XEvent *event,
-                        String *prms, Cardinal *nprms));
-void MailMoveProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms));
-void ReloadCmailMsgProc P((Widget w, XEvent *event, String *prms,
-                           Cardinal *nprms));
-void QuitProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms));
-void PauseProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms));
-void MachineBlackProc P((Widget w, XEvent *event, String *prms,
-                        Cardinal *nprms));
-void MachineWhiteProc P((Widget w, XEvent *event,
-                        String *prms, Cardinal *nprms));
-void AnalyzeModeProc P((Widget w, XEvent *event,
-                        String *prms, Cardinal *nprms));
-void AnalyzeFileProc P((Widget w, XEvent *event,
-                        String *prms, Cardinal *nprms));
-void TwoMachinesProc P((Widget w, XEvent *event, String *prms,
-                       Cardinal *nprms));
-void MatchProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms));
-void MatchOptionsProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms));
-void IcsClientProc P((Widget w, XEvent *event, String *prms,
-                     Cardinal *nprms));
-void EditGameProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms));
-void EditPositionProc P((Widget w, XEvent *event,
-                        String *prms, Cardinal *nprms));
-void TrainingProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms));
-void EditCommentProc P((Widget w, XEvent *event,
-                       String *prms, Cardinal *nprms));
-void IcsInputBoxProc P((Widget w, XEvent *event,
-                       String *prms, Cardinal *nprms));
-void AcceptProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms));
-void DeclineProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms));
-void RematchProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms));
-void CallFlagProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms));
-void DrawProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms));
-void AbortProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms));
-void AdjournProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms));
-void ResignProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms));
-void AdjuWhiteProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms));
-void AdjuBlackProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms));
-void AdjuDrawProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms));
+void KeyBindingProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms));
+void QuitWrapper P((Widget w, XEvent *event, String *prms, Cardinal *nprms));
 void TypeInProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms));
 void EnterKeyProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms));
 void UpKeyProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms));
 void DownKeyProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms));
-void StopObservingProc P((Widget w, XEvent *event, String *prms,
-                         Cardinal *nprms));
-void StopExaminingProc P((Widget w, XEvent *event, String *prms,
-                         Cardinal *nprms));
-void UploadProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms));
-void BackwardProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms));
-void ForwardProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms));
-void ToStartProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms));
-void ToEndProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms));
-void RevertProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms));
-void AnnotateProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms));
-void TruncateGameProc P((Widget w, XEvent *event, String *prms,
-                        Cardinal *nprms));
-void RetractMoveProc P((Widget w, XEvent *event, String *prms,
-                       Cardinal *nprms));
-void MoveNowProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms));
-void AlwaysQueenProc P((Widget w, XEvent *event, String *prms,
-                       Cardinal *nprms));
-void AnimateDraggingProc P((Widget w, XEvent *event, String *prms,
-                        Cardinal *nprms));
-void AnimateMovingProc P((Widget w, XEvent *event, String *prms,
-                        Cardinal *nprms));
-void AutoflagProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms));
-void AutoflipProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms));
-void BlindfoldProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms));
-void FlashMovesProc P((Widget w, XEvent *event, String *prms,
-                      Cardinal *nprms));
-void FlipViewProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms));
-void HighlightDraggingProc P((Widget w, XEvent *event, String *prms,
-                             Cardinal *nprms));
-void HighlightLastMoveProc P((Widget w, XEvent *event, String *prms,
-                             Cardinal *nprms));
-void HighlightArrowProc P((Widget w, XEvent *event, String *prms,
-                             Cardinal *nprms));
-void MoveSoundProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms));
-//void IcsAlarmProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms));
-void OneClickProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms));
-void PeriodicUpdatesProc P((Widget w, XEvent *event, String *prms,
-                        Cardinal *nprms));
-void PonderNextMoveProc P((Widget w, XEvent *event, String *prms,
-                          Cardinal *nprms));
-void PopupMoveErrorsProc P((Widget w, XEvent *event, String *prms,
-                       Cardinal *nprms));
-void PopupExitMessageProc P((Widget w, XEvent *event, String *prms,
-                            Cardinal *nprms));
-//void PremoveProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms));
-void ShowCoordsProc P((Widget w, XEvent *event, String *prms,
-                      Cardinal *nprms));
-void ShowThinkingProc P((Widget w, XEvent *event, String *prms,
-                        Cardinal *nprms));
-void HideThinkingProc P((Widget w, XEvent *event, String *prms,
-                        Cardinal *nprms));
-void TestLegalityProc P((Widget w, XEvent *event, String *prms,
-                         Cardinal *nprms));
-void SaveSettingsProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms));
-void SaveOnExitProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms));
-void InfoProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms));
-void ManProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms));
-void HintProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms));
-void BookProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms));
-void AboutGameProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms));
-void AboutProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms));
-void DebugProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms));
-void NothingProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms));
-void Iconify P((Widget w, XEvent *event, String *prms, Cardinal *nprms));
+void TempBackwardProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms));
+void TempForwardProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms));
+Boolean TempBackwardActive = False;
+void ManInner P((Widget w, XEvent *event, String *prms, Cardinal *nprms));
 void DisplayMove P((int moveNumber));
 void DisplayTitle P((char *title));
 void ICSInitScript P((void));
@@ -456,23 +316,7 @@ static void CreateAnimVars P((void));
 static void DragPieceMove P((int x, int y));
 static void DrawDragPiece P((void));
 char *ModeToWidgetName P((GameMode mode));
-void ShuffleMenuProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms));
-void EngineMenuProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms));
-void UciMenuProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms));
-void TimeControlProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms));
-void OptionsProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms));
-void NewVariantProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms));
-void IcsTextProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms));
-void LoadEngineProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms));
-void FirstSettingsProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms));
-void SecondSettingsProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms));
-void GameListOptionsPopUp P((Widget w, XEvent *event, String *prms, Cardinal *nprms));
-void IcsOptionsProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms));
-void SoundOptionsProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms));
-void BoardOptionsProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms));
-void LoadOptionsProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms));
-void SaveOptionsProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms));
-void EditBookProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms));
+void SelectMove P((Widget w, XEvent * event, String * params, Cardinal * nParams));
 void GameListOptionsPopDown P(());
 void GenericPopDown P(());
 void update_ics_width P(());
@@ -535,6 +379,7 @@ int squareSize, smallLayout = 0, tinyLayout = 0,
   ICSInputBoxUp = False, askQuestionUp = False,
   filenameUp = False, promotionUp = False, pmFromX = -1, pmFromY = -1,
   errorUp = False, errorExitStatus = -1, lineGap, defaultLineGap;
+Dimension textHeight;
 Pixel timerForegroundPixel, timerBackgroundPixel;
 Pixel buttonForegroundPixel, buttonBackgroundPixel;
 char *chessDir, *programName, *programVersion,
@@ -610,198 +455,13 @@ static Pixmap xpmMask[BlackKing + 1];
 
 SizeDefaults sizeDefaults[] = SIZE_DEFAULTS;
 
-MenuItem fileMenu[] = {
-    {N_("New Game        Ctrl+N"),        "New Game", ResetProc},
-    {N_("New Shuffle Game ..."),          "New Shuffle Game", ShuffleMenuProc},
-    {N_("New Variant ...   Alt+Shift+V"), "New Variant", NewVariantProc},      // [HGM] variant: not functional yet
-    {"----", NULL, NothingProc},
-    {N_("Load Game       Ctrl+O"),        "Load Game", LoadGameProc},
-    {N_("Load Position    Ctrl+Shift+O"), "Load Position", LoadPositionProc},
-//    {N_("Load Next Game"), "Load Next Game", LoadNextGameProc},
-//    {N_("Load Previous Game"), "Load Previous Game", LoadPrevGameProc},
-//    {N_("Reload Same Game"), "Reload Same Game", ReloadGameProc},
-    {N_("Next Position     Shift+PgDn"), "Load Next Position", LoadNextPositionProc},
-    {N_("Prev Position     Shift+PgUp"), "Load Previous Position", LoadPrevPositionProc},
-    {"----", NULL, NothingProc},
-//    {N_("Reload Same Position"), "Reload Same Position", ReloadPositionProc},
-    {N_("Save Game       Ctrl+S"),        "Save Game", SaveGameProc},
-    {N_("Save Position    Ctrl+Shift+S"), "Save Position", SavePositionProc},
-    {"----", NULL, NothingProc},
-    {N_("Mail Move"),            "Mail Move", MailMoveProc},
-    {N_("Reload CMail Message"), "Reload CMail Message", ReloadCmailMsgProc},
-    {"----", NULL, NothingProc},
-    {N_("Quit                 Ctr+Q"), "Exit", QuitProc},
-    {NULL, NULL, NULL}
-};
-
-MenuItem editMenu[] = {
-    {N_("Copy Game    Ctrl+C"),        "Copy Game", CopyGameProc},
-    {N_("Copy Position Ctrl+Shift+C"), "Copy Position", CopyPositionProc},
-    {N_("Copy Game List"),        "Copy Game List", CopyGameListProc},
-    {"----", NULL, NothingProc},
-    {N_("Paste Game    Ctrl+V"),        "Paste Game", PasteGameProc},
-    {N_("Paste Position Ctrl+Shift+V"), "Paste Position", PastePositionProc},
-    {"----", NULL, NothingProc},
-    {N_("Edit Game      Ctrl+E"),        "Edit Game", EditGameProc},
-    {N_("Edit Position   Ctrl+Shift+E"), "Edit Position", EditPositionProc},
-    {N_("Edit Tags"),                    "Edit Tags", EditTagsProc},
-    {N_("Edit Comment"),                 "Edit Comment", EditCommentProc},
-    {N_("Edit Book"),                    "Edit Book", EditBookProc},
-    {"----", NULL, NothingProc},
-    {N_("Revert              Home"), "Revert", RevertProc},
-    {N_("Annotate"),                 "Annotate", AnnotateProc},
-    {N_("Truncate Game  End"),       "Truncate Game", TruncateGameProc},
-    {"----", NULL, NothingProc},
-    {N_("Backward         Alt+Left"),   "Backward", BackwardProc},
-    {N_("Forward           Alt+Right"), "Forward", ForwardProc},
-    {N_("Back to Start     Alt+Home"),  "Back to Start", ToStartProc},
-    {N_("Forward to End Alt+End"),      "Forward to End", ToEndProc},
-    {NULL, NULL, NULL}
-};
-
-MenuItem viewMenu[] = {
-    {N_("Flip View             F2"),         "Flip View", FlipViewProc},
-    {"----", NULL, NothingProc},
-    {N_("Engine Output      Alt+Shift+O"),   "Show Engine Output", EngineOutputProc},
-    {N_("Move History       Alt+Shift+H"),   "Show Move History", HistoryShowProc}, // [HGM] hist: activate 4.2.7 code
-    {N_("Evaluation Graph  Alt+Shift+E"),    "Show Evaluation Graph", EvalGraphProc},
-    {N_("Game List            Alt+Shift+G"), "Show Game List", ShowGameListProc},
-    {N_("ICS text menu"), "ICStex", IcsTextProc},
-    {"----", NULL, NothingProc},
-    {N_("Tags"),             "Show Tags", EditTagsProc},
-    {N_("Comments"),         "Show Comments", EditCommentProc},
-    {N_("ICS Input Box"),    "ICS Input Box", IcsInputBoxProc},
-    {"----", NULL, NothingProc},
-    {N_("Board..."),          "Board Options", BoardOptionsProc},
-    {N_("Game List Tags..."), "Game List", GameListOptionsPopUp},
-    {NULL, NULL, NULL}
-};
-
-MenuItem modeMenu[] = {
-    {N_("Machine White  Ctrl+W"), "Machine White", MachineWhiteProc},
-    {N_("Machine Black  Ctrl+B"), "Machine Black", MachineBlackProc},
-    {N_("Two Machines   Ctrl+T"), "Two Machines", TwoMachinesProc},
-    {N_("Analysis Mode  Ctrl+A"), "Analysis Mode", AnalyzeModeProc},
-    {N_("Analyze File      Ctrl+F"), "Analyze File", AnalyzeFileProc },
-    {N_("Edit Game         Ctrl+E"), "Edit Game", EditGameProc},
-    {N_("Edit Position      Ctrl+Shift+E"), "Edit Position", EditPositionProc},
-    {N_("Training"),      "Training", TrainingProc},
-    {N_("ICS Client"),    "ICS Client", IcsClientProc},
-    {"----", NULL, NothingProc},
-    {N_("Machine Match"),         "Machine Match", MatchProc},
-    {N_("Pause               Pause"),         "Pause", PauseProc},
-    {NULL, NULL, NULL}
-};
-
-MenuItem actionMenu[] = {
-    {N_("Accept             F3"), "Accept", AcceptProc},
-    {N_("Decline            F4"), "Decline", DeclineProc},
-    {N_("Rematch           F12"), "Rematch", RematchProc},
-    {"----", NULL, NothingProc},
-    {N_("Call Flag          F5"), "Call Flag", CallFlagProc},
-    {N_("Draw                F6"), "Draw", DrawProc},
-    {N_("Adjourn            F7"),  "Adjourn", AdjournProc},
-    {N_("Abort                F8"),"Abort", AbortProc},
-    {N_("Resign              F9"), "Resign", ResignProc},
-    {"----", NULL, NothingProc},
-    {N_("Stop Observing  F10"), "Stop Observing", StopObservingProc},
-    {N_("Stop Examining  F11"), "Stop Examining", StopExaminingProc},
-    {N_("Upload to Examine"),   "Upload to Examine", UploadProc},
-    {"----", NULL, NothingProc},
-    {N_("Adjudicate to White"), "Adjudicate to White", AdjuWhiteProc},
-    {N_("Adjudicate to Black"), "Adjudicate to Black", AdjuBlackProc},
-    {N_("Adjudicate Draw"),     "Adjudicate Draw", AdjuDrawProc},
-    {NULL, NULL, NULL}
-};
-
-MenuItem engineMenu[] = {
-    {N_("Load New Engine ..."), "Load Engine", LoadEngineProc},
-    {"----", NULL, NothingProc},
-    {N_("Engine #1 Settings ..."), "Engine #1 Settings", FirstSettingsProc},
-    {N_("Engine #2 Settings ..."), "Engine #2 Settings", SecondSettingsProc},
-    {"----", NULL, NothingProc},
-    {N_("Hint"), "Hint", HintProc},
-    {N_("Book"), "Book", BookProc},
-    {"----", NULL, NothingProc},
-    {N_("Move Now     Ctrl+M"),     "Move Now", MoveNowProc},
-    {N_("Retract Move  Ctrl+X"), "Retract Move", RetractMoveProc},
-    {NULL, NULL, NULL}
-};
-
-MenuItem optionsMenu[] = {
-#define OPTIONSDIALOG
-#ifdef OPTIONSDIALOG
-    {N_("General ..."), "General", OptionsProc},
-#endif
-    {N_("Time Control ...       Alt+Shift+T"), "Time Control", TimeControlProc},
-    {N_("Common Engine ...  Alt+Shift+U"),     "Common Engine", UciMenuProc},
-    {N_("Adjudications ...      Alt+Shift+J"), "Adjudications", EngineMenuProc},
-    {N_("ICS ..."),    "ICS", IcsOptionsProc},
-    {N_("Match ..."), "Match", MatchOptionsProc},
-    {N_("Load Game ..."),    "Load Game", LoadOptionsProc},
-    {N_("Save Game ..."),    "Save Game", SaveOptionsProc},
-//    {N_(" ..."),    "", OptionsProc},
-    {N_("Game List ..."),    "Game List", GameListOptionsPopUp},
-    {N_("Sounds ..."),    "Sounds", SoundOptionsProc},
-    {"----", NULL, NothingProc},
-#ifndef OPTIONSDIALOG
-    {N_("Always Queen        Ctrl+Shift+Q"),   "Always Queen", AlwaysQueenProc},
-    {N_("Animate Dragging"), "Animate Dragging", AnimateDraggingProc},
-    {N_("Animate Moving      Ctrl+Shift+A"),   "Animate Moving", AnimateMovingProc},
-    {N_("Auto Flag               Ctrl+Shift+F"), "Auto Flag", AutoflagProc},
-    {N_("Auto Flip View"),   "Auto Flip View", AutoflipProc},
-    {N_("Blindfold"),        "Blindfold", BlindfoldProc},
-    {N_("Flash Moves"),      "Flash Moves", FlashMovesProc},
-#if HIGHDRAG
-    {N_("Highlight Dragging"),    "Highlight Dragging", HighlightDraggingProc},
-#endif
-    {N_("Highlight Last Move"),   "Highlight Last Move", HighlightLastMoveProc},
-    {N_("Highlight With Arrow"),  "Arrow", HighlightArrowProc},
-    {N_("Move Sound"),            "Move Sound", MoveSoundProc},
-//    {N_("ICS Alarm"),             "ICS Alarm", IcsAlarmProc},
-    {N_("One-Click Moving"),      "OneClick", OneClickProc},
-    {N_("Periodic Updates"),      "Periodic Updates", PeriodicUpdatesProc},
-    {N_("Ponder Next Move  Ctrl+Shift+P"), "Ponder Next Move", PonderNextMoveProc},
-    {N_("Popup Exit Message"),    "Popup Exit Message", PopupExitMessageProc},
-    {N_("Popup Move Errors"),     "Popup Move Errors", PopupMoveErrorsProc},
-//    {N_("Premove"),               "Premove", PremoveProc},
-    {N_("Show Coords"),           "Show Coords", ShowCoordsProc},
-    {N_("Hide Thinking        Ctrl+Shift+H"),   "Hide Thinking", HideThinkingProc},
-    {N_("Test Legality          Ctrl+Shift+L"), "Test Legality", TestLegalityProc},
-    {"----", NULL, NothingProc},
-#endif
-    {N_("Save Settings Now"),     "Save Settings Now", SaveSettingsProc},
-    {N_("Save Settings on Exit"), "Save Settings on Exit", SaveOnExitProc},
-    {NULL, NULL, NULL}
-};
-
-MenuItem helpMenu[] = {
-    {N_("Info XBoard"),     "Info XBoard", InfoProc},
-    {N_("Man XBoard   F1"), "Man XBoard", ManProc},
-    {"----", NULL, NothingProc},
-    {N_("About XBoard"), "About XBoard", AboutProc},
-    {NULL, NULL, NULL}
-};
-
-Menu menuBar[] = {
-    {N_("File"),    "File", fileMenu},
-    {N_("Edit"),    "Edit", editMenu},
-    {N_("View"),    "View", viewMenu},
-    {N_("Mode"),    "Mode", modeMenu},
-    {N_("Action"),  "Action", actionMenu},
-    {N_("Engine"),  "Engine", engineMenu},
-    {N_("Options"), "Options", optionsMenu},
-    {N_("Help"),    "Help", helpMenu},
-    {NULL, NULL, NULL}
-};
-
 #define PAUSE_BUTTON "P"
 MenuItem buttonBar[] = {
-    {"<<", "<<", ToStartProc},
-    {"<", "<", BackwardProc},
-    {PAUSE_BUTTON, PAUSE_BUTTON, PauseProc},
-    {">", ">", ForwardProc},
-    {">>", ">>", ToEndProc},
+    {"<<", "<<", ToStartEvent},
+    {"<", "<", BackwardEvent},
+    {N_(PAUSE_BUTTON), PAUSE_BUTTON, PauseEvent},
+    {">", ">", ForwardEvent},
+    {">>", ">>", ToEndEvent},
     {NULL, NULL, NULL}
 };
 
@@ -920,112 +580,11 @@ XtActionsRec boardActions[] = {
     { "PieceMenuPopup", PieceMenuPopup },
     { "WhiteClock", WhiteClock },
     { "BlackClock", BlackClock },
-    { "Iconify", Iconify },
-    { "ResetProc", ResetProc },
-    { "NewVariantProc", NewVariantProc },
-    { "LoadGameProc", LoadGameProc },
-    { "LoadNextGameProc", LoadNextGameProc },
-    { "LoadPrevGameProc", LoadPrevGameProc },
-    { "LoadSelectedProc", LoadSelectedProc },
-    { "SetFilterProc", SetFilterProc },
-    { "ReloadGameProc", ReloadGameProc },
-    { "LoadPositionProc", LoadPositionProc },
-    { "LoadNextPositionProc", LoadNextPositionProc },
-    { "LoadPrevPositionProc", LoadPrevPositionProc },
-    { "ReloadPositionProc", ReloadPositionProc },
-    { "CopyPositionProc", CopyPositionProc },
-    { "PastePositionProc", PastePositionProc },
-    { "CopyGameProc", CopyGameProc },
-    { "CopyGameListProc", CopyGameListProc },
-    { "PasteGameProc", PasteGameProc },
-    { "SaveGameProc", SaveGameProc },
-    { "SavePositionProc", SavePositionProc },
-    { "MailMoveProc", MailMoveProc },
-    { "ReloadCmailMsgProc", ReloadCmailMsgProc },
-    { "QuitProc", QuitProc },
-    { "MachineWhiteProc", MachineWhiteProc },
-    { "MachineBlackProc", MachineBlackProc },
-    { "AnalysisModeProc", AnalyzeModeProc },
-    { "AnalyzeFileProc", AnalyzeFileProc },
-    { "TwoMachinesProc", TwoMachinesProc },
-    { "IcsClientProc", IcsClientProc },
-    { "EditGameProc", EditGameProc },
-    { "EditPositionProc", EditPositionProc },
-    { "TrainingProc", EditPositionProc },
-    { "EngineOutputProc", EngineOutputProc}, // [HGM] Winboard_x engine-output window
-    { "EvalGraphProc", EvalGraphProc},       // [HGM] Winboard_x avaluation graph window
-    { "ShowGameListProc", ShowGameListProc },
-    { "ShowMoveListProc", HistoryShowProc},
-    { "EditTagsProc", EditCommentProc },
-    { "EditBookProc", EditBookProc },
-    { "EditCommentProc", EditCommentProc },
-    { "IcsInputBoxProc", IcsInputBoxProc },
-    { "PauseProc", PauseProc },
-    { "AcceptProc", AcceptProc },
-    { "DeclineProc", DeclineProc },
-    { "RematchProc", RematchProc },
-    { "CallFlagProc", CallFlagProc },
-    { "DrawProc", DrawProc },
-    { "AdjournProc", AdjournProc },
-    { "AbortProc", AbortProc },
-    { "ResignProc", ResignProc },
-    { "AdjuWhiteProc", AdjuWhiteProc },
-    { "AdjuBlackProc", AdjuBlackProc },
-    { "AdjuDrawProc", AdjuDrawProc },
-    { "TypeInProc", TypeInProc },
-    { "EnterKeyProc", EnterKeyProc },
-    { "UpKeyProc", UpKeyProc },
-    { "DownKeyProc", DownKeyProc },
-    { "StopObservingProc", StopObservingProc },
-    { "StopExaminingProc", StopExaminingProc },
-    { "UploadProc", UploadProc },
-    { "BackwardProc", BackwardProc },
-    { "ForwardProc", ForwardProc },
-    { "ToStartProc", ToStartProc },
-    { "ToEndProc", ToEndProc },
-    { "RevertProc", RevertProc },
-    { "AnnotateProc", AnnotateProc },
-    { "TruncateGameProc", TruncateGameProc },
-    { "MoveNowProc", MoveNowProc },
-    { "RetractMoveProc", RetractMoveProc },
-    { "EngineMenuProc", (XtActionProc) EngineMenuProc },
-    { "UciMenuProc", (XtActionProc) UciMenuProc },
-    { "TimeControlProc", (XtActionProc) TimeControlProc },
-    { "FlipViewProc", FlipViewProc },
-    { "PonderNextMoveProc", PonderNextMoveProc },
-#ifndef OPTIONSDIALOG
-    { "AlwaysQueenProc", AlwaysQueenProc },
-    { "AnimateDraggingProc", AnimateDraggingProc },
-    { "AnimateMovingProc", AnimateMovingProc },
-    { "AutoflagProc", AutoflagProc },
-    { "AutoflipProc", AutoflipProc },
-    { "BlindfoldProc", BlindfoldProc },
-    { "FlashMovesProc", FlashMovesProc },
-#if HIGHDRAG
-    { "HighlightDraggingProc", HighlightDraggingProc },
-#endif
-    { "HighlightLastMoveProc", HighlightLastMoveProc },
-//    { "IcsAlarmProc", IcsAlarmProc },
-    { "MoveSoundProc", MoveSoundProc },
-    { "PeriodicUpdatesProc", PeriodicUpdatesProc },
-    { "PopupExitMessageProc", PopupExitMessageProc },
-    { "PopupMoveErrorsProc", PopupMoveErrorsProc },
-//    { "PremoveProc", PremoveProc },
-    { "ShowCoordsProc", ShowCoordsProc },
-    { "ShowThinkingProc", ShowThinkingProc },
-    { "HideThinkingProc", HideThinkingProc },
-    { "TestLegalityProc", TestLegalityProc },
-#endif
-    { "SaveSettingsProc", SaveSettingsProc },
-    { "SaveOnExitProc", SaveOnExitProc },
-    { "InfoProc", InfoProc },
-    { "ManProc", ManProc },
-    { "HintProc", HintProc },
-    { "BookProc", BookProc },
-    { "AboutGameProc", AboutGameProc },
-    { "AboutProc", AboutProc },
-    { "DebugProc", DebugProc },
-    { "NothingProc", NothingProc },
+    { "MenuItem", KeyBindingProc }, // [HGM] generic handler for key bindings
+    { "QuitProc", QuitWrapper },
+    { "ManProc", ManInner },
+    { "TempBackwardProc", TempBackwardProc },
+    { "TempForwardProc", TempForwardProc },
     { "CommentClick", (XtActionProc) CommentClick },
     { "CommentPopDown", (XtActionProc) CommentPopDown },
     { "TagsPopDown", (XtActionProc) TagsPopDown },
@@ -1036,82 +595,88 @@ XtActionsRec boardActions[] = {
     { "GameListPopDown", (XtActionProc) GameListPopDown },
     { "GameListOptionsPopDown", (XtActionProc) GameListOptionsPopDown },
     { "PromotionPopDown", (XtActionProc) PromotionPopDown },
-    { "HistoryPopDown", (XtActionProc) HistoryPopDown },
     { "EngineOutputPopDown", (XtActionProc) EngineOutputPopDown },
     { "EvalGraphPopDown", (XtActionProc) EvalGraphPopDown },
     { "GenericPopDown", (XtActionProc) GenericPopDown },
     { "CopyMemoProc", (XtActionProc) CopyMemoProc },
+    { "SelectMove", (XtActionProc) SelectMove },
+    { "LoadSelectedProc", LoadSelectedProc },
+    { "SetFilterProc", SetFilterProc },
+    { "TypeInProc", TypeInProc },
+    { "EnterKeyProc", EnterKeyProc },
+    { "UpKeyProc", UpKeyProc },
+    { "DownKeyProc", DownKeyProc },
 };
 
 char globalTranslations[] =
-  ":<Key>F9: ResignProc() \n \
-   :Ctrl<Key>n: ResetProc() \n \
-   :Meta<Key>V: NewVariantProc() \n \
-   :Ctrl<Key>o: LoadGameProc() \n \
-   :Meta<Key>Next: LoadNextGameProc() \n \
-   :Meta<Key>Prior: LoadPrevGameProc() \n \
-   :Ctrl<Key>s: SaveGameProc() \n \
-   :Ctrl<Key>c: CopyGameProc() \n \
-   :Ctrl<Key>v: PasteGameProc() \n \
-   :Ctrl<Key>O: LoadPositionProc() \n \
-   :Shift<Key>Next: LoadNextPositionProc() \n \
-   :Shift<Key>Prior: LoadPrevPositionProc() \n \
-   :Ctrl<Key>S: SavePositionProc() \n \
-   :Ctrl<Key>C: CopyPositionProc() \n \
-   :Ctrl<Key>V: PastePositionProc() \n \
-   :Ctrl<Key>q: QuitProc() \n \
-   :Ctrl<Key>w: MachineWhiteProc() \n \
-   :Ctrl<Key>b: MachineBlackProc() \n \
-   :Ctrl<Key>t: TwoMachinesProc() \n \
-   :Ctrl<Key>a: AnalysisModeProc() \n \
-   :Ctrl<Key>f: AnalyzeFileProc() \n \
-   :Ctrl<Key>e: EditGameProc() \n \
-   :Ctrl<Key>E: EditPositionProc() \n \
-   :Meta<Key>O: EngineOutputProc() \n \
-   :Meta<Key>E: EvalGraphProc() \n \
-   :Meta<Key>G: ShowGameListProc() \n \
-   :Meta<Key>H: ShowMoveListProc() \n \
-   :<Key>Pause: PauseProc() \n \
-   :<Key>F3: AcceptProc() \n \
-   :<Key>F4: DeclineProc() \n \
-   :<Key>F12: RematchProc() \n \
-   :<Key>F5: CallFlagProc() \n \
-   :<Key>F6: DrawProc() \n \
-   :<Key>F7: AdjournProc() \n \
-   :<Key>F8: AbortProc() \n \
-   :<Key>F10: StopObservingProc() \n \
-   :<Key>F11: StopExaminingProc() \n \
-   :Meta Ctrl<Key>F12: DebugProc() \n \
-   :Meta<Key>End: ToEndProc() \n \
-   :Meta<Key>Right: ForwardProc() \n \
-   :Meta<Key>Home: ToStartProc() \n \
-   :Meta<Key>Left: BackwardProc() \n \
-   :<Key>Home: RevertProc() \n \
-   :<Key>End: TruncateGameProc() \n \
-   :Ctrl<Key>m: MoveNowProc() \n \
-   :Ctrl<Key>x: RetractMoveProc() \n \
-   :Meta<Key>J: EngineMenuProc() \n \
-   :Meta<Key>U: UciMenuProc() \n \
-   :Meta<Key>T: TimeControlProc() \n \
-   :Ctrl<Key>P: PonderNextMoveProc() \n "
+  ":<Key>F9: MenuItem(ResignProc) \n \
+   :Ctrl<Key>n: MenuItem(NewGame) \n \
+   :Meta<Key>V: MenuItem(NewVariant) \n \
+   :Ctrl<Key>o: MenuItem(LoadGame) \n \
+   :Meta<Key>Next: MenuItem(LoadNextGameProc) \n \
+   :Meta<Key>Prior: MenuItem(LoadPrevGameProc) \n \
+   :Ctrl<Key>Down: LoadSelectedProc(3) \n \
+   :Ctrl<Key>Up: LoadSelectedProc(-3) \n \
+   :Ctrl<Key>s: MenuItem(SaveGame) \n \
+   :Ctrl<Key>c: MenuItem(CopyGame) \n \
+   :Ctrl<Key>v: MenuItem(PasteGame) \n \
+   :Ctrl<Key>O: MenuItem(LoadPosition) \n \
+   :Shift<Key>Next: MenuItem(LoadNextPositionProc) \n \
+   :Shift<Key>Prior: MenuItem(LoadPrevPositionProc) \n \
+   :Ctrl<Key>S: MenuItem(SavePosition) \n \
+   :Ctrl<Key>C: MenuItem(CopyPosition) \n \
+   :Ctrl<Key>V: MenuItem(PastePosition) \n \
+   :Ctrl<Key>q: MenuItem(Exit) \n \
+   :Ctrl<Key>w: MenuItem(MachineWhite) \n \
+   :Ctrl<Key>b: MenuItem(MachineBlack) \n \
+   :Ctrl<Key>t: MenuItem(TwoMachines) \n \
+   :Ctrl<Key>a: MenuItem(AnalysisMode) \n \
+   :Ctrl<Key>g: MenuItem(AnalyzeFile) \n \
+   :Ctrl<Key>e: MenuItem(EditGame) \n \
+   :Ctrl<Key>E: MenuItem(EditPosition) \n \
+   :Meta<Key>O: MenuItem(ShowEngineOutput) \n \
+   :Meta<Key>E: MenuItem(ShowEvaluationGraph) \n \
+   :Meta<Key>G: MenuItem(ShowGameList) \n \
+   :Meta<Key>H: MenuItem(ShowMoveHistory) \n \
+   :<Key>Pause: MenuItem(Pause) \n \
+   :<Key>F3: MenuItem(Accept) \n \
+   :<Key>F4: MenuItem(Decline) \n \
+   :<Key>F12: MenuItem(Rematch) \n \
+   :<Key>F5: MenuItem(CallFlag) \n \
+   :<Key>F6: MenuItem(Draw) \n \
+   :<Key>F7: MenuItem(Adjourn) \n \
+   :<Key>F8: MenuItem(Abort) \n \
+   :<Key>F10: MenuItem(StopObserving) \n \
+   :<Key>F11: MenuItem(StopExamining) \n \
+   :Ctrl<Key>d: MenuItem(DebugProc) \n \
+   :Meta Ctrl<Key>F12: MenuItem(DebugProc) \n \
+   :Meta<Key>End: MenuItem(ToEnd) \n \
+   :Meta<Key>Right: MenuItem(Forward) \n \
+   :Meta<Key>Home: MenuItem(ToStart) \n \
+   :Meta<Key>Left: MenuItem(Backward) \n \
+   :<Key>Left: MenuItem(Backward) \n \
+   :<Key>Right: MenuItem(Forward) \n \
+   :<Key>Home: MenuItem(Revert) \n \
+   :<Key>End: MenuItem(TruncateGame) \n \
+   :Ctrl<Key>m: MenuItem(MoveNow) \n \
+   :Ctrl<Key>x: MenuItem(RetractMove) \n \
+   :Meta<Key>J: MenuItem(Adjudications) \n \
+   :Meta<Key>U: MenuItem(CommonEngine) \n \
+   :Meta<Key>T: MenuItem(TimeControl) \n \
+   :Ctrl<Key>P: MenuItem(PonderNextMove) \n "
 #ifndef OPTIONSDIALOG
     "\
-   :Ctrl<Key>Q: AlwaysQueenProc() \n \
-   :Ctrl<Key>F: AutoflagProc() \n \
-   :Ctrl<Key>A: AnimateMovingProc() \n \
-   :Ctrl<Key>L: TestLegalityProc() \n \
-   :Ctrl<Key>H: HideThinkingProc() \n "
+   :Ctrl<Key>Q: MenuItem(AlwaysQueenProc) \n \
+   :Ctrl<Key>F: MenuItem(AutoflagProc) \n \
+   :Ctrl<Key>A: MenuItem(AnimateMovingProc) \n \
+   :Ctrl<Key>L: MenuItem(TestLegalityProc) \n \
+   :Ctrl<Key>H: MenuItem(HideThinkingProc) \n "
 #endif
    "\
-   :<Key>-: Iconify() \n \
-   :<Key>F1: ManProc() \n \
-   :<Key>F2: FlipViewProc() \n \
-   <KeyDown>.: BackwardProc() \n \
-   <KeyUp>.: ForwardProc() \n \
-   Shift<Key>1: AskQuestionProc(\"Direct command\",\
-                                \"Send to chess program:\",,1) \n \
-   Shift<Key>2: AskQuestionProc(\"Direct command\",\
-                                \"Send to second chess program:\",,2) \n";
+   :<Key>F1: MenuItem(Manual) \n \
+   :<Key>F2: MenuItem(FlipView) \n \
+   :<KeyDown>Return: TempBackwardProc() \n \
+   :<KeyUp>Return: TempForwardProc() \n";
 
 char boardTranslations[] =
    "<Btn1Down>: HandleUserMove(0) \n \
@@ -1119,7 +684,9 @@ char boardTranslations[] =
    <Btn1Up>: HandleUserMove(0) \n \
    <Btn1Motion>: AnimateUserMove() \n \
    <Btn3Motion>: HandlePV() \n \
+   <Btn2Motion>: HandlePV() \n \
    <Btn3Up>: PieceMenuPopup(menuB) \n \
+   <Btn2Up>: PieceMenuPopup(menuB) \n \
    Shift<Btn2Down>: XawPositionSimpleMenu(menuB) XawPositionSimpleMenu(menuD)\
                  PieceMenuPopup(menuB) \n \
    Any<Btn2Down>: XawPositionSimpleMenu(menuW) XawPositionSimpleMenu(menuD) \
@@ -1129,8 +696,12 @@ char boardTranslations[] =
    Any<Btn3Down>: XawPositionSimpleMenu(menuB) XawPositionSimpleMenu(menuD) \
                  PieceMenuPopup(menuB) \n";
 
-char whiteTranslations[] = "<BtnDown>: WhiteClock()\n";
-char blackTranslations[] = "<BtnDown>: BlackClock()\n";
+char whiteTranslations[] =
+   "Shift<BtnDown>: WhiteClock(1)\n \
+   <BtnDown>: WhiteClock(0)\n";
+char blackTranslations[] =
+   "Shift<BtnDown>: BlackClock(1)\n \
+   <BtnDown>: BlackClock(0)\n";
 
 char ICSInputTranslations[] =
     "<Key>Up: UpKeyProc() \n "
@@ -1158,10 +729,7 @@ static int xpm_avail[MAXSQSIZE];
 
 /* Extract piece size from filename */
 static int
-xpm_getsize(name, len, ext)
-     char *name;
-     int len;
-     char *ext;
+xpm_getsize (char *name, int len, char *ext)
 {
     char *p, *d;
     char buf[10];
@@ -1185,9 +753,7 @@ xpm_getsize(name, len, ext)
 
 /* Setup xpm_avail */
 static int
-xpm_getavail(dirname, ext)
-     char *dirname;
-     char *ext;
+xpm_getavail (char *dirname, char *ext)
 {
     DIR *dir;
     struct dirent *ent;
@@ -1219,9 +785,7 @@ xpm_getavail(dirname, ext)
 }
 
 void
-xpm_print_avail(fp, ext)
-     FILE *fp;
-     char *ext;
+xpm_print_avail (FILE *fp, char *ext)
 {
     int i;
 
@@ -1234,10 +798,7 @@ xpm_print_avail(fp, ext)
 
 /* Return XPM piecesize closest to size */
 int
-xpm_closest_to(dirname, size, ext)
-     char *dirname;
-     int size;
-     char *ext;
+xpm_closest_to (char *dirname, int size, char *ext)
 {
     int i;
     int sm_diff = MAXSQSIZE;
@@ -1272,10 +833,7 @@ xpm_closest_to(dirname, size, ext)
    read the directory, so we can't collect a list of
    filenames, etc., so we can't do any size-fitting. */
 int
-xpm_closest_to(dirname, size, ext)
-     char *dirname;
-     int size;
-     char *ext;
+xpm_closest_to (char *dirname, int size, char *ext)
 {
     fprintf(stderr, _("\
 Warning: No DIR structure found on this system --\n\
@@ -1295,9 +853,7 @@ TextColors textColors[(int)NColorClasses];
 
 /* String is: "fg, bg, attr". Which is 0, 1, 2 */
 static int
-parse_color(str, which)
-     char *str;
-     int which;
+parse_color (char *str, int which)
 {
     char *p, buf[100], *d;
     int i;
@@ -1343,9 +899,7 @@ parse_color(str, which)
 }
 
 static int
-parse_cpair(cc, str)
-     ColorClass cc;
-     char *str;
+parse_cpair (ColorClass cc, char *str)
 {
     if ((textColors[(int)cc].fg=parse_color(str, 0)) == -2) {
        fprintf(stderr, _("%s: can't parse foreground color in `%s'\n"),
@@ -1365,7 +919,7 @@ parse_cpair(cc, str)
 /* Arrange to catch delete-window events */
 Atom wm_delete_window;
 void
-CatchDeleteWindow(Widget w, String procname)
+CatchDeleteWindow (Widget w, String procname)
 {
   char buf[MSG_SIZ];
   XSetWMProtocols(xDisplay, XtWindow(w), &wm_delete_window, 1);
@@ -1374,7 +928,7 @@ CatchDeleteWindow(Widget w, String procname)
 }
 
 void
-BoardToTop()
+BoardToTop ()
 {
   Arg args[16];
   XtSetArg(args[0], XtNiconic, False);
@@ -1432,7 +986,7 @@ Boolean fontIsSet[NUM_FONTS], fontValid[NUM_FONTS][MAX_SIZE];
 char *fontTable[NUM_FONTS][MAX_SIZE];
 
 void
-ParseFont(char *name, int number)
+ParseFont (char *name, int number)
 { // in XBoard, only 2 of the fonts are currently implemented, and we just copy their name
   int size;
   if(sscanf(name, "size%d:", &size)) {
@@ -1461,7 +1015,7 @@ ParseFont(char *name, int number)
 }
 
 void
-SetFontDefaults()
+SetFontDefaults ()
 { // only 2 fonts currently
   appData.clockFont = CLOCK_FONT_NAME;
   appData.coordFont = COORD_FONT_NAME;
@@ -1469,41 +1023,41 @@ SetFontDefaults()
 }
 
 void
-CreateFonts()
+CreateFonts ()
 { // no-op, until we identify the code for this already in XBoard and move it here
 }
 
 void
-ParseColor(int n, char *name)
+ParseColor (int n, char *name)
 { // in XBoard, just copy the color-name string
   if(colorVariable[n]) *(char**)colorVariable[n] = strdup(name);
 }
 
 void
-ParseTextAttribs(ColorClass cc, char *s)
+ParseTextAttribs (ColorClass cc, char *s)
 {
     (&appData.colorShout)[cc] = strdup(s);
 }
 
 void
-ParseBoardSize(void *addr, char *name)
+ParseBoardSize (void *addr, char *name)
 {
     appData.boardSize = strdup(name);
 }
 
 void
-LoadAllSounds()
+LoadAllSounds ()
 { // In XBoard the sound-playing program takes care of obtaining the actual sound
 }
 
 void
-SetCommPortDefaults()
+SetCommPortDefaults ()
 { // for now, this is a no-op, as the corresponding option does not exist in XBoard
 }
 
 // [HGM] args: these three cases taken out to stay in front-end
 void
-SaveFontArg(FILE *f, ArgDescriptor *ad)
+SaveFontArg (FILE *f, ArgDescriptor *ad)
 {
   char *name;
   int i, n = (int)(intptr_t)ad->argLoc;
@@ -1531,65 +1085,66 @@ SaveFontArg(FILE *f, ArgDescriptor *ad)
 }
 
 void
-ExportSounds()
+ExportSounds ()
 { // nothing to do, as the sounds are at all times represented by their text-string names already
 }
 
 void
-SaveAttribsArg(FILE *f, ArgDescriptor *ad)
+SaveAttribsArg (FILE *f, ArgDescriptor *ad)
 {      // here the "argLoc" defines a table index. It could have contained the 'ta' pointer itself, though
        fprintf(f, OPTCHAR "%s" SEPCHAR "%s\n", ad->argName, (&appData.colorShout)[(int)(intptr_t)ad->argLoc]);
 }
 
 void
-SaveColor(FILE *f, ArgDescriptor *ad)
+SaveColor (FILE *f, ArgDescriptor *ad)
 {      // in WinBoard the color is an int and has to be converted to text. In X it would be a string already?
        if(colorVariable[(int)(intptr_t)ad->argLoc])
        fprintf(f, OPTCHAR "%s" SEPCHAR "%s\n", ad->argName, *(char**)colorVariable[(int)(intptr_t)ad->argLoc]);
 }
 
 void
-SaveBoardSize(FILE *f, char *name, void *addr)
+SaveBoardSize (FILE *f, char *name, void *addr)
 { // wrapper to shield back-end from BoardSize & sizeInfo
   fprintf(f, OPTCHAR "%s" SEPCHAR "%s\n", name, appData.boardSize);
 }
 
 void
-ParseCommPortSettings(char *s)
+ParseCommPortSettings (char *s)
 { // no such option in XBoard (yet)
 }
 
 extern Widget engineOutputShell;
+int frameX, frameY;
 
 void
-GetActualPlacement(Widget wg, WindowPlacement *wp)
+GetActualPlacement (Widget wg, WindowPlacement *wp)
 {
   Arg args[16];
   Dimension w, h;
   Position x, y;
-  int i;
+  XWindowAttributes winAt;
+  Window win, dummy;
+  int i, rx, ry;
 
   if(!wg) return;
 
-    i = 0;
-    XtSetArg(args[i], XtNx, &x); i++;
-    XtSetArg(args[i], XtNy, &y); i++;
-    XtSetArg(args[i], XtNwidth, &w); i++;
-    XtSetArg(args[i], XtNheight, &h); i++;
-    XtGetValues(wg, args, i);
-    wp->x = x - 4;
-    wp->y = y - 23;
-    wp->height = h;
-    wp->width = w;
+    win = XtWindow(wg);
+    XGetWindowAttributes(xDisplay, win, &winAt); // this works, where XtGetValues on XtNx, XtNy does not!
+    XTranslateCoordinates (xDisplay, win, winAt.root, -winAt.border_width, -winAt.border_width, &rx, &ry, &dummy);
+    wp->x = rx - winAt.x;
+    wp->y = ry - winAt.y;
+    wp->height = winAt.height;
+    wp->width = winAt.width;
+    frameX = winAt.x; frameY = winAt.y; // remember to decide if windows touch
 }
 
 void
-GetWindowCoords()
+GetWindowCoords ()
 { // wrapper to shield use of window handles from back-end (make addressible by number?)
   // In XBoard this will have to wait until awareness of window parameters is implemented
   GetActualPlacement(shellWidget, &wpMain);
-  if(EngineOutputIsUp()) GetActualPlacement(engineOutputShell, &wpEngineOutput); else
-  if(MoveHistoryIsUp()) GetActualPlacement(historyShell, &wpMoveHistory);
+  if(EngineOutputIsUp()) GetActualPlacement(engineOutputShell, &wpEngineOutput);
+  if(MoveHistoryIsUp()) GetActualPlacement(shells[7], &wpMoveHistory);
   if(EvalGraphIsUp()) GetActualPlacement(evalGraphShell, &wpEvalGraph);
   if(GameListIsUp()) GetActualPlacement(gameListShell, &wpGameList);
   if(shellUp[1]) GetActualPlacement(shells[1], &wpComment);
@@ -1597,12 +1152,12 @@ GetWindowCoords()
 }
 
 void
-PrintCommPortSettings(FILE *f, char *name)
+PrintCommPortSettings (FILE *f, char *name)
 { // This option does not exist in XBoard
 }
 
 int
-MySearchPath(char *installDir, char *name, char *fullname)
+MySearchPath (char *installDir, char *name, char *fullname)
 { // just append installDir and name. Perhaps ExpandPath should be used here?
   name = ExpandPathName(name);
   if(name && name[0] == '/')
@@ -1614,7 +1169,7 @@ MySearchPath(char *installDir, char *name, char *fullname)
 }
 
 int
-MyGetFullPathName(char *name, char *fullname)
+MyGetFullPathName (char *name, char *fullname)
 { // should use ExpandPath?
   name = ExpandPathName(name);
   safeStrCpy(fullname, name, MSG_SIZ );
@@ -1622,24 +1177,24 @@ MyGetFullPathName(char *name, char *fullname)
 }
 
 void
-EnsureOnScreen(int *x, int *y, int minX, int minY)
+EnsureOnScreen (int *x, int *y, int minX, int minY)
 {
   return;
 }
 
 int
-MainWindowUp()
+MainWindowUp ()
 { // [HGM] args: allows testing if main window is realized from back-end
   return xBoardWindow != 0;
 }
 
 void
-PopUpStartupDialog()
+PopUpStartupDialog ()
 {  // start menu not implemented in XBoard
 }
 
 char *
-ConvertToLine(int argc, char **argv)
+ConvertToLine (int argc, char **argv)
 {
   static char line[128*1024], buf[1024];
   int i;
@@ -1667,15 +1222,24 @@ extern Boolean twoBoards, partnerUp;
   // eventually, all layout determining code should go into a subroutine, but until then IDSIZE remains undefined
 #else
 #define BoardSize int
-void InitDrawingSizes(BoardSize boardSize, int flags)
+void
+InitDrawingSizes (BoardSize boardSize, int flags)
 {   // [HGM] resize is functional now, but for board format changes only (nr of ranks, files)
     Dimension timerWidth, boardWidth, boardHeight, w, h, sep, bor, wr, hr;
     Arg args[16];
     XtGeometryResult gres;
     int i;
+    static Dimension oldWidth, oldHeight;
+    static VariantClass oldVariant;
+    static int oldDual = -1, oldMono = -1;
 
     if(!formWidget) return;
 
+    if(appData.overrideLineGap >= 0) lineGap = appData.overrideLineGap;
+    boardWidth = lineGap + BOARD_WIDTH * (squareSize + lineGap);
+    boardHeight = lineGap + BOARD_HEIGHT * (squareSize + lineGap);
+
+  if(boardWidth != oldWidth || boardHeight != oldHeight || oldDual != twoBoards) { // do resizing stuff only if size actually changed
     /*
      * Enable shell resizing.
      */
@@ -1690,9 +1254,7 @@ void InitDrawingSizes(BoardSize boardSize, int flags)
     XtSetArg(args[0], XtNdefaultDistance, &sep);
     XtGetValues(formWidget, args, 1);
 
-    if(appData.overrideLineGap >= 0) lineGap = appData.overrideLineGap;
-    boardWidth = lineGap + BOARD_WIDTH * (squareSize + lineGap);
-    boardHeight = lineGap + BOARD_HEIGHT * (squareSize + lineGap);
+    oldWidth = boardWidth; oldHeight = boardHeight; oldDual = twoBoards;
     CreateGrid();
     hOffset = boardWidth + 10;
     for(i=0; i<BOARD_WIDTH+BOARD_HEIGHT+2; i++) { // [HGM] dual: grid for second board
@@ -1744,8 +1306,15 @@ void InitDrawingSizes(BoardSize boardSize, int flags)
     shellArgs[5].value = shellArgs[3].value = h;
     XtSetValues(shellWidget, &shellArgs[0], 6);
 
+    XSync(xDisplay, False);
+    DelayedDrag();
+  }
+
     // [HGM] pieces: tailor piece bitmaps to needs of specific variant
     // (only for xpm)
+
+  if(gameInfo.variant != oldVariant) { // and only if variant changed
+
     if(useImages) {
       for(i=0; i<4; i++) {
        int p;
@@ -1812,13 +1381,19 @@ void InitDrawingSizes(BoardSize boardSize, int flags)
        }
       }
     }
+    oldMono = -10; // kludge to force recreation of animation masks
+    oldVariant = gameInfo.variant;
+  }
 #if HAVE_LIBXPM
+  if(appData.monoMode != oldMono)
     CreateAnimVars();
 #endif
+  oldMono = appData.monoMode;
 }
 #endif
 
-void ParseIcsTextColors()
+void
+ParseIcsTextColors ()
 {   // [HGM] tken out of main(), so it can be called from ICS-Options dialog
     if (parse_cpair(ColorShout, appData.colorShout) < 0 ||
        parse_cpair(ColorSShout, appData.colorSShout) < 0 ||
@@ -1840,7 +1415,8 @@ void ParseIcsTextColors()
       }
 }
 
-int MakeColors()
+int
+MakeColors ()
 {   // [HGM] taken out of main(), so it can be called from BoardOptions dialog
     XrmValue vFrom, vTo;
     int forceMono = False;
@@ -1917,12 +1493,12 @@ int MakeColors()
 }
 
 void
-CreateAnyPieces()
+CreateAnyPieces ()
 {   // [HGM] taken out of main
 #if HAVE_LIBXPM
     if (appData.monoMode && // [HGM] no sense to go on to certain doom
        (appData.bitmapDirectory == NULL || appData.bitmapDirectory[0] == NULLCHAR))
-           appData.bitmapDirectory = DEF_BITMAP_DIR;
+           appData.bitmapDirectory = strdup(DEF_BITMAP_DIR);
 
     if (appData.bitmapDirectory[0] != NULLCHAR) {
       CreatePieces();
@@ -1939,9 +1515,7 @@ CreateAnyPieces()
 }
 
 int
-main(argc, argv)
-     int argc;
-     char **argv;
+main (int argc, char **argv)
 {
     int i, j, clockFontPxlSize, coordFontPxlSize, fontPxlSize;
     XSetWindowAttributes window_attributes;
@@ -2168,10 +1742,13 @@ XBoard square size (hint): %d\n\
       /* For the coordFont, use the 0th font of the fontset. */
       XFontSet coordFontSet = CreateFontSet(appData.coordFont);
       XFontStruct **font_struct_list;
+      XFontSetExtents *fontSize;
       char **font_name_list;
       XFontsOfFontSet(coordFontSet, &font_struct_list, &font_name_list);
       coordFontID = XLoadFont(xDisplay, font_name_list[0]);
       coordFontStruct = XQueryFont(xDisplay, coordFontID);
+      fontSize = XExtentsOfFontSet(fontSet); // [HGM] figure out how much vertical space font takes
+      textHeight = fontSize->max_logical_extent.height + 5; // add borderWidth
     }
 #else
     appData.font = FindFont(appData.font, fontPxlSize);
@@ -2254,7 +1831,7 @@ XBoard square size (hint): %d\n\
     XtGetValues(formWidget, args, 1);
 
     j = 0;
-    widgetList[j++] = menuBarWidget = CreateMenuBar(menuBar);
+    widgetList[j++] = menuBarWidget = CreateMenuBar(menuBar, boardWidth);
     XtSetArg(args[0], XtNtop,    XtChainTop);
     XtSetArg(args[1], XtNbottom, XtChainTop);
     XtSetArg(args[2], XtNright,  XtChainLeft);
@@ -2454,6 +2031,7 @@ XBoard square size (hint): %d\n\
              programName, gres, w, h, wr, hr);
     }
     /* !! end hack */
+    if(!textHeight) textHeight = hr; // [HGM] if !NLS textHeight is still undefined, and we grab it from here
     XtSetArg(args[0], XtNleft,  XtChainLeft);  // [HGM] glue ends for good run-time sizing
     XtSetArg(args[1], XtNright, XtChainRight);
     XtSetValues(messageWidget, args, 2);
@@ -2648,6 +2226,8 @@ XBoard square size (hint): %d\n\
     /* end why */
     XtAddEventHandler(formWidget, KeyPressMask, False,
                      (XtEventHandler) MoveTypeInProc, NULL);
+    XtAddEventHandler(shellWidget, StructureNotifyMask, False,
+                     (XtEventHandler) EventProc, NULL);
 
     /* [AS] Restore layout */
     if( wpMoveHistory.visible ) {
@@ -2692,8 +2272,10 @@ XBoard square size (hint): %d\n\
     return 0;
 }
 
+static Boolean noEcho;
+
 void
-ShutDownFrontEnd()
+ShutDownFrontEnd ()
 {
     if (appData.icsActive && oldICSInteractionTitle != NULL) {
         DisplayIcsInteractionTitle(oldICSInteractionTitle);
@@ -2701,23 +2283,23 @@ ShutDownFrontEnd()
     if (saveSettingsOnExit) SaveSettings(settingsFileName);
     unlink(gameCopyFilename);
     unlink(gamePasteFilename);
+    if(noEcho) EchoOn();
 }
 
-RETSIGTYPE TermSizeSigHandler(int sig)
+RETSIGTYPE
+TermSizeSigHandler (int sig)
 {
     update_ics_width();
 }
 
 RETSIGTYPE
-IntSigHandler(sig)
-     int sig;
+IntSigHandler (int sig)
 {
     ExitEvent(sig);
 }
 
 RETSIGTYPE
-CmailSigHandler(sig)
-     int sig;
+CmailSigHandler (int sig)
 {
     int dummy = 0;
     int error;
@@ -2731,12 +2313,7 @@ CmailSigHandler(sig)
 }
 
 void
-CmailSigHandlerCallBack(isr, closure, message, count, error)
-     InputSourceRef isr;
-     VOIDSTAR closure;
-     char *message;
-     int count;
-     int error;
+CmailSigHandlerCallBack (InputSourceRef isr, VOIDSTAR closure, char *message, int count, int error)
 {
     BoardToTop();
     ReloadCmailMsgEvent(TRUE); /* Reload cmail msg  */
@@ -2745,7 +2322,7 @@ CmailSigHandlerCallBack(isr, closure, message, count, error)
 
 
 void
-ICSInitScript()
+ICSInitScript ()
 {
   /* try to open the icsLogon script, either in the location given
    * or in the users HOME directory
@@ -2777,7 +2354,7 @@ ICSInitScript()
 }
 
 void
-ResetFrontEnd()
+ResetFrontEnd ()
 {
     CommentPopDown();
     TagsPopDown();
@@ -2790,8 +2367,7 @@ typedef struct {
 } Enables;
 
 void
-GreyRevert(grey)
-     Boolean grey;
+GreyRevert (Boolean grey)
 {
     Widget w;
     if (!menuBarWidget) return;
@@ -2810,8 +2386,7 @@ GreyRevert(grey)
 }
 
 void
-SetMenuEnables(enab)
-     Enables *enab;
+SetMenuEnables (Enables *enab)
 {
   Widget w;
   if (!menuBarWidget) return;
@@ -3000,7 +2575,8 @@ Enables userThinkingEnables[] = {
   { NULL, False }
 };
 
-void SetICSMode()
+void
+SetICSMode ()
 {
   SetMenuEnables(icsEnables);
 
@@ -3013,25 +2589,25 @@ void SetICSMode()
 }
 
 void
-SetNCPMode()
+SetNCPMode ()
 {
   SetMenuEnables(ncpEnables);
 }
 
 void
-SetGNUMode()
+SetGNUMode ()
 {
   SetMenuEnables(gnuEnables);
 }
 
 void
-SetCmailMode()
+SetCmailMode ()
 {
   SetMenuEnables(cmailEnables);
 }
 
 void
-SetTrainingModeOn()
+SetTrainingModeOn ()
 {
   SetMenuEnables(trainingOnEnables);
   if (appData.showButtonBar) {
@@ -3041,7 +2617,7 @@ SetTrainingModeOn()
 }
 
 void
-SetTrainingModeOff()
+SetTrainingModeOff ()
 {
   SetMenuEnables(trainingOffEnables);
   if (appData.showButtonBar) {
@@ -3050,14 +2626,14 @@ SetTrainingModeOff()
 }
 
 void
-SetUserThinkingEnables()
+SetUserThinkingEnables ()
 {
   if (appData.noChessProgram) return;
   SetMenuEnables(userThinkingEnables);
 }
 
 void
-SetMachineThinkingEnables()
+SetMachineThinkingEnables ()
 {
   if (appData.noChessProgram) return;
   SetMenuEnables(machineThinkingEnables);
@@ -3079,7 +2655,7 @@ static char *history[HISTORY_SIZE];
 int histIn = 0, histP = 0;
 
 void
-SaveInHistory(char *cmd)
+SaveInHistory (char *cmd)
 {
   if (history[histIn] != NULL) {
     free(history[histIn]);
@@ -3096,7 +2672,7 @@ SaveInHistory(char *cmd)
 }
 
 char *
-PrevInHistory(char *cmd)
+PrevInHistory (char *cmd)
 {
   int newhp;
   if (histP == histIn) {
@@ -3110,7 +2686,7 @@ PrevInHistory(char *cmd)
 }
 
 char *
-NextInHistory()
+NextInHistory ()
 {
   if (histP == histIn) return NULL;
   histP = (histP + 1) % HISTORY_SIZE;
@@ -3122,9 +2698,7 @@ NextInHistory()
 
 #ifdef ENABLE_NLS
 char *
-InsertPxlSize(pattern, targetPxlSize)
-     char *pattern;
-     int targetPxlSize;
+InsertPxlSize (char *pattern, int targetPxlSize)
 {
     char *base_fnt_lst, strInt[12], *p, *q;
     int alternatives, i, len, strIntLen;
@@ -3175,8 +2749,7 @@ InsertPxlSize(pattern, targetPxlSize)
 }
 
 XFontSet
-CreateFontSet(base_fnt_lst)
-     char *base_fnt_lst;
+CreateFontSet (char *base_fnt_lst)
 {
     XFontSet fntSet;
     char **missing_list;
@@ -3220,9 +2793,7 @@ CreateFontSet(base_fnt_lst)
  * longer needed.
  */
 char *
-FindFont(pattern, targetPxlSize)
-     char *pattern;
-     int targetPxlSize;
+FindFont (char *pattern, int targetPxlSize)
 {
     char **fonts, *p, *best, *scalable, *scalableTail;
     int i, j, nfonts, minerr, err, pxlSize;
@@ -3279,7 +2850,8 @@ FindFont(pattern, targetPxlSize)
 }
 #endif
 
-void DeleteGCs()
+void
+DeleteGCs ()
 {   // [HGM] deletes GCs that are to be remade, to prevent resource leak;
     // must be called before all non-first callse to CreateGCs()
     XtReleaseGC(shellWidget, highlineGC);
@@ -3304,7 +2876,8 @@ void DeleteGCs()
     }
 }
 
-void CreateGCs(int redo)
+void
+CreateGCs (int redo)
 {
     XtGCMask value_mask = GCLineWidth | GCLineStyle | GCForeground
       | GCBackground | GCFunction | GCPlaneMask;
@@ -3409,12 +2982,8 @@ void CreateGCs(int redo)
     }
 }
 
-void loadXIM(xim, xmask, filename, dest, mask)
-     XImage *xim;
-     XImage *xmask;
-     char *filename;
-     Pixmap *dest;
-     Pixmap *mask;
+void
+loadXIM (XImage *xim, XImage *xmask, char *filename, Pixmap *dest, Pixmap *mask)
 {
     int x, y, w, h, p;
     FILE *fp;
@@ -3497,7 +3066,8 @@ void loadXIM(xim, xmask, filename, dest, mask)
 
 char pieceBitmapNames[] = "pnbrqfeacwmohijgdvlsukpnsl";
 
-void CreateXIMPieces()
+void
+CreateXIMPieces ()
 {
     int piece, kind;
     char buf[MSG_SIZ];
@@ -3585,17 +3155,19 @@ void CreateXIMPieces()
 static VariantClass oldVariant = (VariantClass) -1; // [HGM] pieces: redo every time variant changes
 
 #if HAVE_LIBXPM
-void CreateXPMBoard(char *s, int kind)
+void
+CreateXPMBoard (char *s, int kind)
 {
     XpmAttributes attr;
     attr.valuemask = 0;
-    if(s == NULL || *s == 0 || *s == '*') { useTexture &= ~(kind+1); return; }
+    if(!appData.useBitmaps || s == NULL || *s == 0 || *s == '*') { useTexture &= ~(kind+1); return; }
     if (XpmReadFileToPixmap(xDisplay, xBoardWindow, s, &(xpmBoardBitmap[kind]), NULL, &attr) == 0) {
        useTexture |= kind + 1; textureW[kind] = attr.width; textureH[kind] = attr.height;
     }
 }
 
-void FreeXPMPieces()
+void
+FreeXPMPieces ()
 {   // [HGM] to prevent resoucre leak on calling CreaeXPMPieces() a second time,
     // thisroutine has to be called t free the old piece pixmaps
     int piece, kind;
@@ -3607,7 +3179,8 @@ void FreeXPMPieces()
     }
 }
 
-void CreateXPMPieces()
+void
+CreateXPMPieces ()
 {
     int piece, kind, r;
     char buf[MSG_SIZ];
@@ -3775,7 +3348,8 @@ void CreatePieces()
 }
 #else
 /* With built-in bitmaps */
-void CreatePieces()
+void
+CreatePieces ()
 {
     BuiltInBits* bib = builtInBits;
     int piece, kind;
@@ -3804,11 +3378,8 @@ void CreatePieces()
 }
 #endif
 
-void ReadBitmap(pm, name, bits, wreq, hreq)
-     Pixmap *pm;
-     String name;
-     unsigned char bits[];
-     u_int wreq, hreq;
+void
+ReadBitmap (Pixmap *pm, String name, unsigned char bits[], u_int wreq, u_int hreq)
 {
     int x_hot, y_hot;
     u_int w, h;
@@ -3855,7 +3426,8 @@ void ReadBitmap(pm, name, bits, wreq, hreq)
     }
 }
 
-void CreateGrid()
+void
+CreateGrid ()
 {
     int i, j;
 
@@ -3880,89 +3452,164 @@ void CreateGrid()
     }
 }
 
-static void MenuBarSelect(w, addr, index)
-     Widget w;
-     caddr_t addr;
-     caddr_t index;
+int nrOfMenuItems = 7;
+MenuListItem menuItemList[150] = {
+    { "LoadNextGameProc", LoadNextGameProc },
+    { "LoadPrevGameProc", LoadPrevGameProc },
+    { "ReloadGameProc", ReloadGameProc },
+    { "ReloadPositionProc", ReloadPositionProc },
+#ifndef OPTIONSDIALOG
+    { "AlwaysQueenProc", AlwaysQueenProc },
+    { "AnimateDraggingProc", AnimateDraggingProc },
+    { "AnimateMovingProc", AnimateMovingProc },
+    { "AutoflagProc", AutoflagProc },
+    { "AutoflipProc", AutoflipProc },
+    { "BlindfoldProc", BlindfoldProc },
+    { "FlashMovesProc", FlashMovesProc },
+#if HIGHDRAG
+    { "HighlightDraggingProc", HighlightDraggingProc },
+#endif
+    { "HighlightLastMoveProc", HighlightLastMoveProc },
+//    { "IcsAlarmProc", IcsAlarmProc },
+    { "MoveSoundProc", MoveSoundProc },
+    { "PeriodicUpdatesProc", PeriodicUpdatesProc },
+    { "PopupExitMessageProc", PopupExitMessageProc },
+    { "PopupMoveErrorsProc", PopupMoveErrorsProc },
+//    { "PremoveProc", PremoveProc },
+    { "ShowCoordsProc", ShowCoordsProc },
+    { "ShowThinkingProc", ShowThinkingProc },
+    { "HideThinkingProc", HideThinkingProc },
+    { "TestLegalityProc", TestLegalityProc },
+#endif
+    { "AboutGameProc", AboutGameEvent },
+    { "DebugProc", DebugProc },
+    { "NothingProc", NothingProc },
+  {NULL, NothingProc}
+};
+
+int
+Equal(char *p, char *s)
+{   // compare strings skipping spaces in second
+    while(*s) {
+       if(*s == ' ') { s++; continue; }
+       if(*s++ != *p++) return 0;
+    }
+    return !*p;
+}
+
+void
+KeyBindingProc (Widget w, XEvent *event, String *prms, Cardinal *nprms)
+{   // [HGM] new method of key binding: specify MenuItem(FlipView) in stead of FlipViewProc in translation string
+    int i;
+    if(*nprms == 0) return;
+    for(i=0; menuItemList[i].name; i++) {
+       if(Equal(prms[0], menuItemList[i].name)) {
+           (menuItemList[i].proc) ();
+           return;
+       }
+    }
+}
+
+static void
+MenuBarSelect (Widget w, caddr_t addr, caddr_t index)
 {
-    XtActionProc proc = (XtActionProc) addr;
+    MenuProc *proc = (MenuProc *) addr;
 
-    (proc)(NULL, NULL, NULL, NULL);
+    (proc)();
 }
 
-void CreateMenuBarPopup(parent, name, mb)
-     Widget parent;
-     String name;
-     Menu *mb;
+static void
+MenuEngineSelect (Widget w, caddr_t addr, caddr_t index)
+{
+    RecentEngineEvent((int) (intptr_t) addr);
+}
+
+// some stuff that must remain in front-end
+static Widget mainBar, currentMenu;
+static int wtot, nr = 0, widths[10];
+
+void
+AppendMenuItem (char *text, char *name, MenuProc *action)
 {
     int j;
-    Widget menu, entry;
-    MenuItem *mi;
+    Widget entry;
     Arg args[16];
 
-    menu = XtCreatePopupShell(name, simpleMenuWidgetClass,
-                             parent, NULL, 0);
     j = 0;
     XtSetArg(args[j], XtNleftMargin, 20);   j++;
     XtSetArg(args[j], XtNrightMargin, 20);  j++;
-    mi = mb->mi;
-    while (mi->string != NULL) {
-       if (strcmp(mi->string, "----") == 0) {
-         entry = XtCreateManagedWidget(_(mi->string), smeLineObjectClass,
-                                         menu, args, j);
+
+       if (strcmp(text, "----") == 0) {
+         entry = XtCreateManagedWidget(text, smeLineObjectClass,
+                                         currentMenu, args, j);
        } else {
-          XtSetArg(args[j], XtNlabel, XtNewString(_(mi->string)));
-           entry = XtCreateManagedWidget(mi->ref, smeBSBObjectClass,
-                                         menu, args, j+1);
+          XtSetArg(args[j], XtNlabel, XtNewString(_(text)));
+           entry = XtCreateManagedWidget(name, smeBSBObjectClass,
+                                         currentMenu, args, j+1);
            XtAddCallback(entry, XtNcallback,
-                         (XtCallbackProc) MenuBarSelect,
-                         (caddr_t) mi->proc);
+                         (XtCallbackProc) (strcmp(name, "recent") ? MenuBarSelect : MenuEngineSelect),
+                         (caddr_t) action);
        }
-       mi++;
-    }
 }
 
-Widget CreateMenuBar(mb)
-     Menu *mb;
+void
+CreateMenuButton (char *name, Menu *mb)
+{   // create menu button on main bar, and shell for pull-down list
+    int i, j;
+    Arg args[16];
+    Dimension w;
+
+       j = 0;
+       XtSetArg(args[j], XtNmenuName, XtNewString(name));  j++;
+       XtSetArg(args[j], XtNlabel, XtNewString(_(mb->name)));  j++;
+       XtSetArg(args[j], XtNborderWidth, 0);                   j++;
+       mb->subMenu = XtCreateManagedWidget(mb->name, menuButtonWidgetClass,
+                                      mainBar, args, j);
+    currentMenu = XtCreatePopupShell(name, simpleMenuWidgetClass,
+                             mainBar, NULL, 0);
+       j = 0;
+       XtSetArg(args[j], XtNwidth, &w);                   j++;
+       XtGetValues(mb->subMenu, args, j);
+       wtot += mb->textWidth = widths[nr++] = w;
+}
+
+Widget
+CreateMenuBar (Menu *mb, int boardWidth)
 {
-    int j;
-    Widget anchor, menuBar;
+    int i, j;
     Arg args[16];
     char menuName[MSG_SIZ];
+    Dimension w;
+    Menu *ma = mb;
 
+    // create bar itself
     j = 0;
     XtSetArg(args[j], XtNorientation, XtorientHorizontal);  j++;
     XtSetArg(args[j], XtNvSpace, 0);                        j++;
     XtSetArg(args[j], XtNborderWidth, 0);                   j++;
-    menuBar = XtCreateWidget("menuBar", boxWidgetClass,
+    mainBar = XtCreateWidget("menuBar", boxWidgetClass,
                             formWidget, args, j);
 
-    while (mb->name != NULL) {
-        safeStrCpy(menuName, "menu", sizeof(menuName)/sizeof(menuName[0]) );
-       strncat(menuName, mb->ref, MSG_SIZ - strlen(menuName) - 1);
-       j = 0;
-       XtSetArg(args[j], XtNmenuName, XtNewString(menuName));  j++;
-       if (tinyLayout) {
-           char shortName[2];
-            shortName[0] = mb->name[0];
-           shortName[1] = NULLCHAR;
-           XtSetArg(args[j], XtNlabel, XtNewString(shortName)); j++;
-       }
-      else {
-       XtSetArg(args[j], XtNlabel, XtNewString(_(mb->name))); j++;
-      }
+    CreateMainMenus(mb); // put menus in bar according to description in back-end
 
-       XtSetArg(args[j], XtNborderWidth, 0);                   j++;
-       anchor = XtCreateManagedWidget(mb->name, menuButtonWidgetClass,
-                                      menuBar, args, j);
-       CreateMenuBarPopup(menuBar, menuName, mb);
-       mb++;
+    // size buttons to make menu bar fit, clipping menu names where necessary
+    while(wtot > boardWidth - 40) {
+       int wmax=0, imax=0;
+       for(i=0; i<nr; i++) if(widths[i] > wmax) wmax = widths[imax=i];
+       widths[imax]--;
+       wtot--;
+    }
+    for(i=0; i<nr; i++) if(widths[i] != ma[i].textWidth) {
+       j = 0;
+       XtSetArg(args[j], XtNwidth, widths[i]);                   j++;
+       XtSetValues(ma[i].subMenu, args, j);
     }
-    return menuBar;
+
+    return mainBar;
 }
 
-Widget CreateButtonBar(mi)
-     MenuItem *mi;
+Widget
+CreateButtonBar (MenuItem *mi)
 {
     int j;
     Widget button, buttonBar;
@@ -3996,9 +3643,7 @@ Widget CreateButtonBar(mi)
 }
 
 Widget
-CreatePieceMenu(name, color)
-     char *name;
-     int color;
+CreatePieceMenu (char *name, int color)
 {
     int i;
     Widget entry, menu;
@@ -4032,7 +3677,7 @@ CreatePieceMenu(name, color)
 }
 
 void
-CreatePieceMenus()
+CreatePieceMenus ()
 {
     int i;
     Widget entry;
@@ -4042,6 +3687,7 @@ CreatePieceMenus()
     whitePieceMenu = CreatePieceMenu("menuW", 0);
     blackPieceMenu = CreatePieceMenu("menuB", 1);
 
+    if(appData.pieceMenu) // [HGM] sweep: no idea what this was good for, but it stopped reporting button events outside the window
     XtRegisterGrabAction(PieceMenuPopup, True,
                         (unsigned)(ButtonPressMask|ButtonReleaseMask),
                         GrabModeAsync, GrabModeAsync);
@@ -4067,7 +3713,8 @@ CreatePieceMenus()
     }
 }
 
-void SetupDropMenu()
+void
+SetupDropMenu ()
 {
     int i, j, count;
     char label[32];
@@ -4091,11 +3738,8 @@ void SetupDropMenu()
     }
 }
 
-void PieceMenuPopup(w, event, params, num_params)
-     Widget w;
-     XEvent *event;
-     String *params;
-     Cardinal *num_params;
+void
+PieceMenuPopup (Widget w, XEvent *event, String *params, Cardinal *num_params)
 {
     String whichMenu; int menuNr = -2;
     shiftKey = strcmp(params[0], "menuW"); // used to indicate black
@@ -4113,39 +3757,31 @@ void PieceMenuPopup(w, event, params, num_params)
     XtPopupSpringLoaded(XtNameToWidget(boardWidget, whichMenu));
 }
 
-static void PieceMenuSelect(w, piece, junk)
-     Widget w;
-     ChessSquare piece;
-     caddr_t junk;
+static void
+PieceMenuSelect (Widget w, ChessSquare piece, caddr_t junk)
 {
     if (pmFromX < 0 || pmFromY < 0) return;
     EditPositionMenuEvent(piece, pmFromX, pmFromY);
 }
 
-static void DropMenuSelect(w, piece, junk)
-     Widget w;
-     ChessSquare piece;
-     caddr_t junk;
+static void
+DropMenuSelect (Widget w, ChessSquare piece, caddr_t junk)
 {
     if (pmFromX < 0 || pmFromY < 0) return;
     DropMenuEvent(piece, pmFromX, pmFromY);
 }
 
-void WhiteClock(w, event, prms, nprms)
-     Widget w;
-     XEvent *event;
-     String *prms;
-     Cardinal *nprms;
+void
+WhiteClock (Widget w, XEvent *event, String *prms, Cardinal *nprms)
 {
+    shiftKey = prms[0][0] & 1;
     ClockClick(0);
 }
 
-void BlackClock(w, event, prms, nprms)
-     Widget w;
-     XEvent *event;
-     String *prms;
-     Cardinal *nprms;
+void
+BlackClock (Widget w, XEvent *event, String *prms, Cardinal *nprms)
 {
+    shiftKey = prms[0][0] & 1;
     ClockClick(1);
 }
 
@@ -4154,8 +3790,8 @@ void BlackClock(w, event, prms, nprms)
  * If the user selects on a border boundary, return -1; if off the board,
  *   return -2.  Otherwise map the event coordinate to the square.
  */
-int EventToSquare(x, limit)
-     int x;
+int
+EventToSquare (int x, int limit)
 {
     if (x <= 0)
       return -2;
@@ -4170,15 +3806,14 @@ int EventToSquare(x, limit)
     return x;
 }
 
-static void do_flash_delay(msec)
-     unsigned long msec;
+static void
+do_flash_delay (unsigned long msec)
 {
     TimeDelay(msec);
 }
 
-static void drawHighlight(file, rank, gc)
-     int file, rank;
-     GC gc;
+static void
+drawHighlight (int file, int rank, GC gc)
 {
     int x, y;
 
@@ -4202,14 +3837,14 @@ int hi1X = -1, hi1Y = -1, hi2X = -1, hi2Y = -1;
 int pm1X = -1, pm1Y = -1, pm2X = -1, pm2Y = -1;
 
 void
-SetHighlights(fromX, fromY, toX, toY)
-     int fromX, fromY, toX, toY;
+SetHighlights (int fromX, int fromY, int toX, int toY)
 {
     if (hi1X != fromX || hi1Y != fromY) {
        if (hi1X >= 0 && hi1Y >= 0) {
            drawHighlight(hi1X, hi1Y, lineGC);
        }
     } // [HGM] first erase both, then draw new!
+
     if (hi2X != toX || hi2Y != toY) {
        if (hi2X >= 0 && hi2Y >= 0) {
            drawHighlight(hi2X, hi2Y, lineGC);
@@ -4225,6 +3860,10 @@ SetHighlights(fromX, fromY, toX, toY)
            drawHighlight(toX, toY, highlineGC);
        }
     }
+
+    if(toX<0) // clearing the highlights must have damaged arrow
+       DrawArrowHighlight(hi1X, hi1Y, hi2X, hi2Y); // for now, redraw it (should really be cleared!)
+
     hi1X = fromX;
     hi1Y = fromY;
     hi2X = toX;
@@ -4232,15 +3871,14 @@ SetHighlights(fromX, fromY, toX, toY)
 }
 
 void
-ClearHighlights()
+ClearHighlights ()
 {
     SetHighlights(-1, -1, -1, -1);
 }
 
 
 void
-SetPremoveHighlights(fromX, fromY, toX, toY)
-     int fromX, fromY, toX, toY;
+SetPremoveHighlights (int fromX, int fromY, int toX, int toY)
 {
     if (pm1X != fromX || pm1Y != fromY) {
        if (pm1X >= 0 && pm1Y >= 0) {
@@ -4265,13 +3903,13 @@ SetPremoveHighlights(fromX, fromY, toX, toY)
 }
 
 void
-ClearPremoveHighlights()
+ClearPremoveHighlights ()
 {
   SetPremoveHighlights(-1, -1, -1, -1);
 }
 
-static int CutOutSquare(x, y, x0, y0, kind)
-     int x, y, *x0, *y0, kind;
+static int
+CutOutSquare (int x, int y, int *x0, int *y0, int  kind)
 {
     int W = BOARD_WIDTH, H = BOARD_HEIGHT;
     int nx = x/(squareSize + lineGap), ny = y/(squareSize + lineGap);
@@ -4288,10 +3926,8 @@ static int CutOutSquare(x, y, x0, y0, kind)
     return 1;
 }
 
-static void BlankSquare(x, y, color, piece, dest, fac)
-     int x, y, color, fac;
-     ChessSquare piece;
-     Drawable dest;
+static void
+BlankSquare (int x, int y, int color, ChessSquare piece, Drawable dest, int fac)
 {   // [HGM] extra param 'fac' for forcing destination to (0,0) for copying to animation buffer
     int x0, y0;
     if (useImages && color != 2 && (useTexture & color+1) && CutOutSquare(x, y, &x0, &y0, color)) {
@@ -4336,10 +3972,8 @@ static void BlankSquare(x, y, color, piece, dest, fac)
    I split out the routines to draw a piece so that I could
    make a generic flash routine.
 */
-static void monoDrawPiece_1bit(piece, square_color, x, y, dest)
-     ChessSquare piece;
-     int square_color, x, y;
-     Drawable dest;
+static void
+monoDrawPiece_1bit (ChessSquare piece, int square_color, int x, int y, Drawable dest)
 {
     /* Avoid XCopyPlane on 1-bit screens to work around Sun bug */
     switch (square_color) {
@@ -4362,10 +3996,8 @@ static void monoDrawPiece_1bit(piece, square_color, x, y, dest)
     }
 }
 
-static void monoDrawPiece(piece, square_color, x, y, dest)
-     ChessSquare piece;
-     int square_color, x, y;
-     Drawable dest;
+static void
+monoDrawPiece (ChessSquare piece, int square_color, int x, int y, Drawable dest)
 {
     switch (square_color) {
       case 1: /* light */
@@ -4387,10 +4019,8 @@ static void monoDrawPiece(piece, square_color, x, y, dest)
     }
 }
 
-static void colorDrawPiece(piece, square_color, x, y, dest)
-     ChessSquare piece;
-     int square_color, x, y;
-     Drawable dest;
+static void
+colorDrawPiece (ChessSquare piece, int square_color, int x, int y, Drawable dest)
 {
     if(pieceToSolid(piece) == NULL) return; // [HGM] bitmaps: make it non-fatal if we have no bitmap;
     switch (square_color) {
@@ -4416,10 +4046,8 @@ static void colorDrawPiece(piece, square_color, x, y, dest)
     }
 }
 
-static void colorDrawPieceImage(piece, square_color, x, y, dest)
-     ChessSquare piece;
-     int square_color, x, y;
-     Drawable dest;
+static void
+colorDrawPieceImage (ChessSquare piece, int square_color, int x, int y, Drawable dest)
 {
     int kind, p = piece;
 
@@ -4459,7 +4087,8 @@ static void colorDrawPieceImage(piece, square_color, x, y, dest)
 
 typedef void (*DrawFunc)();
 
-DrawFunc ChooseDrawFunc()
+DrawFunc
+ChooseDrawFunc ()
 {
     if (appData.monoMode) {
        if (DefaultDepth(xDisplay, xScreen) == 1) {
@@ -4476,8 +4105,8 @@ DrawFunc ChooseDrawFunc()
 }
 
 /* [HR] determine square color depending on chess variant. */
-static int SquareColor(row, column)
-     int row, column;
+static int
+SquareColor (int row, int column)
 {
     int square_color;
 
@@ -4501,9 +4130,8 @@ static int SquareColor(row, column)
     return square_color;
 }
 
-void DrawSquare(row, column, piece, do_flash)
-     int row, column, do_flash;
-     ChessSquare piece;
+void
+DrawSquare (int row, int column, ChessSquare piece, int do_flash)
 {
     int square_color, x, y, direction, font_ascent, font_descent;
     int i;
@@ -4613,22 +4241,100 @@ void DrawSquare(row, column, piece, do_flash)
        }
     }
     if(!partnerUp && marker[row][column]) {
+       if(appData.monoMode) {
+           XFillArc(xDisplay, xBoardWindow, marker[row][column] == 2 ? darkSquareGC : lightSquareGC,
+                   x + squareSize/4, y+squareSize/4, squareSize/2, squareSize/2, 0, 64*360);
+           XDrawArc(xDisplay, xBoardWindow, marker[row][column] == 2 ? lightSquareGC : darkSquareGC,
+                   x + squareSize/4, y+squareSize/4, squareSize/2, squareSize/2, 0, 64*360);
+       } else
        XFillArc(xDisplay, xBoardWindow, marker[row][column] == 2 ? prelineGC : highlineGC,
                x + squareSize/4, y+squareSize/4, squareSize/2, squareSize/2, 0, 64*360);
     }
 }
 
+double
+Fraction (int x, int start, int stop)
+{
+   double f = ((double) x - start)/(stop - start);
+   if(f > 1.) f = 1.; else if(f < 0.) f = 0.;
+   return f;
+}
+
+static WindowPlacement wpNew;
+
+void
+CoDrag (Widget sh, WindowPlacement *wp)
+{
+    Arg args[16];
+    int j=0, touch=0, fudge = 2;
+    GetActualPlacement(sh, wp);
+    if(abs(wpMain.x + wpMain.width + 2*frameX - wp->x)         < fudge) touch = 1; else // right touch
+    if(abs(wp->x + wp->width + 2*frameX - wpMain.x)            < fudge) touch = 2; else // left touch
+    if(abs(wpMain.y + wpMain.height + frameX + frameY - wp->y) < fudge) touch = 3; else // bottom touch
+    if(abs(wp->y + wp->height + frameX + frameY - wpMain.y)    < fudge) touch = 4;      // top touch
+    if(!touch ) return; // only windows that touch co-move
+    if(touch < 3 && wpNew.height != wpMain.height) { // left or right and height changed
+       int heightInc = wpNew.height - wpMain.height;
+       double fracTop = Fraction(wp->y, wpMain.y, wpMain.y + wpMain.height + frameX + frameY);
+       double fracBot = Fraction(wp->y + wp->height + frameX + frameY + 1, wpMain.y, wpMain.y + wpMain.height + frameX + frameY);
+       wp->y += fracTop * heightInc;
+       heightInc = (int) (fracBot * heightInc) - (int) (fracTop * heightInc);
+       if(heightInc) XtSetArg(args[j], XtNheight, wp->height + heightInc), j++;
+    } else if(touch > 2 && wpNew.width != wpMain.width) { // top or bottom and width changed
+       int widthInc = wpNew.width - wpMain.width;
+       double fracLeft = Fraction(wp->x, wpMain.x, wpMain.x + wpMain.width + 2*frameX);
+       double fracRght = Fraction(wp->x + wp->width + 2*frameX + 1, wpMain.x, wpMain.x + wpMain.width + 2*frameX);
+       wp->y += fracLeft * widthInc;
+       widthInc = (int) (fracRght * widthInc) - (int) (fracLeft * widthInc);
+       if(widthInc) XtSetArg(args[j], XtNwidth, wp->width + widthInc), j++;
+    }
+    wp->x += wpNew.x - wpMain.x;
+    wp->y += wpNew.y - wpMain.y;
+    if(touch == 1) wp->x += wpNew.width - wpMain.width; else
+    if(touch == 3) wp->y += wpNew.height - wpMain.height;
+    XtSetArg(args[j], XtNx, wp->x); j++;
+    XtSetArg(args[j], XtNy, wp->y); j++;
+    XtSetValues(sh, args, j);
+}
+
+static XtIntervalId delayedDragID = 0;
+
+void
+DragProc ()
+{
+       GetActualPlacement(shellWidget, &wpNew);
+       if(wpNew.x == wpMain.x && wpNew.y == wpMain.y && // not moved
+          wpNew.width == wpMain.width && wpNew.height == wpMain.height) // not sized
+           return; // false alarm
+       if(EngineOutputIsUp()) CoDrag(engineOutputShell, &wpEngineOutput);
+       if(MoveHistoryIsUp()) CoDrag(shells[7], &wpMoveHistory);
+       if(EvalGraphIsUp()) CoDrag(evalGraphShell, &wpEvalGraph);
+       if(GameListIsUp()) CoDrag(gameListShell, &wpGameList);
+       wpMain = wpNew;
+       XDrawPosition(boardWidget, True, NULL);
+       delayedDragID = 0; // now drag executed, make sure next DelayedDrag will not cancel timer event (which could now be used by other)
+}
+
+
+void
+DelayedDrag ()
+{
+    if(delayedDragID) XtRemoveTimeOut(delayedDragID); // cancel pending
+    delayedDragID =
+      XtAppAddTimeOut(appContext, 50, (XtTimerCallbackProc) DragProc, (XtPointer) 0); // and schedule new one 50 msec later
+}
 
 /* Why is this needed on some versions of X? */
-void EventProc(widget, unused, event)
-     Widget widget;
-     caddr_t unused;
-     XEvent *event;
+void
+EventProc (Widget widget, caddr_t unused, XEvent *event)
 {
     if (!XtIsRealized(widget))
       return;
-
     switch (event->type) {
+      case ConfigureNotify: // main window is being dragged: drag attached windows with it
+       if(appData.useStickyWindows)
+           DelayedDrag(); // as long as events keep coming in faster than 50 msec, they destroy each other
+       break;
       case Expose:
        if (event->xexpose.count > 0) return;  /* no clipping is done */
        XDrawPosition(widget, True, NULL);
@@ -4646,17 +4352,16 @@ void EventProc(widget, unused, event)
 }
 /* end why */
 
-void DrawPosition(fullRedraw, board)
-     /*Boolean*/int fullRedraw;
-     Board board;
+void
+DrawPosition (int fullRedraw, Board board)
 {
     XDrawPosition(boardWidget, fullRedraw, board);
 }
 
 /* Returns 1 if there are "too many" differences between b1 and b2
    (i.e. more than 1 move was made) */
-static int too_many_diffs(b1, b2)
-     Board b1, b2;
+static int
+too_many_diffs (Board b1, Board b2)
 {
     int i, j;
     int c = 0;
@@ -4689,9 +4394,8 @@ static int castling_matrix[4][5] = {
    Note: Only handles a max of 1 castling move, so be sure
    to call too_many_diffs() first.
    */
-static int check_castle_draw(newb, oldb, rrow, rcol)
-     Board newb, oldb;
-     int *rrow, *rcol;
+static int
+check_castle_draw (Board newb, Board oldb, int *rrow, int *rcol)
 {
     int i, *r, j;
     int match;
@@ -4720,22 +4424,26 @@ static int check_castle_draw(newb, oldb, rrow, rcol)
 }
 
 // [HGM] seekgraph: some low-level drawing routines cloned from xevalgraph
-void DrawSeekAxis( int x, int y, int xTo, int yTo )
+void
+DrawSeekAxis (int x, int y, int xTo, int yTo)
 {
       XDrawLine(xDisplay, xBoardWindow, lineGC, x, y, xTo, yTo);
 }
 
-void DrawSeekBackground( int left, int top, int right, int bottom )
+void
+DrawSeekBackground (int left, int top, int right, int bottom)
 {
     XFillRectangle(xDisplay, xBoardWindow, lightSquareGC, left, top, right-left, bottom-top);
 }
 
-void DrawSeekText(char *buf, int x, int y)
+void
+DrawSeekText (char *buf, int x, int y)
 {
     XDrawString(xDisplay, xBoardWindow, coordGC, x, y+4, buf, strlen(buf));
 }
 
-void DrawSeekDot(int x, int y, int colorNr)
+void
+DrawSeekDot (int x, int y, int colorNr)
 {
     int square = colorNr & 0x80;
     GC color;
@@ -4754,10 +4462,8 @@ static int damage[2][BOARD_RANKS][BOARD_FILES];
 /*
  * event handler for redrawing the board
  */
-void XDrawPosition(w, repaint, board)
-     Widget w;
-     /*Boolean*/int repaint;
-     Board board;
+void
+XDrawPosition (Widget w, int repaint, Board board)
 {
     int i, j, do_flash;
     static int lastFlipView = 0;
@@ -4864,11 +4570,8 @@ void XDrawPosition(w, repaint, board)
 /*
  * event handler for redrawing the board
  */
-void DrawPositionProc(w, event, prms, nprms)
-     Widget w;
-     XEvent *event;
-     String *prms;
-     Cardinal *nprms;
+void
+DrawPositionProc (Widget w, XEvent *event, String *prms, Cardinal *nprms)
 {
     XDrawPosition(w, True, NULL);
 }
@@ -4884,11 +4587,8 @@ void DrawPositionProc(w, event, prms, nprms)
 //       move, (which will weed out the illegal selfcaptures and moves into the holdings, and flag promotions),
 //       and at the end FinishMove() to perform the move after optional promotion popups.
 //       For now I patched it to allow self-capture with King, and suppress clicks between board and holdings.
-void HandleUserMove(w, event, prms, nprms)
-     Widget w;
-     XEvent *event;
-     String *prms;
-     Cardinal *nprms;
+void
+HandleUserMove (Widget w, XEvent *event, String *prms, Cardinal *nprms)
 {
     if (w != boardWidget || errorExitStatus != -1) return;
     if(nprms) shiftKey = !strcmp(prms[0], "1");
@@ -4910,22 +4610,23 @@ void HandleUserMove(w, event, prms, nprms)
     if(event->type == ButtonRelease) LeftClick(Release, event->xbutton.x, event->xbutton.y);
 }
 
-void AnimateUserMove (Widget w, XEvent * event,
-                     String * params, Cardinal * nParams)
+void
+AnimateUserMove (Widget w, XEvent *event, String *params, Cardinal *nParams)
 {
     if(!PromoScroll(event->xmotion.x, event->xmotion.y))
     DragPieceMove(event->xmotion.x, event->xmotion.y);
 }
 
-void HandlePV (Widget w, XEvent * event,
-                     String * params, Cardinal * nParams)
+void
+HandlePV (Widget w, XEvent * event, String * params, Cardinal * nParams)
 {   // [HGM] pv: walk PV
     MovePV(event->xmotion.x, event->xmotion.y, lineGap + BOARD_HEIGHT * (squareSize + lineGap));
 }
 
 static int savedIndex;  /* gross that this is global */
 
-void CommentClick (Widget w, XEvent * event, String * params, Cardinal * nParams)
+void
+CommentClick (Widget w, XEvent * event, String * params, Cardinal * nParams)
 {
        String val;
        XawTextPosition index, dummy;
@@ -4939,23 +4640,24 @@ void CommentClick (Widget w, XEvent * event, String * params, Cardinal * nParams
        LoadVariation( index, val ); // [HGM] also does the actual moving to it, now
 }
 
-void EditCommentPopUp(index, title, text)
-     int index;
-     char *title, *text;
+void
+EditCommentPopUp (int index, char *title, char *text)
 {
     savedIndex = index;
     if (text == NULL) text = "";
     NewCommentPopup(title, text, index);
 }
 
-void ICSInputBoxPopUp()
+void
+ICSInputBoxPopUp ()
 {
     InputBoxPopup();
 }
 
 extern Option boxOptions[];
 
-void ICSInputSendText()
+void
+ICSInputSendText ()
 {
     Widget edit;
     int j;
@@ -4972,43 +4674,50 @@ void ICSInputSendText()
     XtCallActionProc(edit, "kill-selection", NULL, NULL, 0);
 }
 
-void ICSInputBoxPopDown()
+void
+ICSInputBoxPopDown ()
 {
     PopDown(4);
 }
 
-void CommentPopUp(title, text)
-     char *title, *text;
+void
+CommentPopUp (char *title, char *text)
 {
     savedIndex = currentMove; // [HGM] vari
     NewCommentPopup(title, text, currentMove);
 }
 
-void CommentPopDown()
+void
+CommentPopDown ()
 {
     PopDown(1);
 }
 
-void FileNamePopUp(label, def, filter, proc, openMode)
-     char *label;
-     char *def;
-     char *filter;
-     FileProc proc;
-     char *openMode;
+static char *openName;
+FILE *openFP;
+
+void
+DelayedLoad ()
+{
+  (void) (*fileProc)(openFP, 0, openName);
+}
+
+void
+FileNamePopUp (char *label, char *def, char *filter, FileProc proc, char *openMode)
 {
     fileProc = proc;           /* I can't see a way not */
     fileOpenMode = openMode;   /*   to use globals here */
     {   // [HGM] use file-selector dialog stolen from Ghostview
-       char *name;
        int index; // this is not supported yet
-       FILE *f;
-       if(f = XsraSelFile(shellWidget, label, NULL, NULL, "could not open: ",
-                          (def[0] ? def : NULL), filter, openMode, NULL, &name))
-         (void) (*fileProc)(f, index=0, name);
+       if(openFP = XsraSelFile(shellWidget, label, NULL, NULL, _("could not open: "),
+                          (def[0] ? def : NULL), filter, openMode, NULL, &openName))
+         // [HGM] delay to give expose event opportunity to redraw board after browser-dialog popdown before lengthy load starts
+         ScheduleDelayedEvent(&DelayedLoad, 50);
     }
 }
 
-void FileNamePopDown()
+void
+FileNamePopDown ()
 {
     if (!filenameUp) return;
     XtPopdown(fileNameShell);
@@ -5017,9 +4726,8 @@ void FileNamePopDown()
     ModeHighlight();
 }
 
-void FileNameCallback(w, client_data, call_data)
-     Widget w;
-     XtPointer client_data, call_data;
+void
+FileNameCallback (Widget w, XtPointer client_data, XtPointer call_data)
 {
     String name;
     Arg args[16];
@@ -5035,11 +4743,8 @@ void FileNameCallback(w, client_data, call_data)
     FileNameAction(w, NULL, NULL, NULL);
 }
 
-void FileNameAction(w, event, prms, nprms)
-     Widget w;
-     XEvent *event;
-     String *prms;
-     Cardinal *nprms;
+void
+FileNameAction (Widget w, XEvent *event, String *prms, Cardinal *nprms)
 {
     char buf[MSG_SIZ];
     String name;
@@ -5084,13 +4789,15 @@ void FileNameAction(w, event, prms, nprms)
     ModeHighlight();
 }
 
-void PromotionPopUp()
+void
+PromotionPopUp ()
 {
     Arg args[16];
     Widget dialog, layout;
     Position x, y;
     Dimension bw_width, pw_width;
     int j;
+    char *PromoChars = "wglcqrbnkac+=\0";
 
     j = 0;
     XtSetArg(args[j], XtNwidth, &bw_width); j++;
@@ -5114,47 +4821,33 @@ void PromotionPopUp()
 
   if(gameInfo.variant != VariantShogi) {
    if(gameInfo.variant == VariantSpartan && !WhiteOnMove(currentMove)) {
-      XawDialogAddButton(dialog, _("Warlord"), PromotionCallback,
-                        (XtPointer) dialog);
-      XawDialogAddButton(dialog, _("General"), PromotionCallback,
-                        (XtPointer) dialog);
-      XawDialogAddButton(dialog, _("Lieutenant"), PromotionCallback,
-                        (XtPointer) dialog);
-      XawDialogAddButton(dialog, _("Captain"), PromotionCallback,
-                        (XtPointer) dialog);
-    } else {\r
-    XawDialogAddButton(dialog, _("Queen"), PromotionCallback,
-                      (XtPointer) dialog);
-    XawDialogAddButton(dialog, _("Rook"), PromotionCallback,
-                      (XtPointer) dialog);
-    XawDialogAddButton(dialog, _("Bishop"), PromotionCallback,
-                      (XtPointer) dialog);
-    XawDialogAddButton(dialog, _("Knight"), PromotionCallback,
-                      (XtPointer) dialog);
+      XawDialogAddButton(dialog, _("Warlord"), PromotionCallback, PromoChars + 0);
+      XawDialogAddButton(dialog, _("General"), PromotionCallback, PromoChars + 1);
+      XawDialogAddButton(dialog, _("Lieutenant"), PromotionCallback, PromoChars + 2);
+      XawDialogAddButton(dialog, _("Captain"), PromotionCallback, PromoChars + 3);
+    } else {
+    XawDialogAddButton(dialog, _("Queen"), PromotionCallback, PromoChars + 4);
+    XawDialogAddButton(dialog, _("Rook"), PromotionCallback, PromoChars + 5);
+    XawDialogAddButton(dialog, _("Bishop"), PromotionCallback, PromoChars + 6);
+    XawDialogAddButton(dialog, _("Knight"), PromotionCallback, PromoChars + 7);
     }
     if (!appData.testLegality || gameInfo.variant == VariantSuicide ||
-        gameInfo.variant == VariantSpartan && !WhiteOnMove(currentMove) ||\r
+        gameInfo.variant == VariantSpartan && !WhiteOnMove(currentMove) ||
         gameInfo.variant == VariantGiveaway) {
-      XawDialogAddButton(dialog, _("King"), PromotionCallback,
-                        (XtPointer) dialog);
+      XawDialogAddButton(dialog, _("King"), PromotionCallback, PromoChars + 8);
     }
     if(gameInfo.variant == VariantCapablanca ||
        gameInfo.variant == VariantGothic ||
        gameInfo.variant == VariantCapaRandom) {
-      XawDialogAddButton(dialog, _("Archbishop"), PromotionCallback,
-                        (XtPointer) dialog);
-      XawDialogAddButton(dialog, _("Chancellor"), PromotionCallback,
-                        (XtPointer) dialog);
+      XawDialogAddButton(dialog, _("Archbishop"), PromotionCallback, PromoChars + 9);
+      XawDialogAddButton(dialog, _("Chancellor"), PromotionCallback, PromoChars + 10);
     }
   } else // [HGM] shogi
   {
-      XawDialogAddButton(dialog, _("Promote"), PromotionCallback,
-                        (XtPointer) dialog);
-      XawDialogAddButton(dialog, _("Defer"), PromotionCallback,
-                        (XtPointer) dialog);
+      XawDialogAddButton(dialog, _("Promote"), PromotionCallback, PromoChars + 11);
+      XawDialogAddButton(dialog, _("Defer"), PromotionCallback, PromoChars + 12);
   }
-    XawDialogAddButton(dialog, _("cancel"), PromotionCallback,
-                      (XtPointer) dialog);
+    XawDialogAddButton(dialog, _("cancel"), PromotionCallback, PromoChars + 13);
 
     XtRealizeWidget(promotionShell);
     CatchDeleteWindow(promotionShell, "PromotionPopDown");
@@ -5178,7 +4871,8 @@ void PromotionPopUp()
     promotionUp = True;
 }
 
-void PromotionPopDown()
+void
+PromotionPopDown ()
 {
     if (!promotionUp) return;
     XtPopdown(promotionShell);
@@ -5186,35 +4880,20 @@ void PromotionPopDown()
     promotionUp = False;
 }
 
-void PromotionCallback(w, client_data, call_data)
-     Widget w;
-     XtPointer client_data, call_data;
+void
+PromotionCallback (Widget w, XtPointer client_data, XtPointer call_data)
 {
-    String name;
-    Arg args[16];
-    int promoChar;
-
-    XtSetArg(args[0], XtNlabel, &name);
-    XtGetValues(w, args, 1);
+    int promoChar = * (const char *) client_data;
 
     PromotionPopDown();
 
     if (fromX == -1) return;
 
-    if (strcmp(name, _("cancel")) == 0) {
+    if (! promoChar) {
        fromX = fromY = -1;
        ClearHighlights();
        return;
-    } else if (strcmp(name, _("Knight")) == 0) {
-       promoChar = 'n';
-    } else if (strcmp(name, _("Promote")) == 0) {
-       promoChar = '+';
-    } else if (strcmp(name, _("Defer")) == 0) {
-       promoChar = '=';
-    } else {
-       promoChar = ToLower(name[0]);
     }
-
     UserMoveEvent(fromX, fromY, toX, toY, promoChar);
 
     if (!appData.highlightLastMove || gotPremove) ClearHighlights();
@@ -5223,29 +4902,28 @@ void PromotionCallback(w, client_data, call_data)
 }
 
 
-void ErrorCallback(w, client_data, call_data)
-     Widget w;
-     XtPointer client_data, call_data;
+void
+ErrorCallback (Widget w, XtPointer client_data, XtPointer call_data)
 {
-    errorUp = False;
+    dialogError = errorUp = False;
     XtPopdown(w = XtParent(XtParent(XtParent(w))));
     XtDestroyWidget(w);
     if (errorExitStatus != -1) ExitEvent(errorExitStatus);
 }
 
 
-void ErrorPopDown()
+void
+ErrorPopDown ()
 {
     if (!errorUp) return;
-    errorUp = False;
+    dialogError = errorUp = False;
     XtPopdown(errorShell);
     XtDestroyWidget(errorShell);
     if (errorExitStatus != -1) ExitEvent(errorExitStatus);
 }
 
-void ErrorPopUp(title, label, modal)
-     char *title, *label;
-     int modal;
+void
+ErrorPopUp (char *title, char *label, int modal)
 {
     Arg args[16];
     Widget dialog, layout;
@@ -5261,7 +4939,7 @@ void ErrorPopUp(title, label, modal)
     XtSetArg(args[i], XtNtitle, title); i++;
     errorShell =
       XtCreatePopupShell("errorpopup", transientShellWidgetClass,
-                        shellWidget, args, i);
+                        shellUp[0] ? (dialogError = modal = TRUE, shells[0]) : shellWidget, args, i);
     layout =
       XtCreateManagedWidget(layoutName, formWidgetClass, errorShell,
                            layoutArgs, XtNumber(layoutArgs));
@@ -5313,7 +4991,9 @@ void ErrorPopUp(title, label, modal)
 
 /* Disable all user input other than deleting the window */
 static int frozen = 0;
-void FreezeUI()
+
+void
+FreezeUI ()
 {
   if (frozen) return;
   /* Grab by a widget that doesn't accept input */
@@ -5322,15 +5002,16 @@ void FreezeUI()
 }
 
 /* Undo a FreezeUI */
-void ThawUI()
+void
+ThawUI ()
 {
   if (!frozen) return;
   XtRemoveGrab(messageWidget);
   frozen = 0;
 }
 
-char *ModeToWidgetName(mode)
-     GameMode mode;
+char *
+ModeToWidgetName (GameMode mode)
 {
     switch (mode) {
       case BeginningOfGame:
@@ -5371,7 +5052,8 @@ char *ModeToWidgetName(mode)
     }
 }
 
-void ModeHighlight()
+void
+ModeHighlight ()
 {
     Arg args[16];
     static int oldPausing = FALSE;
@@ -5430,19 +5112,8 @@ void ModeHighlight()
 /*
  * Button/menu procedures
  */
-void ResetProc(w, event, prms, nprms)
-     Widget w;
-     XEvent *event;
-     String *prms;
-     Cardinal *nprms;
-{
-    ResetGameEvent();
-}
-
-int LoadGamePopUp(f, gameNumber, title)
-     FILE *f;
-     int gameNumber;
-     char *title;
+int
+LoadGamePopUp (FILE *f, int gameNumber, char *title)
 {
     cmailMsgLoaded = FALSE;
     if (gameNumber == 0) {
@@ -5460,11 +5131,8 @@ int LoadGamePopUp(f, gameNumber, title)
     return LoadGame(f, gameNumber, title, FALSE);
 }
 
-void LoadGameProc(w, event, prms, nprms)
-     Widget w;
-     XEvent *event;
-     String *prms;
-     Cardinal *nprms;
+void
+LoadGameProc ()
 {
     if (gameMode == AnalyzeMode || gameMode == AnalyzeFile) {
        Reset(FALSE, TRUE);
@@ -5472,65 +5140,44 @@ void LoadGameProc(w, event, prms, nprms)
     FileNamePopUp(_("Load game file name?"), "", ".pgn .game", LoadGamePopUp, "rb");
 }
 
-void LoadNextGameProc(w, event, prms, nprms)
-     Widget w;
-     XEvent *event;
-     String *prms;
-     Cardinal *nprms;
+void
+LoadNextGameProc ()
 {
     ReloadGame(1);
 }
 
-void LoadPrevGameProc(w, event, prms, nprms)
-     Widget w;
-     XEvent *event;
-     String *prms;
-     Cardinal *nprms;
+void
+LoadPrevGameProc ()
 {
     ReloadGame(-1);
 }
 
-void ReloadGameProc(w, event, prms, nprms)
-     Widget w;
-     XEvent *event;
-     String *prms;
-     Cardinal *nprms;
+void
+ReloadGameProc ()
 {
     ReloadGame(0);
 }
 
-void LoadNextPositionProc(w, event, prms, nprms)
-     Widget w;
-     XEvent *event;
-     String *prms;
-     Cardinal *nprms;
+void
+LoadNextPositionProc ()
 {
     ReloadPosition(1);
 }
 
-void LoadPrevPositionProc(w, event, prms, nprms)
-     Widget w;
-     XEvent *event;
-     String *prms;
-     Cardinal *nprms;
+void
+LoadPrevPositionProc ()
 {
     ReloadPosition(-1);
 }
 
-void ReloadPositionProc(w, event, prms, nprms)
-     Widget w;
-     XEvent *event;
-     String *prms;
-     Cardinal *nprms;
+void
+ReloadPositionProc ()
 {
     ReloadPosition(0);
 }
 
-void LoadPositionProc(w, event, prms, nprms)
-     Widget w;
-     XEvent *event;
-     String *prms;
-     Cardinal *nprms;
+void
+LoadPositionProc() 
 {
     if (gameMode == AnalyzeMode || gameMode == AnalyzeFile) {
        Reset(FALSE, TRUE);
@@ -5538,11 +5185,8 @@ void LoadPositionProc(w, event, prms, nprms)
     FileNamePopUp(_("Load position file name?"), "", ".fen .epd .pos", LoadPosition, "rb");
 }
 
-void SaveGameProc(w, event, prms, nprms)
-     Widget w;
-     XEvent *event;
-     String *prms;
-     Cardinal *nprms;
+void
+SaveGameProc ()
 {
     FileNamePopUp(_("Save game file name?"),
                  DefaultFileName(appData.oldSaveStyle ? "game" : "pgn"),
@@ -5550,11 +5194,8 @@ void SaveGameProc(w, event, prms, nprms)
                  SaveGame, "a");
 }
 
-void SavePositionProc(w, event, prms, nprms)
-     Widget w;
-     XEvent *event;
-     String *prms;
-     Cardinal *nprms;
+void
+SavePositionProc ()
 {
     FileNamePopUp(_("Save position file name?"),
                  DefaultFileName(appData.oldSaveStyle ? "pos" : "fen"),
@@ -5562,31 +5203,19 @@ void SavePositionProc(w, event, prms, nprms)
                  SavePosition, "a");
 }
 
-void ReloadCmailMsgProc(w, event, prms, nprms)
-     Widget w;
-     XEvent *event;
-     String *prms;
-     Cardinal *nprms;
+void
+ReloadCmailMsgProc ()
 {
     ReloadCmailMsgEvent(FALSE);
 }
 
-void MailMoveProc(w, event, prms, nprms)
-     Widget w;
-     XEvent *event;
-     String *prms;
-     Cardinal *nprms;
-{
-    MailMoveEvent();
-}
-
 /* this variable is shared between CopyPositionProc and SendPositionSelection */
 char *selected_fen_position=NULL;
 
 Boolean
-SendPositionSelection(Widget w, Atom *selection, Atom *target,
-                Atom *type_return, XtPointer *value_return,
-                unsigned long *length_return, int *format_return)
+SendPositionSelection (Widget w, Atom *selection, Atom *target,
+                      Atom *type_return, XtPointer *value_return,
+                      unsigned long *length_return, int *format_return)
 {
   char *selection_tmp;
 
@@ -5610,11 +5239,19 @@ SendPositionSelection(Widget w, Atom *selection, Atom *target,
     *value_return = targets_tmp;
     *type_return = XA_ATOM;
     *length_return = 2;
+#if 0
+    // This code leads to a read of value_return out of bounds on 64-bit systems.
+    // Other code which I have seen always sets *format_return to 32 independent of
+    // sizeof(Atom) without adjusting *length_return. For instance see TextConvertSelection()
+    // at http://cgit.freedesktop.org/xorg/lib/libXaw/tree/src/Text.c -- BJ
     *format_return = 8 * sizeof(Atom);
     if (*format_return > 32) {
       *length_return *= *format_return / 32;
       *format_return = 32;
     }
+#else
+    *format_return = 32;
+#endif
     return True;
   } else {
     return False;
@@ -5624,12 +5261,9 @@ SendPositionSelection(Widget w, Atom *selection, Atom *target,
 /* note: when called from menu all parameters are NULL, so no clue what the
  * Widget which was clicked on was, or what the click event was
  */
-void CopyPositionProc(w, event, prms, nprms)
-  Widget w;
-  XEvent *event;
-  String *prms;
-  Cardinal *nprms;
-  {
+void
+CopyPositionProc ()
+{
     /*
      * Set both PRIMARY (the selection) and CLIPBOARD, since we don't
      * have a notion of a position that is selected but not copied.
@@ -5649,12 +5283,18 @@ void CopyPositionProc(w, event, prms, nprms)
                   SendPositionSelection,
                   NULL/* lose_ownership_proc */ ,
                   NULL/* transfer_done_proc */);
-  }
+}
+
+void
+CopyFENToClipboard ()
+{ // wrapper to make call from back-end possible
+  CopyPositionProc();
+}
 
 /* function called when the data to Paste is ready */
 static void
-PastePositionCB(Widget w, XtPointer client_data, Atom *selection,
-          Atom *type, XtPointer value, unsigned long *len, int *format)
+PastePositionCB (Widget w, XtPointer client_data, Atom *selection,
+                Atom *type, XtPointer value, unsigned long *len, int *format)
 {
   char *fenstr=value;
   if (value==NULL || *len==0) return; /* nothing had been selected to copy */
@@ -5665,11 +5305,8 @@ PastePositionCB(Widget w, XtPointer client_data, Atom *selection,
 
 /* called when Paste Position button is pressed,
  * all parameters will be NULL */
-void PastePositionProc(w, event, prms, nprms)
-  Widget w;
-  XEvent *event;
-  String *prms;
-  Cardinal *nprms;
+void
+PastePositionProc ()
 {
     XtGetSelectionValue(menuBarWidget,
       appData.pasteSelection ? XA_PRIMARY: XA_CLIPBOARD(xDisplay), XA_STRING,
@@ -5685,9 +5322,9 @@ void PastePositionProc(w, event, prms, nprms)
 }
 
 static Boolean
-SendGameSelection(Widget w, Atom *selection, Atom *target,
-                 Atom *type_return, XtPointer *value_return,
-                 unsigned long *length_return, int *format_return)
+SendGameSelection (Widget w, Atom *selection, Atom *target,
+                  Atom *type_return, XtPointer *value_return,
+                  unsigned long *length_return, int *format_return)
 {
   char *selection_tmp;
 
@@ -5719,21 +5356,28 @@ SendGameSelection(Widget w, Atom *selection, Atom *target,
     *value_return = targets_tmp;
     *type_return = XA_ATOM;
     *length_return = 2;
+#if 0
+    // This code leads to a read of value_return out of bounds on 64-bit systems.
+    // Other code which I have seen always sets *format_return to 32 independent of
+    // sizeof(Atom) without adjusting *length_return. For instance see TextConvertSelection()
+    // at http://cgit.freedesktop.org/xorg/lib/libXaw/tree/src/Text.c -- BJ
     *format_return = 8 * sizeof(Atom);
     if (*format_return > 32) {
       *length_return *= *format_return / 32;
       *format_return = 32;
     }
+#else
+    *format_return = 32;
+#endif
     return True;
   } else {
     return False;
   }
 }
 
-void CopySomething()
+void
+CopySomething ()
 {
-  int ret;
-
   /*
    * Set both PRIMARY (the selection) and CLIPBOARD, since we don't
    * have a notion of a game that is selected but not copied.
@@ -5754,11 +5398,8 @@ void CopySomething()
 /* note: when called from menu all parameters are NULL, so no clue what the
  * Widget which was clicked on was, or what the click event was
  */
-void CopyGameProc(w, event, prms, nprms)
-  Widget w;
-  XEvent *event;
-  String *prms;
-  Cardinal *nprms;
+void
+CopyGameProc ()
 {
   int ret;
 
@@ -5768,11 +5409,8 @@ void CopyGameProc(w, event, prms, nprms)
   CopySomething();
 }
 
-void CopyGameListProc(w, event, prms, nprms)
-  Widget w;
-  XEvent *event;
-  String *prms;
-  Cardinal *nprms;
+void
+CopyGameListProc ()
 {
   if(!SaveGameListAsText(fopen(gameCopyFilename, "w"))) return;
   CopySomething();
@@ -5780,8 +5418,8 @@ void CopyGameListProc(w, event, prms, nprms)
 
 /* function called when the data to Paste is ready */
 static void
-PasteGameCB(Widget w, XtPointer client_data, Atom *selection,
-           Atom *type, XtPointer value, unsigned long *len, int *format)
+PasteGameCB (Widget w, XtPointer client_data, Atom *selection,
+            Atom *type, XtPointer value, unsigned long *len, int *format)
 {
   FILE* f;
   if (value == NULL || *len == 0) {
@@ -5800,11 +5438,8 @@ PasteGameCB(Widget w, XtPointer client_data, Atom *selection,
 
 /* called when Paste Game button is pressed,
  * all parameters will be NULL */
-void PasteGameProc(w, event, prms, nprms)
-  Widget w;
-  XEvent *event;
-  String *prms;
-  Cardinal *nprms;
+void
+PasteGameProc ()
 {
     XtGetSelectionValue(menuBarWidget,
       appData.pasteSelection ? XA_PRIMARY: XA_CLIPBOARD(xDisplay), XA_STRING,
@@ -5820,54 +5455,27 @@ void PasteGameProc(w, event, prms, nprms)
 }
 
 
-void AutoSaveGame()
+void
+AutoSaveGame ()
 {
-    SaveGameProc(NULL, NULL, NULL, NULL);
+    SaveGameProc();
 }
 
 
-void QuitProc(w, event, prms, nprms)
-     Widget w;
-     XEvent *event;
-     String *prms;
-     Cardinal *nprms;
+void
+QuitProc ()
 {
     ExitEvent(0);
 }
 
-void PauseProc(w, event, prms, nprms)
-     Widget w;
-     XEvent *event;
-     String *prms;
-     Cardinal *nprms;
-{
-    PauseEvent();
-}
-
-
-void MachineBlackProc(w, event, prms, nprms)
-     Widget w;
-     XEvent *event;
-     String *prms;
-     Cardinal *nprms;
-{
-    MachineBlackEvent();
-}
-
-void MachineWhiteProc(w, event, prms, nprms)
-     Widget w;
-     XEvent *event;
-     String *prms;
-     Cardinal *nprms;
+void
+QuitWrapper (Widget w, XEvent *event, String *prms, Cardinal *nprms)
 {
-    MachineWhiteEvent();
+    QuitProc();
 }
 
-void AnalyzeModeProc(w, event, prms, nprms)
-     Widget w;
-     XEvent *event;
-     String *prms;
-     Cardinal *nprms;
+void
+AnalyzeModeProc ()
 {
     char buf[MSG_SIZ];
 
@@ -5902,17 +5510,14 @@ void AnalyzeModeProc(w, event, prms, nprms)
     }
 #ifndef OPTIONSDIALOG
     if (!appData.showThinking)
-      ShowThinkingProc(w,event,prms,nprms);
+      ShowThinkingProc();
 #endif
 
     AnalyzeModeEvent();
 }
 
-void AnalyzeFileProc(w, event, prms, nprms)
-     Widget w;
-     XEvent *event;
-     String *prms;
-     Cardinal *nprms;
+void
+AnalyzeFileProc ()
 {
     if (!first.analysisSupport) {
       char buf[MSG_SIZ];
@@ -5920,75 +5525,24 @@ void AnalyzeFileProc(w, event, prms, nprms)
       DisplayError(buf, 0);
       return;
     }
-    Reset(FALSE, TRUE);
+//    Reset(FALSE, TRUE);
 #ifndef OPTIONSDIALOG
     if (!appData.showThinking)
-      ShowThinkingProc(w,event,prms,nprms);
+      ShowThinkingProc();
 #endif
     AnalyzeFileEvent();
-    FileNamePopUp(_("File to analyze"), "", ".pgn .game", LoadGamePopUp, "rb");
+//    FileNamePopUp(_("File to analyze"), "", ".pgn .game", LoadGamePopUp, "rb");
     AnalysisPeriodicEvent(1);
 }
 
-void TwoMachinesProc(w, event, prms, nprms)
-     Widget w;
-     XEvent *event;
-     String *prms;
-     Cardinal *nprms;
-{
-    TwoMachinesEvent();
-}
-
-void MatchProc(w, event, prms, nprms)
-     Widget w;
-     XEvent *event;
-     String *prms;
-     Cardinal *nprms;
-{
-    MatchEvent(2);\r
-}
-
-void IcsClientProc(w, event, prms, nprms)
-     Widget w;
-     XEvent *event;
-     String *prms;
-     Cardinal *nprms;
-{
-    IcsClientEvent();
-}
-
-void EditGameProc(w, event, prms, nprms)
-     Widget w;
-     XEvent *event;
-     String *prms;
-     Cardinal *nprms;
-{
-    EditGameEvent();
-}
-
-void EditPositionProc(w, event, prms, nprms)
-     Widget w;
-     XEvent *event;
-     String *prms;
-     Cardinal *nprms;
-{
-    EditPositionEvent();
-}
-
-void TrainingProc(w, event, prms, nprms)
-     Widget w;
-     XEvent *event;
-     String *prms;
-     Cardinal *nprms;
+void
+MatchProc ()
 {
-    TrainingEvent();
+    MatchEvent(2);
 }
 
-void EditCommentProc(w, event, prms, nprms)
-     Widget w;
-     XEvent *event;
-     String *prms;
-     Cardinal *nprms;
+void
+EditCommentProc ()
 {
     Arg args[5];
     int j;
@@ -6001,129 +5555,39 @@ void EditCommentProc(w, event, prms, nprms)
        EditCommentEvent();
 }
 
-void IcsInputBoxProc(w, event, prms, nprms)
-     Widget w;
-     XEvent *event;
-     String *prms;
-     Cardinal *nprms;
+void
+IcsInputBoxProc ()
 {
     if (!PopDown(4)) ICSInputBoxPopUp();
 }
 
-void AcceptProc(w, event, prms, nprms)
-     Widget w;
-     XEvent *event;
-     String *prms;
-     Cardinal *nprms;
-{
-    AcceptEvent();
-}
-
-void DeclineProc(w, event, prms, nprms)
-     Widget w;
-     XEvent *event;
-     String *prms;
-     Cardinal *nprms;
-{
-    DeclineEvent();
-}
-
-void RematchProc(w, event, prms, nprms)
-     Widget w;
-     XEvent *event;
-     String *prms;
-     Cardinal *nprms;
-{
-    RematchEvent();
-}
-
-void CallFlagProc(w, event, prms, nprms)
-     Widget w;
-     XEvent *event;
-     String *prms;
-     Cardinal *nprms;
-{
-    CallFlagEvent();
-}
-
-void DrawProc(w, event, prms, nprms)
-     Widget w;
-     XEvent *event;
-     String *prms;
-     Cardinal *nprms;
-{
-    DrawEvent();
-}
-
-void AbortProc(w, event, prms, nprms)
-     Widget w;
-     XEvent *event;
-     String *prms;
-     Cardinal *nprms;
-{
-    AbortEvent();
-}
-
-void AdjournProc(w, event, prms, nprms)
-     Widget w;
-     XEvent *event;
-     String *prms;
-     Cardinal *nprms;
-{
-    AdjournEvent();
-}
-
-void ResignProc(w, event, prms, nprms)
-     Widget w;
-     XEvent *event;
-     String *prms;
-     Cardinal *nprms;
-{
-    ResignEvent();
-}
-
-void AdjuWhiteProc(w, event, prms, nprms)
-     Widget w;
-     XEvent *event;
-     String *prms;
-     Cardinal *nprms;
+void
+AdjuWhiteProc ()
 {
     UserAdjudicationEvent(+1);
 }
 
-void AdjuBlackProc(w, event, prms, nprms)
-     Widget w;
-     XEvent *event;
-     String *prms;
-     Cardinal *nprms;
+void
+AdjuBlackProc ()
 {
     UserAdjudicationEvent(-1);
 }
 
-void AdjuDrawProc(w, event, prms, nprms)
-     Widget w;
-     XEvent *event;
-     String *prms;
-     Cardinal *nprms;
+void
+AdjuDrawProc ()
 {
     UserAdjudicationEvent(0);
 }
 
-void EnterKeyProc(w, event, prms, nprms)
-     Widget w;
-     XEvent *event;
-     String *prms;
-     Cardinal *nprms;
+void
+EnterKeyProc (Widget w, XEvent *event, String *prms, Cardinal *nprms)
 {
     if (shellUp[4] == True)
       ICSInputSendText();
 }
 
-void UpKeyProc(w, event, prms, nprms)
-     Widget w;
-     XEvent *event;
-     String *prms;
-     Cardinal *nprms;
+void
+UpKeyProc (Widget w, XEvent *event, String *prms, Cardinal *nprms)
 {   // [HGM] input: let up-arrow recall previous line from history
     Widget edit;
     int j;
@@ -6146,11 +5610,8 @@ void UpKeyProc(w, event, prms, nprms)
     }
 }
 
-void DownKeyProc(w, event, prms, nprms)
-     Widget w;
-     XEvent *event;
-     String *prms;
-     Cardinal *nprms;
+void
+DownKeyProc (Widget w, XEvent *event, String *prms, Cardinal *nprms)
 {   // [HGM] input: let down-arrow recall next line from history
     Widget edit;
     String val;
@@ -6168,130 +5629,52 @@ void DownKeyProc(w, event, prms, nprms)
     }
 }
 
-void StopObservingProc(w, event, prms, nprms)
-     Widget w;
-     XEvent *event;
-     String *prms;
-     Cardinal *nprms;
-{
-    StopObservingEvent();
-}
-
-void StopExaminingProc(w, event, prms, nprms)
-     Widget w;
-     XEvent *event;
-     String *prms;
-     Cardinal *nprms;
-{
-    StopExaminingEvent();
-}
-
-void UploadProc(w, event, prms, nprms)
-     Widget w;
-     XEvent *event;
-     String *prms;
-     Cardinal *nprms;
+void
+TempBackwardProc (Widget w, XEvent *event, String *prms, Cardinal *nprms)
 {
-    UploadGameEvent();
+       if (!TempBackwardActive) {
+               TempBackwardActive = True;
+               BackwardEvent();
+       }
 }
 
-
-void ForwardProc(w, event, prms, nprms)
-     Widget w;
-     XEvent *event;
-     String *prms;
-     Cardinal *nprms;
-{
+void
+TempForwardProc (Widget w, XEvent *event, String *prms, Cardinal *nprms)
+{
+       /* Check to see if triggered by a key release event for a repeating key.
+        * If so the next queued event will be a key press of the same key at the same time */
+       if (XEventsQueued(xDisplay, QueuedAfterReading)) {
+               XEvent next;
+               XPeekEvent(xDisplay, &next);
+               if (next.type == KeyPress && next.xkey.time == event->xkey.time &&
+                       next.xkey.keycode == event->xkey.keycode)
+                               return;
+       }
     ForwardEvent();
+       TempBackwardActive = False;
 }
 
-
-void BackwardProc(w, event, prms, nprms)
-     Widget w;
-     XEvent *event;
-     String *prms;
-     Cardinal *nprms;
-{
-    BackwardEvent();
-}
-
-void ToStartProc(w, event, prms, nprms)
-     Widget w;
-     XEvent *event;
-     String *prms;
-     Cardinal *nprms;
-{
-    ToStartEvent();
-}
-
-void ToEndProc(w, event, prms, nprms)
-     Widget w;
-     XEvent *event;
-     String *prms;
-     Cardinal *nprms;
-{
-    ToEndEvent();
-}
-
-void RevertProc(w, event, prms, nprms)
-     Widget w;
-     XEvent *event;
-     String *prms;
-     Cardinal *nprms;
+void
+RevertProc ()
 {
     RevertEvent(False);
 }
 
-void AnnotateProc(w, event, prms, nprms)
-     Widget w;
-     XEvent *event;
-     String *prms;
-     Cardinal *nprms;
+void
+AnnotateProc ()
 {
     RevertEvent(True);
 }
 
-void TruncateGameProc(w, event, prms, nprms)
-     Widget w;
-     XEvent *event;
-     String *prms;
-     Cardinal *nprms;
-{
-    TruncateGameEvent();
-}
-void RetractMoveProc(w, event, prms, nprms)
-     Widget w;
-     XEvent *event;
-     String *prms;
-     Cardinal *nprms;
-{
-    RetractMoveEvent();
-}
-
-void MoveNowProc(w, event, prms, nprms)
-     Widget w;
-     XEvent *event;
-     String *prms;
-     Cardinal *nprms;
-{
-    MoveNowEvent();
-}
-
-void FlipViewProc(w, event, prms, nprms)
-     Widget w;
-     XEvent *event;
-     String *prms;
-     Cardinal *nprms;
+void
+FlipViewProc ()
 {
     flipView = !flipView;
     DrawPosition(True, NULL);
 }
 
-void PonderNextMoveProc(w, event, prms, nprms)
-     Widget w;
-     XEvent *event;
-     String *prms;
-     Cardinal *nprms;
+void
+PonderNextMoveProc ()
 {
     Arg args[16];
 
@@ -6308,11 +5691,8 @@ void PonderNextMoveProc(w, event, prms, nprms)
 }
 
 #ifndef OPTIONSDIALOG
-void AlwaysQueenProc(w, event, prms, nprms)
-     Widget w;
-     XEvent *event;
-     String *prms;
-     Cardinal *nprms;
+void
+AlwaysQueenProc ()
 {
     Arg args[16];
 
@@ -6327,11 +5707,8 @@ void AlwaysQueenProc(w, event, prms, nprms)
                args, 1);
 }
 
-void AnimateDraggingProc(w, event, prms, nprms)
-     Widget w;
-     XEvent *event;
-     String *prms;
-     Cardinal *nprms;
+void
+AnimateDraggingProc ()
 {
     Arg args[16];
 
@@ -6347,11 +5724,8 @@ void AnimateDraggingProc(w, event, prms, nprms)
                args, 1);
 }
 
-void AnimateMovingProc(w, event, prms, nprms)
-     Widget w;
-     XEvent *event;
-     String *prms;
-     Cardinal *nprms;
+void
+AnimateMovingProc ()
 {
     Arg args[16];
 
@@ -6367,11 +5741,8 @@ void AnimateMovingProc(w, event, prms, nprms)
                args, 1);
 }
 
-void AutoflagProc(w, event, prms, nprms)
-     Widget w;
-     XEvent *event;
-     String *prms;
-     Cardinal *nprms;
+void
+AutoflagProc ()
 {
     Arg args[16];
 
@@ -6386,11 +5757,8 @@ void AutoflagProc(w, event, prms, nprms)
                args, 1);
 }
 
-void AutoflipProc(w, event, prms, nprms)
-     Widget w;
-     XEvent *event;
-     String *prms;
-     Cardinal *nprms;
+void
+AutoflipProc ()
 {
     Arg args[16];
 
@@ -6405,11 +5773,8 @@ void AutoflipProc(w, event, prms, nprms)
                args, 1);
 }
 
-void BlindfoldProc(w, event, prms, nprms)
-     Widget w;
-     XEvent *event;
-     String *prms;
-     Cardinal *nprms;
+void
+BlindfoldProc ()
 {
     Arg args[16];
 
@@ -6426,11 +5791,8 @@ void BlindfoldProc(w, event, prms, nprms)
     DrawPosition(True, NULL);
 }
 
-void TestLegalityProc(w, event, prms, nprms)
-     Widget w;
-     XEvent *event;
-     String *prms;
-     Cardinal *nprms;
+void
+TestLegalityProc ()
 {
     Arg args[16];
 
@@ -6446,11 +5808,8 @@ void TestLegalityProc(w, event, prms, nprms)
 }
 
 
-void FlashMovesProc(w, event, prms, nprms)
-     Widget w;
-     XEvent *event;
-     String *prms;
-     Cardinal *nprms;
+void
+FlashMovesProc ()
 {
     Arg args[16];
 
@@ -6470,11 +5829,8 @@ void FlashMovesProc(w, event, prms, nprms)
 }
 
 #if HIGHDRAG
-void HighlightDraggingProc(w, event, prms, nprms)
-     Widget w;
-     XEvent *event;
-     String *prms;
-     Cardinal *nprms;
+void
+HighlightDraggingProc ()
 {
     Arg args[16];
 
@@ -6490,11 +5846,8 @@ void HighlightDraggingProc(w, event, prms, nprms)
 }
 #endif
 
-void HighlightLastMoveProc(w, event, prms, nprms)
-     Widget w;
-     XEvent *event;
-     String *prms;
-     Cardinal *nprms;
+void
+HighlightLastMoveProc ()
 {
     Arg args[16];
 
@@ -6509,11 +5862,8 @@ void HighlightLastMoveProc(w, event, prms, nprms)
                               "menuOptions.Highlight Last Move"), args, 1);
 }
 
-void HighlightArrowProc(w, event, prms, nprms)
-     Widget w;
-     XEvent *event;
-     String *prms;
-     Cardinal *nprms;
+void
+HighlightArrowProc ()
 {
     Arg args[16];
 
@@ -6529,11 +5879,8 @@ void HighlightArrowProc(w, event, prms, nprms)
 }
 
 #if 0
-void IcsAlarmProc(w, event, prms, nprms)
-     Widget w;
-     XEvent *event;
-     String *prms;
-     Cardinal *nprms;
+void
+IcsAlarmProc ()
 {
     Arg args[16];
 
@@ -6549,11 +5896,8 @@ void IcsAlarmProc(w, event, prms, nprms)
 }
 #endif
 
-void MoveSoundProc(w, event, prms, nprms)
-     Widget w;
-     XEvent *event;
-     String *prms;
-     Cardinal *nprms;
+void
+MoveSoundProc ()
 {
     Arg args[16];
 
@@ -6568,11 +5912,8 @@ void MoveSoundProc(w, event, prms, nprms)
                args, 1);
 }
 
-void OneClickProc(w, event, prms, nprms)
-     Widget w;
-     XEvent *event;
-     String *prms;
-     Cardinal *nprms;
+void
+OneClickProc ()
 {
     Arg args[16];
 
@@ -6587,11 +5928,8 @@ void OneClickProc(w, event, prms, nprms)
                args, 1);
 }
 
-void PeriodicUpdatesProc(w, event, prms, nprms)
-     Widget w;
-     XEvent *event;
-     String *prms;
-     Cardinal *nprms;
+void
+PeriodicUpdatesProc ()
 {
     Arg args[16];
 
@@ -6606,11 +5944,8 @@ void PeriodicUpdatesProc(w, event, prms, nprms)
                args, 1);
 }
 
-void PopupExitMessageProc(w, event, prms, nprms)
-     Widget w;
-     XEvent *event;
-     String *prms;
-     Cardinal *nprms;
+void
+PopupExitMessageProc ()
 {
     Arg args[16];
 
@@ -6625,11 +5960,8 @@ void PopupExitMessageProc(w, event, prms, nprms)
                               "menuOptions.Popup Exit Message"), args, 1);
 }
 
-void PopupMoveErrorsProc(w, event, prms, nprms)
-     Widget w;
-     XEvent *event;
-     String *prms;
-     Cardinal *nprms;
+void
+PopupMoveErrorsProc ()
 {
     Arg args[16];
 
@@ -6645,11 +5977,8 @@ void PopupMoveErrorsProc(w, event, prms, nprms)
 }
 
 #if 0
-void PremoveProc(w, event, prms, nprms)
-     Widget w;
-     XEvent *event;
-     String *prms;
-     Cardinal *nprms;
+void
+PremoveProc ()
 {
     Arg args[16];
 
@@ -6665,11 +5994,8 @@ void PremoveProc(w, event, prms, nprms)
 }
 #endif
 
-void ShowCoordsProc(w, event, prms, nprms)
-     Widget w;
-     XEvent *event;
-     String *prms;
-     Cardinal *nprms;
+void
+ShowCoordsProc ()
 {
     Arg args[16];
 
@@ -6686,21 +6012,15 @@ void ShowCoordsProc(w, event, prms, nprms)
     DrawPosition(True, NULL);
 }
 
-void ShowThinkingProc(w, event, prms, nprms)
-     Widget w;
-     XEvent *event;
-     String *prms;
-     Cardinal *nprms;
+void
+ShowThinkingProc ()
 {
     appData.showThinking = !appData.showThinking; // [HGM] thinking: tken out of ShowThinkingEvent
     ShowThinkingEvent();
 }
 
-void HideThinkingProc(w, event, prms, nprms)
-     Widget w;
-     XEvent *event;
-     String *prms;
-     Cardinal *nprms;
+void
+HideThinkingProc ()
 {
     Arg args[16];
 
@@ -6717,11 +6037,8 @@ void HideThinkingProc(w, event, prms, nprms)
 }
 #endif
 
-void SaveOnExitProc(w, event, prms, nprms)
-     Widget w;
-     XEvent *event;
-     String *prms;
-     Cardinal *nprms;
+void
+SaveOnExitProc ()
 {
     Arg args[16];
 
@@ -6736,20 +6053,14 @@ void SaveOnExitProc(w, event, prms, nprms)
                args, 1);
 }
 
-void SaveSettingsProc(w, event, prms, nprms)
-     Widget w;
-     XEvent *event;
-     String *prms;
-     Cardinal *nprms;
+void
+SaveSettingsProc ()
 {
      SaveSettings(settingsFileName);
 }
 
-void InfoProc(w, event, prms, nprms)
-     Widget w;
-     XEvent *event;
-     String *prms;
-     Cardinal *nprms;
+void
+InfoProc ()
 {
     char buf[MSG_SIZ];
     snprintf(buf, sizeof(buf), "xterm -e info --directory %s --directory . -f %s &",
@@ -6757,12 +6068,9 @@ void InfoProc(w, event, prms, nprms)
     system(buf);
 }
 
-void ManProc(w, event, prms, nprms)
-     Widget w;
-     XEvent *event;
-     String *prms;
-     Cardinal *nprms;
-{
+void
+ManInner (Widget w, XEvent *event, String *prms, Cardinal *nprms)
+{   // called as key binding
     char buf[MSG_SIZ];
     String name;
     if (nprms && *nprms > 0)
@@ -6773,88 +6081,82 @@ void ManProc(w, event, prms, nprms)
     system(buf);
 }
 
-void HintProc(w, event, prms, nprms)
-     Widget w;
-     XEvent *event;
-     String *prms;
-     Cardinal *nprms;
+void
+ManProc ()
+{   // called from menu
+    ManInner(NULL, NULL, NULL, NULL);
+}
+
+void
+BugReportProc ()
 {
-    HintEvent();
+    char buf[MSG_SIZ];
+    snprintf(buf, MSG_SIZ, "%s mailto:bug-xboard@gnu.org", appData.sysOpen);
+    system(buf);
 }
 
-void BookProc(w, event, prms, nprms)
-     Widget w;
-     XEvent *event;
-     String *prms;
-     Cardinal *nprms;
+void
+GuideProc ()
 {
-    BookEvent();
+    char buf[MSG_SIZ];
+    snprintf(buf, MSG_SIZ, "%s http://www.gnu.org/software/xboard/user_guide/UserGuide.html", appData.sysOpen);
+    system(buf);
 }
 
-void AboutProc(w, event, prms, nprms)
-     Widget w;
-     XEvent *event;
-     String *prms;
-     Cardinal *nprms;
+void
+HomePageProc ()
 {
     char buf[MSG_SIZ];
+    snprintf(buf, MSG_SIZ, "%s http://www.gnu.org/software/xboard/", appData.sysOpen);
+    system(buf);
+}
+
+void
+NewsPageProc ()
+{
+    char buf[MSG_SIZ];
+    snprintf(buf, MSG_SIZ, "%s http://www.gnu.org/software/xboard/whats_new/portal.html", appData.sysOpen);
+    system(buf);
+}
+
+void
+AboutProc ()
+{
+    char buf[2 * MSG_SIZ];
 #if ZIPPY
-    char *zippy = " (with Zippy code)";
+    char *zippy = _(" (with Zippy code)");
 #else
     char *zippy = "";
 #endif
-    snprintf(buf, sizeof(buf), "%s%s\n\n%s\n%s\n%s\n\n%s%s\n%s",
-           programVersion, zippy,
-           "Copyright 1991 Digital Equipment Corporation",
-           "Enhancements Copyright 1992-2009 Free Software Foundation",
-           "Enhancements Copyright 2005 Alessandro Scotti",
-           PACKAGE, " is free software and carries NO WARRANTY;",
-           "see the file COPYING for more information.");
+    snprintf(buf, sizeof(buf), 
+_("%s%s\n\n"
+"Copyright 1991 Digital Equipment Corporation\n"
+"Enhancements Copyright 1992-2012 Free Software Foundation\n"
+"Enhancements Copyright 2005 Alessandro Scotti\n\n"
+"%s is free software and carries NO WARRANTY;"
+"see the file COPYING for more information.\n\n"
+"Visit XBoard on the web at: http://www.gnu.org/software/xboard/\n"
+"Check out the newest features at: http://www.gnu.org/software/xboard/whats_new.html\n\n"
+"Report bugs via email at: <bug-xboard@gnu.org>\n\n"
+  ),
+           programVersion, zippy, PACKAGE);
     ErrorPopUp(_("About XBoard"), buf, FALSE);
 }
 
-void DebugProc(w, event, prms, nprms)
-     Widget w;
-     XEvent *event;
-     String *prms;
-     Cardinal *nprms;
+void
+DebugProc ()
 {
     appData.debugMode = !appData.debugMode;
 }
 
-void AboutGameProc(w, event, prms, nprms)
-     Widget w;
-     XEvent *event;
-     String *prms;
-     Cardinal *nprms;
-{
-    AboutGameEvent();
-}
-
-void NothingProc(w, event, prms, nprms)
-     Widget w;
-     XEvent *event;
-     String *prms;
-     Cardinal *nprms;
+void
+NothingProc ()
 {
     return;
 }
 
-void Iconify(w, event, prms, nprms)
-     Widget w;
-     XEvent *event;
-     String *prms;
-     Cardinal *nprms;
-{
-    Arg args[16];
-
-    fromX = fromY = -1;
-    XtSetArg(args[0], XtNiconic, True);
-    XtSetValues(shellWidget, args, 1);
-}
-
-void DisplayMessage(message, extMessage)
-     char *message, *extMessage;
+void
+DisplayMessage (char *message, char *extMessage)
 {
   /* display a message in the message widget */
 
@@ -6888,8 +6190,8 @@ void DisplayMessage(message, extMessage)
   return;
 }
 
-void DisplayTitle(text)
-     char *text;
+void
+DisplayTitle (char *text)
 {
     Arg args[16];
     int i;
@@ -6935,13 +6237,12 @@ void DisplayTitle(text)
     XtSetArg(args[i], XtNiconName, (XtArgVal) icon);    i++;
     XtSetArg(args[i], XtNtitle, (XtArgVal) title);      i++;
     XtSetValues(shellWidget, args, i);
+    XSync(xDisplay, False);
 }
 
 
 void
-DisplayError(message, error)
-     String message;
-     int error;
+DisplayError (String message, int error)
 {
     char buf[MSG_SIZ];
 
@@ -6961,8 +6262,8 @@ DisplayError(message, error)
 }
 
 
-void DisplayMoveError(message)
-     String message;
+void
+DisplayMoveError (String message)
 {
     fromX = fromY = -1;
     ClearHighlights();
@@ -6978,9 +6279,8 @@ void DisplayMoveError(message)
 }
 
 
-void DisplayFatalError(message, error, status)
-     String message;
-     int error, status;
+void
+DisplayFatalError (String message, int error, int status)
 {
     char buf[MSG_SIZ];
 
@@ -7000,30 +6300,28 @@ void DisplayFatalError(message, error, status)
     }
 }
 
-void DisplayInformation(message)
-     String message;
+void
+DisplayInformation (String message)
 {
     ErrorPopDown();
     ErrorPopUp(_("Information"), message, TRUE);
 }
 
-void DisplayNote(message)
-     String message;
+void
+DisplayNote (String message)
 {
     ErrorPopDown();
     ErrorPopUp(_("Note"), message, FALSE);
 }
 
 static int
-NullXErrorCheck(dpy, error_event)
-     Display *dpy;
-     XErrorEvent *error_event;
+NullXErrorCheck (Display *dpy, XErrorEvent *error_event)
 {
     return 0;
 }
 
-void DisplayIcsInteractionTitle(message)
-     String message;
+void
+DisplayIcsInteractionTitle (String message)
 {
   if (oldICSInteractionTitle == NULL) {
     /* Magic to find the old window title, adapted from vim */
@@ -7054,11 +6352,8 @@ void DisplayIcsInteractionTitle(message)
 char pendingReplyPrefix[MSG_SIZ];
 ProcRef pendingReplyPR;
 
-void AskQuestionProc(w, event, prms, nprms)
-     Widget w;
-     XEvent *event;
-     String *prms;
-     Cardinal *nprms;
+void
+AskQuestionProc (Widget w, XEvent *event, String *prms, Cardinal *nprms)
 {
     if (*nprms != 4) {
        fprintf(stderr, _("AskQuestionProc needed 4 parameters, got %d\n"),
@@ -7068,7 +6363,8 @@ void AskQuestionProc(w, event, prms, nprms)
     AskQuestionEvent(prms[0], prms[1], prms[2], prms[3]);
 }
 
-void AskQuestionPopDown()
+void
+AskQuestionPopDown ()
 {
     if (!askQuestionUp) return;
     XtPopdown(askQuestionShell);
@@ -7076,11 +6372,8 @@ void AskQuestionPopDown()
     askQuestionUp = False;
 }
 
-void AskQuestionReplyAction(w, event, prms, nprms)
-     Widget w;
-     XEvent *event;
-     String *prms;
-     Cardinal *nprms;
+void
+AskQuestionReplyAction (Widget w, XEvent *event, String *prms, Cardinal *nprms)
 {
     char buf[MSG_SIZ];
     int err;
@@ -7097,9 +6390,8 @@ void AskQuestionReplyAction(w, event, prms, nprms)
     if (err) DisplayFatalError(_("Error writing to chess program"), err, 0);
 }
 
-void AskQuestionCallback(w, client_data, call_data)
-     Widget w;
-     XtPointer client_data, call_data;
+void
+AskQuestionCallback (Widget w, XtPointer client_data, XtPointer call_data)
 {
     String name;
     Arg args[16];
@@ -7114,9 +6406,8 @@ void AskQuestionCallback(w, client_data, call_data)
     }
 }
 
-void AskQuestion(title, question, replyPrefix, pr)
-     char *title, *question, *replyPrefix;
-     ProcRef pr;
+void
+AskQuestion (char *title, char *question, char *replyPrefix, ProcRef pr)
 {
     Arg args[16];
     Widget popup, layout, dialog, edit;
@@ -7170,8 +6461,7 @@ void AskQuestion(title, question, replyPrefix, pr)
 
 
 void
-PlaySound(name)
-     char *name;
+PlaySound (char *name)
 {
   if (*name == NULLCHAR) {
     return;
@@ -7180,6 +6470,7 @@ PlaySound(name)
   } else {
     char buf[2048];
     char *prefix = "", *sep = "";
+    if(appData.soundProgram[0] == NULLCHAR) return;
     if(!strchr(name, '/')) { prefix = appData.soundDirectory; sep = "/"; }
     snprintf(buf, sizeof(buf), "%s '%s%s%s' &", appData.soundProgram, prefix, sep, name);
     system(buf);
@@ -7187,57 +6478,69 @@ PlaySound(name)
 }
 
 void
-RingBell()
+RingBell ()
 {
   PlaySound(appData.soundMove);
 }
 
 void
-PlayIcsWinSound()
+PlayIcsWinSound ()
 {
   PlaySound(appData.soundIcsWin);
 }
 
 void
-PlayIcsLossSound()
+PlayIcsLossSound ()
 {
   PlaySound(appData.soundIcsLoss);
 }
 
 void
-PlayIcsDrawSound()
+PlayIcsDrawSound ()
 {
   PlaySound(appData.soundIcsDraw);
 }
 
 void
-PlayIcsUnfinishedSound()
+PlayIcsUnfinishedSound ()
 {
   PlaySound(appData.soundIcsUnfinished);
 }
 
 void
-PlayAlarmSound()
+PlayAlarmSound ()
 {
   PlaySound(appData.soundIcsAlarm);
 }
 
 void
-EchoOn()
+PlayTellSound ()
+{
+  PlaySound(appData.soundTell);
+}
+
+void
+EchoOn ()
 {
     system("stty echo");
+    noEcho = False;
 }
 
 void
-EchoOff()
+EchoOff ()
 {
     system("stty -echo");
+    noEcho = True;
+}
+
+void
+RunCommand (char *buf)
+{
+    system(buf);
 }
 
 void
-Colorize(cc, continuation)
-     ColorClass cc;
-     int continuation;
+Colorize (ColorClass cc, int continuation)
 {
     char buf[MSG_SIZ];
     int count, outCount, error;
@@ -7300,14 +6603,14 @@ Colorize(cc, continuation)
     }
 }
 
-char *UserName()
+char *
+UserName ()
 {
     return getpwuid(getuid())->pw_name;
 }
 
 static char *
-ExpandPathName(path)
-     char *path;
+ExpandPathName (char *path)
 {
     static char static_buf[4*MSG_SIZ];
     char *d, *s, buf[4*MSG_SIZ];
@@ -7349,7 +6652,8 @@ ExpandPathName(path)
     return static_buf;
 }
 
-char *HostName()
+char *
+HostName ()
 {
     static char host_name[MSG_SIZ];
 
@@ -7370,15 +6674,14 @@ XtIntervalId delayedEventTimerXID = 0;
 DelayedEventCallback delayedEventCallback = 0;
 
 void
-FireDelayedEvent()
+FireDelayedEvent ()
 {
     delayedEventTimerXID = 0;
     delayedEventCallback();
 }
 
 void
-ScheduleDelayedEvent(cb, millisec)
-     DelayedEventCallback cb; long millisec;
+ScheduleDelayedEvent (DelayedEventCallback cb, long millisec)
 {
     if(delayedEventTimerXID && delayedEventCallback == cb)
        // [HGM] alive: replace, rather than add or flush identical event
@@ -7390,7 +6693,7 @@ ScheduleDelayedEvent(cb, millisec)
 }
 
 DelayedEventCallback
-GetDelayedEvent()
+GetDelayedEvent ()
 {
   if (delayedEventTimerXID) {
     return delayedEventCallback;
@@ -7400,7 +6703,7 @@ GetDelayedEvent()
 }
 
 void
-CancelDelayedEvent()
+CancelDelayedEvent ()
 {
   if (delayedEventTimerXID) {
     XtRemoveTimeOut(delayedEventTimerXID);
@@ -7410,12 +6713,14 @@ CancelDelayedEvent()
 
 XtIntervalId loadGameTimerXID = 0;
 
-int LoadGameTimerRunning()
+int
+LoadGameTimerRunning ()
 {
     return loadGameTimerXID != 0;
 }
 
-int StopLoadGameTimer()
+int
+StopLoadGameTimer ()
 {
     if (loadGameTimerXID != 0) {
        XtRemoveTimeOut(loadGameTimerXID);
@@ -7427,17 +6732,14 @@ int StopLoadGameTimer()
 }
 
 void
-LoadGameTimerCallback(arg, id)
-     XtPointer arg;
-     XtIntervalId *id;
+LoadGameTimerCallback (XtPointer arg, XtIntervalId *id)
 {
     loadGameTimerXID = 0;
     AutoPlayGameLoop();
 }
 
 void
-StartLoadGameTimer(millisec)
-     long millisec;
+StartLoadGameTimer (long millisec)
 {
     loadGameTimerXID =
       XtAppAddTimeOut(appContext, millisec,
@@ -7448,9 +6750,7 @@ StartLoadGameTimer(millisec)
 XtIntervalId analysisClockXID = 0;
 
 void
-AnalysisClockCallback(arg, id)
-     XtPointer arg;
-     XtIntervalId *id;
+AnalysisClockCallback (XtPointer arg, XtIntervalId *id)
 {
     if (gameMode == AnalyzeMode || gameMode == AnalyzeFile
          || appData.icsEngineAnalyze) { // [DM]
@@ -7460,7 +6760,7 @@ AnalysisClockCallback(arg, id)
 }
 
 void
-StartAnalysisClock()
+StartAnalysisClock ()
 {
     analysisClockXID =
       XtAppAddTimeOut(appContext, 2000,
@@ -7470,12 +6770,14 @@ StartAnalysisClock()
 
 XtIntervalId clockTimerXID = 0;
 
-int ClockTimerRunning()
+int
+ClockTimerRunning ()
 {
     return clockTimerXID != 0;
 }
 
-int StopClockTimer()
+int
+StopClockTimer ()
 {
     if (clockTimerXID != 0) {
        XtRemoveTimeOut(clockTimerXID);
@@ -7487,17 +6789,14 @@ int StopClockTimer()
 }
 
 void
-ClockTimerCallback(arg, id)
-     XtPointer arg;
-     XtIntervalId *id;
+ClockTimerCallback (XtPointer arg, XtIntervalId *id)
 {
     clockTimerXID = 0;
     DecrementClocks();
 }
 
 void
-StartClockTimer(millisec)
-     long millisec;
+StartClockTimer (long millisec)
 {
     clockTimerXID =
       XtAppAddTimeOut(appContext, millisec,
@@ -7506,11 +6805,7 @@ StartClockTimer(millisec)
 }
 
 void
-DisplayTimerLabel(w, color, timer, highlight)
-     Widget w;
-     char *color;
-     long timer;
-     int highlight;
+DisplayTimerLabel (Widget w, char *color, long timer, int highlight)
 {
     char buf[MSG_SIZ];
     Arg args[16];
@@ -7544,9 +6839,7 @@ DisplayTimerLabel(w, color, timer, highlight)
 }
 
 void
-DisplayWhiteClock(timeRemaining, highlight)
-     long timeRemaining;
-     int highlight;
+DisplayWhiteClock (long timeRemaining, int highlight)
 {
     Arg args[16];
 
@@ -7560,9 +6853,7 @@ DisplayWhiteClock(timeRemaining, highlight)
 }
 
 void
-DisplayBlackClock(timeRemaining, highlight)
-     long timeRemaining;
-     int highlight;
+DisplayBlackClock (long timeRemaining, int highlight)
 {
     Arg args[16];
 
@@ -7589,10 +6880,8 @@ typedef struct {
 } ChildProc;
 
 
-int StartChildProcess(cmdLine, dir, pr)
-     char *cmdLine;
-     char *dir;
-     ProcRef *pr;
+int
+StartChildProcess (char *cmdLine, char *dir, ProcRef *pr)
 {
     char *argv[64], *p;
     int i, pid;
@@ -7601,7 +6890,7 @@ int StartChildProcess(cmdLine, dir, pr)
     char buf[MSG_SIZ];
 
     if (appData.debugMode) {
-       fprintf(stderr, "StartChildProcess (dir=\"%s\") %s\n",dir, cmdLine);
+       fprintf(debugFP, "StartChildProcess (dir=\"%s\") %s\n",dir, cmdLine);
     }
 
     /* We do NOT feed the cmdLine to the shell; we just
@@ -7664,15 +6953,14 @@ int StartChildProcess(cmdLine, dir, pr)
 }
 
 // [HGM] kill: implement the 'hard killing' of AS's Winboard_x
-static RETSIGTYPE AlarmCallBack(int n)
+static RETSIGTYPE
+AlarmCallBack (int n)
 {
     return;
 }
 
 void
-DestroyChildProcess(pr, signalType)
-     ProcRef pr;
-     int signalType;
+DestroyChildProcess (ProcRef pr, int signalType)
 {
     ChildProc *cp = (ChildProc *) pr;
 
@@ -7699,8 +6987,7 @@ DestroyChildProcess(pr, signalType)
 }
 
 void
-InterruptChildProcess(pr)
-     ProcRef pr;
+InterruptChildProcess (ProcRef pr)
 {
     ChildProc *cp = (ChildProc *) pr;
 
@@ -7708,10 +6995,8 @@ InterruptChildProcess(pr)
     (void) kill(cp->pid, SIGINT); /* stop it thinking */
 }
 
-int OpenTelnet(host, port, pr)
-     char *host;
-     char *port;
-     ProcRef *pr;
+int
+OpenTelnet (char *host, char *port, ProcRef *pr)
 {
     char cmdLine[MSG_SIZ];
 
@@ -7723,10 +7008,8 @@ int OpenTelnet(host, port, pr)
     return StartChildProcess(cmdLine, "", pr);
 }
 
-int OpenTCP(host, port, pr)
-     char *host;
-     char *port;
-     ProcRef *pr;
+int
+OpenTCP (char *host, char *port, ProcRef *pr)
 {
 #if OMIT_SOCKETS
     DisplayFatalError(_("Socket support is not configured in"), 0, 2);
@@ -7734,7 +7017,7 @@ int OpenTCP(host, port, pr)
     struct addrinfo hints;
     struct addrinfo *ais, *ai;
     int error;
-    int s;
+    int s=0;
     ChildProc *cp;
 
     memset(&hints, 0, sizeof(hints));
@@ -7778,9 +7061,8 @@ int OpenTCP(host, port, pr)
     return 0;
 }
 
-int OpenCommPort(name, pr)
-     char *name;
-     ProcRef *pr;
+int
+OpenCommPort (char *name, ProcRef *pr)
 {
     int fd;
     ChildProc *cp;
@@ -7798,8 +7080,8 @@ int OpenCommPort(name, pr)
     return 0;
 }
 
-int OpenLoopback(pr)
-     ProcRef *pr;
+int
+OpenLoopback (ProcRef *pr)
 {
     ChildProc *cp;
     int to[2], from[2];
@@ -7816,9 +7098,8 @@ int OpenLoopback(pr)
     return 0;
 }
 
-int OpenRcmd(host, user, cmd, pr)
-     char *host, *user, *cmd;
-     ProcRef *pr;
+int
+OpenRcmd (char *host, char *user, char *cmd, ProcRef *pr)
 {
     DisplayFatalError(_("internal rcmd not implemented for Unix"), 0, 1);
     return -1;
@@ -7838,10 +7119,7 @@ typedef struct {
 } InputSource;
 
 void
-DoInputCallback(closure, source, xid)
-     caddr_t closure;
-     int *source;
-     XtInputId *xid;
+DoInputCallback (caddr_t closure, int *source, XtInputId *xid)
 {
     InputSource *is = (InputSource *) closure;
     int count;
@@ -7879,11 +7157,8 @@ DoInputCallback(closure, source, xid)
     }
 }
 
-InputSourceRef AddInputSource(pr, lineByLine, func, closure)
-     ProcRef pr;
-     int lineByLine;
-     InputCallback func;
-     VOIDSTAR closure;
+InputSourceRef
+AddInputSource (ProcRef pr, int lineByLine, InputCallback func, VOIDSTAR closure)
 {
     InputSource *is;
     ChildProc *cp = (ChildProc *) pr;
@@ -7911,8 +7186,7 @@ InputSourceRef AddInputSource(pr, lineByLine, func, closure)
 }
 
 void
-RemoveInputSource(isr)
-     InputSourceRef isr;
+RemoveInputSource (InputSourceRef isr)
 {
     InputSource *is = (InputSource *) isr;
 
@@ -7921,11 +7195,8 @@ RemoveInputSource(isr)
     is->xid = 0;
 }
 
-int OutputToProcess(pr, message, count, outError)
-     ProcRef pr;
-     char *message;
-     int count;
-     int *outError;
+int
+OutputToProcess (ProcRef pr, char *message, int count, int *outError)
 {
     static int line = 0;
     ChildProc *cp = (ChildProc *) pr;
@@ -7969,12 +7240,8 @@ int OutputToProcess(pr, message, count, outError)
    between each character. This is needed when sending the logon
    script to ICC, which for some reason doesn't like the
    instantaneous send. */
-int OutputToProcessDelayed(pr, message, count, outError, msdelay)
-     ProcRef pr;
-     char *message;
-     int count;
-     int *outError;
-     long msdelay;
+int
+OutputToProcessDelayed (ProcRef pr, char *message, int count, int *outError, long msdelay)
 {
     ChildProc *cp = (ChildProc *) pr;
     int outCount = 0;
@@ -8016,8 +7283,7 @@ int OutputToProcessDelayed(pr, message, count, outError, msdelay)
 static int xpmDone = 0;
 
 static void
-CreateAnimMasks (pieceDepth)
-     int pieceDepth;
+CreateAnimMasks (int pieceDepth)
 {
   ChessSquare   piece;
   Pixmap       buf;
@@ -8095,9 +7361,7 @@ CreateAnimMasks (pieceDepth)
 }
 
 static void
-InitAnimState (anim, info)
-  AnimState * anim;
-  XWindowAttributes * info;
+InitAnimState (AnimState *anim, XWindowAttributes *info)
 {
   XtGCMask  mask;
   XGCValues values;
@@ -8147,8 +7411,8 @@ CreateAnimVars ()
 
 static Boolean frameWaiting;
 
-static RETSIGTYPE FrameAlarm (sig)
-     int sig;
+static RETSIGTYPE
+FrameAlarm (int sig)
 {
   frameWaiting = False;
   /* In case System-V style signals.  Needed?? */
@@ -8156,8 +7420,7 @@ static RETSIGTYPE FrameAlarm (sig)
 }
 
 static void
-FrameDelay (time)
-     int time;
+FrameDelay (int time)
 {
   struct itimerval delay;
 
@@ -8181,8 +7444,7 @@ FrameDelay (time)
 #else
 
 static void
-FrameDelay (time)
-     int time;
+FrameDelay (int time)
 {
   XSync(xDisplay, False);
   if (time > 0)
@@ -8191,11 +7453,16 @@ FrameDelay (time)
 
 #endif
 
+void
+DoSleep (int n)
+{
+    FrameDelay(n);
+}
+
 /*     Convert board position to corner of screen rect and color       */
 
 static void
-ScreenSquare(column, row, pt, color)
-     int column; int row; XPoint * pt; int * color;
+ScreenSquare (int column, int row, XPoint *pt, int *color)
 {
   if (flipView) {
     pt->x = lineGap + ((BOARD_WIDTH-1)-column) * (squareSize + lineGap);
@@ -8210,8 +7477,7 @@ ScreenSquare(column, row, pt, color)
 /*     Convert window coords to square                 */
 
 static void
-BoardSquare(x, y, column, row)
-     int x; int y; int * column; int * row;
+BoardSquare (int x, int y, int *column, int *row)
 {
   *column = EventToSquare(x, BOARD_WIDTH);
   if (flipView && *column >= 0)
@@ -8229,8 +7495,7 @@ BoardSquare(x, y, column, row)
 #define Min(a, b) ((a) < (b) ? (a) : (b))
 
 static void
-SetRect(rect, x, y, width, height)
-     XRectangle * rect; int x; int y; int width; int height;
+SetRect (XRectangle *rect, int x, int y, int width, int height)
 {
   rect->x = x;
   rect->y = y;
@@ -8243,9 +7508,7 @@ SetRect(rect, x, y, width, height)
        that rect within new. */
 
 static Boolean
-Intersect(old, new, size, area, pt)
-     XPoint * old; XPoint * new;
-     int size; XRectangle * area; XPoint * pt;
+Intersect ( XPoint *old, XPoint *new, int size, XRectangle *area, XPoint *pt)
 {
   if (old->x > new->x + size || new->x > old->x + size ||
       old->y > new->y + size || new->y > old->y + size) {
@@ -8263,9 +7526,7 @@ Intersect(old, new, size, area, pt)
        in the old that do not intersect with the new.   */
 
 static void
-CalcUpdateRects(old, new, size, update, nUpdates)
-     XPoint * old; XPoint * new; int size;
-     XRectangle update[]; int * nUpdates;
+CalcUpdateRects (XPoint *old, XPoint *new, int size, XRectangle update[], int *nUpdates)
 {
   int       count;
 
@@ -8311,10 +7572,7 @@ CalcUpdateRects(old, new, size, update, nUpdates)
        noticeable.                                             */
 
 static void
-Tween(start, mid, finish, factor, frames, nFrames)
-     XPoint * start; XPoint * mid;
-     XPoint * finish; int factor;
-     XPoint frames[]; int * nFrames;
+Tween (XPoint *start, XPoint *mid, XPoint *finish, int factor, XPoint frames[], int *nFrames)
 {
   int fraction, n, count;
 
@@ -8349,8 +7607,7 @@ Tween(start, mid, finish, factor, frames, nFrames)
 /*     Draw a piece on the screen without disturbing what's there      */
 
 static void
-SelectGCMask(piece, clip, outline, mask)
-     ChessSquare piece; GC * clip; GC * outline; Pixmap * mask;
+SelectGCMask (ChessSquare piece, GC *clip, GC *outline, Pixmap *mask)
 {
   GC source;
 
@@ -8390,8 +7647,7 @@ SelectGCMask(piece, clip, outline, mask)
 }
 
 static void
-OverlayPiece(piece, clip, outline,  dest)
-     ChessSquare piece; GC clip; GC outline; Drawable dest;
+OverlayPiece (ChessSquare piece, GC clip, GC outline,  Drawable dest)
 {
   int  kind;
 
@@ -8421,11 +7677,7 @@ OverlayPiece(piece, clip, outline,  dest)
 /* Animate the movement of a single piece */
 
 static void
-BeginAnimation(anim, piece, startColor, start)
-     AnimState *anim;
-     ChessSquare piece;
-     int startColor;
-     XPoint * start;
+BeginAnimation (AnimState *anim, ChessSquare piece, int startColor, XPoint *start)
 {
   Pixmap mask;
 
@@ -8440,10 +7692,7 @@ BeginAnimation(anim, piece, startColor, start)
 }
 
 static void
-AnimationFrame(anim, frame, piece)
-     AnimState *anim;
-     XPoint *frame;
-     ChessSquare piece;
+AnimationFrame (AnimState *anim, XPoint *frame, ChessSquare piece)
 {
   XRectangle updates[4];
   XRectangle overlap;
@@ -8493,9 +7742,7 @@ AnimationFrame(anim, frame, piece)
 }
 
 static void
-EndAnimation (anim, finish)
-     AnimState *anim;
-     XPoint *finish;
+EndAnimation (AnimState *anim, XPoint *finish)
 {
   XRectangle updates[4];
   XRectangle overlap;
@@ -8520,11 +7767,7 @@ EndAnimation (anim, finish)
 }
 
 static void
-FrameSequence(anim, piece, startColor, start, finish, frames, nFrames)
-     AnimState *anim;
-     ChessSquare piece; int startColor;
-     XPoint * start; XPoint * finish;
-     XPoint frames[]; int nFrames;
+FrameSequence (AnimState *anim, ChessSquare piece, int startColor, XPoint *start, XPoint *finish, XPoint frames[], int nFrames)
 {
   int n;
 
@@ -8537,7 +7780,7 @@ FrameSequence(anim, piece, startColor, start, finish, frames, nFrames)
 }
 
 void
-AnimateAtomicCapture(Board board, int fromX, int fromY, int toX, int toY)
+AnimateAtomicCapture (Board board, int fromX, int fromY, int toX, int toY)
 {
     int i, x, y;
     ChessSquare piece = board[fromY][toY];
@@ -8562,12 +7805,7 @@ AnimateAtomicCapture(Board board, int fromX, int fromY, int toX, int toY)
 /* Main control logic for deciding what to animate and how */
 
 void
-AnimateMove(board, fromX, fromY, toX, toY)
-     Board board;
-     int fromX;
-     int fromY;
-     int toX;
-     int toY;
+AnimateMove (Board board, int fromX, int fromY, int toX, int toY)
 {
   ChessSquare piece;
   int hop;
@@ -8593,11 +7831,6 @@ AnimateMove(board, fromX, fromY, toX, toY)
   hop = abs(fromX-toX) == 1 && abs(fromY-toY) == 2 || abs(fromX-toX) == 2 && abs(fromY-toY) == 1;
 #endif
 
-  if (appData.debugMode) {
-      fprintf(debugFP, hop ? _("AnimateMove: piece %d hops from %d,%d to %d,%d \n") :
-                             _("AnimateMove: piece %d slides from %d,%d to %d,%d \n"),
-             piece, fromX, fromY, toX, toY);  }
-
   ScreenSquare(fromX, fromY, &start, &startColor);
   ScreenSquare(toX, toY, &finish, &endColor);
 
@@ -8632,8 +7865,7 @@ AnimateMove(board, fromX, fromY, toX, toY)
 }
 
 void
-DragPieceBegin(x, y)
-     int x; int y;
+DragPieceBegin (int x, int y, Boolean instantly)
 {
     int         boardX, boardY, color;
     XPoint corner;
@@ -8686,7 +7918,7 @@ DragPieceBegin(x, y)
 }
 
 void
-ChangeDragPiece(ChessSquare piece)
+ChangeDragPiece (ChessSquare piece)
 {
   Pixmap mask;
   player.dragPiece = piece;
@@ -8696,8 +7928,7 @@ ChangeDragPiece(ChessSquare piece)
 }
 
 static void
-DragPieceMove(x, y)
-     int x; int y;
+DragPieceMove (int x, int y)
 {
     XPoint corner;
 
@@ -8723,8 +7954,7 @@ DragPieceMove(x, y)
 }
 
 void
-DragPieceEnd(x, y)
-     int x; int y;
+DragPieceEnd (int x, int y)
 {
     int boardX, boardY, color;
     XPoint corner;
@@ -8770,7 +8000,8 @@ DrawDragPiece ()
 }
 
 #include <sys/ioctl.h>
-int get_term_width()
+int
+get_term_width ()
 {
     int fd, default_width;
 
@@ -8790,7 +8021,7 @@ int get_term_width()
 }
 
 void
-update_ics_width()
+update_ics_width ()
 {
   static int old_width = 0;
   int new_width = get_term_width();
@@ -8800,7 +8031,8 @@ update_ics_width()
   old_width = new_width;
 }
 
-void NotifyFrontendLogin()
+void
+NotifyFrontendLogin ()
 {
     update_ics_width();
 }
@@ -8812,17 +8044,20 @@ static double A_WIDTH = 5; /* Width of arrow body */
 #define A_HEIGHT_FACTOR 6   /* Length of arrow "point", relative to body width */
 #define A_WIDTH_FACTOR  3   /* Width of arrow "point", relative to body width */
 
-static double Sqr( double x )
+static double
+Sqr (double x)
 {
     return x*x;
 }
 
-static int Round( double x )
+static int
+Round (double x)
 {
     return (int) (x + 0.5);
 }
 
-void SquareToPos(int rank, int file, int *x, int *y)
+void
+SquareToPos (int rank, int file, int *x, int *y)
 {
     if (flipView) {
        *x = lineGap + ((BOARD_WIDTH-1)-file) * (squareSize + lineGap);
@@ -8834,9 +8069,10 @@ void SquareToPos(int rank, int file, int *x, int *y)
 }
 
 /* Draw an arrow between two points using current settings */
-void DrawArrowBetweenPoints( int s_x, int s_y, int d_x, int d_y )
+void
+DrawArrowBetweenPoints (int s_x, int s_y, int d_x, int d_y)
 {
-    XPoint arrow[7];
+    XPoint arrow[8];
     double dx, dy, j, k, x, y;
 
     if( d_x == s_x ) {
@@ -8933,13 +8169,29 @@ void DrawArrowBetweenPoints( int s_x, int s_y, int d_x, int d_y )
     }
 
     XFillPolygon(xDisplay, xBoardWindow, highlineGC, arrow, 7, Nonconvex, CoordModeOrigin);
+    if(appData.monoMode) arrow[7] = arrow[0], XDrawLines(xDisplay, xBoardWindow, darkSquareGC, arrow, 8, CoordModeOrigin);
 //    Polygon( hdc, arrow, 7 );
 }
 
+void
+ArrowDamage (int s_col, int s_row, int d_col, int d_row)
+{
+    int hor, vert, i;
+    hor = 64*s_col + 32; vert = 64*s_row + 32;
+    for(i=0; i<= 64; i++) {
+            damage[0][vert+6>>6][hor+6>>6] = True;
+            damage[0][vert-6>>6][hor+6>>6] = True;
+            damage[0][vert+6>>6][hor-6>>6] = True;
+            damage[0][vert-6>>6][hor-6>>6] = True;
+            hor += d_col - s_col; vert += d_row - s_row;
+    }
+}
+
 /* [AS] Draw an arrow between two squares */
-void DrawArrowBetweenSquares( int s_col, int s_row, int d_col, int d_row )
+void
+DrawArrowBetweenSquares (int s_col, int s_row, int d_col, int d_row)
 {
-    int s_x, s_y, d_x, d_y, hor, vert, i;
+    int s_x, s_y, d_x, d_y;
 
     if( s_col == d_col && s_row == d_row ) {
         return;
@@ -8976,29 +8228,24 @@ void DrawArrowBetweenSquares( int s_col, int s_row, int d_col, int d_row )
     A_WIDTH = squareSize / 14.; //[HGM] make float
 
     DrawArrowBetweenPoints( s_x, s_y, d_x, d_y );
-
-    hor = 64*s_col + 32; vert = 64*s_row + 32;
-    for(i=0; i<= 64; i++) {
-            damage[0][vert+6>>6][hor+6>>6] = True;
-            damage[0][vert-6>>6][hor+6>>6] = True;
-            damage[0][vert+6>>6][hor-6>>6] = True;
-            damage[0][vert-6>>6][hor-6>>6] = True;
-            hor += d_col - s_col; vert += d_row - s_row;
-    }
+    ArrowDamage(s_col, s_row, d_col, d_row);
 }
 
-Boolean IsDrawArrowEnabled()
+Boolean
+IsDrawArrowEnabled ()
 {
     return appData.highlightMoveWithArrow && squareSize >= 32;
 }
 
-void DrawArrowHighlight(int fromX, int fromY, int toX,int toY)
+void
+DrawArrowHighlight (int fromX, int fromY, int toX,int toY)
 {
     if( IsDrawArrowEnabled() && fromX >= 0 && fromY >= 0 && toX >= 0 && toY >= 0)
         DrawArrowBetweenSquares(fromX, fromY, toX, toY);
 }
 
-void UpdateLogos(int displ)
+void
+UpdateLogos (int displ)
 {
     return; // no logos in XBoard yet
 }