void EngineOutputPopUp () { static int needInit = TRUE; static char *title = N_("Engine output"); if (GenericPopUp(engoutOptions, _(title), EngOutDlg, BoardWindow, NONMODAL, appData.topLevel)) { if(engoutOptions[STRIDE-1].type != Break) DisplayFatalError(_("Mismatch of STRIDE in nengineoutput.c\nChange and recompile!"), 0, 2); AddHandler(&engoutOptions[MEMO], EngOutDlg, 6); AddHandler(&engoutOptions[MEMO+STRIDE], EngOutDlg, 6); if( needInit ) { InitEngineOutput(&engoutOptions[0], &engoutOptions[MEMO]); // make icon bitmaps needInit = FALSE; } SetEngineColorIcon( 0 ); SetEngineColorIcon( 1 ); SetEngineState( 0, STATE_IDLE, "" ); SetEngineState( 1, STATE_IDLE, "" ); } else { SetIconName(EngOutDlg, _(title)); SetDialogTitle(EngOutDlg, _(title)); } MarkMenu("View.EngineOutput", EngOutDlg); ShowThinkingEvent(); // [HGM] thinking: might need to prompt engine for thinking output }
void EngineOutputPopUp () { Arg args[16]; int j; Widget edit; static int needInit = TRUE; static char *title = N_("Engine output"), *text = N_("This feature is experimental"); if (engineOutputShell == NULL) { engineOutputShell = EngineOutputCreate(_(title), _(text)); XtRealizeWidget(engineOutputShell); CatchDeleteWindow(engineOutputShell, "EngineOutputPopDown"); if( needInit ) { InitializeEngineOutput(); needInit = FALSE; } SetEngineColorIcon( 0 ); SetEngineColorIcon( 1 ); SetEngineState( 0, STATE_IDLE, "" ); SetEngineState( 1, STATE_IDLE, "" ); } else { edit = XtNameToWidget(engineOutputShell, "*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(engineOutputShell, args, j); } XtPopup(engineOutputShell, XtGrabNone); XSync(xDisplay, False); j=0; XtSetArg(args[j], XtNleftBitmap, xMarkPixmap); j++; XtSetValues(XtNameToWidget(menuBarWidget, "menuView.Show Engine Output"), args, j); engineOutputDialogUp = True; ShowThinkingEvent(); // [HGM] thinking: might need to prompt engine for thinking output }
// pure back end, now SetWindowText is called via wrapper DoSetWindowText static void UpdateControls (EngineOutputData *ed) { // int isPondering = FALSE; char s_label[MAX_NAME_LENGTH + 32]; int h; char * name = ed->name; /* Label */ if( name == 0 || *name == '\0' ) { name = "?"; } strncpy( s_label, name, MAX_NAME_LENGTH ); s_label[ MAX_NAME_LENGTH-1 ] = '\0'; #ifdef SHOW_PONDERING if( IsEnginePondering( ed->which ) ) { char buf[8]; buf[0] = '\0'; if( ed->hint != 0 && *ed->hint != '\0' ) { strncpy( buf, ed->hint, sizeof(buf) ); buf[sizeof(buf)-1] = '\0'; } else if( ed->pv != 0 && *ed->pv != '\0' ) { char * sep = strchr( ed->pv, ' ' ); int buflen = sizeof(buf); if( sep != NULL ) { buflen = sep - ed->pv + 1; if( buflen > sizeof(buf) ) buflen = sizeof(buf); } strncpy( buf, ed->pv, buflen ); buf[ buflen-1 ] = '\0'; } SetEngineState( ed->which, STATE_PONDERING, buf ); } else if( gameMode == TwoMachinesPlay ) { SetEngineState( ed->which, STATE_THINKING, "" ); } 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; buf[0] = '\0'; if( ed->an_move_index != 0 && ed->an_move_count != 0 && *ed->hint != '\0' ) { char mov[16]; strncpy( mov, ed->hint, sizeof(mov) ); mov[ sizeof(mov)-1 ] = '\0'; snprintf( buf, sizeof(buf)/sizeof(buf[0]), "[%d] %d/%d: %s [%02d:%02d:%02d]", ed->depth, ed->an_move_index, ed->an_move_count, mov, time_mins / 60, time_mins % 60, time_secs % 60 ); } SetEngineState( ed->which, STATE_ANALYZING, buf ); } else { SetEngineState( ed->which, STATE_IDLE, "" ); } #endif DoSetWindowText( ed->which, nLabel, s_label ); s_label[0] = '\0'; if( ed->time > 0 && ed->nodes > 0 ) { unsigned long nps_100 = ed->nodes / ed->time; if( nps_100 < 100000 ) { snprintf( s_label, sizeof(s_label)/sizeof(s_label[0]), "%s: %lu", _("NPS"), nps_100 * 100 ); } else { snprintf( s_label, sizeof(s_label)/sizeof(s_label[0]), "%s: %.1fk", _("NPS"), nps_100 / 10.0 ); } } DoSetWindowText( ed->which, nLabelNPS, s_label ); /* Memo */ if( ed->pv != 0 && *ed->pv != '\0' ) { char s_nodes[24]; char s_score[16]; char s_time[24]; char buf[256]; int buflen; int time_secs = ed->time / 100; int time_cent = ed->time % 100; /* Nodes */ if( ed->nodes < 1000000 ) { snprintf( s_nodes, sizeof(s_nodes)/sizeof(s_nodes[0]), u64Display, ed->nodes ); } else { snprintf( s_nodes, sizeof(s_nodes)/sizeof(s_nodes[0]), "%.1fM", u64ToDouble(ed->nodes) / 1000000.0 ); } /* Score */ h = ((gameMode == AnalyzeMode && appData.whitePOV || appData.scoreWhite) && !WhiteOnMove(currentMove) ? -1 : 1) * ed->score; if( h > 0 ) { snprintf( s_score, sizeof(s_score)/sizeof(s_score[0]), "+%.2f", h / 100.0 ); } else { snprintf( s_score, sizeof(s_score)/sizeof(s_score[0]), "%.2f", h / 100.0 ); } /* Time */ snprintf( s_time, sizeof(s_time)/sizeof(s_time[0]), "%d:%02d.%02d", time_secs / 60, time_secs % 60, time_cent ); /* Put all together... */ if(ed->nodes == 0 && ed->score == 0 && ed->time == 0) snprintf( buf, sizeof(buf)/sizeof(buf[0]), "%3d\t", ed->depth ); else snprintf( buf, sizeof(buf)/sizeof(buf[0]), "%3d\t%s\t%s\t%s\t", ed->depth, s_score, s_nodes, s_time ); /* Add PV */ buflen = strlen(buf); strncpy( buf + buflen, ed->pv, sizeof(buf) - buflen ); buf[ sizeof(buf) - 3 ] = '\0'; strcat( buf + buflen, "\r\n" ); /* Update memo */ InsertIntoMemo( ed->which, buf, InsertionPoint(strlen(buf), ed) ); strncpy(lastLine[ed->which], buf, MSG_SIZ); } /* Colors */ SetEngineColorIcon( ed->which ); }