Merge commit 'v4.4.1.20091022' into gtk
[xboard.git] / xboard.c
index 9ad61d2..d479ba3 100644 (file)
--- a/xboard.c
+++ b/xboard.c
@@ -245,13 +245,13 @@ typedef struct {
 int main P((int argc, char **argv));
 RETSIGTYPE CmailSigHandler P((int sig));
 RETSIGTYPE IntSigHandler P((int sig));
+RETSIGTYPE TermSizeSigHandler P((int sig));
 void CreateGCs P((void));
 void CreateXIMPieces P((void));
 void CreateXPMPieces P((void));
 void CreatePieces P((void));
 void CreatePieceMenus P((void));
 Widget CreateMenuBar P((Menu *mb));
-Widget CreateButtonBar P ((MenuItem *mi));
 char *FindFont P((char *pattern, int targetPxlSize));
 void PieceMenuPopup P((Widget w, XEvent *event,
                       String *params, Cardinal *num_params));
@@ -263,29 +263,17 @@ void HandleUserMove P((Widget w, XEvent *event,
                     String *prms, Cardinal *nprms));
 void AnimateUserMove P((Widget w, XEvent * event,
                     String * params, Cardinal * nParams));
-void WhiteClock P((Widget w, XEvent *event,
-                  String *prms, Cardinal *nprms));
-void BlackClock P((Widget w, XEvent *event,
-                  String *prms, Cardinal *nprms));
 void CommentPopUp P((char *title, char *label));
 void CommentPopDown P((void));
 void CommentCallback P((Widget w, XtPointer client_data,
                        XtPointer call_data));
 void ICSInputBoxPopUp P((void));
 void ICSInputBoxPopDown P((void));
-void FileNamePopUp P((char *label, char *def,
-                     FileProc proc, char *openMode));
-void FileNamePopDown P((void));
-void FileNameCallback P((Widget w, XtPointer client_data,
-                        XtPointer call_data));
-void FileNameAction P((Widget w, XEvent *event,
-                      String *prms, Cardinal *nprms));
 void AskQuestionReplyAction P((Widget w, XEvent *event,
                          String *prms, Cardinal *nprms));
 void AskQuestionProc P((Widget w, XEvent *event,
                          String *prms, Cardinal *nprms));
 void AskQuestionPopDown P((void));
-void PromotionPopUp P((void));
 void PromotionPopDown P((void));
 void PromotionCallback P((Widget w, XtPointer client_data,
                          XtPointer call_data));
@@ -293,30 +281,17 @@ void EditCommentPopDown P((void));
 void EditCommentCallback P((Widget w, XtPointer client_data,
                            XtPointer call_data));
 void SelectCommand P((Widget w, XtPointer client_data, XtPointer call_data));
-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 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 AnalyzeModeProc P((Widget w, XEvent *event,
                         String *prms, Cardinal *nprms));
-void AnalyzeFileProc 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));
@@ -326,33 +301,6 @@ void EditCommentProc P((Widget w, XEvent *event,
 void IcsInputBoxProc P((Widget w, XEvent *event,
                        String *prms, Cardinal *nprms));
 void EnterKeyProc 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 AutocommProc 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 AutobsProc P((Widget w, XEvent *event, String *prms,
-                       Cardinal *nprms));
-void AutoraiseProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms));
-void AutosaveProc 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 HighlightDraggingProc P((Widget w, XEvent *event, String *prms,
-                             Cardinal *nprms));
-void HighlightLastMoveProc 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 OldSaveStyleProc 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,
@@ -361,8 +309,6 @@ void PopupExitMessageProc P((Widget w, XEvent *event, String *prms,
                             Cardinal *nprms));
 void PremoveProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms));
 void QuietPlayProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms));
-void TestLegalityProc P((Widget w, XEvent *event, String *prms,
-                         Cardinal *nprms));
 void AboutGameProc 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));
@@ -375,9 +321,7 @@ void ErrorPopUp P((char *title, char *text, int modal));
 void ErrorPopDown P((void));
 static char *ExpandPathName P((char *path));
 static void CreateAnimVars P((void));
-void DragPieceBegin P((int x, int y));
 static void DragPieceMove P((int x, int y));
-void DragPieceEnd P((int x, int y));
 static void DrawDragPiece P((void));
 char *ModeToWidgetName P((GameMode mode));
 void EngineOutputUpdate( FrontEndProgramStats * stats );
@@ -395,7 +339,8 @@ void TimeControlPopDown P(());
 void NewVariantPopDown P(());
 void SettingsPopDown P(());
 void SetMenuEnables P((Enables *enab));
-
+void update_ics_width P(());
+int get_term_width P(());
 /*
 * XBoard depends on Xt R4 or higher
 */
@@ -420,7 +365,7 @@ Pixmap iconPixmap, wIconPixmap, bIconPixmap, xMarkPixmap;
 Widget shellWidget, layoutWidget, formWidget, boardWidget, messageWidget,
   whiteTimerWidget, blackTimerWidget, titleWidget, widgetList[16],
   commentShell, promotionShell, whitePieceMenu, blackPieceMenu, dropMenu,
-  menuBarWidget, buttonBarWidget, editShell, errorShell, analysisShell,
+  menuBarWidget,  editShell, errorShell, analysisShell,
   ICSInputShell, fileNameShell, askQuestionShell;
 Font clockFontID, coordFontID, countFontID;
 XFontStruct *clockFontStruct, *coordFontStruct, *countFontStruct;
@@ -650,24 +595,24 @@ Enables userThinkingEnables[] = {
 MenuItem fileMenu[] = {
     {N_("New Shuffle Game ..."), ShuffleMenuProc},
     {N_("New Variant ..."), NewVariantProc},      // [HGM] variant: not functional yet
-    {"----", NothingProc},
-    {N_("Save Game"), SaveGameProc},
-    {"----", NothingProc},
+    //    {"----", NothingProc},
+    //    {N_("Save Game"), SaveGameProc},
+    //    {"----", NothingProc},
     {N_("Copy Game"), CopyGameProc},
     {N_("Paste Game"), PasteGameProc},
-    {"----", NothingProc},
-    {N_("Load Position"), LoadPositionProc},
-    {N_("Load Next Position"), LoadNextPositionProc},
-    {N_("Load Previous Position"), LoadPrevPositionProc},
-    {N_("Reload Same Position"), ReloadPositionProc},
-    {N_("Save Position"), SavePositionProc},
-    {"----", NothingProc},
+    //    {"----", NothingProc},
+    //    {N_("Load Position"), LoadPositionProc},
+    //    {N_("Load Next Position"), LoadNextPositionProc},
+    //    {N_("Load Previous Position"), LoadPrevPositionProc},
+    //    {N_("Reload Same Position"), ReloadPositionProc},
+    //    {N_("Save Position"), SavePositionProc},
+    //    {"----", NothingProc},
     {N_("Copy Position"), CopyPositionProc},
     {N_("Paste Position"), PastePositionProc},
-    {"----", NothingProc},
+    //    {"----", NothingProc},
     {N_("Mail Move"), MailMoveProc},
     {N_("Reload CMail Message"), ReloadCmailMsgProc},
-    {"----", NothingProc},
+    //    {"----", NothingProc},
     {NULL, NULL}
 };
 
@@ -676,7 +621,7 @@ MenuItem modeMenu[] = {
   //    {N_("Machine Black"), MachineBlackProc},
   //    {N_("Two Machines"), TwoMachinesProc},
     {N_("Analysis Mode"), AnalyzeModeProc},
-    {N_("Analyze File"), AnalyzeFileProc },
+    //    {N_("Analyze File"), AnalyzeFileProc },
     //    {N_("ICS Client"), IcsClientProc},
     {N_("Edit Game"), EditGameProc},
     {N_("Edit Position"), EditPositionProc},
@@ -687,7 +632,7 @@ MenuItem modeMenu[] = {
     {N_("Show Game List"), ShowGameListProc},
     //    {"Show Move History", HistoryShowProc}, // [HGM] hist: activate 4.2.7 code
     {"----", NothingProc},
-    {N_("Edit Tags"), EditTagsProc},
+    //    {N_("Edit Tags"), EditTagsProc},
     {N_("Edit Comment"), EditCommentProc},
     {N_("ICS Input Box"), IcsInputBoxProc},
     {NULL, NULL}
@@ -702,33 +647,33 @@ MenuItem optionsMenu[] = {
     {N_("Engine #2 Settings ..."), SecondSettingsProc},
     {N_("Time Control ..."), TimeControlProc},
     {"----", NothingProc},
-    {N_("Always Queen"), AlwaysQueenProc},
-    {N_("Animate Dragging"), AnimateDraggingProc},
-    {N_("Animate Moving"), AnimateMovingProc},
-    {N_("Auto Comment"), AutocommProc},
-    {N_("Auto Flag"), AutoflagProc},
-    {N_("Auto Flip View"), AutoflipProc},
-    {N_("Auto Observe"), AutobsProc},
-    {N_("Auto Raise Board"), AutoraiseProc},
-    {N_("Auto Save"), AutosaveProc},
-    {N_("Blindfold"), BlindfoldProc},
-    {N_("Flash Moves"), FlashMovesProc},
+    //    {N_("Always Queen"), AlwaysQueenProc},
+    //    {N_("Animate Dragging"), AnimateDraggingProc},
+    //    {N_("Animate Moving"), AnimateMovingProc},
+    //    {N_("Auto Comment"), AutocommProc},
+    //    {N_("Auto Flag"), AutoflagProc},
+    //    {N_("Auto Flip View"), AutoflipProc},
+    //    {N_("Auto Observe"), AutobsProc},
+    //    {N_("Auto Raise Board"), AutoraiseProc},
+    //    {N_("Auto Save"), AutosaveProc},
+    //    {N_("Blindfold"), BlindfoldProc},
+    //    {N_("Flash Moves"), FlashMovesProc},
  //    {N_("Get Move List"), GetMoveListProc},
-#if HIGHDRAG
-    {N_("Highlight Dragging"), HighlightDraggingProc},
-#endif
-    {N_("Highlight Last Move"), HighlightLastMoveProc},
-    {N_("Move Sound"), MoveSoundProc},
-    {N_("ICS Alarm"), IcsAlarmProc},
-    {N_("Old Save Style"), OldSaveStyleProc},
-    {N_("Periodic Updates"), PeriodicUpdatesProc},
+    //#if HIGHDRAG
+    //    {N_("Highlight Dragging"), HighlightDraggingProc},
+    //#endif
+    //    {N_("Highlight Last Move"), HighlightLastMoveProc},
+    //    {N_("Move Sound"), MoveSoundProc},
+    //    {N_("ICS Alarm"), IcsAlarmProc},
+    //    {N_("Old Save Style"), OldSaveStyleProc},
+    //    {N_("Periodic Updates"), PeriodicUpdatesProc},
     {N_("Ponder Next Move"), PonderNextMoveProc},
     {N_("Popup Exit Message"), PopupExitMessageProc},
     {N_("Popup Move Errors"), PopupMoveErrorsProc},
     {N_("Premove"), PremoveProc},
     {N_("Quiet Play"), QuietPlayProc},
     //    {N_("Hide Thinking"), HideThinkingProc},
-    {N_("Test Legality"), TestLegalityProc},
+    //    {N_("Test Legality"), TestLegalityProc},
     {NULL, NULL}
 };
 
@@ -739,16 +684,6 @@ Menu menuBar[] = {
     {NULL, NULL}
 };
 
-#define PAUSE_BUTTON N_("P")
-MenuItem buttonBar[] = {
-  //    {"<<", ToStartProc},
-    //    {"<", BackwardProc},
-    //    {PAUSE_BUTTON, PauseProc},
-    //    {">", ForwardProc},
-  //    {">>", ToEndProc},
-    {NULL, NULL}
-};
-
 #define PIECE_MENU_SIZE 18
 String pieceMenuStrings[2][PIECE_MENU_SIZE] = {
     { N_("White"), "----", N_("Pawn"), N_("Knight"), N_("Bishop"), N_("Rook"),
@@ -1429,6 +1364,15 @@ XtResource clientResources[] = {
     { "forceIllegalMoves", "forceIllegalMoves", XtRBoolean,
        sizeof(Boolean), XtOffset(AppDataPtr, forceIllegal),
        XtRImmediate, (XtPointer) False},
+    { "keepLineBreaksICS", "keepLineBreaksICS", XtRBoolean,
+       sizeof(Boolean), XtOffset(AppDataPtr, noJoin),
+       XtRImmediate, (XtPointer) False},
+    { "wrapContinuationSequence", "wrapContinuationSequence", XtRString,
+       sizeof(String), XtOffset(AppDataPtr, wrapContSeq),
+       XtRString, ""},
+    { "useInternalWrap", "useInternalWrap", XtRBoolean,
+       sizeof(Boolean), XtOffset(AppDataPtr, useInternalWrap),
+       XtRImmediate, (XtPointer) True},
 };
 
 XrmOptionDescRec shellOptions[] = {
@@ -1798,36 +1742,38 @@ XrmOptionDescRec shellOptions[] = {
     { "-secondNeedsNoncompliantFEN", "secondNeedsNoncompliantFEN", XrmoptionSepArg, NULL },
     { "-keepAlive", "keepAlive", XrmoptionSepArg, NULL },
     { "-forceIllegalMoves", "forceIllegalMoves", XrmoptionNoArg, "True" },
+    { "-keepLineBreaksICS", "keepLineBreaksICS", XrmoptionSepArg, NULL },
+    { "-wrapContinuationSequence", "wrapContinuationSequence", XrmoptionSepArg, NULL },
+    { "-useInternalWrap", "useInternalWrap", XrmoptionSepArg, NULL },
 };
 
-
 XtActionsRec boardActions[] = {
     { "HandleUserMove", HandleUserMove },
     { "AnimateUserMove", AnimateUserMove },
-    { "FileNameAction", FileNameAction },
+    //    { "FileNameAction", FileNameAction },
     { "AskQuestionProc", AskQuestionProc },
     { "AskQuestionReplyAction", AskQuestionReplyAction },
     { "PieceMenuPopup", PieceMenuPopup },
-    { "WhiteClock", WhiteClock },
-    { "BlackClock", BlackClock },
+    //    { "WhiteClock", WhiteClock },
+    //    { "BlackClock", BlackClock },
     { "Iconify", Iconify },
     { "LoadSelectedProc", LoadSelectedProc },
-    { "LoadPositionProc", LoadPositionProc },
-    { "LoadNextPositionProc", LoadNextPositionProc },
-    { "LoadPrevPositionProc", LoadPrevPositionProc },
-    { "ReloadPositionProc", ReloadPositionProc },
+    //    { "LoadPositionProc", LoadPositionProc },
+    //    { "LoadNextPositionProc", LoadNextPositionProc },
+    //    { "LoadPrevPositionProc", LoadPrevPositionProc },
+    //    { "ReloadPositionProc", ReloadPositionProc },
     { "CopyPositionProc", CopyPositionProc },
     { "PastePositionProc", PastePositionProc },
     { "CopyGameProc", CopyGameProc },
     { "PasteGameProc", PasteGameProc },
-    { "SaveGameProc", SaveGameProc },
-    { "SavePositionProc", SavePositionProc },
+    //    { "SaveGameProc", SaveGameProc },
+    //    { "SavePositionProc", SavePositionProc },
     { "MailMoveProc", MailMoveProc },
     { "ReloadCmailMsgProc", ReloadCmailMsgProc },
     //    { "MachineWhiteProc", MachineWhiteProc },
     //    { "MachineBlackProc", MachineBlackProc },
     { "AnalysisModeProc", AnalyzeModeProc },
-    { "AnalyzeFileProc", AnalyzeFileProc },
+    //    { "AnalyzeFileProc", AnalyzeFileProc },
     //    { "TwoMachinesProc", TwoMachinesProc },
     //    { "IcsClientProc", IcsClientProc },
     { "EditGameProc", EditGameProc },
@@ -1836,9 +1782,9 @@ XtActionsRec boardActions[] = {
     { "EngineOutputProc", EngineOutputProc}, // [HGM] Winboard_x engine-output window
     { "ShowGameListProc", ShowGameListProc },
     //    { "ShowMoveListProc", HistoryShowProc},
-    { "EditTagsProc", EditCommentProc },
+    //    { "EditTagsProc", EditCommentProc },
     { "EditCommentProc", EditCommentProc },
-    { "IcsAlarmProc", IcsAlarmProc },
+    //    { "IcsAlarmProc", IcsAlarmProc },
     { "IcsInputBoxProc", IcsInputBoxProc },
     //    { "AcceptProc", AcceptProc },
     //    { "DeclineProc", DeclineProc },
@@ -1862,26 +1808,26 @@ XtActionsRec boardActions[] = {
     //    { "TruncateGameProc", TruncateGameProc },
     //    { "MoveNowProc", MoveNowProc },
     //    { "RetractMoveProc", RetractMoveProc },
-    { "AlwaysQueenProc", AlwaysQueenProc },
-    { "AnimateDraggingProc", AnimateDraggingProc },
-    { "AnimateMovingProc", AnimateMovingProc },
-    { "AutoflagProc", AutoflagProc },
-    { "AutoflipProc", AutoflipProc },
-    { "AutobsProc", AutobsProc },
-    { "AutoraiseProc", AutoraiseProc },
-    { "AutosaveProc", AutosaveProc },
-    { "BlindfoldProc", BlindfoldProc },
-    { "FlashMovesProc", FlashMovesProc },
+    //    { "AlwaysQueenProc", AlwaysQueenProc },
+    //    { "AnimateDraggingProc", AnimateDraggingProc },
+    //    { "AnimateMovingProc", AnimateMovingProc },
+    //    { "AutoflagProc", AutoflagProc },
+    //    { "AutoflipProc", AutoflipProc },
+    //    { "AutobsProc", AutobsProc },
+    //    { "AutoraiseProc", AutoraiseProc },
+    //    { "AutosaveProc", AutosaveProc },
+    //    { "BlindfoldProc", BlindfoldProc },
+    //    { "FlashMovesProc", FlashMovesProc },
     //    { "FlipViewProc", FlipViewProc },
     //    { "GetMoveListProc", GetMoveListProc },
 #if HIGHDRAG
-    { "HighlightDraggingProc", HighlightDraggingProc },
+    //    { "HighlightDraggingProc", HighlightDraggingProc },
 #endif
-    { "HighlightLastMoveProc", HighlightLastMoveProc },
-    { "IcsAlarmProc", IcsAlarmProc },
-    { "MoveSoundProc", MoveSoundProc },
-    { "OldSaveStyleProc", OldSaveStyleProc },
-    { "PeriodicUpdatesProc", PeriodicUpdatesProc },
+    //    { "HighlightLastMoveProc", HighlightLastMoveProc },
+    //    { "IcsAlarmProc", IcsAlarmProc },
+    //    { "MoveSoundProc", MoveSoundProc },
+    //    { "OldSaveStyleProc", OldSaveStyleProc },
+    //    { "PeriodicUpdatesProc", PeriodicUpdatesProc },
     { "PonderNextMoveProc", PonderNextMoveProc },
     { "PopupExitMessageProc", PopupExitMessageProc },
     { "PopupMoveErrorsProc", PopupMoveErrorsProc },
@@ -1902,8 +1848,7 @@ XtActionsRec boardActions[] = {
     { "TagsPopDown", (XtActionProc) TagsPopDown },
     { "ErrorPopDown", (XtActionProc) ErrorPopDown },
     { "ICSInputBoxPopDown", (XtActionProc) ICSInputBoxPopDown },
-    { "AnalysisPopDown", (XtActionProc) AnalysisPopDown },
-    { "FileNamePopDown", (XtActionProc) FileNamePopDown },
+    //    { "FileNamePopDown", (XtActionProc) FileNamePopDown },
     { "AskQuestionPopDown", (XtActionProc) AskQuestionPopDown },
     { "GameListPopDown", (XtActionProc) GameListPopDown },
     { "PromotionPopDown", (XtActionProc) PromotionPopDown },
@@ -1922,7 +1867,7 @@ char ICSInputTranslations[] =
     "<Key>Return: EnterKeyProc() \n";
 
 String xboardResources[] = {
-    "*fileName*value.translations: #override\\n <Key>Return: FileNameAction()",
+  //    "*fileName*value.translations: #override\\n <Key>Return: FileNameAction()",
     "*question*value.translations: #override\\n <Key>Return: AskQuestionReplyAction()",
     "*errorpopup*translations: #override\\n <Key>Return: ErrorPopDown()",
     NULL
@@ -2023,9 +1968,6 @@ BoardToTop()
   return;
 }
 
-#ifdef IDSIZES
-  // 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)
 {   // [HGM] resize is functional now, but for board format changes only (nr of ranks, files)
@@ -2118,7 +2060,6 @@ void InitDrawingSizes(BoardSize boardSize, int flags)
     CreateAnimVars();
 #endif
 }
-#endif
 
 void EscapeExpand(char *p, char *q)
 {      // [HGM] initstring: routine to shape up string arguments
@@ -2221,9 +2162,18 @@ main(argc, argv)
     GUI_Window = GTK_WIDGET (gtk_builder_get_object (builder, "MainWindow"));
     if(!GUI_Window) printf("Error: gtk_builder didn't work!\n");
 
+    GUI_Aspect = GTK_WIDGET (gtk_builder_get_object (builder, "Aspectframe"));
+    if(!GUI_Aspect) printf("Error: gtk_builder didn't work!\n");
+
     GUI_History = GTK_WIDGET (gtk_builder_get_object (builder, "MoveHistory"));
     if(!GUI_History) printf("Error: gtk_builder didn't work!\n");
 
+    GUI_Menubar  = GTK_WIDGET (gtk_builder_get_object (builder, "MenuBar"));
+    if(!GUI_Menubar) printf("Error: gtk_builder didn't work!\n");
+    GUI_Timer  = GTK_WIDGET (gtk_builder_get_object (builder, "Timer"));
+    if(!GUI_Timer) printf("Error: gtk_builder didn't work!\n");
+    GUI_Buttonbar  = GTK_WIDGET (gtk_builder_get_object (builder, "ButtonBar"));
+    if(!GUI_Buttonbar) printf("Error: gtk_builder didn't work!\n");
     GUI_Board  = GTK_WIDGET (gtk_builder_get_object (builder, "Board"));
     if(!GUI_Board) printf("Error: gtk_builder didn't work!\n");
 
@@ -2236,6 +2186,13 @@ main(argc, argv)
     LIST_MoveHistory = GTK_LIST_STORE (gtk_builder_get_object (builder, "MoveHistoryStore"));
     if(!LIST_MoveHistory) printf("Error: gtk_builder didn't work!\n");
 
+    /* EditTags window */
+    GUI_EditTags = GTK_WIDGET (gtk_builder_get_object (builder, "EditTags"));
+    if(!GUI_EditTags) printf("Error: gtk_builder didn't work!\n");
+    
+    GUI_EditTagsTextArea = GTK_WIDGET (gtk_builder_get_object (builder, "EditTagsTextArea"));
+    if(!GUI_EditTagsTextArea) printf("Error: gtk_builder didn't work!\n");
+
 
     gtk_builder_connect_signals (builder, NULL);
 
@@ -2333,56 +2290,66 @@ main(argc, argv)
     gameInfo.variant = StringToVariant(appData.variant);
     InitPosition(FALSE);
 
-
-#ifdef IDSIZE
-    InitDrawingSizes(-1, 0); // [HGM] initsize: make this into a subroutine
-#else
-    if (isdigit(appData.boardSize[0])) {
-      i = sscanf(appData.boardSize, "%d,%d,%d,%d,%d,%d,%d", &squareSize,
-                &lineGap, &clockFontPxlSize, &coordFontPxlSize,
-                &fontPxlSize, &smallLayout, &tinyLayout);
-      if (i == 0) {
-       fprintf(stderr, _("%s: bad boardSize syntax %s\n"),
-               programName, appData.boardSize);
-       exit(2);
-      }
-      if (i < 7) {
-       /* Find some defaults; use the nearest known size */
-       SizeDefaults *szd, *nearest;
-       int distance = 99999;
-       nearest = szd = sizeDefaults;
-       while (szd->name != NULL) {
-         if (abs(szd->squareSize - squareSize) < distance) {
-           nearest = szd;
-           distance = abs(szd->squareSize - squareSize);
-                          if (distance == 0) break;
-                          }
-             szd++;
-         }
-         if (i < 2) lineGap = nearest->lineGap;
-         if (i < 3) clockFontPxlSize = nearest->clockFontPxlSize;
-         if (i < 4) coordFontPxlSize = nearest->coordFontPxlSize;
-         if (i < 5) fontPxlSize = nearest->fontPxlSize;
-         if (i < 6) smallLayout = nearest->smallLayout;
-         if (i < 7) tinyLayout = nearest->tinyLayout;
-       }
-      } else {
-        SizeDefaults *szd = sizeDefaults;
-        if (*appData.boardSize == NULLCHAR) {
-         while (DisplayWidth(xDisplay, xScreen) < szd->minScreenSize ||
-                DisplayHeight(xDisplay, xScreen) < szd->minScreenSize) {
-           szd++;
-         }
-         if (szd->name == NULL) szd--;
-       } else {
-         while (szd->name != NULL &&
-                StrCaseCmp(szd->name, appData.boardSize) != 0) szd++;
-         if (szd->name == NULL) {
-           fprintf(stderr, _("%s: unrecognized boardSize name %s\n"),
+    /* calc board size */
+    if (isdigit(appData.boardSize[0])) 
+      {
+       i = sscanf(appData.boardSize, "%d,%d,%d,%d,%d,%d,%d", &squareSize,
+                  &lineGap, &clockFontPxlSize, &coordFontPxlSize,
+                  &fontPxlSize, &smallLayout, &tinyLayout);
+       if (i == 0) 
+         {
+           fprintf(stderr, _("%s: bad boardSize syntax %s\n"),
                    programName, appData.boardSize);
            exit(2);
          }
-       }
+       if (i < 7) 
+         {
+           /* Find some defaults; use the nearest known size */
+           SizeDefaults *szd, *nearest;
+           int distance = 99999;
+           nearest = szd = sizeDefaults;
+           while (szd->name != NULL) 
+             {
+               if (abs(szd->squareSize - squareSize) < distance) 
+                 {
+                   nearest = szd;
+                   distance = abs(szd->squareSize - squareSize);
+                   if (distance == 0) break;
+                 }
+               szd++;
+             };
+           if (i < 2) lineGap = nearest->lineGap;
+           if (i < 3) clockFontPxlSize = nearest->clockFontPxlSize;
+           if (i < 4) coordFontPxlSize = nearest->coordFontPxlSize;
+           if (i < 5) fontPxlSize = nearest->fontPxlSize;
+           if (i < 6) smallLayout = nearest->smallLayout;
+           if (i < 7) tinyLayout = nearest->tinyLayout;
+         }
+      } 
+    else 
+      {
+        SizeDefaults *szd = sizeDefaults;
+        if (*appData.boardSize == NULLCHAR) 
+         {
+           while (DisplayWidth(xDisplay, xScreen) < szd->minScreenSize 
+                  || DisplayHeight(xDisplay, xScreen) < szd->minScreenSize) 
+             {
+               szd++;
+             }
+           if (szd->name == NULL) szd--;
+         } 
+       else 
+         {
+           while (szd->name != NULL 
+                  && StrCaseCmp(szd->name, appData.boardSize) != 0) 
+             szd++;
+           if (szd->name == NULL) 
+             {
+               fprintf(stderr, _("%s: unrecognized boardSize name %s\n"),
+                       programName, appData.boardSize);
+               exit(2);
+             }
+         }
        squareSize = szd->squareSize;
        lineGap = szd->lineGap;
        clockFontPxlSize = szd->clockFontPxlSize;
@@ -2390,26 +2357,12 @@ main(argc, argv)
        fontPxlSize = szd->fontPxlSize;
        smallLayout = szd->smallLayout;
        tinyLayout = szd->tinyLayout;
-    }
-
+      }
+    /* end figuring out what size to use */
+    
     boardWidth  = lineGap + BOARD_WIDTH * (squareSize + lineGap);
     boardHeight = lineGap + BOARD_HEIGHT * (squareSize + lineGap);
-    if (appData.showJail == 1) {
-       /* Jail on top and bottom */
-       XtSetArg(boardArgs[1], XtNwidth, boardWidth);
-       XtSetArg(boardArgs[2], XtNheight,
-                boardHeight + 2*(lineGap + squareSize));
-    } else if (appData.showJail == 2) {
-       /* Jail on sides */
-       XtSetArg(boardArgs[1], XtNwidth,
-                boardWidth + 2*(lineGap + squareSize));
-       XtSetArg(boardArgs[2], XtNheight, boardHeight);
-    } else {
-       /* No jail */
-       XtSetArg(boardArgs[1], XtNwidth, boardWidth);
-       XtSetArg(boardArgs[2], XtNheight, boardHeight);
-    }
-
+    
     /*
      * Determine what fonts to use.
      */
@@ -2570,15 +2523,6 @@ main(argc, argv)
       /* TODO hide button bar if requested */
     }
 
-    /*
-     *  gtk set properties of widgets
-     */
-
-    /* set board size */
-    gtk_widget_set_size_request(GTK_WIDGET(GUI_Board),
-                               boardWidth,boardHeight);
-
-    /* end gtk set properties of widgets */
 
     if (appData.titleInWindow)
       {
@@ -2601,9 +2545,6 @@ main(argc, argv)
       {
       }
 
-    // [HGM] it seems the layout code ends here, but perhaps the color stuff is size independent and would
-    //       not need to go into InitDrawingSizes().
-#endif
 
     /* set some checkboxes in the menu according to appData */
 
@@ -2696,7 +2637,6 @@ main(argc, argv)
 
     /* end setting check boxes */
 
-
     /* load square colors */
     SVGLightSquare   = load_pixbuf("svg/LightSquare.svg",squareSize);
     SVGDarkSquare    = load_pixbuf("svg/DarkSquare.svg",squareSize);
@@ -2708,16 +2648,11 @@ main(argc, argv)
     WindowIcon = WhiteIcon;
     gtk_window_set_icon(GTK_WINDOW(GUI_Window),WindowIcon);
 
-    /* do resizing to a fixed aspect ratio */
-
-    {
-      int i,j;
-    }
-    GUI_SetAspectRatio(0.7);
 
     /* realize window */
     gtk_widget_show (GUI_Window);
 
+    /* recalc boardsize */
     CreateGCs();
     CreatePieces();
     CreatePieceMenus();
@@ -2735,6 +2670,9 @@ main(argc, argv)
            if (appData.icsInputBox) ICSInputBoxPopUp();
        }
 
+    #ifdef SIGWINCH
+    signal(SIGWINCH, TermSizeSigHandler);
+    #endif
        signal(SIGINT, IntSigHandler);
        signal(SIGTERM, IntSigHandler);
        if (*appData.cmailGameName != NULLCHAR) {
@@ -2770,6 +2708,11 @@ ShutDownFrontEnd()
     unlink(gamePasteFilename);
 }
 
+RETSIGTYPE TermSizeSigHandler(int sig)
+{
+    update_ics_width();
+}
+
 RETSIGTYPE
 IntSigHandler(sig)
      int sig;
@@ -3033,6 +2976,8 @@ char *FindFont(pattern, targetPxlSize)
 
 void CreateGCs()
 {
+  /* GCs are not needed anymore for GTK  just left them in here for the moment, since there is a lot of X-code still around that's wants them*/
+
     XtGCMask value_mask = GCLineWidth | GCLineStyle | GCForeground
       | GCBackground | GCFunction | GCPlaneMask;
     XGCValues gc_values;
@@ -3113,17 +3058,29 @@ void CreateGCs()
 
 void CreatePieces()
 {
-  /* order of pieces
-  WhitePawn, WhiteKnight, WhiteBishop, WhiteRook, WhiteQueen, WhiteKing,
-  BlackPawn, BlackKnight, BlackBishop, BlackRook, BlackQueen, BlackKing,
-  */
   int i;
 
+  /* free if used 
+  for(i=0;i<MAXPIECES;i++)
+    {
+      if(SVGpieces[i])
+       {       
+         g_free(SVGpieces[i]);
+         SVGpieces[i]=NULL;
+       }
+    }
+  */
+
+  /* reload these */
+  SVGLightSquare   = load_pixbuf("svg/LightSquare.svg",squareSize);
+  SVGDarkSquare    = load_pixbuf("svg/DarkSquare.svg",squareSize);
+  SVGNeutralSquare = load_pixbuf("svg/NeutralSquare.svg",squareSize);
+
+
   /* get some defaults going */
   for(i=WhitePawn; i<DemotePiece+1; i++)
     SVGpieces[i]   = load_pixbuf("svg/NeutralSquare.svg",squareSize);
     
-
   SVGpieces[WhitePawn]   = load_pixbuf("svg/WhitePawn.svg",squareSize);
   SVGpieces[WhiteKnight] = load_pixbuf("svg/WhiteKnight.svg",squareSize);
   SVGpieces[WhiteBishop] = load_pixbuf("svg/WhiteBishop.svg",squareSize);
@@ -3223,39 +3180,6 @@ Widget CreateMenuBar(mb)
     return menuBar;
 }
 
-Widget CreateButtonBar(mi)
-     MenuItem *mi;
-{
-    int j;
-    Widget button, buttonBar;
-    Arg args[16];
-
-    j = 0;
-    XtSetArg(args[j], XtNorientation, XtorientHorizontal); j++;
-    if (tinyLayout) {
-       XtSetArg(args[j], XtNhSpace, 0); j++;
-    }
-    XtSetArg(args[j], XtNborderWidth, 0); j++;
-    XtSetArg(args[j], XtNvSpace, 0);                        j++;
-    buttonBar = XtCreateWidget("buttonBar", boxWidgetClass,
-                              formWidget, args, j);
-
-    while (mi->string != NULL) {
-       j = 0;
-       if (tinyLayout) {
-           XtSetArg(args[j], XtNinternalWidth, 2); j++;
-           XtSetArg(args[j], XtNborderWidth, 0); j++;
-       }
-      XtSetArg(args[j], XtNlabel, XtNewString(_(mi->string))); j++;
-       button = XtCreateManagedWidget(mi->string, commandWidgetClass,
-                                      buttonBar, args, j);
-       XtAddCallback(button, XtNcallback,
-                     (XtCallbackProc) MenuBarSelect,
-                     (caddr_t) mi->proc);
-       mi++;
-    }
-    return buttonBar;
-}
 
 Widget
 CreatePieceMenu(name, color)
@@ -3413,33 +3337,6 @@ static void DropMenuSelect(w, piece, junk)
     DropMenuEvent(piece, pmFromX, pmFromY);
 }
 
-void WhiteClock(w, event, prms, nprms)
-     Widget w;
-     XEvent *event;
-     String *prms;
-     Cardinal *nprms;
-{
-    if (gameMode == EditPosition || gameMode == IcsExamining) {
-       SetWhiteToPlayEvent();
-    } else if (gameMode == IcsPlayingBlack || gameMode == MachinePlaysWhite) {
-       CallFlagEvent();
-    }
-}
-
-void BlackClock(w, event, prms, nprms)
-     Widget w;
-     XEvent *event;
-     String *prms;
-     Cardinal *nprms;
-{
-    if (gameMode == EditPosition || gameMode == IcsExamining) {
-       SetBlackToPlayEvent();
-    } else if (gameMode == IcsPlayingWhite || gameMode == MachinePlaysBlack) {
-       CallFlagEvent();
-    }
-}
-
-
 /*
  * If the user selects on a border boundary, return -1; if off the board,
  *   return -2.  Otherwise map the event coordinate to the square.
@@ -4082,44 +3979,8 @@ void HandleUserMove(w, event, prms, nprms)
      String *prms;
      Cardinal *nprms;
 {
-    int x, y;
-    Boolean saveAnimate;
-    static int second = 0, promotionChoice = 0;
-    ChessMove moveType;
-
     if (w != boardWidget || errorExitStatus != -1) return;
 
-    x = EventToSquare(event->xbutton.x, BOARD_WIDTH);
-    y = EventToSquare(event->xbutton.y, BOARD_HEIGHT);
-    if (!flipView && y >= 0) {
-       y = BOARD_HEIGHT - 1 - y;
-    }
-    if (flipView && x >= 0) {
-       x = BOARD_WIDTH - 1 - x;
-    }
-
-    if(promotionChoice) { // we are waiting for a click to indicate promotion piece
-       if(event->type == ButtonRelease) return; // ignore upclick of click-click destination
-       promotionChoice = FALSE; // only one chance: if click not OK it is interpreted as cancel
-       if(appData.debugMode) fprintf(debugFP, "promotion click, x=%d, y=%d\n", x, y);
-       if(gameInfo.holdingsWidth && 
-               (WhiteOnMove(currentMove) 
-                       ? x == BOARD_WIDTH-1 && y < gameInfo.holdingsSize && y > 0
-                       : x == 0 && y >= BOARD_HEIGHT - gameInfo.holdingsSize && y < BOARD_HEIGHT-1) ) {
-           // click in right holdings, for determining promotion piece
-           ChessSquare p = boards[currentMove][y][x];
-           if(appData.debugMode) fprintf(debugFP, "square contains %d\n", (int)p);
-           if(p != EmptySquare) {
-               FinishMove(NormalMove, fromX, fromY, toX, toY, ToLower(PieceToChar(p)));
-               fromX = fromY = -1;
-               return;
-           }
-       }
-       DrawPosition(FALSE, boards[currentMove]);
-       return;
-    }
-    if (event->type == ButtonPress) ErrorPopDown();
-
     if (promotionUp) {
        if (event->type == ButtonPress) {
 //         XtPopdown(promotionShell);
@@ -4132,138 +3993,9 @@ void HandleUserMove(w, event, prms, nprms)
        }
     }
 
-    /* [HGM] holdings: next 5 lines: ignore all clicks between board and holdings */
-    if(event->type == ButtonPress
-            && ( x == BOARD_LEFT-1 || 
-                x == BOARD_RGHT   || 
-                (x == BOARD_LEFT-2 && y < BOARD_HEIGHT-gameInfo.holdingsSize ) || 
-                (x == BOARD_RGHT+1 && y >= gameInfo.holdingsSize)) )
-       return;
-
-    if (fromX == -1) {
-       if (event->type == ButtonPress) {
-           /* First square, prepare to drag */
-           if (OKToStartUserMove(x, y)) {
-               fromX = x;
-               fromY = y;
-               second = 0;
-               DragPieceBegin(event->xbutton.x, event->xbutton.y);
-               if (appData.highlightDragging) {
-                   SetHighlights(x, y, -1, -1);
-               }
-           }
-       }
-       return;
-    }
-
-    /* fromX != -1 */
-    if (event->type == ButtonRelease &&        x == fromX && y == fromY) {
-    /* Click on single square in stead of drag-drop */
-       DragPieceEnd(event->xbutton.x, event->xbutton.y);
-       if (appData.animateDragging) {
-           /* Undo animation damage if any */
-           DrawPosition(FALSE, NULL);
-       }
-       if (second) {
-           /* Second up/down in same square; just abort move */
-           second = 0;
-           fromX = fromY = -1;
-           ClearHighlights();
-           gotPremove = 0;
-           ClearPremoveHighlights();
-       } else {
-           /* First upclick in same square; start click-click mode */
-           SetHighlights(x, y, -1, -1);
-       }
-       return;
-    }
-
-    moveType = UserMoveTest(fromX, fromY, x, y, NULLCHAR, event->type == ButtonRelease);
-
-    if (moveType == Comment) { // kludge for indicating capture-own on Press
-      /* Clicked again on same color piece -- changed his mind */
-      /* note that re-clicking same square always hits same color piece */
-      second = (x == fromX && y == fromY);
-      if (appData.highlightDragging) {
-       SetHighlights(x, y, -1, -1);
-      } else {
-       ClearHighlights();
-      }
-      if (OKToStartUserMove(x, y)) {
-       fromX = x;
-       fromY = y;
-       DragPieceBegin(event->xbutton.x, event->xbutton.y);
-      }
-      return;
-    }
-
-    if(moveType == AmbiguousMove) { // kludge to indicate edit-position move
-      fromX = fromY = -1; 
-      ClearHighlights();
-      DragPieceEnd(event->xbutton.x, event->xbutton.y);
-      DrawPosition(FALSE, boards[currentMove]);
-      return;
-    }
-
-    /* Complete move; (x,y) is now different from (fromX, fromY) on both Press and Release */
-    toX = x;
-    toY = y;
-    saveAnimate = appData.animate;
-    if (event->type == ButtonPress) {
-       /* Finish clickclick move */
-       if (appData.animate || appData.highlightLastMove) {
-           SetHighlights(fromX, fromY, toX, toY);
-       } else {
-           ClearHighlights();
-       }
-    } else {
-       /* Finish drag move */
-       if (appData.highlightLastMove) {
-           SetHighlights(fromX, fromY, toX, toY);
-       } else {
-           ClearHighlights();
-       }
-       DragPieceEnd(event->xbutton.x, event->xbutton.y);
-       /* Don't animate move and drag both */
-       appData.animate = FALSE;
-    }
-    if (moveType == WhitePromotionKnight || moveType == BlackPromotionKnight ||
-        (moveType == WhitePromotionQueen || moveType == BlackPromotionQueen) &&
-            appData.alwaysPromoteToQueen) { // promotion, but no choice
-      FinishMove(moveType, fromX, fromY, toX, toY, 'q');
-    } else
-    if (moveType == WhitePromotionQueen || moveType == BlackPromotionQueen ) {
-       SetHighlights(fromX, fromY, toX, toY);
-       if(gameInfo.variant == VariantSuper || gameInfo.variant == VariantGreat) {
-           // [HGM] super: promotion to captured piece selected from holdings
-           ChessSquare p = boards[currentMove][fromY][fromX], q = boards[currentMove][toY][toX];
-           promotionChoice = TRUE;
-           // kludge follows to temporarily execute move on display, without promoting yet
-           boards[currentMove][fromY][fromX] = EmptySquare; // move Pawn to 8th rank
-           boards[currentMove][toY][toX] = p;
-           DrawPosition(FALSE, boards[currentMove]);
-           boards[currentMove][fromY][fromX] = p; // take back, but display stays
-           boards[currentMove][toY][toX] = q;
-           DisplayMessage("Click in holdings to choose piece", "");
-           return;
-       }
-       PromotionPopUp();
-       goto skipClearingFrom; // the skipped stuff is done asynchronously by PromotionCallback
-    } else
-    if(moveType != ImpossibleMove) { // valid move, but no promotion
-      FinishMove(moveType, fromX, fromY, toX, toY, NULLCHAR);
-    } else { // invalid move; could have set premove
-      ClearHighlights();
-    }
-           if (!appData.highlightLastMove || gotPremove) ClearHighlights();
-           if (gotPremove) SetPremoveHighlights(fromX, fromY, toX, toY);
-           fromX = fromY = -1;
-skipClearingFrom:
-    appData.animate = saveAnimate;
-    if (appData.animate || appData.animateDragging) {
-       /* Undo animation damage if needed */
-       DrawPosition(FALSE, NULL);
-    }
+    // [HGM] mouse: the rest of the mouse handler is moved to the backend, and called here
+    if(event->type == ButtonPress)   LeftClick(Press,   event->xbutton.x, event->xbutton.y);
+    if(event->type == ButtonRelease) LeftClick(Release, event->xbutton.x, event->xbutton.y);
 }
 
 void AnimateUserMove (Widget w, XEvent * event,
@@ -4705,37 +4437,6 @@ void CommentPopUp(title, text)
     commentUp = True;
 }
 
-void AnalysisPopUp(title, text)
-     char *title, *text;
-{
-    Arg args[16];
-    int j;
-    Widget edit;
-
-    if (analysisShell == NULL) {
-       analysisShell = MiscCreate(title, text, False, NULL, 4);
-       XtRealizeWidget(analysisShell);
-       CatchDeleteWindow(analysisShell, "AnalysisPopDown");
-
-    } else {
-       edit = XtNameToWidget(analysisShell, "*form.text");
-       j = 0;
-       XtSetArg(args[j], XtNstring, text); j++;
-       XtSetValues(edit, args, j);
-       j = 0;
-       XtSetArg(args[j], XtNiconName, (XtArgVal) title);   j++;
-       XtSetArg(args[j], XtNtitle, (XtArgVal) title);      j++;
-       XtSetValues(analysisShell, args, j);
-    }
-
-    if (!analysisUp) {
-       XtPopup(analysisShell, XtGrabNone);
-    }
-    XSync(xDisplay, False);
-
-    analysisUp = True;
-}
-
 void CommentCallback(w, client_data, call_data)
      Widget w;
      XtPointer client_data, call_data;
@@ -4774,148 +4475,6 @@ void CommentPopDown()
     commentUp = False;
 }
 
-void AnalysisPopDown()
-{
-    if (!analysisUp) return;
-    XtPopdown(analysisShell);
-    XSync(xDisplay, False);
-    analysisUp = False;
-    if (appData.icsEngineAnalyze) ExitAnalyzeMode();    /* [DM] icsEngineAnalyze */
-}
-
-
-void FileNamePopUp(label, def, proc, openMode)
-     char *label;
-     char *def;
-     FileProc proc;
-     char *openMode;
-{
-    Arg args[16];
-    Widget popup, layout, dialog, edit;
-    Window root, child;
-    int x, y, i;
-    int win_x, win_y;
-    unsigned int mask;
-
-    fileProc = proc;           /* I can't see a way not */
-    fileOpenMode = openMode;   /*   to use globals here */
-
-    i = 0;
-    XtSetArg(args[i], XtNresizable, True); i++;
-    XtSetArg(args[i], XtNwidth, DIALOG_SIZE); i++;
-    XtSetArg(args[i], XtNtitle, XtNewString(_("File name prompt"))); i++;
-    fileNameShell = popup =
-      XtCreatePopupShell("File name prompt", transientShellWidgetClass,
-                        shellWidget, args, i);
-
-    layout =
-      XtCreateManagedWidget(layoutName, formWidgetClass, popup,
-                           layoutArgs, XtNumber(layoutArgs));
-
-    i = 0;
-    XtSetArg(args[i], XtNlabel, label); i++;
-    XtSetArg(args[i], XtNvalue, def); i++;
-    XtSetArg(args[i], XtNborderWidth, 0); i++;
-    dialog = XtCreateManagedWidget("fileName", dialogWidgetClass,
-                                  layout, args, i);
-
-    XawDialogAddButton(dialog, _("ok"), FileNameCallback, (XtPointer) dialog);
-    XawDialogAddButton(dialog, _("cancel"), FileNameCallback,
-                      (XtPointer) dialog);
-
-    XtRealizeWidget(popup);
-    CatchDeleteWindow(popup, "FileNamePopDown");
-
-    XQueryPointer(xDisplay, xBoardWindow, &root, &child,
-                 &x, &y, &win_x, &win_y, &mask);
-
-    XtSetArg(args[0], XtNx, x - 10);
-    XtSetArg(args[1], XtNy, y - 30);
-    XtSetValues(popup, args, 2);
-
-    XtPopup(popup, XtGrabExclusive);
-    filenameUp = True;
-
-    edit = XtNameToWidget(dialog, "*value");
-    XtSetKeyboardFocus(popup, edit);
-}
-
-void FileNamePopDown()
-{
-    if (!filenameUp) return;
-    XtPopdown(fileNameShell);
-    XtDestroyWidget(fileNameShell);
-    filenameUp = False;
-    ModeHighlight();
-}
-
-void FileNameCallback(w, client_data, call_data)
-     Widget w;
-     XtPointer client_data, call_data;
-{
-    String name;
-    Arg args[16];
-
-    XtSetArg(args[0], XtNlabel, &name);
-    XtGetValues(w, args, 1);
-
-    if (strcmp(name, _("cancel")) == 0) {
-        FileNamePopDown();
-        return;
-    }
-
-    FileNameAction(w, NULL, NULL, NULL);
-}
-
-void FileNameAction(w, event, prms, nprms)
-     Widget w;
-     XEvent *event;
-     String *prms;
-     Cardinal *nprms;
-{
-    char buf[MSG_SIZ];
-    String name;
-    FILE *f;
-    char *p, *fullname;
-    int index;
-
-    name = XawDialogGetValueString(w = XtParent(w));
-
-    if ((name != NULL) && (*name != NULLCHAR)) {
-       strcpy(buf, name);
-       XtPopdown(w = XtParent(XtParent(w)));
-       XtDestroyWidget(w);
-       filenameUp = False;
-
-       p = strrchr(buf, ' ');
-       if (p == NULL) {
-           index = 0;
-       } else {
-           *p++ = NULLCHAR;
-           index = atoi(p);
-       }
-       fullname = ExpandPathName(buf);
-       if (!fullname) {
-           ErrorPopUp(_("Error"), _("Can't open file"), FALSE);
-       }
-       else {
-           f = fopen(fullname, fileOpenMode);
-           if (f == NULL) {
-               DisplayError(_("Failed to open file"), errno);
-           } else {
-               (void) (*fileProc)(f, index, buf);
-           }
-       }
-       ModeHighlight();
-       return;
-    }
-
-    XtPopdown(w = XtParent(XtParent(w)));
-    XtDestroyWidget(w);
-    filenameUp = False;
-    ModeHighlight();
-}
-
 void PromotionPopUp()
 {
     Arg args[16];
@@ -5035,7 +4594,7 @@ void PromotionCallback(w, client_data, call_data)
        promoChar = ToLower(name[0]);
     }
 
-    FinishMove(NormalMove, fromX, fromY, toX, toY, promoChar);
+    UserMoveEvent(fromX, fromY, toX, toY, promoChar);
 
     if (!appData.highlightLastMove || gotPremove) ClearHighlights();
     if (gotPremove) SetPremoveHighlights(fromX, fromY, toX, toY);
@@ -5213,7 +4772,8 @@ int LoadGamePopUp(f, gameNumber, title)
        else if (!ListEmpty(&gameList) 
                 && ((ListGame *) gameList.tailPred)->number > 1) 
          {
-           GameListPopUp(f, title);
+           // TODO convert to GTK
+           //      GameListPopUp(f, title);
            return TRUE;
          };
 
@@ -5224,68 +4784,6 @@ int LoadGamePopUp(f, gameNumber, title)
     return LoadGame(f, gameNumber, title, FALSE);
 }
 
-
-void LoadNextPositionProc(w, event, prms, nprms)
-     Widget w;
-     XEvent *event;
-     String *prms;
-     Cardinal *nprms;
-{
-    ReloadPosition(1);
-}
-
-void LoadPrevPositionProc(w, event, prms, nprms)
-     Widget w;
-     XEvent *event;
-     String *prms;
-     Cardinal *nprms;
-{
-    ReloadPosition(-1);
-}
-
-void ReloadPositionProc(w, event, prms, nprms)
-     Widget w;
-     XEvent *event;
-     String *prms;
-     Cardinal *nprms;
-{
-    ReloadPosition(0);
-}
-
-void LoadPositionProc(w, event, prms, nprms)
-     Widget w;
-     XEvent *event;
-     String *prms;
-     Cardinal *nprms;
-{
-    if (gameMode == AnalyzeMode || gameMode == AnalyzeFile) {
-       Reset(FALSE, TRUE);
-    }
-    FileNamePopUp(_("Load position file name?"), "", LoadPosition, "rb");
-}
-
-void SaveGameProc(w, event, prms, nprms)
-     Widget w;
-     XEvent *event;
-     String *prms;
-     Cardinal *nprms;
-{
-    FileNamePopUp(_("Save game file name?"),
-                 DefaultFileName(appData.oldSaveStyle ? "game" : "pgn"),
-                 SaveGame, "a");
-}
-
-void SavePositionProc(w, event, prms, nprms)
-     Widget w;
-     XEvent *event;
-     String *prms;
-     Cardinal *nprms;
-{
-    FileNamePopUp(_("Save position file name?"),
-                 DefaultFileName(appData.oldSaveStyle ? "pos" : "fen"),
-                 SavePosition, "a");
-}
-
 void ReloadCmailMsgProc(w, event, prms, nprms)
      Widget w;
      XEvent *event;
@@ -5485,7 +4983,8 @@ void PasteGameProc(w, event, prms, nprms)
 
 void AutoSaveGame()
 {
-    SaveGameProc(NULL, NULL, NULL, NULL);
+  SaveGameProc(NULL, NULL);
+  return;
 }
 
 void AnalyzeModeProc(w, event, prms, nprms)
@@ -5531,29 +5030,6 @@ void AnalyzeModeProc(w, event, prms, nprms)
     AnalyzeModeEvent();
 }
 
-void AnalyzeFileProc(w, event, prms, nprms)
-     Widget w;
-     XEvent *event;
-     String *prms;
-     Cardinal *nprms;
-{
-    if (!first.analysisSupport) {
-      char buf[MSG_SIZ];
-      snprintf(buf, sizeof(buf), _("%s does not support analysis"), first.tidy);
-      DisplayError(buf, 0);
-      return;
-    }
-    Reset(FALSE, TRUE);
-
-    if (!appData.showThinking)
-      ShowThinkingProc(NULL,NULL);
-
-    AnalyzeFileEvent();
-    FileNamePopUp(_("File to analyze"), "", LoadGamePopUp, "rb");
-    AnalysisPeriodicEvent(1);
-}
-
-
 void EditGameProc(w, event, prms, nprms)
      Widget w;
      XEvent *event;
@@ -5618,360 +5094,6 @@ void EnterKeyProc(w, event, prms, nprms)
       ICSInputSendText();
 }
 
-void AlwaysQueenProc(w, event, prms, nprms)
-     Widget w;
-     XEvent *event;
-     String *prms;
-     Cardinal *nprms;
-{
-    Arg args[16];
-
-    appData.alwaysPromoteToQueen = !appData.alwaysPromoteToQueen;
-
-    if (appData.alwaysPromoteToQueen) {
-       XtSetArg(args[0], XtNleftBitmap, xMarkPixmap);
-    } else {
-       XtSetArg(args[0], XtNleftBitmap, None);
-    }
-    XtSetValues(XtNameToWidget(menuBarWidget, "menuOptions.Always Queen"),
-               args, 1);
-}
-
-void AnimateDraggingProc(w, event, prms, nprms)
-     Widget w;
-     XEvent *event;
-     String *prms;
-     Cardinal *nprms;
-{
-    Arg args[16];
-
-    appData.animateDragging = !appData.animateDragging;
-
-    if (appData.animateDragging) {
-       XtSetArg(args[0], XtNleftBitmap, xMarkPixmap);
-        CreateAnimVars();
-    } else {
-       XtSetArg(args[0], XtNleftBitmap, None);
-    }
-    XtSetValues(XtNameToWidget(menuBarWidget, "menuOptions.Animate Dragging"),
-               args, 1);
-}
-
-void AnimateMovingProc(w, event, prms, nprms)
-     Widget w;
-     XEvent *event;
-     String *prms;
-     Cardinal *nprms;
-{
-    Arg args[16];
-
-    appData.animate = !appData.animate;
-
-    if (appData.animate) {
-       XtSetArg(args[0], XtNleftBitmap, xMarkPixmap);
-        CreateAnimVars();
-    } else {
-       XtSetArg(args[0], XtNleftBitmap, None);
-    }
-    XtSetValues(XtNameToWidget(menuBarWidget, "menuOptions.Animate Moving"),
-               args, 1);
-}
-
-void AutocommProc(w, event, prms, nprms)
-     Widget w;
-     XEvent *event;
-     String *prms;
-     Cardinal *nprms;
-{
-    Arg args[16];
-
-    appData.autoComment = !appData.autoComment;
-
-    if (appData.autoComment) {
-       XtSetArg(args[0], XtNleftBitmap, xMarkPixmap);
-    } else {
-       XtSetArg(args[0], XtNleftBitmap, None);
-    }
-    XtSetValues(XtNameToWidget(menuBarWidget, "menuOptions.Auto Comment"),
-               args, 1);
-}
-
-
-void AutoflagProc(w, event, prms, nprms)
-     Widget w;
-     XEvent *event;
-     String *prms;
-     Cardinal *nprms;
-{
-    Arg args[16];
-
-    appData.autoCallFlag = !appData.autoCallFlag;
-
-    if (appData.autoCallFlag) {
-       XtSetArg(args[0], XtNleftBitmap, xMarkPixmap);
-    } else {
-       XtSetArg(args[0], XtNleftBitmap, None);
-    }
-    XtSetValues(XtNameToWidget(menuBarWidget, "menuOptions.Auto Flag"),
-               args, 1);
-}
-
-void AutoflipProc(w, event, prms, nprms)
-     Widget w;
-     XEvent *event;
-     String *prms;
-     Cardinal *nprms;
-{
-    Arg args[16];
-
-    appData.autoFlipView = !appData.autoFlipView;
-
-    if (appData.autoFlipView) {
-       XtSetArg(args[0], XtNleftBitmap, xMarkPixmap);
-    } else {
-       XtSetArg(args[0], XtNleftBitmap, None);
-    }
-    XtSetValues(XtNameToWidget(menuBarWidget, "menuOptions.Auto Flip View"),
-               args, 1);
-}
-
-void AutobsProc(w, event, prms, nprms)
-     Widget w;
-     XEvent *event;
-     String *prms;
-     Cardinal *nprms;
-{
-    Arg args[16];
-
-    appData.autoObserve = !appData.autoObserve;
-
-    if (appData.autoObserve) {
-       XtSetArg(args[0], XtNleftBitmap, xMarkPixmap);
-    } else {
-       XtSetArg(args[0], XtNleftBitmap, None);
-    }
-    XtSetValues(XtNameToWidget(menuBarWidget, "menuOptions.Auto Observe"),
-               args, 1);
-}
-
-void AutoraiseProc(w, event, prms, nprms)
-     Widget w;
-     XEvent *event;
-     String *prms;
-     Cardinal *nprms;
-{
-    Arg args[16];
-
-    appData.autoRaiseBoard = !appData.autoRaiseBoard;
-
-    if (appData.autoRaiseBoard) {
-       XtSetArg(args[0], XtNleftBitmap, xMarkPixmap);
-    } else {
-       XtSetArg(args[0], XtNleftBitmap, None);
-    }
-    XtSetValues(XtNameToWidget(menuBarWidget, "menuOptions.Auto Raise Board"),
-               args, 1);
-}
-
-void AutosaveProc(w, event, prms, nprms)
-     Widget w;
-     XEvent *event;
-     String *prms;
-     Cardinal *nprms;
-{
-    Arg args[16];
-
-    appData.autoSaveGames = !appData.autoSaveGames;
-
-    if (appData.autoSaveGames) {
-       XtSetArg(args[0], XtNleftBitmap, xMarkPixmap);
-    } else {
-       XtSetArg(args[0], XtNleftBitmap, None);
-    }
-    XtSetValues(XtNameToWidget(menuBarWidget, "menuOptions.Auto Save"),
-               args, 1);
-}
-
-void BlindfoldProc(w, event, prms, nprms)
-     Widget w;
-     XEvent *event;
-     String *prms;
-     Cardinal *nprms;
-{
-    Arg args[16];
-
-    appData.blindfold = !appData.blindfold;
-
-    if (appData.blindfold) {
-       XtSetArg(args[0], XtNleftBitmap, xMarkPixmap);
-    } else {
-       XtSetArg(args[0], XtNleftBitmap, None);
-    }
-    XtSetValues(XtNameToWidget(menuBarWidget, "menuOptions.Blindfold"),
-               args, 1);
-
-    DrawPosition(True, NULL);
-}
-
-void TestLegalityProc(w, event, prms, nprms)
-     Widget w;
-     XEvent *event;
-     String *prms;
-     Cardinal *nprms;
-{
-    Arg args[16];
-
-    appData.testLegality = !appData.testLegality;
-
-    if (appData.testLegality) {
-       XtSetArg(args[0], XtNleftBitmap, xMarkPixmap);
-    } else {
-       XtSetArg(args[0], XtNleftBitmap, None);
-    }
-    XtSetValues(XtNameToWidget(menuBarWidget, "menuOptions.Test Legality"),
-               args, 1);
-}
-
-
-void FlashMovesProc(w, event, prms, nprms)
-     Widget w;
-     XEvent *event;
-     String *prms;
-     Cardinal *nprms;
-{
-    Arg args[16];
-
-    if (appData.flashCount == 0) {
-       appData.flashCount = 3;
-    } else {
-       appData.flashCount = -appData.flashCount;
-    }
-
-    if (appData.flashCount > 0) {
-       XtSetArg(args[0], XtNleftBitmap, xMarkPixmap);
-    } else {
-       XtSetArg(args[0], XtNleftBitmap, None);
-    }
-    XtSetValues(XtNameToWidget(menuBarWidget, "menuOptions.Flash Moves"),
-               args, 1);
-}
-
-#if HIGHDRAG
-void HighlightDraggingProc(w, event, prms, nprms)
-     Widget w;
-     XEvent *event;
-     String *prms;
-     Cardinal *nprms;
-{
-    Arg args[16];
-
-    appData.highlightDragging = !appData.highlightDragging;
-
-    if (appData.highlightDragging) {
-       XtSetArg(args[0], XtNleftBitmap, xMarkPixmap);
-    } else {
-       XtSetArg(args[0], XtNleftBitmap, None);
-    }
-    XtSetValues(XtNameToWidget(menuBarWidget,
-                              "menuOptions.Highlight Dragging"), args, 1);
-}
-#endif
-
-void HighlightLastMoveProc(w, event, prms, nprms)
-     Widget w;
-     XEvent *event;
-     String *prms;
-     Cardinal *nprms;
-{
-    Arg args[16];
-
-    appData.highlightLastMove = !appData.highlightLastMove;
-
-    if (appData.highlightLastMove) {
-       XtSetArg(args[0], XtNleftBitmap, xMarkPixmap);
-    } else {
-       XtSetArg(args[0], XtNleftBitmap, None);
-    }
-    XtSetValues(XtNameToWidget(menuBarWidget,
-                              "menuOptions.Highlight Last Move"), args, 1);
-}
-
-void IcsAlarmProc(w, event, prms, nprms)
-     Widget w;
-     XEvent *event;
-     String *prms;
-     Cardinal *nprms;
-{
-    Arg args[16];
-
-    appData.icsAlarm = !appData.icsAlarm;
-
-    if (appData.icsAlarm) {
-       XtSetArg(args[0], XtNleftBitmap, xMarkPixmap);
-    } else {
-       XtSetArg(args[0], XtNleftBitmap, None);
-    }
-    XtSetValues(XtNameToWidget(menuBarWidget,
-                              "menuOptions.ICS Alarm"), args, 1);
-}
-
-void MoveSoundProc(w, event, prms, nprms)
-     Widget w;
-     XEvent *event;
-     String *prms;
-     Cardinal *nprms;
-{
-    Arg args[16];
-
-    appData.ringBellAfterMoves = !appData.ringBellAfterMoves;
-
-    if (appData.ringBellAfterMoves) {
-       XtSetArg(args[0], XtNleftBitmap, xMarkPixmap);
-    } else {
-       XtSetArg(args[0], XtNleftBitmap, None);
-    }
-    XtSetValues(XtNameToWidget(menuBarWidget, "menuOptions.Move Sound"),
-               args, 1);
-}
-
-
-void OldSaveStyleProc(w, event, prms, nprms)
-     Widget w;
-     XEvent *event;
-     String *prms;
-     Cardinal *nprms;
-{
-    Arg args[16];
-
-    appData.oldSaveStyle = !appData.oldSaveStyle;
-
-    if (appData.oldSaveStyle) {
-       XtSetArg(args[0], XtNleftBitmap, xMarkPixmap);
-    } else {
-       XtSetArg(args[0], XtNleftBitmap, None);
-    }
-    XtSetValues(XtNameToWidget(menuBarWidget, "menuOptions.Old Save Style"),
-               args, 1);
-}
-
-void PeriodicUpdatesProc(w, event, prms, nprms)
-     Widget w;
-     XEvent *event;
-     String *prms;
-     Cardinal *nprms;
-{
-    Arg args[16];
-
-    PeriodicUpdatesEvent(!appData.periodicUpdates);
-
-    if (appData.periodicUpdates) {
-       XtSetArg(args[0], XtNleftBitmap, xMarkPixmap);
-    } else {
-       XtSetArg(args[0], XtNleftBitmap, None);
-    }
-    XtSetValues(XtNameToWidget(menuBarWidget, "menuOptions.Periodic Updates"),
-               args, 1);
-}
 
 void PonderNextMoveProc(w, event, prms, nprms)
      Widget w;
@@ -7230,11 +6352,33 @@ int OutputToProcess(pr, message, count, outError)
      int count;
      int *outError;
 {
+    static int line = 0;
     ChildProc *cp = (ChildProc *) pr;
     int outCount;
 
     if (pr == NoProc)
-      outCount = fwrite(message, 1, count, stdout);
+    {
+        if (appData.noJoin || !appData.useInternalWrap)
+            outCount = fwrite(message, 1, count, stdout);
+        else
+        {
+            int width = get_term_width();
+            int len = wrap(NULL, message, count, width, &line);
+            char *msg = malloc(len);
+            int dbgchk;
+
+            if (!msg)
+                outCount = fwrite(message, 1, count, stdout);
+            else
+            {
+                dbgchk = wrap(msg, message, count, width, &line);
+                if (dbgchk != len && appData.debugMode)
+                    fprintf(debugFP, "wrap(): dbgchk(%d) != len(%d)\n", dbgchk, len);
+                outCount = fwrite(msg, 1, dbgchk, stdout);
+                free(msg);
+            }
+        }
+    }
     else
       outCount = write(cp->fdTo, message, count);
 
@@ -8018,3 +7162,38 @@ SetProgramStats( FrontEndProgramStats * stats )
   // [HGM] done, but perhaps backend should call this directly?
     EngineOutputUpdate( stats );
 }
+
+#include <sys/ioctl.h>
+int get_term_width()
+{
+    int fd, default_width;
+
+    fd = STDIN_FILENO;
+    default_width = 79; // this is FICS default anyway...
+
+#if !defined(TIOCGWINSZ) && defined(TIOCGSIZE)
+    struct ttysize win;
+    if (!ioctl(fd, TIOCGSIZE, &win))
+        default_width = win.ts_cols;
+#elif defined(TIOCGWINSZ)
+    struct winsize win;
+    if (!ioctl(fd, TIOCGWINSZ, &win))
+        default_width = win.ws_col;
+#endif
+    return default_width;
+}
+
+void update_ics_width()
+{
+    static int old_width = 0;
+    int new_width = get_term_width();
+
+    if (old_width != new_width)
+       ics_printf("set width %d\n", new_width);
+    old_width = new_width;
+}
+
+void NotifyFrontendLogin()
+{
+    update_ics_width();
+}