X-Git-Url: http://winboard.nl/cgi-bin?a=blobdiff_plain;f=winboard%2Fwengineo.c;h=936fcd86fd9b6f7ce8fafde90061558ad52946e2;hb=8c94141e6c30dc94777dee5824cfbf027a18f940;hp=1c3238f5d3ed61d0007c2bad715e3e089fd74092;hpb=044c57fe38b45daa427c1374c8765ecd55778832;p=xboard.git diff --git a/winboard/wengineo.c b/winboard/wengineo.c index 1c3238f..936fcd8 100644 --- a/winboard/wengineo.c +++ b/winboard/wengineo.c @@ -34,9 +34,9 @@ #include #include "common.h" -#include "winboard.h" #include "frontend.h" #include "backend.h" +#include "winboard.h" #include "wsnap.h" @@ -61,27 +61,8 @@ HICON icons[8]; // [HGM] this front-end array translates back-end icon indicator HWND outputField[2][7]; // [HGM] front-end array to translate output field to window handle -void EngineOutputPopUp(); -void EngineOutputPopDown(); -int EngineOutputIsUp(); - #define SHOW_PONDERING -/* Imports from backend.c */ -char * SavePart(char *str); -extern int opponentKibitzes; - -/* Imports from winboard.c */ -extern HWND engineOutputDialog; -extern int engineOutputDialogUp; - -extern HINSTANCE hInst; -extern HWND hwndMain; - -extern WindowPlacement wpEngineOutput; - -extern BoardSize boardSize; - /* Module variables */ #define H_MARGIN 2 #define V_MARGIN 2 @@ -97,12 +78,11 @@ extern BoardSize boardSize; #define STATE_ANALYZING 3 static int windowMode = 1; - static int needInit = TRUE; - static int lastDepth[2] = { -1, -1 }; static int lastForwardMostMove[2] = { -1, -1 }; static int engineState[2] = { -1, -1 }; +static BOOLEAN engineOutputDialogUp = FALSE; typedef struct { // HWND hColorIcon; // [HGM] the output-control handles are no loger passed, @@ -306,9 +286,9 @@ static void ResizeWindowControls( HWND hDlg, int mode ) } // front end. Actual printing of PV lines into the output field -static void InsertIntoMemo( int which, char * text ) +static void InsertIntoMemo( int which, char * text, int where ) { - SendMessage( outputField[which][nMemo], EM_SETSEL, 0, 0 ); + SendMessage( outputField[which][nMemo], EM_SETSEL, where, where ); // [HGM] multivar: choose insertion point SendMessage( outputField[which][nMemo], EM_REPLACESEL, (WPARAM) FALSE, (LPARAM) text ); } @@ -454,6 +434,8 @@ void DoClearMemo(int which) //------------------------ pure back-end routines ------------------------------- +#define MAX_VAR 400 +static int scores[MAX_VAR], textEnd[MAX_VAR], curDepth[2], nrVariations[2]; // back end, due to front-end wrapper for SetWindowText, and new SetIcon arguments static void SetEngineState( int which, int state, char * state_data ) @@ -544,7 +526,7 @@ void EngineOutputUpdate( FrontEndProgramStats * stats ) clearMemo = TRUE; } - if( clearMemo ) DoClearMemo(which); + if( clearMemo ) { DoClearMemo(which); nrVariations[which] = 0; } /* Update */ lastDepth[which] = depth == 1 && ed.nodes == 0 ? 0 : depth; // [HGM] info-line kudge @@ -691,6 +673,38 @@ static void SetEngineColorIcon( int which ) #define MAX_NAME_LENGTH 32 +// [HGM] multivar: sort Thinking Output within one depth on score + +static int InsertionPoint( int len, EngineOutputData * ed ) +{ + int i, offs = 0, newScore = ed->score, n = ed->which; + + if(ed->nodes == 0 && ed->score == 0 && ed->time == 0) + newScore = 1e6; // info lines inserted on top + if(ed->depth != curDepth[n]) { // depth has changed + curDepth[n] = ed->depth; + nrVariations[n] = 0; // throw away everything we had + } + // loop through all lines. Note even / odd used for different panes + for(i=nrVariations[n]-2; i>=0; i-=2) { + // put new item behind those we haven't looked at + offs = textEnd[i+n]; + textEnd[i+n+2] = offs + len; + scores[i+n+2] = newScore; + if(newScore < scores[i+n]) break; + // if it had higher score as previous, move previous in stead + scores[i+n+2] = scores[i+n]; + textEnd[i+n+2] = textEnd[i+n] + len; + } + if(i<0) { + offs = 0; + textEnd[n] = offs + len; + scores[n] = newScore; + } + nrVariations[n] += 2; + return offs; +} + // pure back end, now SetWindowText is called via wrapper DoSetWindowText static void UpdateControls( EngineOutputData * ed ) { @@ -820,7 +834,7 @@ static void UpdateControls( EngineOutputData * ed ) strcat( buf + buflen, "\r\n" ); /* Update memo */ - InsertIntoMemo( ed->which, buf ); + InsertIntoMemo( ed->which, buf, InsertionPoint(strlen(buf), ed) ); } /* Colors */ @@ -851,5 +865,5 @@ void OutputKibitz(int window, char *text) 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); + InsertIntoMemo(window-1, text, 0); // [HGM] multivar: always at top }