Switch to use of short menu references
[xboard.git] / xboard.c
index 84e0aec..54d981d 100644 (file)
--- a/xboard.c
+++ b/xboard.c
@@ -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,20 +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;
-    int textWidth;
-    Widget subMenu;
-} 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));
@@ -315,141 +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 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 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 ManInner P((Widget w, XEvent *event, String *prms, Cardinal *nprms));
 void DisplayMove P((int moveNumber));
 void DisplayTitle P((char *title));
 void ICSInitScript P((void));
@@ -461,23 +316,6 @@ 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(());
@@ -617,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 Game   Ctrl+G"), "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},
-    {N_(PAUSE_BUTTON), PAUSE_BUTTON, PauseProc},
-    {">", ">", ForwardProc},
-    {">>", ">>", ToEndProc},
+    {"<<", "<<", ToStartEvent},
+    {"<", "<", BackwardEvent},
+    {N_(PAUSE_BUTTON), PAUSE_BUTTON, PauseEvent},
+    {">", ">", ForwardEvent},
+    {">>", ">>", ToEndEvent},
     {NULL, NULL, NULL}
 };
 
@@ -927,113 +580,11 @@ XtActionsRec boardActions[] = {
     { "PieceMenuPopup", PieceMenuPopup },
     { "WhiteClock", WhiteClock },
     { "BlackClock", BlackClock },
-    { "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", EditTagsProc },
-    { "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 },
+    { "MenuItem", KeyBindingProc }, // [HGM] generic handler for key bindings
+    { "QuitProc", QuitWrapper },
+    { "ManProc", ManInner },
     { "TempBackwardProc", TempBackwardProc },
     { "TempForwardProc", TempForwardProc },
-    { "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 },
     { "CommentClick", (XtActionProc) CommentClick },
     { "CommentPopDown", (XtActionProc) CommentPopDown },
     { "TagsPopDown", (XtActionProc) TagsPopDown },
@@ -1049,74 +600,81 @@ XtActionsRec boardActions[] = {
     { "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 \
+  ":<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: 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>g: 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>Left: BackwardProc() \n \
-   :<Key>Right: ForwardProc() \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 "
+   :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>F1: ManProc() \n \
-   :<Key>F2: FlipViewProc() \n \
+   :<Key>F1: MenuItem(Manual) \n \
+   :<Key>F2: MenuItem(FlipView) \n \
    :<KeyDown>Return: TempBackwardProc() \n \
    :<KeyUp>Return: TempForwardProc() \n";
 
@@ -2514,100 +2072,99 @@ XBoard square size (hint): %d\n\
     XtSetArg(args[0], XtNleftBitmap, xMarkPixmap);
 #ifndef OPTIONSDIALOG
     if (appData.alwaysPromoteToQueen) {
-       XtSetValues(XtNameToWidget(menuBarWidget, "menuOptions.Always Queen"),
+       XtSetValues(XtNameToWidget(menuBarWidget, "Always Queen"),
                    args, 1);
     }
     if (appData.animateDragging) {
        XtSetValues(XtNameToWidget(menuBarWidget,
-                                  "menuOptions.Animate Dragging"),
+                                  "Animate Dragging"),
                    args, 1);
     }
     if (appData.animate) {
-       XtSetValues(XtNameToWidget(menuBarWidget, "menuOptions.Animate Moving"),
+       XtSetValues(XtNameToWidget(menuBarWidget, "Animate Moving"),
                    args, 1);
     }
     if (appData.autoCallFlag) {
-       XtSetValues(XtNameToWidget(menuBarWidget, "menuOptions.Auto Flag"),
+       XtSetValues(XtNameToWidget(menuBarWidget, "Auto Flag"),
                    args, 1);
     }
     if (appData.autoFlipView) {
-       XtSetValues(XtNameToWidget(menuBarWidget,"menuOptions.Auto Flip View"),
+       XtSetValues(XtNameToWidget(menuBarWidget,"Auto Flip View"),
                    args, 1);
     }
     if (appData.blindfold) {
        XtSetValues(XtNameToWidget(menuBarWidget,
-                                  "menuOptions.Blindfold"), args, 1);
+                                  "Blindfold"), args, 1);
     }
     if (appData.flashCount > 0) {
        XtSetValues(XtNameToWidget(menuBarWidget,
-                                  "menuOptions.Flash Moves"),
+                                  "Flash Moves"),
                    args, 1);
     }
 #if HIGHDRAG
     if (appData.highlightDragging) {
        XtSetValues(XtNameToWidget(menuBarWidget,
-                                  "menuOptions.Highlight Dragging"),
+                                  "Highlight Dragging"),
                    args, 1);
     }
 #endif
     if (appData.highlightLastMove) {
        XtSetValues(XtNameToWidget(menuBarWidget,
-                                  "menuOptions.Highlight Last Move"),
+                                  "Highlight Last Move"),
                    args, 1);
     }
     if (appData.highlightMoveWithArrow) {
        XtSetValues(XtNameToWidget(menuBarWidget,
-                                  "menuOptions.Arrow"),
+                                  "Arrow"),
                    args, 1);
     }
 //    if (appData.icsAlarm) {
-//     XtSetValues(XtNameToWidget(menuBarWidget, "menuOptions.ICS Alarm"),
+//     XtSetValues(XtNameToWidget(menuBarWidget, "ICS Alarm"),
 //                 args, 1);
 //    }
     if (appData.ringBellAfterMoves) {
-       XtSetValues(XtNameToWidget(menuBarWidget, "menuOptions.Move Sound"),
+       XtSetValues(XtNameToWidget(menuBarWidget, "Move Sound"),
                    args, 1);
     }
     if (appData.oneClick) {
        XtSetValues(XtNameToWidget(menuBarWidget,
-                                  "menuOptions.OneClick"), args, 1);
+                                  "OneClick"), args, 1);
     }
     if (appData.periodicUpdates) {
        XtSetValues(XtNameToWidget(menuBarWidget,
-                                  "menuOptions.Periodic Updates"), args, 1);
+                                  "Periodic Updates"), args, 1);
     }
     if (appData.ponderNextMove) {
        XtSetValues(XtNameToWidget(menuBarWidget,
-                                  "menuOptions.Ponder Next Move"), args, 1);
+                                  "Ponder Next Move"), args, 1);
     }
     if (appData.popupExitMessage) {
        XtSetValues(XtNameToWidget(menuBarWidget,
-                                  "menuOptions.Popup Exit Message"), args, 1);
+                                  "Popup Exit Message"), args, 1);
     }
     if (appData.popupMoveErrors) {
        XtSetValues(XtNameToWidget(menuBarWidget,
-                                  "menuOptions.Popup Move Errors"), args, 1);
+                                  "Popup Move Errors"), args, 1);
     }
 //    if (appData.premove) {
 //     XtSetValues(XtNameToWidget(menuBarWidget,
-//                                "menuOptions.Premove"), args, 1);
+//                                "Premove"), args, 1);
 //    }
     if (appData.showCoords) {
-       XtSetValues(XtNameToWidget(menuBarWidget, "menuOptions.Show Coords"),
+       XtSetValues(XtNameToWidget(menuBarWidget, "Show Coords"),
                    args, 1);
     }
     if (appData.hideThinkingFromHuman) {
-       XtSetValues(XtNameToWidget(menuBarWidget, "menuOptions.Hide Thinking"),
+       XtSetValues(XtNameToWidget(menuBarWidget, "Hide Thinking"),
                    args, 1);
     }
     if (appData.testLegality) {
-       XtSetValues(XtNameToWidget(menuBarWidget,"menuOptions.Test Legality"),
+       XtSetValues(XtNameToWidget(menuBarWidget,"Test Legality"),
                    args, 1);
     }
 #endif
     if (saveSettingsOnExit) {
-       XtSetValues(XtNameToWidget(menuBarWidget,"menuOptions.Save Settings on Exit"),
-                   args, 1);
+       MarkMenuItem("Save Settings on Exit", True);
     }
 
     /*
@@ -2704,6 +2261,7 @@ XBoard square size (hint): %d\n\
            signal(SIGUSR1, CmailSigHandler);
        }
     }
+
     gameInfo.boardWidth = 0; // [HGM] pieces: kludge to ensure InitPosition() calls InitDrawingSizes()
     InitPosition(TRUE);
 //    XtSetKeyboardFocus(shellWidget, formWidget);
@@ -2803,217 +2361,184 @@ ResetFrontEnd ()
     return;
 }
 
-typedef struct {
-    char *name;
-    Boolean value;
-} Enables;
-
 void
 GreyRevert (Boolean grey)
 {
-    Widget w;
-    if (!menuBarWidget) return;
-    w = XtNameToWidget(menuBarWidget, "menuEdit.Revert");
-    if (w == NULL) {
-      DisplayError("menuEdit.Revert", 0);
-    } else {
-      XtSetSensitive(w, !grey);
-    }
-    w = XtNameToWidget(menuBarWidget, "menuEdit.Annotate");
-    if (w == NULL) {
-      DisplayError("menuEdit.Annotate", 0);
-    } else {
-      XtSetSensitive(w, !grey);
-    }
-}
-
-void
-SetMenuEnables (Enables *enab)
-{
-  Widget w;
-  if (!menuBarWidget) return;
-  while (enab->name != NULL) {
-    w = XtNameToWidget(menuBarWidget, enab->name);
-    if (w == NULL) {
-      DisplayError(enab->name, 0);
-    } else {
-      XtSetSensitive(w, enab->value);
-    }
-    enab++;
-  }
+    MarkMenuItem("Revert", !grey);
+    MarkMenuItem("Annotate", !grey);
 }
 
 Enables icsEnables[] = {
-    { "menuFile.Mail Move", False },
-    { "menuFile.Reload CMail Message", False },
-    { "menuMode.Machine Black", False },
-    { "menuMode.Machine White", False },
-    { "menuMode.Analysis Mode", False },
-    { "menuMode.Analyze File", False },
-    { "menuMode.Two Machines", False },
-    { "menuMode.Machine Match", False },
+    { "Mail Move", False },
+    { "Reload CMail Message", False },
+    { "Machine Black", False },
+    { "Machine White", False },
+    { "Analysis Mode", False },
+    { "Analyze File", False },
+    { "Two Machines", False },
+    { "Machine Match", False },
 #ifndef ZIPPY
-    { "menuEngine.Hint", False },
-    { "menuEngine.Book", False },
-    { "menuEngine.Move Now", False },
+    { "Hint", False },
+    { "Book", False },
+    { "Move Now", False },
 #ifndef OPTIONSDIALOG
-    { "menuOptions.Periodic Updates", False },
-    { "menuOptions.Hide Thinking", False },
-    { "menuOptions.Ponder Next Move", False },
+    { "Periodic Updates", False },
+    { "Hide Thinking", False },
+    { "Ponder Next Move", False },
 #endif
 #endif
-    { "menuEngine.Engine #1 Settings", False },
-    { "menuEngine.Engine #2 Settings", False },
-    { "menuEngine.Load Engine", False },
-    { "menuEdit.Annotate", False },
-    { "menuOptions.Match", False },
+    { "Engine #1 Settings", False },
+    { "Engine #2 Settings", False },
+    { "Load Engine", False },
+    { "Annotate", False },
+    { "Match", False },
     { NULL, False }
 };
 
 Enables ncpEnables[] = {
-    { "menuFile.Mail Move", False },
-    { "menuFile.Reload CMail Message", False },
-    { "menuMode.Machine White", False },
-    { "menuMode.Machine Black", False },
-    { "menuMode.Analysis Mode", False },
-    { "menuMode.Analyze File", False },
-    { "menuMode.Two Machines", False },
-    { "menuMode.Machine Match", False },
-    { "menuMode.ICS Client", False },
-    { "menuView.ICStex", False },
-    { "menuView.ICS Input Box", False },
+    { "Mail Move", False },
+    { "Reload CMail Message", False },
+    { "Machine White", False },
+    { "Machine Black", False },
+    { "Analysis Mode", False },
+    { "Analyze File", False },
+    { "Two Machines", False },
+    { "Machine Match", False },
+    { "ICS Client", False },
+    { "ICStex", False },
+    { "ICS Input Box", False },
     { "Action", False },
-    { "menuEdit.Revert", False },
-    { "menuEdit.Annotate", False },
-    { "menuEngine.Engine #1 Settings", False },
-    { "menuEngine.Engine #2 Settings", False },
-    { "menuEngine.Move Now", False },
-    { "menuEngine.Retract Move", False },
-    { "menuOptions.ICS", False },
+    { "Revert", False },
+    { "Annotate", False },
+    { "Engine #1 Settings", False },
+    { "Engine #2 Settings", False },
+    { "Move Now", False },
+    { "Retract Move", False },
+    { "ICS", False },
 #ifndef OPTIONSDIALOG
-    { "menuOptions.Auto Flag", False },
-    { "menuOptions.Auto Flip View", False },
-//    { "menuOptions.ICS Alarm", False },
-    { "menuOptions.Move Sound", False },
-    { "menuOptions.Hide Thinking", False },
-    { "menuOptions.Periodic Updates", False },
-    { "menuOptions.Ponder Next Move", False },
+    { "Auto Flag", False },
+    { "Auto Flip View", False },
+//    { "ICS Alarm", False },
+    { "Move Sound", False },
+    { "Hide Thinking", False },
+    { "Periodic Updates", False },
+    { "Ponder Next Move", False },
 #endif
-    { "menuEngine.Hint", False },
-    { "menuEngine.Book", False },
+    { "Hint", False },
+    { "Book", False },
     { NULL, False }
 };
 
 Enables gnuEnables[] = {
-    { "menuMode.ICS Client", False },
-    { "menuView.ICStex", False },
-    { "menuView.ICS Input Box", False },
-    { "menuAction.Accept", False },
-    { "menuAction.Decline", False },
-    { "menuAction.Rematch", False },
-    { "menuAction.Adjourn", False },
-    { "menuAction.Stop Examining", False },
-    { "menuAction.Stop Observing", False },
-    { "menuAction.Upload to Examine", False },
-    { "menuEdit.Revert", False },
-    { "menuEdit.Annotate", False },
-    { "menuOptions.ICS", False },
+    { "ICS Client", False },
+    { "ICStex", False },
+    { "ICS Input Box", False },
+    { "Accept", False },
+    { "Decline", False },
+    { "Rematch", False },
+    { "Adjourn", False },
+    { "Stop Examining", False },
+    { "Stop Observing", False },
+    { "Upload to Examine", False },
+    { "Revert", False },
+    { "Annotate", False },
+    { "ICS", False },
 
     /* The next two options rely on SetCmailMode being called *after*    */
     /* SetGNUMode so that when GNU is being used to give hints these     */
     /* menu options are still available                                  */
 
-    { "menuFile.Mail Move", False },
-    { "menuFile.Reload CMail Message", False },
+    { "Mail Move", False },
+    { "Reload CMail Message", False },
     // [HGM] The following have been added to make a switch from ncp to GNU mode possible
-    { "menuMode.Machine White", True },
-    { "menuMode.Machine Black", True },
-    { "menuMode.Analysis Mode", True },
-    { "menuMode.Analyze File", True },
-    { "menuMode.Two Machines", True },
-    { "menuMode.Machine Match", True },
-    { "menuEngine.Engine #1 Settings", True },
-    { "menuEngine.Engine #2 Settings", True },
-    { "menuEngine.Hint", True },
-    { "menuEngine.Book", True },
-    { "menuEngine.Move Now", True },
-    { "menuEngine.Retract Move", True },
+    { "Machine White", True },
+    { "Machine Black", True },
+    { "Analysis Mode", True },
+    { "Analyze File", True },
+    { "Two Machines", True },
+    { "Machine Match", True },
+    { "Engine #1 Settings", True },
+    { "Engine #2 Settings", True },
+    { "Hint", True },
+    { "Book", True },
+    { "Move Now", True },
+    { "Retract Move", True },
     { "Action", True },
     { NULL, False }
 };
 
 Enables cmailEnables[] = {
     { "Action", True },
-    { "menuAction.Call Flag", False },
-    { "menuAction.Draw", True },
-    { "menuAction.Adjourn", False },
-    { "menuAction.Abort", False },
-    { "menuAction.Stop Observing", False },
-    { "menuAction.Stop Examining", False },
-    { "menuFile.Mail Move", True },
-    { "menuFile.Reload CMail Message", True },
+    { "Call Flag", False },
+    { "Draw", True },
+    { "Adjourn", False },
+    { "Abort", False },
+    { "Stop Observing", False },
+    { "Stop Examining", False },
+    { "Mail Move", True },
+    { "Reload CMail Message", True },
     { NULL, False }
 };
 
 Enables trainingOnEnables[] = {
-  { "menuMode.Edit Comment", False },
-  { "menuMode.Pause", False },
-  { "menuEdit.Forward", False },
-  { "menuEdit.Backward", False },
-  { "menuEdit.Forward to End", False },
-  { "menuEdit.Back to Start", False },
-  { "menuEngine.Move Now", False },
-  { "menuEdit.Truncate Game", False },
+  { "Edit Comment", False },
+  { "Pause", False },
+  { "Forward", False },
+  { "Backward", False },
+  { "Forward to End", False },
+  { "Back to Start", False },
+  { "Move Now", False },
+  { "Truncate Game", False },
   { NULL, False }
 };
 
 Enables trainingOffEnables[] = {
-  { "menuMode.Edit Comment", True },
-  { "menuMode.Pause", True },
-  { "menuEdit.Forward", True },
-  { "menuEdit.Backward", True },
-  { "menuEdit.Forward to End", True },
-  { "menuEdit.Back to Start", True },
-  { "menuEngine.Move Now", True },
-  { "menuEdit.Truncate Game", True },
+  { "Edit Comment", True },
+  { "Pause", True },
+  { "Forward", True },
+  { "Backward", True },
+  { "Forward to End", True },
+  { "Back to Start", True },
+  { "Move Now", True },
+  { "Truncate Game", True },
   { NULL, False }
 };
 
 Enables machineThinkingEnables[] = {
-  { "menuFile.Load Game", False },
-//  { "menuFile.Load Next Game", False },
-//  { "menuFile.Load Previous Game", False },
-//  { "menuFile.Reload Same Game", False },
-  { "menuEdit.Paste Game", False },
-  { "menuFile.Load Position", False },
-//  { "menuFile.Load Next Position", False },
-//  { "menuFile.Load Previous Position", False },
-//  { "menuFile.Reload Same Position", False },
-  { "menuEdit.Paste Position", False },
-  { "menuMode.Machine White", False },
-  { "menuMode.Machine Black", False },
-  { "menuMode.Two Machines", False },
-//  { "menuMode.Machine Match", False },
-  { "menuEngine.Retract Move", False },
+  { "Load Game", False },
+//  { "Load Next Game", False },
+//  { "Load Previous Game", False },
+//  { "Reload Same Game", False },
+  { "Paste Game", False },
+  { "Load Position", False },
+//  { "Load Next Position", False },
+//  { "Load Previous Position", False },
+//  { "Reload Same Position", False },
+  { "Paste Position", False },
+  { "Machine White", False },
+  { "Machine Black", False },
+  { "Two Machines", False },
+//  { "Machine Match", False },
+  { "Retract Move", False },
   { NULL, False }
 };
 
 Enables userThinkingEnables[] = {
-  { "menuFile.Load Game", True },
-//  { "menuFile.Load Next Game", True },
-//  { "menuFile.Load Previous Game", True },
-//  { "menuFile.Reload Same Game", True },
-  { "menuEdit.Paste Game", True },
-  { "menuFile.Load Position", True },
-//  { "menuFile.Load Next Position", True },
-//  { "menuFile.Load Previous Position", True },
-//  { "menuFile.Reload Same Position", True },
-  { "menuEdit.Paste Position", True },
-  { "menuMode.Machine White", True },
-  { "menuMode.Machine Black", True },
-  { "menuMode.Two Machines", True },
-//  { "menuMode.Machine Match", True },
-  { "menuEngine.Retract Move", True },
+  { "Load Game", True },
+//  { "Load Next Game", True },
+//  { "Load Previous Game", True },
+//  { "Reload Same Game", True },
+  { "Paste Game", True },
+  { "Load Position", True },
+//  { "Load Next Position", True },
+//  { "Load Previous Position", True },
+//  { "Reload Same Position", True },
+  { "Paste Position", True },
+  { "Machine White", True },
+  { "Machine Black", True },
+  { "Two Machines", True },
+//  { "Machine Match", True },
+  { "Retract Move", True },
   { NULL, False }
 };
 
@@ -3024,8 +2549,8 @@ SetICSMode ()
 
 #if ZIPPY
   if (appData.zippyPlay && !appData.noChessProgram) { /* [DM] icsEngineAnalyze */
-     XtSetSensitive(XtNameToWidget(menuBarWidget, "menuMode.Analysis Mode"), True);
-     XtSetSensitive(XtNameToWidget(menuBarWidget, "menuEngine.Engine #1 Settings"), True);
+     EnableMenuItem("Analysis Mode", True);
+     EnableMenuItem("Engine #1 Settings", True);
   }
 #endif
 }
@@ -3083,8 +2608,7 @@ SetMachineThinkingEnables ()
   case MachinePlaysBlack:
   case MachinePlaysWhite:
   case TwoMachinesPlay:
-    XtSetSensitive(XtNameToWidget(menuBarWidget,
-                                 ModeToWidgetName(gameMode)), True);
+    EnableMenuItem(ModeToWidgetName(gameMode), True);
     break;
   default:
     break;
@@ -3894,12 +3418,98 @@ CreateGrid ()
     }
 }
 
+int nrOfMenuItems = 7;
+Widget menuWidget[150];
+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}
+};
+
+void
+MarkMenuItem (char *menuRef, int state)
+{
+    int nr = MenuToNumber(menuRef);
+    if(nr >= 0) {
+       Arg args[2];
+       XtSetArg(args[0], XtNleftBitmap, state ? xMarkPixmap : None);
+       XtSetValues(menuWidget[nr], args, 1);
+    }
+}
+
+void
+EnableMenuItem (char *menuRef, int state)
+{
+    int nr = MenuToNumber(menuRef);
+    if(nr >= 0) XtSetSensitive(menuWidget[nr], state);
+}
+
+void
+SetMenuEnables (Enables *enab)
+{
+  while (enab->name != NULL) {
+    EnableMenuItem(enab->name, enab->value);
+    enab++;
+  }
+}
+
+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)();
 }
 
 static void
@@ -3908,97 +3518,76 @@ 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
-AppendEnginesToMenu (Widget menu, char *list)
+AppendMenuItem (char *text, char *name, MenuProc *action)
 {
-    int i=0, j;
+    int j;
     Widget entry;
-    MenuItem *mi;
     Arg args[16];
-    char *p;
 
-    if(appData.icsActive || appData.recentEngines <= 0) return;
-    recentEngines = strdup(list);
     j = 0;
     XtSetArg(args[j], XtNleftMargin, 20);   j++;
     XtSetArg(args[j], XtNrightMargin, 20);  j++;
-    while (*list) {
-       p = strchr(list, '\n'); if(p == NULL) break;
-       if(i == 0) XtCreateManagedWidget(_("----"), smeLineObjectClass, menu, args, j); // at least one valid item to add
-       *p = 0;
-       XtSetArg(args[j], XtNlabel, XtNewString(list));
-       entry = XtCreateManagedWidget("engine", smeBSBObjectClass, menu, args, j+1);
-       XtAddCallback(entry, XtNcallback,
-                         (XtCallbackProc) MenuEngineSelect,
-                         (caddr_t) (intptr_t) i);
-       i++; *p = '\n'; list = p + 1;
-    }
+
+       if (strcmp(text, "----") == 0) {
+         entry = XtCreateManagedWidget(text, smeLineObjectClass,
+                                         currentMenu, args, j);
+       } else {
+          XtSetArg(args[j], XtNlabel, XtNewString(_(text)));
+           entry = XtCreateManagedWidget(name, smeBSBObjectClass,
+                                         currentMenu, args, j+1);
+           XtAddCallback(entry, XtNcallback,
+                         (XtCallbackProc) (strcmp(name, "recent") ? MenuBarSelect : MenuEngineSelect),
+                         (caddr_t) action);
+           menuWidget[nrOfMenuItems] = entry;
+       }
 }
 
 void
-CreateMenuBarPopup (Widget parent, String name, Menu *mb)
-{
-    int j;
-    Widget menu, entry;
-    MenuItem *mi;
+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;
 
-    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);
-       } else {
-          XtSetArg(args[j], XtNlabel, XtNewString(_(mi->string)));
-           entry = XtCreateManagedWidget(mi->ref, smeBSBObjectClass,
-                                         menu, args, j+1);
-           XtAddCallback(entry, XtNcallback,
-                         (XtCallbackProc) MenuBarSelect,
-                         (caddr_t) mi->proc);
-       }
-       mi++;
-    }
-    if(!strcmp(mb->name, "Engine")) AppendEnginesToMenu(menu, appData.recentEngineList);
+       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 i, j, nr = 0, wtot = 0, widths[10];
-    Widget 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++;
-       XtSetArg(args[j], XtNlabel, XtNewString(_(mb->name)));  j++;
-       XtSetArg(args[j], XtNborderWidth, 0);                   j++;
-       mb->subMenu = XtCreateManagedWidget(mb->name, menuButtonWidgetClass,
-                                      menuBar, args, j);
-       CreateMenuBarPopup(menuBar, menuName, mb);
-       j = 0;
-       XtSetArg(args[j], XtNwidth, &w);                   j++;
-       XtGetValues(mb->subMenu, args, j);
-       wtot += mb->textWidth = widths[nr++] = w;
-       mb++;
-    }
+    CreateMainMenus(mb); // put menus in bar according to description in back-end
+
+    // 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];
@@ -4010,7 +3599,8 @@ CreateMenuBar (Menu *mb, int boardWidth)
        XtSetArg(args[j], XtNwidth, widths[i]);                   j++;
        XtSetValues(ma[i].subMenu, args, j);
     }
-    return menuBar;
+
+    return mainBar;
 }
 
 Widget
@@ -4249,6 +3839,7 @@ SetHighlights (int fromX, int fromY, int toX, int toY)
            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);
@@ -4264,8 +3855,10 @@ SetHighlights (int fromX, int fromY, int toX, int 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;
@@ -4699,6 +4292,8 @@ CoDrag (Widget sh, WindowPlacement *wp)
     XtSetValues(sh, args, j);
 }
 
+static XtIntervalId delayedDragID = 0;
+
 void
 DragProc ()
 {
@@ -4712,13 +4307,13 @@ DragProc ()
        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 ()
 {
-    static XtIntervalId delayedDragID = 0;
     if(delayedDragID) XtRemoveTimeOut(delayedDragID); // cancel pending
     delayedDragID =
       XtAppAddTimeOut(appContext, 50, (XtTimerCallbackProc) DragProc, (XtPointer) 0); // and schedule new one 50 msec later
@@ -4880,9 +4475,7 @@ XDrawPosition (Widget w, int repaint, Board board)
        board = lastBoard[nr];
     }
     if (!lastBoardValid[nr] || (nr == 0 && lastFlipView != flipView)) {
-       XtSetArg(args[0], XtNleftBitmap, (flipView ? xMarkPixmap : None));
-       XtSetValues(XtNameToWidget(menuBarWidget, "menuView.Flip View"),
-                   args, 1);
+       MarkMenuItem("Flip View", flipView);
     }
 
     /*
@@ -5416,36 +5009,36 @@ ModeToWidgetName (GameMode mode)
     switch (mode) {
       case BeginningOfGame:
        if (appData.icsActive)
-         return "menuMode.ICS Client";
+         return "ICS Client";
        else if (appData.noChessProgram ||
                 *appData.cmailGameName != NULLCHAR)
-         return "menuMode.Edit Game";
+         return "Edit Game";
        else
-         return "menuMode.Machine Black";
+         return "Machine Black";
       case MachinePlaysBlack:
-       return "menuMode.Machine Black";
+       return "Machine Black";
       case MachinePlaysWhite:
-       return "menuMode.Machine White";
+       return "Machine White";
       case AnalyzeMode:
-       return "menuMode.Analysis Mode";
+       return "Analysis Mode";
       case AnalyzeFile:
-       return "menuMode.Analyze File";
+       return "Analyze File";
       case TwoMachinesPlay:
-       return "menuMode.Two Machines";
+       return "Two Machines";
       case EditGame:
-       return "menuMode.Edit Game";
+       return "Edit Game";
       case PlayFromGameFile:
-       return "menuFile.Load Game";
+       return "Load Game";
       case EditPosition:
-       return "menuMode.Edit Position";
+       return "Edit Position";
       case Training:
-       return "menuMode.Training";
+       return "Training";
       case IcsPlayingWhite:
       case IcsPlayingBlack:
       case IcsObserving:
       case IcsIdle:
       case IcsExamining:
-       return "menuMode.ICS Client";
+       return "ICS Client";
       default:
       case EndOfGame:
        return NULL;
@@ -5464,13 +5057,7 @@ ModeHighlight ()
 
     if (pausing != oldPausing) {
        oldPausing = pausing;
-       if (pausing) {
-           XtSetArg(args[0], XtNleftBitmap, xMarkPixmap);
-       } else {
-           XtSetArg(args[0], XtNleftBitmap, None);
-       }
-       XtSetValues(XtNameToWidget(menuBarWidget, "menuMode.Pause"),
-                   args, 1);
+       MarkMenuItem("Pause", pausing);
 
        if (appData.showButtonBar) {
          /* Always toggle, don't set.  Previous code messes up when
@@ -5491,33 +5078,23 @@ ModeHighlight ()
 
     wname = ModeToWidgetName(oldmode);
     if (wname != NULL) {
-       XtSetArg(args[0], XtNleftBitmap, None);
-       XtSetValues(XtNameToWidget(menuBarWidget, wname), args, 1);
+       MarkMenuItem(wname, False);
     }
     wname = ModeToWidgetName(gameMode);
     if (wname != NULL) {
-       XtSetArg(args[0], XtNleftBitmap, xMarkPixmap);
-       XtSetValues(XtNameToWidget(menuBarWidget, wname), args, 1);
+       MarkMenuItem(wname, True);
     }
     oldmode = gameMode;
-    XtSetArg(args[0], XtNleftBitmap, matchMode && matchGame < appData.matchGames ? xMarkPixmap : None);
-    XtSetValues(XtNameToWidget(menuBarWidget, "menuMode.Machine Match"), args, 1);
+    MarkMenuItem("Machine Match", matchMode && matchGame < appData.matchGames);
 
     /* Maybe all the enables should be handled here, not just this one */
-    XtSetSensitive(XtNameToWidget(menuBarWidget, "menuMode.Training"),
-                  gameMode == Training || gameMode == PlayFromGameFile);
+    EnableMenuItem("Training", gameMode == Training || gameMode == PlayFromGameFile);
 }
 
 
 /*
  * Button/menu procedures
  */
-void
-ResetProc (Widget w, XEvent *event, String *prms, Cardinal *nprms)
-{
-    ResetGameEvent();
-}
-
 int
 LoadGamePopUp (FILE *f, int gameNumber, char *title)
 {
@@ -5538,7 +5115,7 @@ LoadGamePopUp (FILE *f, int gameNumber, char *title)
 }
 
 void
-LoadGameProc (Widget w, XEvent *event, String *prms, Cardinal *nprms)
+LoadGameProc ()
 {
     if (gameMode == AnalyzeMode || gameMode == AnalyzeFile) {
        Reset(FALSE, TRUE);
@@ -5547,43 +5124,43 @@ LoadGameProc (Widget w, XEvent *event, String *prms, Cardinal *nprms)
 }
 
 void
-LoadNextGameProc (Widget w, XEvent *event, String *prms, Cardinal *nprms)
+LoadNextGameProc ()
 {
     ReloadGame(1);
 }
 
 void
-LoadPrevGameProc (Widget w, XEvent *event, String *prms, Cardinal *nprms)
+LoadPrevGameProc ()
 {
     ReloadGame(-1);
 }
 
 void
-ReloadGameProc (Widget w, XEvent *event, String *prms, Cardinal *nprms)
+ReloadGameProc ()
 {
     ReloadGame(0);
 }
 
 void
-LoadNextPositionProc (Widget w, XEvent *event, String *prms, Cardinal *nprms)
+LoadNextPositionProc ()
 {
     ReloadPosition(1);
 }
 
 void
-LoadPrevPositionProc (Widget w, XEvent *event, String *prms, Cardinal *nprms)
+LoadPrevPositionProc ()
 {
     ReloadPosition(-1);
 }
 
 void
-ReloadPositionProc (Widget w, XEvent *event, String *prms, Cardinal *nprms)
+ReloadPositionProc ()
 {
     ReloadPosition(0);
 }
 
 void
-LoadPositionProc(Widget w, XEvent *event, String *prms, Cardinal *nprms) 
+LoadPositionProc() 
 {
     if (gameMode == AnalyzeMode || gameMode == AnalyzeFile) {
        Reset(FALSE, TRUE);
@@ -5592,7 +5169,7 @@ LoadPositionProc(Widget w, XEvent *event, String *prms, Cardinal *nprms)
 }
 
 void
-SaveGameProc (Widget w, XEvent *event, String *prms, Cardinal *nprms)
+SaveGameProc ()
 {
     FileNamePopUp(_("Save game file name?"),
                  DefaultFileName(appData.oldSaveStyle ? "game" : "pgn"),
@@ -5601,7 +5178,7 @@ SaveGameProc (Widget w, XEvent *event, String *prms, Cardinal *nprms)
 }
 
 void
-SavePositionProc (Widget w, XEvent *event, String *prms, Cardinal *nprms)
+SavePositionProc ()
 {
     FileNamePopUp(_("Save position file name?"),
                  DefaultFileName(appData.oldSaveStyle ? "pos" : "fen"),
@@ -5610,17 +5187,11 @@ SavePositionProc (Widget w, XEvent *event, String *prms, Cardinal *nprms)
 }
 
 void
-ReloadCmailMsgProc (Widget w, XEvent *event, String *prms, Cardinal *nprms)
+ReloadCmailMsgProc ()
 {
     ReloadCmailMsgEvent(FALSE);
 }
 
-void
-MailMoveProc (Widget w, XEvent *event, String *prms, Cardinal *nprms)
-{
-    MailMoveEvent();
-}
-
 /* this variable is shared between CopyPositionProc and SendPositionSelection */
 char *selected_fen_position=NULL;
 
@@ -5674,7 +5245,7 @@ SendPositionSelection (Widget w, Atom *selection, Atom *target,
  * Widget which was clicked on was, or what the click event was
  */
 void
-CopyPositionProc (Widget w, XEvent *event, String *prms, Cardinal *nprms)
+CopyPositionProc ()
 {
     /*
      * Set both PRIMARY (the selection) and CLIPBOARD, since we don't
@@ -5700,7 +5271,7 @@ CopyPositionProc (Widget w, XEvent *event, String *prms, Cardinal *nprms)
 void
 CopyFENToClipboard ()
 { // wrapper to make call from back-end possible
-  CopyPositionProc(NULL, NULL, NULL, NULL);
+  CopyPositionProc();
 }
 
 /* function called when the data to Paste is ready */
@@ -5717,11 +5288,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,
@@ -5814,7 +5382,7 @@ CopySomething ()
  * Widget which was clicked on was, or what the click event was
  */
 void
-CopyGameProc (Widget w, XEvent *event, String *prms, Cardinal *nprms)
+CopyGameProc ()
 {
   int ret;
 
@@ -5825,7 +5393,7 @@ CopyGameProc (Widget w, XEvent *event, String *prms, Cardinal *nprms)
 }
 
 void
-CopyGameListProc (Widget w, XEvent *event, String *prms, Cardinal *nprms)
+CopyGameListProc ()
 {
   if(!SaveGameListAsText(fopen(gameCopyFilename, "w"))) return;
   CopySomething();
@@ -5854,7 +5422,7 @@ PasteGameCB (Widget w, XtPointer client_data, Atom *selection,
 /* called when Paste Game button is pressed,
  * all parameters will be NULL */
 void
-PasteGameProc (Widget w, XEvent *event, String *prms, Cardinal *nprms)
+PasteGameProc ()
 {
     XtGetSelectionValue(menuBarWidget,
       appData.pasteSelection ? XA_PRIMARY: XA_CLIPBOARD(xDisplay), XA_STRING,
@@ -5873,36 +5441,24 @@ PasteGameProc (Widget w, XEvent *event, String *prms, Cardinal *nprms)
 void
 AutoSaveGame ()
 {
-    SaveGameProc(NULL, NULL, NULL, NULL);
+    SaveGameProc();
 }
 
 
 void
-QuitProc (Widget w, XEvent *event, String *prms, Cardinal *nprms)
+QuitProc ()
 {
     ExitEvent(0);
 }
 
 void
-PauseProc (Widget w, XEvent *event, String *prms, Cardinal *nprms)
+QuitWrapper (Widget w, XEvent *event, String *prms, Cardinal *nprms)
 {
-    PauseEvent();
+    QuitProc();
 }
 
 void
-MachineBlackProc (Widget w, XEvent *event, String *prms, Cardinal *nprms)
-{
-    MachineBlackEvent();
-}
-
-void
-MachineWhiteProc (Widget w, XEvent *event, String *prms, Cardinal *nprms)
-{
-    MachineWhiteEvent();
-}
-
-void
-AnalyzeModeProc (Widget w, XEvent *event, String *prms, Cardinal *nprms)
+AnalyzeModeProc ()
 {
     char buf[MSG_SIZ];
 
@@ -5937,14 +5493,14 @@ AnalyzeModeProc (Widget w, XEvent *event, String *prms, Cardinal *nprms)
     }
 #ifndef OPTIONSDIALOG
     if (!appData.showThinking)
-      ShowThinkingProc(w,event,prms,nprms);
+      ShowThinkingProc();
 #endif
 
     AnalyzeModeEvent();
 }
 
 void
-AnalyzeFileProc (Widget w, XEvent *event, String *prms, Cardinal *nprms)
+AnalyzeFileProc ()
 {
     if (!first.analysisSupport) {
       char buf[MSG_SIZ];
@@ -5955,7 +5511,7 @@ AnalyzeFileProc (Widget w, XEvent *event, String *prms, Cardinal *nprms)
 //    Reset(FALSE, TRUE);
 #ifndef OPTIONSDIALOG
     if (!appData.showThinking)
-      ShowThinkingProc(w,event,prms,nprms);
+      ShowThinkingProc();
 #endif
     AnalyzeFileEvent();
 //    FileNamePopUp(_("File to analyze"), "", ".pgn .game", LoadGamePopUp, "rb");
@@ -5963,123 +5519,43 @@ AnalyzeFileProc (Widget w, XEvent *event, String *prms, Cardinal *nprms)
 }
 
 void
-TwoMachinesProc (Widget w, XEvent *event, String *prms, Cardinal *nprms)
-{
-    TwoMachinesEvent();
-}
-
-void
-MatchProc (Widget w, XEvent *event, String *prms, Cardinal *nprms)
+MatchProc ()
 {
     MatchEvent(2);
 }
 
 void
-IcsClientProc (Widget w, XEvent *event, String *prms, Cardinal *nprms)
-{
-    IcsClientEvent();
-}
-
-void
-EditGameProc (Widget w, XEvent *event, String *prms, Cardinal *nprms)
-{
-    EditGameEvent();
-}
-
-void
-EditPositionProc (Widget w, XEvent *event, String *prms, Cardinal *nprms)
-{
-    EditPositionEvent();
-}
-
-void
-TrainingProc (Widget w, XEvent *event, String *prms, Cardinal *nprms)
-{
-    TrainingEvent();
-}
-
-void
-EditCommentProc (Widget w, XEvent *event, String *prms, Cardinal *nprms)
+EditCommentProc ()
 {
     Arg args[5];
     int j;
     if (PopDown(1)) { // popdown succesful
-       j = 0;
-       XtSetArg(args[j], XtNleftBitmap, None); j++;
-       XtSetValues(XtNameToWidget(menuBarWidget, "menuEdit.Edit Comment"), args, j);
-       XtSetValues(XtNameToWidget(menuBarWidget, "menuView.Show Comments"), args, j);
+       MarkMenuItem("Edit Comment", False);
+       MarkMenuItem("Show Comments", False);
     } else // was not up
        EditCommentEvent();
 }
 
 void
-IcsInputBoxProc (Widget w, XEvent *event, String *prms, Cardinal *nprms)
+IcsInputBoxProc ()
 {
     if (!PopDown(4)) ICSInputBoxPopUp();
 }
 
 void
-AcceptProc (Widget w, XEvent *event, String *prms, Cardinal *nprms)
-{
-    AcceptEvent();
-}
-
-void
-DeclineProc (Widget w, XEvent *event, String *prms, Cardinal *nprms)
-{
-    DeclineEvent();
-}
-
-void
-RematchProc (Widget w, XEvent *event, String *prms, Cardinal *nprms)
-{
-    RematchEvent();
-}
-
-void
-CallFlagProc (Widget w, XEvent *event, String *prms, Cardinal *nprms)
-{
-    CallFlagEvent();
-}
-
-void
-DrawProc (Widget w, XEvent *event, String *prms, Cardinal *nprms)
-{
-    DrawEvent();
-}
-
-void
-AbortProc (Widget w, XEvent *event, String *prms, Cardinal *nprms)
-{
-    AbortEvent();
-}
-
-void
-AdjournProc (Widget w, XEvent *event, String *prms, Cardinal *nprms)
-{
-    AdjournEvent();
-}
-
-void
-ResignProc (Widget w, XEvent *event, String *prms, Cardinal *nprms)
-{
-    ResignEvent();
-}
-
-void
-AdjuWhiteProc (Widget w, XEvent *event, String *prms, Cardinal *nprms)
+AdjuWhiteProc ()
 {
     UserAdjudicationEvent(+1);
 }
 
 void
-AdjuBlackProc (Widget w, XEvent *event, String *prms, Cardinal *nprms)
+AdjuBlackProc ()
 {
     UserAdjudicationEvent(-1);
 }
 
 void
-AdjuDrawProc (Widget w, XEvent *event, String *prms, Cardinal *nprms)
+AdjuDrawProc ()
 {
     UserAdjudicationEvent(0);
 }
@@ -6135,38 +5611,6 @@ DownKeyProc (Widget w, XEvent *event, String *prms, Cardinal *nprms)
 }
 
 void
-StopObservingProc (Widget w, XEvent *event, String *prms, Cardinal *nprms)
-{
-    StopObservingEvent();
-}
-
-void
-StopExaminingProc (Widget w, XEvent *event, String *prms, Cardinal *nprms)
-{
-    StopExaminingEvent();
-}
-
-void
-UploadProc (Widget w, XEvent *event, String *prms, Cardinal *nprms)
-{
-    UploadGameEvent();
-}
-
-
-void
-ForwardProc (Widget w, XEvent *event, String *prms, Cardinal *nprms)
-{
-    ForwardEvent();
-}
-
-
-void
-BackwardProc (Widget w, XEvent *event, String *prms, Cardinal *nprms)
-{
-    BackwardEvent();
-}
-
-void
 TempBackwardProc (Widget w, XEvent *event, String *prms, Cardinal *nprms)
 {
        if (!TempBackwardActive) {
@@ -6192,56 +5636,26 @@ TempForwardProc (Widget w, XEvent *event, String *prms, Cardinal *nprms)
 }
 
 void
-ToStartProc (Widget w, XEvent *event, String *prms, Cardinal *nprms)
-{
-    ToStartEvent();
-}
-
-void
-ToEndProc (Widget w, XEvent *event, String *prms, Cardinal *nprms)
-{
-    ToEndEvent();
-}
-
-void
-RevertProc (Widget w, XEvent *event, String *prms, Cardinal *nprms)
+RevertProc ()
 {
     RevertEvent(False);
 }
 
 void
-AnnotateProc (Widget w, XEvent *event, String *prms, Cardinal *nprms)
+AnnotateProc ()
 {
     RevertEvent(True);
 }
 
 void
-TruncateGameProc (Widget w, XEvent *event, String *prms, Cardinal *nprms)
-{
-    TruncateGameEvent();
-}
-
-void
-RetractMoveProc (Widget w, XEvent *event, String *prms, Cardinal *nprms)
-{
-    RetractMoveEvent();
-}
-
-void
-MoveNowProc (Widget w, XEvent *event, String *prms, Cardinal *nprms)
-{
-    MoveNowEvent();
-}
-
-void
-FlipViewProc (Widget w, XEvent *event, String *prms, Cardinal *nprms)
+FlipViewProc ()
 {
     flipView = !flipView;
     DrawPosition(True, NULL);
 }
 
 void
-PonderNextMoveProc (Widget w, XEvent *event, String *prms, Cardinal *nprms)
+PonderNextMoveProc ()
 {
     Arg args[16];
 
@@ -6252,14 +5666,14 @@ PonderNextMoveProc (Widget w, XEvent *event, String *prms, Cardinal *nprms)
     } else {
        XtSetArg(args[0], XtNleftBitmap, None);
     }
-    XtSetValues(XtNameToWidget(menuBarWidget, "menuOptions.Ponder Next Move"),
+    XtSetValues(XtNameToWidget(menuBarWidget, "Ponder Next Move"),
                args, 1);
 #endif
 }
 
 #ifndef OPTIONSDIALOG
 void
-AlwaysQueenProc (Widget w, XEvent *event, String *prms, Cardinal *nprms)
+AlwaysQueenProc ()
 {
     Arg args[16];
 
@@ -6270,12 +5684,12 @@ AlwaysQueenProc (Widget w, XEvent *event, String *prms, Cardinal *nprms)
     } else {
        XtSetArg(args[0], XtNleftBitmap, None);
     }
-    XtSetValues(XtNameToWidget(menuBarWidget, "menuOptions.Always Queen"),
+    XtSetValues(XtNameToWidget(menuBarWidget, "Always Queen"),
                args, 1);
 }
 
 void
-AnimateDraggingProc (Widget w, XEvent *event, String *prms, Cardinal *nprms)
+AnimateDraggingProc ()
 {
     Arg args[16];
 
@@ -6287,12 +5701,12 @@ AnimateDraggingProc (Widget w, XEvent *event, String *prms, Cardinal *nprms)
     } else {
        XtSetArg(args[0], XtNleftBitmap, None);
     }
-    XtSetValues(XtNameToWidget(menuBarWidget, "menuOptions.Animate Dragging"),
+    XtSetValues(XtNameToWidget(menuBarWidget, "Animate Dragging"),
                args, 1);
 }
 
 void
-AnimateMovingProc (Widget w, XEvent *event, String *prms, Cardinal *nprms)
+AnimateMovingProc ()
 {
     Arg args[16];
 
@@ -6304,12 +5718,12 @@ AnimateMovingProc (Widget w, XEvent *event, String *prms, Cardinal *nprms)
     } else {
        XtSetArg(args[0], XtNleftBitmap, None);
     }
-    XtSetValues(XtNameToWidget(menuBarWidget, "menuOptions.Animate Moving"),
+    XtSetValues(XtNameToWidget(menuBarWidget, "Animate Moving"),
                args, 1);
 }
 
 void
-AutoflagProc (Widget w, XEvent *event, String *prms, Cardinal *nprms)
+AutoflagProc ()
 {
     Arg args[16];
 
@@ -6320,12 +5734,12 @@ AutoflagProc (Widget w, XEvent *event, String *prms, Cardinal *nprms)
     } else {
        XtSetArg(args[0], XtNleftBitmap, None);
     }
-    XtSetValues(XtNameToWidget(menuBarWidget, "menuOptions.Auto Flag"),
+    XtSetValues(XtNameToWidget(menuBarWidget, "Auto Flag"),
                args, 1);
 }
 
 void
-AutoflipProc (Widget w, XEvent *event, String *prms, Cardinal *nprms)
+AutoflipProc ()
 {
     Arg args[16];
 
@@ -6336,12 +5750,12 @@ AutoflipProc (Widget w, XEvent *event, String *prms, Cardinal *nprms)
     } else {
        XtSetArg(args[0], XtNleftBitmap, None);
     }
-    XtSetValues(XtNameToWidget(menuBarWidget, "menuOptions.Auto Flip View"),
+    XtSetValues(XtNameToWidget(menuBarWidget, "Auto Flip View"),
                args, 1);
 }
 
 void
-BlindfoldProc (Widget w, XEvent *event, String *prms, Cardinal *nprms)
+BlindfoldProc ()
 {
     Arg args[16];
 
@@ -6352,14 +5766,14 @@ BlindfoldProc (Widget w, XEvent *event, String *prms, Cardinal *nprms)
     } else {
        XtSetArg(args[0], XtNleftBitmap, None);
     }
-    XtSetValues(XtNameToWidget(menuBarWidget, "menuOptions.Blindfold"),
+    XtSetValues(XtNameToWidget(menuBarWidget, "Blindfold"),
                args, 1);
 
     DrawPosition(True, NULL);
 }
 
 void
-TestLegalityProc (Widget w, XEvent *event, String *prms, Cardinal *nprms)
+TestLegalityProc ()
 {
     Arg args[16];
 
@@ -6370,13 +5784,13 @@ TestLegalityProc (Widget w, XEvent *event, String *prms, Cardinal *nprms)
     } else {
        XtSetArg(args[0], XtNleftBitmap, None);
     }
-    XtSetValues(XtNameToWidget(menuBarWidget, "menuOptions.Test Legality"),
+    XtSetValues(XtNameToWidget(menuBarWidget, "Test Legality"),
                args, 1);
 }
 
 
 void
-FlashMovesProc (Widget w, XEvent *event, String *prms, Cardinal *nprms)
+FlashMovesProc ()
 {
     Arg args[16];
 
@@ -6391,13 +5805,13 @@ FlashMovesProc (Widget w, XEvent *event, String *prms, Cardinal *nprms)
     } else {
        XtSetArg(args[0], XtNleftBitmap, None);
     }
-    XtSetValues(XtNameToWidget(menuBarWidget, "menuOptions.Flash Moves"),
+    XtSetValues(XtNameToWidget(menuBarWidget, "Flash Moves"),
                args, 1);
 }
 
 #if HIGHDRAG
 void
-HighlightDraggingProc (Widget w, XEvent *event, String *prms, Cardinal *nprms)
+HighlightDraggingProc ()
 {
     Arg args[16];
 
@@ -6409,12 +5823,12 @@ HighlightDraggingProc (Widget w, XEvent *event, String *prms, Cardinal *nprms)
        XtSetArg(args[0], XtNleftBitmap, None);
     }
     XtSetValues(XtNameToWidget(menuBarWidget,
-                              "menuOptions.Highlight Dragging"), args, 1);
+                              "Highlight Dragging"), args, 1);
 }
 #endif
 
 void
-HighlightLastMoveProc (Widget w, XEvent *event, String *prms, Cardinal *nprms)
+HighlightLastMoveProc ()
 {
     Arg args[16];
 
@@ -6426,11 +5840,11 @@ HighlightLastMoveProc (Widget w, XEvent *event, String *prms, Cardinal *nprms)
        XtSetArg(args[0], XtNleftBitmap, None);
     }
     XtSetValues(XtNameToWidget(menuBarWidget,
-                              "menuOptions.Highlight Last Move"), args, 1);
+                              "Highlight Last Move"), args, 1);
 }
 
 void
-HighlightArrowProc (Widget w, XEvent *event, String *prms, Cardinal *nprms)
+HighlightArrowProc ()
 {
     Arg args[16];
 
@@ -6442,12 +5856,12 @@ HighlightArrowProc (Widget w, XEvent *event, String *prms, Cardinal *nprms)
        XtSetArg(args[0], XtNleftBitmap, None);
     }
     XtSetValues(XtNameToWidget(menuBarWidget,
-                              "menuOptions.Arrow"), args, 1);
+                              "Arrow"), args, 1);
 }
 
 #if 0
 void
-IcsAlarmProc (Widget w, XEvent *event, String *prms, Cardinal *nprms)
+IcsAlarmProc ()
 {
     Arg args[16];
 
@@ -6459,12 +5873,12 @@ IcsAlarmProc (Widget w, XEvent *event, String *prms, Cardinal *nprms)
        XtSetArg(args[0], XtNleftBitmap, None);
     }
     XtSetValues(XtNameToWidget(menuBarWidget,
-                              "menuOptions.ICS Alarm"), args, 1);
+                              "ICS Alarm"), args, 1);
 }
 #endif
 
 void
-MoveSoundProc (Widget w, XEvent *event, String *prms, Cardinal *nprms)
+MoveSoundProc ()
 {
     Arg args[16];
 
@@ -6475,12 +5889,12 @@ MoveSoundProc (Widget w, XEvent *event, String *prms, Cardinal *nprms)
     } else {
        XtSetArg(args[0], XtNleftBitmap, None);
     }
-    XtSetValues(XtNameToWidget(menuBarWidget, "menuOptions.Move Sound"),
+    XtSetValues(XtNameToWidget(menuBarWidget, "Move Sound"),
                args, 1);
 }
 
 void
-OneClickProc (Widget w, XEvent *event, String *prms, Cardinal *nprms)
+OneClickProc ()
 {
     Arg args[16];
 
@@ -6491,12 +5905,12 @@ OneClickProc (Widget w, XEvent *event, String *prms, Cardinal *nprms)
     } else {
        XtSetArg(args[0], XtNleftBitmap, None);
     }
-    XtSetValues(XtNameToWidget(menuBarWidget, "menuOptions.OneClick"),
+    XtSetValues(XtNameToWidget(menuBarWidget, "OneClick"),
                args, 1);
 }
 
 void
-PeriodicUpdatesProc (Widget w, XEvent *event, String *prms, Cardinal *nprms)
+PeriodicUpdatesProc ()
 {
     Arg args[16];
 
@@ -6507,12 +5921,12 @@ PeriodicUpdatesProc (Widget w, XEvent *event, String *prms, Cardinal *nprms)
     } else {
        XtSetArg(args[0], XtNleftBitmap, None);
     }
-    XtSetValues(XtNameToWidget(menuBarWidget, "menuOptions.Periodic Updates"),
+    XtSetValues(XtNameToWidget(menuBarWidget, "Periodic Updates"),
                args, 1);
 }
 
 void
-PopupExitMessageProc (Widget w, XEvent *event, String *prms, Cardinal *nprms)
+PopupExitMessageProc ()
 {
     Arg args[16];
 
@@ -6524,11 +5938,11 @@ PopupExitMessageProc (Widget w, XEvent *event, String *prms, Cardinal *nprms)
        XtSetArg(args[0], XtNleftBitmap, None);
     }
     XtSetValues(XtNameToWidget(menuBarWidget,
-                              "menuOptions.Popup Exit Message"), args, 1);
+                              "Popup Exit Message"), args, 1);
 }
 
 void
-PopupMoveErrorsProc (Widget w, XEvent *event, String *prms, Cardinal *nprms)
+PopupMoveErrorsProc ()
 {
     Arg args[16];
 
@@ -6539,13 +5953,13 @@ PopupMoveErrorsProc (Widget w, XEvent *event, String *prms, Cardinal *nprms)
     } else {
        XtSetArg(args[0], XtNleftBitmap, None);
     }
-    XtSetValues(XtNameToWidget(menuBarWidget, "menuOptions.Popup Move Errors"),
+    XtSetValues(XtNameToWidget(menuBarWidget, "Popup Move Errors"),
                args, 1);
 }
 
 #if 0
 void
-PremoveProc (Widget w, XEvent *event, String *prms, Cardinal *nprms)
+PremoveProc ()
 {
     Arg args[16];
 
@@ -6557,12 +5971,12 @@ PremoveProc (Widget w, XEvent *event, String *prms, Cardinal *nprms)
        XtSetArg(args[0], XtNleftBitmap, None);
     }
     XtSetValues(XtNameToWidget(menuBarWidget,
-                              "menuOptions.Premove"), args, 1);
+                              "Premove"), args, 1);
 }
 #endif
 
 void
-ShowCoordsProc (Widget w, XEvent *event, String *prms, Cardinal *nprms)
+ShowCoordsProc ()
 {
     Arg args[16];
 
@@ -6573,61 +5987,49 @@ ShowCoordsProc (Widget w, XEvent *event, String *prms, Cardinal *nprms)
     } else {
        XtSetArg(args[0], XtNleftBitmap, None);
     }
-    XtSetValues(XtNameToWidget(menuBarWidget, "menuOptions.Show Coords"),
+    XtSetValues(XtNameToWidget(menuBarWidget, "Show Coords"),
                args, 1);
 
     DrawPosition(True, NULL);
 }
 
 void
-ShowThinkingProc (Widget w, XEvent *event, String *prms, Cardinal *nprms)
+ShowThinkingProc ()
 {
     appData.showThinking = !appData.showThinking; // [HGM] thinking: tken out of ShowThinkingEvent
     ShowThinkingEvent();
 }
 
 void
-HideThinkingProc (Widget w, XEvent *event, String *prms, Cardinal *nprms)
+HideThinkingProc ()
 {
     Arg args[16];
 
     appData.hideThinkingFromHuman = !appData.hideThinkingFromHuman; // [HGM] thinking: tken out of ShowThinkingEvent
     ShowThinkingEvent();
 
-    if (appData.hideThinkingFromHuman) {
-       XtSetArg(args[0], XtNleftBitmap, xMarkPixmap);
-    } else {
-       XtSetArg(args[0], XtNleftBitmap, None);
-    }
-    XtSetValues(XtNameToWidget(menuBarWidget, "menuOptions.Hide Thinking"),
-               args, 1);
+    MarkMenuItem("Hide Thinking", appData.hideThinkingFromHuman);
 }
 #endif
 
 void
-SaveOnExitProc (Widget w, XEvent *event, String *prms, Cardinal *nprms)
+SaveOnExitProc ()
 {
     Arg args[16];
 
     saveSettingsOnExit = !saveSettingsOnExit;
 
-    if (saveSettingsOnExit) {
-       XtSetArg(args[0], XtNleftBitmap, xMarkPixmap);
-    } else {
-       XtSetArg(args[0], XtNleftBitmap, None);
-    }
-    XtSetValues(XtNameToWidget(menuBarWidget, "menuOptions.Save Settings on Exit"),
-               args, 1);
+    MarkMenuItem("Save Settings on Exit", saveSettingsOnExit);
 }
 
 void
-SaveSettingsProc (Widget w, XEvent *event, String *prms, Cardinal *nprms)
+SaveSettingsProc ()
 {
      SaveSettings(settingsFileName);
 }
 
 void
-InfoProc (Widget w, XEvent *event, String *prms, Cardinal *nprms)
+InfoProc ()
 {
     char buf[MSG_SIZ];
     snprintf(buf, sizeof(buf), "xterm -e info --directory %s --directory . -f %s &",
@@ -6636,8 +6038,8 @@ InfoProc (Widget w, XEvent *event, String *prms, Cardinal *nprms)
 }
 
 void
-ManProc (Widget w, XEvent *event, String *prms, Cardinal *nprms)
-{
+ManInner (Widget w, XEvent *event, String *prms, Cardinal *nprms)
+{   // called as key binding
     char buf[MSG_SIZ];
     String name;
     if (nprms && *nprms > 0)
@@ -6649,21 +6051,47 @@ ManProc (Widget w, XEvent *event, String *prms, Cardinal *nprms)
 }
 
 void
-HintProc (Widget w, XEvent *event, String *prms, Cardinal *nprms)
+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
+GuideProc ()
+{
+    char buf[MSG_SIZ];
+    snprintf(buf, MSG_SIZ, "%s http://www.gnu.org/software/xboard/user_guide/UserGuide.html", appData.sysOpen);
+    system(buf);
 }
 
 void
-BookProc (Widget w, XEvent *event, String *prms, Cardinal *nprms)
+HomePageProc ()
 {
-    BookEvent();
+    char buf[MSG_SIZ];
+    snprintf(buf, MSG_SIZ, "%s http://www.gnu.org/software/xboard/", appData.sysOpen);
+    system(buf);
 }
 
 void
-AboutProc (Widget w, XEvent *event, String *prms, Cardinal *nprms)
+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)");
 #else
@@ -6685,19 +6113,13 @@ _("%s%s\n\n"
 }
 
 void
-DebugProc (Widget w, XEvent *event, String *prms, Cardinal *nprms)
+DebugProc ()
 {
     appData.debugMode = !appData.debugMode;
 }
 
 void
-AboutGameProc (Widget w, XEvent *event, String *prms, Cardinal *nprms)
-{
-    AboutGameEvent();
-}
-
-void
-NothingProc (Widget w, XEvent *event, String *prms, Cardinal *nprms)
+NothingProc ()
 {
     return;
 }