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