Merge commit 'v4.3.16'
[xboard.git] / xengineoutput.c
index a7d595d..6fe9931 100644 (file)
  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.\r
  * ------------------------------------------------------------------------\r
  */\r
-#include "config.h"
-
-#include <stdio.h>
-#include <ctype.h>
-#include <errno.h>
-#include <sys/types.h>
-
-#if STDC_HEADERS
-# include <stdlib.h>
-# include <string.h>
-#else /* not STDC_HEADERS */
-extern char *getenv();
-# if HAVE_STRING_H
-#  include <string.h>
-# else /* not HAVE_STRING_H */
-#  include <strings.h>
-# endif /* not HAVE_STRING_H */
-#endif /* not STDC_HEADERS */
-
-#if HAVE_UNISTD_H
-# include <unistd.h>
-#endif
-
-#include <X11/Intrinsic.h>
-#include <X11/StringDefs.h>
-#include <X11/Shell.h>
-#include <X11/Xaw/Dialog.h>
-#include <X11/Xaw/Form.h>
-#include <X11/Xaw/List.h>
-#include <X11/Xaw/Label.h>
-#include <X11/Xaw/SimpleMenu.h>
-#include <X11/Xaw/SmeBSB.h>
-#include <X11/Xaw/SmeLine.h>
-#include <X11/Xaw/Box.h>
-#include <X11/Xaw/Paned.h>
-#include <X11/Xaw/MenuButton.h>
-#include <X11/cursorfont.h>
-#include <X11/Xaw/Text.h>
-#include <X11/Xaw/AsciiText.h>
-#include <X11/Xaw/Viewport.h>
-
-#include "common.h"
-#include "frontend.h"
-#include "backend.h"
-#include "xboard.h"
-// Add xengineo.h later
-
+#include "config.h"\r
+\r
+#include <stdio.h>\r
+#include <ctype.h>\r
+#include <errno.h>\r
+#include <sys/types.h>\r
+\r
+#if STDC_HEADERS\r
+# include <stdlib.h>\r
+# include <string.h>\r
+#else /* not STDC_HEADERS */\r
+extern char *getenv();\r
+# if HAVE_STRING_H\r
+#  include <string.h>\r
+# else /* not HAVE_STRING_H */\r
+#  include <strings.h>\r
+# endif /* not HAVE_STRING_H */\r
+#endif /* not STDC_HEADERS */\r
+\r
+#if HAVE_UNISTD_H\r
+# include <unistd.h>\r
+#endif\r
+\r
+#include <X11/Intrinsic.h>\r
+#include <X11/StringDefs.h>\r
+#include <X11/Shell.h>\r
+#include <X11/Xaw/Dialog.h>\r
+#include <X11/Xaw/Form.h>\r
+#include <X11/Xaw/List.h>\r
+#include <X11/Xaw/Label.h>\r
+#include <X11/Xaw/SimpleMenu.h>\r
+#include <X11/Xaw/SmeBSB.h>\r
+#include <X11/Xaw/SmeLine.h>\r
+#include <X11/Xaw/Box.h>\r
+#include <X11/Xaw/Paned.h>\r
+#include <X11/Xaw/MenuButton.h>\r
+#include <X11/cursorfont.h>\r
+#include <X11/Xaw/Text.h>\r
+#include <X11/Xaw/AsciiText.h>\r
+#include <X11/Xaw/Viewport.h>\r
+\r
+#include "common.h"\r
+#include "frontend.h"\r
+#include "backend.h"\r
+#include "xboard.h"\r
+// Add xengineo.h later\r
+#include "gettext.h"\r
+\r
+#ifdef ENABLE_NLS\r
+# define  _(s) gettext (s)\r
+# define N_(s) gettext_noop (s)\r
+#else\r
+# define  _(s) (s)\r
+# define N_(s)  s\r
+#endif\r
+\r
 #include <X11/xpm.h>\r
-
-// [HGM] pixmaps of some ICONS used in the engine-outut window
-#include "pixmaps/WHITE_14.xpm"
-#include "pixmaps/BLACK_14.xpm"
-#include "pixmaps/CLEAR_14.xpm"
-#include "pixmaps/UNKNOWN_14.xpm"
-#include "pixmaps/THINKING_14.xpm"
-#include "pixmaps/PONDER_14.xpm"
-#include "pixmaps/ANALYZING_14.xpm"
-
+\r
+// [HGM] pixmaps of some ICONS used in the engine-outut window\r
+#include "pixmaps/WHITE_14.xpm"\r
+#include "pixmaps/BLACK_14.xpm"\r
+#include "pixmaps/CLEAR_14.xpm"\r
+#include "pixmaps/UNKNOWN_14.xpm"\r
+#include "pixmaps/THINKING_14.xpm"\r
+#include "pixmaps/PONDER_14.xpm"\r
+#include "pixmaps/ANALYZING_14.xpm"\r
+\r
 #ifdef SNAP\r
 #include "wsnap.h"\r
-#endif
-
-#define _LL_ 100
-
-// imports from xboard.c
-extern Widget formWidget, shellWidget, boardWidget, menuBarWidget;
-extern Display *xDisplay;
-extern Window xBoardWindow;
-extern int squareSize;
-extern Pixmap xMarkPixmap, wIconPixmap, bIconPixmap;
-extern char *layoutName;
-
-// temporary kludge to avoid compile errors untill all Windows code has been replaced
-#define HICON int *
-#define HWND  int *
+#endif\r
+\r
+#define _LL_ 100\r
+\r
+// imports from xboard.c\r
+extern Widget formWidget, shellWidget, boardWidget, menuBarWidget;\r
+extern Display *xDisplay;\r
+extern Window xBoardWindow;\r
+extern int squareSize;\r
+extern Pixmap xMarkPixmap, wIconPixmap, bIconPixmap;\r
+extern char *layoutName;\r
+\r
+// temporary kludge to avoid compile errors untill all Windows code has been replaced\r
+#define HICON int *\r
+#define HWND  int *\r
 \r
 // [HGM] define numbers to indicate icons, for referring to them in platform-independent way\r
 #define nColorBlack   1\r
@@ -124,7 +133,7 @@ static void SetEngineColorIcon( int which );
 #define SHOW_PONDERING\r
 \r
 /* Imports from backend.c */\r
-char * SavePart(char *str);
+char * SavePart(char *str);\r
 extern int opponentKibitzes;\r
 \r
 /* Imports from winboard.c */\r
@@ -132,12 +141,12 @@ extern int opponentKibitzes;
 extern Arg layoutArgs[2], formArgs[2], messageArgs[4];\r
 \r
 //extern WindowPlacement wpEngineOutput;\r
-
-Position engineOutputX = -1, engineOutputY = -1;
-Dimension engineOutputW, engineOutputH;
-Widget engineOutputShell;
-int engineOutputDialogUp;
-
+\r
+Position engineOutputX = -1, engineOutputY = -1;\r
+Dimension engineOutputW, engineOutputH;\r
+Widget engineOutputShell;\r
+int engineOutputDialogUp;\r
+\r
 /* Module variables */\r
 #define H_MARGIN            2\r
 #define V_MARGIN            2\r
@@ -164,7 +173,7 @@ typedef struct {
     char * name;\r
     int which;\r
     int depth;\r
-    unsigned long nodes;\r
+    u64 nodes;\r
     int score;\r
     int time;\r
     char * pv;\r
@@ -176,241 +185,33 @@ typedef struct {
 static int VerifyDisplayMode();\r
 static void UpdateControls( EngineOutputData * ed );\r
 static SetEngineState( int which, int state, char * state_data );\r
-
-void ReadIcon(char *pixData[], int iconNr)
-{
-    int r;
-
+\r
+void ReadIcon(char *pixData[], int iconNr)\r
+{\r
+    int r;\r
+\r
        if ((r=XpmCreatePixmapFromData(xDisplay, XtWindow(outputField[0][nColorIcon]),\r
                                       pixData,\r
                                       &(icons[iconNr]),\r
                                       NULL, NULL /*&attr*/)) != 0) {\r
-         fprintf(stderr, "Error %d loading icon image\n", r);\r
+         fprintf(stderr, _("Error %d loading icon image\n"), r);\r
          exit(1); \r
        }       \r
-}
-
+}\r
+\r
 static void InitializeEngineOutput()\r
-{ int i;
-
+{ int i;\r
+\r
         ReadIcon(WHITE_14,   nColorWhite);\r
         ReadIcon(BLACK_14,   nColorBlack);\r
         ReadIcon(UNKNOWN_14, nColorUnknown);\r
-
+\r
         ReadIcon(CLEAR_14,   nClear);\r
         ReadIcon(PONDER_14,  nPondering);\r
         ReadIcon(THINK_14,   nThinking);\r
         ReadIcon(ANALYZE_14, nAnalyzing);\r
-//        icons[nClear]       = wIconPixmap;\r
-//        icons[nPondering]   = bIconPixmap;\r//        icons[nThinking]    = wIconPixmap;\r
-//        icons[nAnalyzing]   = bIconPixmap;\r}
-
-#if 0
-// Windows routines commented out
-\r
-// front end\r
-static HICON LoadIconEx( int id )\r
-{\r
-    return LoadImage( hInst, MAKEINTRESOURCE(id), IMAGE_ICON, ICON_SIZE, ICON_SIZE, 0 );\r
-}\r
-\r
-// [HGM] the platform-dependent way of indicating where output should go is now all\r
-// concentrated here, where a table of platform-dependent handles are initialized.\r
-// This cleanses most other routines of front-end stuff, so they can go into the back end.\r
-static void InitializeEngineOutput()\r
-{\r
- //   if( needInit ) { // needInit was already tested before call\r
-       // [HGM] made this into a table, rather than separate global variables\r
-        icons[nColorBlack]   = LoadIconEx( IDI_BLACK_14 );\r
-        icons[nColorWhite]   = LoadIconEx( IDI_WHITE_14 );\r
-        icons[nColorUnknown] = LoadIconEx( IDI_UNKNOWN_14 );\r
-        icons[nClear]        = LoadIconEx( IDI_TRANS_14 );\r
-        icons[nPondering]    = LoadIconEx( IDI_PONDER_14 );\r
-        icons[nThinking]     = LoadIconEx( IDI_CLOCK_14 );\r
-        icons[nAnalyzing]    = LoadIconEx( IDI_ANALYZE2_14 );\r
-\r
-       // [HGM] also make a table of handles to output controls\r
-       // Note that engineOutputDialog must be defined first!\r
-        outputField[0][nColorIcon] = GetDlgItem( engineOutputDialog, IDC_Color1 );\r
-        outputField[0][nLabel]     = GetDlgItem( engineOutputDialog, IDC_EngineLabel1 );\r
-        outputField[0][nStateIcon] = GetDlgItem( engineOutputDialog, IDC_StateIcon1 );\r
-        outputField[0][nStateData] = GetDlgItem( engineOutputDialog, IDC_StateData1 );\r
-        outputField[0][nLabelNPS]  = GetDlgItem( engineOutputDialog, IDC_Engine1_NPS );\r
-        outputField[0][nMemo]      = GetDlgItem( engineOutputDialog, IDC_EngineMemo1 );\r
-\r
-        outputField[1][nColorIcon] = GetDlgItem( engineOutputDialog, IDC_Color2 );\r
-        outputField[1][nLabel]     = GetDlgItem( engineOutputDialog, IDC_EngineLabel2 );\r
-        outputField[1][nStateIcon] = GetDlgItem( engineOutputDialog, IDC_StateIcon2 );\r
-        outputField[1][nStateData] = GetDlgItem( engineOutputDialog, IDC_StateData2 );\r
-        outputField[1][nLabelNPS]  = GetDlgItem( engineOutputDialog, IDC_Engine2_NPS );\r
-        outputField[1][nMemo]      = GetDlgItem( engineOutputDialog, IDC_EngineMemo2 );\r
-//        needInit = FALSE;\r
-//    }\r
 }\r
 \r
-// front end\r
-static void SetControlPos( HWND hDlg, int id, int x, int y, int width, int height )\r
-{\r
-    HWND hControl = GetDlgItem( hDlg, id );\r
-\r
-    SetWindowPos( hControl, HWND_TOP, x, y, width, height, SWP_NOZORDER );\r
-}\r
-\r
-#define HIDDEN_X    20000\r
-#define HIDDEN_Y    20000\r
-\r
-// front end\r
-static void HideControl( HWND hDlg, int id )\r
-{\r
-    HWND hControl = GetDlgItem( hDlg, id );\r
-    RECT rc;\r
-\r
-    GetWindowRect( hControl, &rc );\r
-\r
-    /* \r
-        Avoid hiding an already hidden control, because that causes many\r
-        unnecessary WM_ERASEBKGND messages!\r
-    */\r
-    if( rc.left != HIDDEN_X || rc.top != HIDDEN_Y ) {\r
-        SetControlPos( hDlg, id, 20000, 20000, 100, 100 );\r
-    }\r
-}\r
-\r
-// front end, although we might make GetWindowRect front end instead\r
-static int GetControlWidth( HWND hDlg, int id )\r
-{\r
-    RECT rc;\r
-\r
-    GetWindowRect( GetDlgItem( hDlg, id ), &rc );\r
-\r
-    return rc.right - rc.left;\r
-}\r
-\r
-// front end?\r
-static int GetControlHeight( HWND hDlg, int id )\r
-{\r
-    RECT rc;\r
-\r
-    GetWindowRect( GetDlgItem( hDlg, id ), &rc );\r
-\r
-    return rc.bottom - rc.top;\r
-}\r
-\r
-static int GetHeaderHeight()\r
-{\r
-    int result = GetControlHeight( engineOutputDialog, IDC_EngineLabel1 );\r
-\r
-    if( result < ICON_SIZE ) result = ICON_SIZE;\r
-\r
-    return result;\r
-}\r
-\r
-// The size calculations should be backend? If setControlPos is a platform-dependent way of doing things,\r
-// a platform-independent wrapper for it should be supplied.\r
-static void PositionControlSet( HWND hDlg, int x, int y, int clientWidth, int memoHeight, int idColor, int idEngineLabel, int idNPS, int idMemo, int idStateIcon, int idStateData )\r
-{\r
-    int label_x = x + ICON_SIZE + H_MARGIN;\r
-    int label_h = GetControlHeight( hDlg, IDC_EngineLabel1 );\r
-    int label_y = y + ICON_SIZE - label_h;\r
-    int nps_w = GetControlWidth( hDlg, IDC_Engine1_NPS );\r
-    int nps_x = clientWidth - H_MARGIN - nps_w;\r
-    int state_data_w = GetControlWidth( hDlg, IDC_StateData1 );\r
-    int state_data_x = nps_x - H_MARGIN - state_data_w;\r
-    int state_icon_x = state_data_x - ICON_SIZE - 2;\r
-    int max_w = clientWidth - 2*H_MARGIN;\r
-    int memo_y = y + ICON_SIZE + LABEL_V_DISTANCE;\r
-\r
-    SetControlPos( hDlg, idColor, x, y, ICON_SIZE, ICON_SIZE );\r
-    SetControlPos( hDlg, idEngineLabel, label_x, label_y, state_icon_x - label_x, label_h );\r
-    SetControlPos( hDlg, idStateIcon, state_icon_x, y, ICON_SIZE, ICON_SIZE );\r
-    SetControlPos( hDlg, idStateData, state_data_x, label_y, state_data_w, label_h );\r
-    SetControlPos( hDlg, idNPS, nps_x, label_y, nps_w, label_h );\r
-    SetControlPos( hDlg, idMemo, x, memo_y, max_w, memoHeight );\r
-}\r
-\r
-// Also here some of the size calculations should go to the back end, and their actual application to a front-end routine\r
-static void ResizeWindowControls( HWND hDlg, int mode )\r
-{\r
-    RECT rc;\r
-    int headerHeight = GetHeaderHeight();\r
-    int labelHeight = GetControlHeight( hDlg, IDC_EngineLabel1 );\r
-    int labelOffset = H_MARGIN + ICON_SIZE + H_MARGIN;\r
-    int labelDeltaY = ICON_SIZE - labelHeight;\r
-    int clientWidth;\r
-    int clientHeight;\r
-    int maxControlWidth;\r
-    int npsWidth;\r
-\r
-    /* Initialize variables */\r
-    GetClientRect( hDlg, &rc );\r
-\r
-    clientWidth = rc.right - rc.left;\r
-    clientHeight = rc.bottom - rc.top;\r
-\r
-    maxControlWidth = clientWidth - 2*H_MARGIN;\r
-\r
-    npsWidth = GetControlWidth( hDlg, IDC_Engine1_NPS );\r
-\r
-    /* Resize controls */\r
-    if( mode == 0 ) {\r
-        /* One engine */\r
-        PositionControlSet( hDlg, H_MARGIN, V_MARGIN, \r
-            clientWidth, \r
-            clientHeight - V_MARGIN - LABEL_V_DISTANCE - headerHeight- V_MARGIN,\r
-            IDC_Color1, IDC_EngineLabel1, IDC_Engine1_NPS, IDC_EngineMemo1, IDC_StateIcon1, IDC_StateData1 );\r
-\r
-        /* Hide controls for the second engine */\r
-        HideControl( hDlg, IDC_Color2 );\r
-        HideControl( hDlg, IDC_EngineLabel2 );\r
-        HideControl( hDlg, IDC_StateIcon2 );\r
-        HideControl( hDlg, IDC_StateData2 );\r
-        HideControl( hDlg, IDC_Engine2_NPS );\r
-        HideControl( hDlg, IDC_EngineMemo2 );\r
-        SendDlgItemMessage( hDlg, IDC_EngineMemo2, WM_SETTEXT, 0, (LPARAM) "" );\r
-        /* TODO: we should also hide/disable them!!! what about tab stops?!?! */\r
-    }\r
-    else {\r
-        /* Two engines */\r
-        int memo_h = (clientHeight - headerHeight*2 - V_MARGIN*2 - LABEL_V_DISTANCE*2 - SPLITTER_SIZE) / 2;\r
-        int header1_y = V_MARGIN;\r
-        int header2_y = V_MARGIN + headerHeight + LABEL_V_DISTANCE + memo_h + SPLITTER_SIZE;\r
-\r
-        PositionControlSet( hDlg, H_MARGIN, header1_y, clientWidth, memo_h,\r
-            IDC_Color1, IDC_EngineLabel1, IDC_Engine1_NPS, IDC_EngineMemo1, IDC_StateIcon1, IDC_StateData1 );\r
-\r
-        PositionControlSet( hDlg, H_MARGIN, header2_y, clientWidth, memo_h,\r
-            IDC_Color2, IDC_EngineLabel2, IDC_Engine2_NPS, IDC_EngineMemo2, IDC_StateIcon2, IDC_StateData2 );\r
-    }\r
-\r
-    InvalidateRect( GetDlgItem(hDlg,IDC_EngineMemo1), NULL, FALSE );\r
-    InvalidateRect( GetDlgItem(hDlg,IDC_EngineMemo2), NULL, FALSE );\r
-}\r
-\r
-// front end. Actual printing of PV lines into the output field\r
-static void InsertIntoMemo( int which, char * text )\r
-{\r
-    SendMessage( outputField[which][nMemo], EM_SETSEL, 0, 0 );\r
-\r
-    SendMessage( outputField[which][nMemo], EM_REPLACESEL, (WPARAM) FALSE, (LPARAM) text );\r
-}\r
-\r
-// front end. Associates an icon with an output field ("control" in Windows jargon).\r
-// [HGM] let it find out the output field from the 'which' number by itself\r
-static void SetIcon( int which, int field, int nIcon )\r
-{\r
-\r
-    if( nIcon != 0 ) {\r
-        SendMessage( outputField[which][field], STM_SETICON, (WPARAM) icons[nIcon], 0 );\r
-    }\r
-}\r
-\r
-// front end wrapper for SetWindowText, taking control number in stead of handle\r
-void DoSetWindowText(int which, int field, char *s_label)\r
-{\r
-    SetWindowText( outputField[which][field], s_label );\r
-}\r
-#endif
-
 void DoSetWindowText(int which, int field, char *s_label)\r
 { \r
        Arg arg;\r
@@ -418,108 +219,117 @@ void DoSetWindowText(int which, int field, char *s_label)
        XtSetArg(arg, XtNlabel, (XtArgVal) s_label);\r
        XtSetValues(outputField[which][field], &arg, 1);\r
 }\r
-
+\r
 static void InsertIntoMemo( int which, char * text )\r
-{
-       Arg arg; XawTextBlock t; Widget edit;
-
+{\r
+       Arg arg; XawTextBlock t; Widget edit;\r
+\r
        t.ptr = text; t.firstPos = 0; t.length = strlen(text); t.format = XawFmt8Bit;\r
        edit = XtNameToWidget(engineOutputShell, which ? "*form2.text" : "*form.text");\r
-       XawTextReplace(edit, 0, 0, &t);
+       XawTextReplace(edit, 0, 0, &t);\r
 //     XtSetArg(arg, XtNstring, (XtArgVal) text);\r
 //     XtSetValues(outputField[which][nMemo], &arg, 1);\r
 }\r
-
-static void SetIcon( int which, int field, int nIcon )
-{
-    Arg arg;
+\r
+static void SetIcon( int which, int field, int nIcon )\r
+{\r
+    Arg arg;\r
 \r
     if( nIcon != 0 ) {\r
        XtSetArg(arg, XtNleftBitmap, (XtArgVal) icons[nIcon]);\r
        XtSetValues(outputField[which][field], &arg, 1);\r
     }\r
-}
-
-void DoClearMemo(int which)\r\r    Arg args[16];\r
+}\r
+\r
+void DoClearMemo(int which)\r
+{ \r
+    Arg args[16];\r
     int j;\r
     Widget edit;\r
-
+\r
        edit = XtNameToWidget(engineOutputShell, which ? "*form2.text" : "*form.text");\r
        XtCallActionProc(edit, "select-all", NULL, NULL, 0);\r
        XtCallActionProc(edit, "kill-selection", NULL, NULL, 0);\r
-}
+}\r
 \r
 // The following routines are mutated clones of the commentPopUp routines\r
 \r
 void PositionControlSet(which, form, bw_width)\r
      int which;\r
      Widget form;\r
-     Dimension bw_width;\r{\r
+     Dimension bw_width;\r
+{\r
     Arg args[16];\r
     Widget edit, NameWidget, ColorWidget, ModeWidget, MoveWidget, NodesWidget;\r
     int j, mutable=1;\r
     j = 0;\r
-    XtSetArg(args[j], XtNborderWidth, (XtArgVal) 0); j++;
+    XtSetArg(args[j], XtNborderWidth, (XtArgVal) 0); j++;\r
     XtSetArg(args[j], XtNlabel,     (XtArgVal) ""); j++;\r
     XtSetArg(args[j], XtNtop,       XtChainTop); j++;\r
     XtSetArg(args[j], XtNbottom,    XtChainTop); j++;\r
-    XtSetArg(args[j], XtNleft,      XtChainLeft); j++;\r    XtSetArg(args[j], XtNright,     XtChainLeft); j++;\r    XtSetArg(args[j], XtNheight,    (XtArgVal) 16); j++;\r
+    XtSetArg(args[j], XtNleft,      XtChainLeft); j++;\r
+    XtSetArg(args[j], XtNright,     XtChainLeft); j++;\r
+    XtSetArg(args[j], XtNheight,    (XtArgVal) 16); j++;\r
     XtSetArg(args[j], XtNwidth,     (XtArgVal) 17); j++;\r
-    outputField[which][nColorIcon] = ColorWidget =
+    outputField[which][nColorIcon] = ColorWidget =\r
       XtCreateManagedWidget("Color", labelWidgetClass,\r
                     form, args, j);\r
-
+\r
     j = 0;\r
-    XtSetArg(args[j], XtNborderWidth, (XtArgVal) 0); j++;
-    XtSetArg(args[j], XtNjustify,   (XtArgVal) XtJustifyLeft); j++;
+    XtSetArg(args[j], XtNborderWidth, (XtArgVal) 0); j++;\r
+    XtSetArg(args[j], XtNjustify,   (XtArgVal) XtJustifyLeft); j++;\r
     XtSetArg(args[j], XtNfromHoriz, (XtArgVal) ColorWidget); j++;\r
     XtSetArg(args[j], XtNtop,       XtChainTop); j++;\r
     XtSetArg(args[j], XtNbottom,    XtChainTop); j++;\r
-    XtSetArg(args[j], XtNleft,      XtChainLeft); j++;\r    XtSetArg(args[j], XtNheight,    (XtArgVal) 16); j++;\r
+    XtSetArg(args[j], XtNleft,      XtChainLeft); j++;\r
+    XtSetArg(args[j], XtNheight,    (XtArgVal) 16); j++;\r
     XtSetArg(args[j], XtNwidth,     (XtArgVal) bw_width/2 - 57); j++;\r
-    outputField[which][nLabel] = NameWidget =
+    outputField[which][nLabel] = NameWidget =\r
       XtCreateManagedWidget("Engine", labelWidgetClass,\r
                     form, args, j);\r
-
+\r
     j = 0;\r
-    XtSetArg(args[j], XtNborderWidth, (XtArgVal) 0); j++;
+    XtSetArg(args[j], XtNborderWidth, (XtArgVal) 0); j++;\r
     XtSetArg(args[j], XtNlabel,     (XtArgVal) ""); j++;\r
     XtSetArg(args[j], XtNfromHoriz, (XtArgVal) NameWidget); j++;\r
     XtSetArg(args[j], XtNtop,       XtChainTop); j++;\r
     XtSetArg(args[j], XtNbottom,    XtChainTop); j++;\r
     XtSetArg(args[j], XtNheight,    (XtArgVal) 16); j++;\r
     XtSetArg(args[j], XtNwidth,     (XtArgVal) 20); j++;\r
-    outputField[which][nStateIcon] = ModeWidget =
+    outputField[which][nStateIcon] = ModeWidget =\r
       XtCreateManagedWidget("Mode", labelWidgetClass,\r
                     form, args, j);\r
-
+\r
     j = 0;\r
-    XtSetArg(args[j], XtNborderWidth, (XtArgVal) 0); j++;
-    XtSetArg(args[j], XtNjustify,   (XtArgVal) XtJustifyLeft); j++;
+    XtSetArg(args[j], XtNborderWidth, (XtArgVal) 0); j++;\r
+    XtSetArg(args[j], XtNjustify,   (XtArgVal) XtJustifyLeft); j++;\r
     XtSetArg(args[j], XtNlabel,     (XtArgVal) ""); j++;\r
     XtSetArg(args[j], XtNfromHoriz, (XtArgVal) ModeWidget); j++;\r
     XtSetArg(args[j], XtNtop,       XtChainTop); j++;\r
     XtSetArg(args[j], XtNbottom,    XtChainTop); j++;\r
-    XtSetArg(args[j], XtNright,     XtChainRight); j++;\r    XtSetArg(args[j], XtNheight,    (XtArgVal) 16); j++;\r
+    XtSetArg(args[j], XtNright,     XtChainRight); j++;\r
+    XtSetArg(args[j], XtNheight,    (XtArgVal) 16); j++;\r
     XtSetArg(args[j], XtNwidth,     (XtArgVal) bw_width/2 - 102); j++;\r
-    outputField[which][nStateData] = MoveWidget =
+    outputField[which][nStateData] = MoveWidget =\r
       XtCreateManagedWidget("Move", labelWidgetClass,\r
                     form, args, j);\r
-
+\r
     j = 0;\r
-    XtSetArg(args[j], XtNborderWidth, (XtArgVal) 0); j++;
+    XtSetArg(args[j], XtNborderWidth, (XtArgVal) 0); j++;\r
     XtSetArg(args[j], XtNjustify,   (XtArgVal) XtJustifyRight); j++;\r
-    XtSetArg(args[j], XtNlabel,     (XtArgVal) "NPS"); j++;\r
+    XtSetArg(args[j], XtNlabel,     (XtArgVal) _("NPS")); j++;\r
     XtSetArg(args[j], XtNfromHoriz, (XtArgVal) MoveWidget); j++;\r
     XtSetArg(args[j], XtNtop,       XtChainTop); j++;\r
     XtSetArg(args[j], XtNbottom,    XtChainTop); j++;\r
-    XtSetArg(args[j], XtNleft,      XtChainRight); j++;\r    XtSetArg(args[j], XtNright,     XtChainRight); j++;\r    XtSetArg(args[j], XtNheight,    (XtArgVal) 16); j++;\r
+    XtSetArg(args[j], XtNleft,      XtChainRight); j++;\r
+    XtSetArg(args[j], XtNright,     XtChainRight); j++;\r
+    XtSetArg(args[j], XtNheight,    (XtArgVal) 16); j++;\r
     XtSetArg(args[j], XtNwidth,     (XtArgVal) 100); j++;\r
-    outputField[which][nLabelNPS] = NodesWidget =
+    outputField[which][nLabelNPS] = NodesWidget =\r
       XtCreateManagedWidget("Nodes", labelWidgetClass,\r
                     form, args, j);\r
-
-    // create "text" within "form"
+\r
+    // create "text" within "form"\r
     j = 0;\r
     if (mutable) {\r
        XtSetArg(args[j], XtNeditType, XawtextEdit);  j++;\r
@@ -538,7 +348,8 @@ void PositionControlSet(which, form, bw_width)
 #else\r
     /* !!Work around an apparent bug in XFree86 4.0.1 (X11R6.4.3) */\r
     XtSetArg(args[j], XtNscrollVertical, XawtextScrollAlways);  j++;\r
-    XtSetArg(args[j], XtNscrollHorizontal, XawtextScrollWhenNeeded);  j++;\r#endif\r
+    XtSetArg(args[j], XtNscrollHorizontal, XawtextScrollWhenNeeded);  j++;\r
+#endif\r
 //    XtSetArg(args[j], XtNautoFill, True);  j++;\r
 //    XtSetArg(args[j], XtNwrap, XawtextWrapWord); j++;\r
     outputField[which][nMemo] = edit =\r
@@ -554,15 +365,17 @@ Widget EngineOutputCreate(name, text)
      char *name, *text;\r
 {\r
     Arg args[16];\r
-    Widget shell, layout, form, form2, edit;
+    Widget shell, layout, form, form2, edit;\r
     Dimension bw_width, bw_height;\r
     int j;\r
 \r
-    // get board width
+    // get board width\r
     j = 0;\r
-    XtSetArg(args[j], XtNwidth,  &bw_width);  j++;\r    XtSetArg(args[j], XtNheight, &bw_height);  j++;\r    XtGetValues(boardWidget, args, j);\r
+    XtSetArg(args[j], XtNwidth,  &bw_width);  j++;\r
+    XtSetArg(args[j], XtNheight, &bw_height);  j++;\r
+    XtGetValues(boardWidget, args, j);\r
 \r
-    // define form within layout within shell.
+    // define form within layout within shell.\r
     j = 0;\r
     XtSetArg(args[j], XtNresizable, True);  j++;\r
     shell =\r
@@ -571,23 +384,28 @@ Widget EngineOutputCreate(name, text)
     layout =\r
       XtCreateManagedWidget(layoutName, formWidgetClass, shell,\r
                            layoutArgs, XtNumber(layoutArgs));\r
-    // divide window vertically into two equal parts, by creating two forms
+    // divide window vertically into two equal parts, by creating two forms\r
     form =\r
       XtCreateManagedWidget("form", formWidgetClass, layout,\r
                            formArgs, XtNumber(formArgs));\r
     form2 =\r
       XtCreateManagedWidget("form2", formWidgetClass, layout,\r
                            formArgs, XtNumber(formArgs));\r
-    j = 0;\r    XtSetArg(args[j], XtNfromVert,  (XtArgVal) form); j++;\r    XtSetValues(form2, args, j);\r
-    // make sure width is known in advance, for better placement of child widgets
-    j = 0;\r    XtSetArg(args[j], XtNwidth,     (XtArgVal) bw_width-16); j++;\r    XtSetArg(args[j], XtNheight,    (XtArgVal) bw_height/2); j++;\r    XtSetValues(shell, args, j);\r
-
-    // fill up both forms with control elements
-    PositionControlSet(0, form,  bw_width);
-    PositionControlSet(1, form2, bw_width);
+    j = 0;\r
+    XtSetArg(args[j], XtNfromVert,  (XtArgVal) form); j++;\r
+    XtSetValues(form2, args, j);\r
+    // make sure width is known in advance, for better placement of child widgets\r
+    j = 0;\r
+    XtSetArg(args[j], XtNwidth,     (XtArgVal) bw_width-16); j++;\r
+    XtSetArg(args[j], XtNheight,    (XtArgVal) bw_height/2); j++;\r
+    XtSetValues(shell, args, j);\r
+\r
+    // fill up both forms with control elements\r
+    PositionControlSet(0, form,  bw_width);\r
+    PositionControlSet(1, form2, bw_width);\r
 \r
     XtRealizeWidget(shell);\r
-
+\r
     if (engineOutputX == -1) {\r
        int xx, yy;\r
        Window junk;\r
@@ -602,9 +420,11 @@ Widget EngineOutputCreate(name, text)
        XtSetArg(args[j], XtNheight, &pw_height);  j++;\r
        XtGetValues(shell, args, j);\r
        engineOutputH = pw_height + (lines - 1) * ew_height;\r
-       engineOutputW = bw_width - 16;
-#else
-       engineOutputH = bw_height/2;\r   engineOutputW = bw_width-16;\r#endif
+       engineOutputW = bw_width - 16;\r
+#else\r
+       engineOutputH = bw_height/2;\r
+       engineOutputW = bw_width-16;\r
+#endif\r
 \r
        XSync(xDisplay, False);\r
 #ifdef NOTDEF\r
@@ -626,7 +446,8 @@ Widget EngineOutputCreate(name, text)
        if (engineOutputY < 0) engineOutputY = 0; /*avoid positioning top offscreen*/\r
     }\r
     j = 0;\r
-    XtSetArg(args[j], XtNheight, engineOutputH);  j++;\r    XtSetArg(args[j], XtNwidth, engineOutputW);  j++;\r
+    XtSetArg(args[j], XtNheight, engineOutputH);  j++;\r
+    XtSetArg(args[j], XtNwidth, engineOutputW);  j++;\r
     XtSetArg(args[j], XtNx, engineOutputX);  j++;\r
     XtSetArg(args[j], XtNy, engineOutputY);  j++;\r
     XtSetValues(shell, args, j);\r
@@ -635,133 +456,42 @@ Widget EngineOutputCreate(name, text)
     return shell;\r
 }\r
 \r
-void ResizeWindowControls(shell, mode)
-       Widget shell;
-       int mode;
-{
-    Widget form1, form2;
-    Arg args[16];
-    int j;
-    Dimension ew_height, tmp;
-
+void ResizeWindowControls(shell, mode)\r
+       Widget shell;\r
+       int mode;\r
+{\r
+    Widget form1, form2;\r
+    Arg args[16];\r
+    int j;\r
+    Dimension ew_height, tmp;\r
+\r
     form1 = XtNameToWidget(shell, "*form");\r
-    form2 = XtNameToWidget(shell, "*form2");
-
-    j = 0;
-    XtSetArg(args[j], XtNheight, (XtArgVal) &ew_height); j++;\r    XtGetValues(form1, args, j);
-    j = 0;
-    XtSetArg(args[j], XtNheight, (XtArgVal) &tmp); j++;\r    XtGetValues(form2, args, j);
-    ew_height += tmp; // total height
+    form2 = XtNameToWidget(shell, "*form2");\r
+\r
+    j = 0;\r
+    XtSetArg(args[j], XtNheight, (XtArgVal) &ew_height); j++;\r
+    XtGetValues(form1, args, j);\r
+    j = 0;\r
+    XtSetArg(args[j], XtNheight, (XtArgVal) &tmp); j++;\r
+    XtGetValues(form2, args, j);\r
+    ew_height += tmp; // total height\r
 \r
     if(mode==0) {\r
-       j = 0;
+       j = 0;\r
        XtSetArg(args[j], XtNheight, (XtArgVal) 5); j++;\r
-       XtSetValues(form2, args, j);
-       j = 0;
+       XtSetValues(form2, args, j);\r
+       j = 0;\r
        XtSetArg(args[j], XtNheight, (XtArgVal) (ew_height-5)); j++;\r
-       XtSetValues(form1, args, j);
-    } else {
-       j = 0;
+       XtSetValues(form1, args, j);\r
+    } else {\r
+       j = 0;\r
        XtSetArg(args[j], XtNheight, (XtArgVal) (ew_height/2)); j++;\r
-       XtSetValues(form1, args, j);
-       j = 0;
+       XtSetValues(form1, args, j);\r
+       j = 0;\r
        XtSetArg(args[j], XtNheight, (XtArgVal) (ew_height/2)); j++;\r
-       XtSetValues(form2, args, j);
-    }\r
-}
-
-#if 0\r
-void EngineOutputCallback(w, client_data, call_data)\r
-     Widget w;\r
-     XtPointer client_data, call_data;\r
-{\r
-    String name;\r
-    Arg args[16];\r
-    int j;\r
-\r
-    j = 0;\r
-    XtSetArg(args[j], XtNlabel, &name);  j++;\r
-    XtGetValues(w, args, j);\r
-\r
-    if (strcmp(name, "close") == 0) {\r
-       EngineOutputPopDown();\r
-    } else if (strcmp(name, "edit") == 0) {\r
-       EngineOutputPopDown();\r
-       EditCommentEvent();\r
-    }\r
-}\r
-#endif
-\r
-#if 0\r
-// This seems pure front end\r
-LRESULT CALLBACK EngineOutputProc( HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam )\r
-{\r
-    static SnapData sd;\r
-\r
-    switch (message) {\r
-    case WM_INITDIALOG:\r
-        if( engineOutputDialog == NULL ) {\r
-            engineOutputDialog = hDlg;\r
-\r
-            RestoreWindowPlacement( hDlg, &wpEngineOutput ); /* Restore window placement */\r
-\r
-            ResizeWindowControls( hDlg, windowMode );\r
-\r
-            SetEngineState( 0, STATE_IDLE, "" );\r
-            SetEngineState( 1, STATE_IDLE, "" );\r
-        }\r
-\r
-        return FALSE;\r
-\r
-    case WM_COMMAND:\r
-        switch (LOWORD(wParam)) {\r
-        case IDOK:\r
-          EndDialog(hDlg, TRUE);\r
-          return TRUE;\r
-\r
-        case IDCANCEL:\r
-          EndDialog(hDlg, FALSE);\r
-          return TRUE;\r
-\r
-        default:\r
-          break;\r
-        }\r
-\r
-        break;\r
-\r
-    case WM_GETMINMAXINFO:\r
-        {\r
-            MINMAXINFO * mmi = (MINMAXINFO *) lParam;\r
-        \r
-            mmi->ptMinTrackSize.x = 100;\r
-            mmi->ptMinTrackSize.y = 160;\r
-        }\r
-        break;\r
-\r
-    case WM_CLOSE:\r
-        EngineOutputPopDown();\r
-        break;\r
-\r
-    case WM_SIZE:\r
-        ResizeWindowControls( hDlg, windowMode );\r
-        break;\r
-\r
-    case WM_ENTERSIZEMOVE:\r
-        return OnEnterSizeMove( &sd, hDlg, wParam, lParam );\r
-\r
-    case WM_SIZING:\r
-        return OnSizing( &sd, hDlg, wParam, lParam );\r
-\r
-    case WM_MOVING:\r
-        return OnMoving( &sd, hDlg, wParam, lParam );\r
-\r
-    case WM_EXITSIZEMOVE:\r
-        return OnExitSizeMove( &sd, hDlg, wParam, lParam );\r
+       XtSetValues(form2, args, j);\r
     }\r
-\r
-    return FALSE;\r
 }\r
-#endif
 \r
 void EngineOutputPopUp(title, text)\r
      char *title, *text;\r
@@ -777,12 +507,13 @@ void EngineOutputPopUp(title, text)
        CatchDeleteWindow(engineOutputShell, "EngineOutputPopDown");\r
        if( needInit ) {\r
            InitializeEngineOutput();\r
-           needInit = FALSE;\r  }\r
+           needInit = FALSE;\r
+       }\r
         SetEngineColorIcon( 0 );\r
         SetEngineColorIcon( 1 );\r
         SetEngineState( 0, STATE_IDLE, "" );\r
         SetEngineState( 1, STATE_IDLE, "" );\r
-    } else {
+    } else {\r
        edit = XtNameToWidget(engineOutputShell, "*form.text");\r
        j = 0;\r
        XtSetArg(args[j], XtNstring, text); j++;\r
@@ -796,48 +527,14 @@ void EngineOutputPopUp(title, text)
     XtPopup(engineOutputShell, XtGrabNone);\r
     XSync(xDisplay, False);\r
 \r
-    j=0;
-    XtSetArg(args[j], XtNleftBitmap, xMarkPixmap); j++;
-    XtSetValues(XtNameToWidget(menuBarWidget, "menuMode.Show Engine Output"),
-               args, j);
-
-    engineOutputDialogUp = True;\r
-    ShowThinkingEvent(); // [HGM] thinking: might need to prompt engine for thinking output
-}\r
-
-#if 0\r
-// front end\r
-void EngineOutputPopUp()\r
-{\r
-  FARPROC lpProc;\r
-  \r
-  CheckMenuItem(GetMenu(hwndMain), IDM_ShowEngineOutput, MF_CHECKED);\r
-\r
-  if( engineOutputDialog ) {\r
-    SendMessage( engineOutputDialog, WM_INITDIALOG, 0, 0 );\r
-\r
-    if( ! engineOutputDialogUp ) {\r
-        ShowWindow(engineOutputDialog, SW_SHOW);\r
-    }\r
-  }\r
-  else {\r
-    lpProc = MakeProcInstance( (FARPROC) EngineOutputProc, hInst );\r
-\r
-    /* Note to self: dialog must have the WS_VISIBLE style set, otherwise it's not shown! */\r
-    CreateDialog( hInst, MAKEINTRESOURCE(DLG_EngineOutput), hwndMain, (DLGPROC)lpProc );\r
-\r
-    FreeProcInstance(lpProc);\r
-  }\r
-\r
-  // [HGM] displaced to after creation of dialog, to allow initialization of output fields\r
-  if( needInit ) {\r
-      InitializeEngineOutput();\r
-      needInit = FALSE;\r
-  }\r
+    j=0;\r
+    XtSetArg(args[j], XtNleftBitmap, xMarkPixmap); j++;\r
+    XtSetValues(XtNameToWidget(menuBarWidget, "menuMode.Show Engine Output"),\r
+               args, j);\r
 \r
-  engineOutputDialogUp = TRUE;\r
+    engineOutputDialogUp = True;\r
+    ShowThinkingEvent(); // [HGM] thinking: might need to prompt engine for thinking output\r
 }\r
-#endif
 \r
 void EngineOutputPopDown()\r
 {\r
@@ -845,7 +542,7 @@ void EngineOutputPopDown()
     int j;\r
 \r
     if (!engineOutputDialogUp) return;\r
-    DoClearMemo(1);
+    DoClearMemo(1);\r
     j = 0;\r
     XtSetArg(args[j], XtNx, &engineOutputX); j++;\r
     XtSetArg(args[j], XtNy, &engineOutputY); j++;\r
@@ -853,36 +550,16 @@ void EngineOutputPopDown()
     XtSetArg(args[j], XtNheight, &engineOutputH); j++;\r
     XtGetValues(engineOutputShell, args, j);\r
     XtPopdown(engineOutputShell);\r
-    XSync(xDisplay, False);
-    j=0;
-    XtSetArg(args[j], XtNleftBitmap, None); j++;
-    XtSetValues(XtNameToWidget(menuBarWidget, "menuMode.Show Engine Output"),
-               args, j);
+    XSync(xDisplay, False);\r
+    j=0;\r
+    XtSetArg(args[j], XtNleftBitmap, None); j++;\r
+    XtSetValues(XtNameToWidget(menuBarWidget, "menuMode.Show Engine Output"),\r
+               args, j);\r
 \r
     engineOutputDialogUp = False;\r
-    ShowThinkingEvent(); // [HGM] thinking: might need to shut off thinking output
-}\r
-\r
-#if 0
-// front end\r
-void EngineOutputPopDown()\r
-{\r
-  CheckMenuItem(GetMenu(hwndMain), IDM_ShowEngineOutput, MF_UNCHECKED);\r
-\r
-  if( engineOutputDialog ) {\r
-      ShowWindow(engineOutputDialog, SW_HIDE);\r
-  }\r
-\r
-  engineOutputDialogUp = FALSE;\r
+    ShowThinkingEvent(); // [HGM] thinking: might need to shut off thinking output\r
 }\r
 \r
-// front end. [HGM] Takes handle of output control from table, so only number is passed\r
-void DoClearMemo(int which)\r
-{\r
-        SendMessage( outputField[which][nMemo], WM_SETTEXT, 0, (LPARAM) "" );\r
-}\r
-#endif
-
 //------------------------ pure back-end routines -------------------------------\r
 \r
 \r
@@ -932,8 +609,9 @@ void EngineOutputUpdate( FrontEndProgramStats * stats )
         return;\r
     }\r
 \r
-    if(gameMode == IcsObserving) return; // [HGM] kibitz: shut up engine if we are observing an ICS game
-
+    if(gameMode == IcsObserving && !appData.icsEngineAnalyze)\r
+       return; // [HGM] kibitz: shut up engine if we are observing an ICS game\r
+\r
     which = stats->which;\r
     depth = stats->depth;\r
 \r
@@ -1078,6 +756,8 @@ int VerifyDisplayMode()
 \r
     /* Get proper mode for current game */\r
     switch( gameMode ) {\r
+    case IcsObserving:    // [HGM] ICS analyze\r
+       if(!appData.icsEngineAnalyze) return;\r
     case AnalyzeMode:\r
     case AnalyzeFile:\r
     case MachinePlaysWhite:\r
@@ -1162,7 +842,8 @@ static void UpdateControls( EngineOutputData * ed )
     else if( gameMode == TwoMachinesPlay ) {\r
         SetEngineState( ed->which, STATE_THINKING, "" );\r
     }\r
-    else if( gameMode == AnalyzeMode || gameMode == AnalyzeFile ) {\r
+    else if( gameMode == AnalyzeMode || gameMode == AnalyzeFile \r
+         || gameMode == IcsObserving && appData.icsEngineAnalyze) { // [HGM] ICS-analyze\r
         char buf[64];\r
         int time_secs = ed->time / 100;\r
         int time_mins = time_secs / 60;\r
@@ -1193,10 +874,10 @@ static void UpdateControls( EngineOutputData * ed )
         unsigned long nps_100 = ed->nodes / ed->time;\r
 \r
         if( nps_100 < 100000 ) {\r
-            sprintf( s_label, "NPS: %lu", nps_100 * 100 );\r
+            sprintf( s_label, _("NPS: %lu"), nps_100 * 100 );\r
         }\r
         else {\r
-            sprintf( s_label, "NPS: %.1fk", nps_100 / 10.0 );\r
+            sprintf( s_label, _("NPS: %.1fk"), nps_100 / 10.0 );\r
         }\r
     }\r
 \r
@@ -1214,10 +895,10 @@ static void UpdateControls( EngineOutputData * ed )
 \r
         /* Nodes */\r
         if( ed->nodes < 1000000 ) {\r
-            sprintf( s_nodes, "%lu", ed->nodes );\r
+            sprintf( s_nodes, u64Display, ed->nodes );\r
         }\r
         else {\r
-            sprintf( s_nodes, "%.1fM", ed->nodes / 1000000.0 );\r
+            sprintf( s_nodes, "%.1fM", u64ToDouble(ed->nodes) / 1000000.0 );\r
         }\r
 \r
         /* Score */\r
@@ -1254,40 +935,30 @@ int EngineOutputIsUp()
 {\r
     return engineOutputDialogUp;\r
 }\r
-
-void
-EngineOutputProc(w, event, prms, nprms)
-     Widget w;
-     XEvent *event;
-     String *prms;
-     Cardinal *nprms;
-{
-  if (engineOutputDialogUp) {
-    EngineOutputPopDown();
-  } else {
-    EngineOutputPopUp("engine output","This feature is experimental");
-  }
-//  ToNrEvent(currentMove);
-}
-
-// [HGM] kibitz: write kibitz line; split window for it if necessary
-void OutputKibitz(int window, char *text)
-{
-       if(!EngineOutputIsUp()) return;
-       if(!opponentKibitzes) { // on first kibitz of game, clear memos
-           DoClearMemo(1);
-           if(gameMode == IcsObserving) DoClearMemo(0);
-       }
-       opponentKibitzes = TRUE; // this causes split window DisplayMode in ICS modes.
-       VerifyDisplayMode();
-       if(gameMode == IcsObserving) {
-           DoSetWindowText(0, nLabel, gameInfo.white);
-           SetIcon( 0, nColorIcon,  nColorWhite);
-           SetIcon( 0, nStateIcon,  nClear);
-       }
-       DoSetWindowText(1, nLabel, gameMode == IcsPlayingBlack ? gameInfo.white : gameInfo.black); // opponent name
-       SetIcon( 1, nColorIcon,  gameMode == IcsPlayingBlack ? nColorWhite : nColorBlack);
-       SetIcon( 1, nStateIcon,  nClear);
-       InsertIntoMemo(window-1, text);
-}
-
+\r
+void\r
+EngineOutputProc(w, event, prms, nprms)\r
+     Widget w;\r
+     XEvent *event;\r
+     String *prms;\r
+     Cardinal *nprms;\r
+{\r
+  if (engineOutputDialogUp) {\r
+    EngineOutputPopDown();\r
+  } else {\r
+    EngineOutputPopUp(_("engine output"),_("This feature is experimental"));\r
+  }\r
+//  ToNrEvent(currentMove);\r
+}\r
+\r
+// [HGM] kibitz: write kibitz line; split window for it if necessary\r
+void OutputKibitz(char *text)\r
+{\r
+       if(!EngineOutputIsUp()) return;\r
+       if(!opponentKibitzes) DoClearMemo(1);\r
+       opponentKibitzes = TRUE; // thas causes split window DisplayMode in ICS modes.\r
+       VerifyDisplayMode();\r
+       DoSetWindowText(1, nLabel, gameMode == IcsPlayingWhite ? gameInfo.black : gameInfo.white); // opponent name\r
+       SetIcon( 1, nColorIcon,  gameMode == IcsPlayingWhite ? nColorBlack : nColorWhite);\r
+       InsertIntoMemo(1, text);\r
+}\r