X-Git-Url: http://winboard.nl/cgi-bin?a=blobdiff_plain;f=xengineoutput.c;h=f1ab45297e51b0b997fadf58e97b55684a72ed34;hb=94a0b32d0e66365ad23f99e1a6e162b0168b9e2a;hp=e7d8b6b3b0af168891592f35072b8ddf335aa898;hpb=292d1fc96afcdd5aececf3ec0da28c56bfb1a5a6;p=xboard.git diff --git a/xengineoutput.c b/xengineoutput.c index e7d8b6b..f1ab452 100644 --- a/xengineoutput.c +++ b/xengineoutput.c @@ -5,7 +5,7 @@ * * Copyright 2005 Alessandro Scotti * - * Enhancements Copyright 2009 Free Software Foundation, Inc. + * Enhancements Copyright 2009, 2010 Free Software Foundation, Inc. * * ------------------------------------------------------------------------ * @@ -131,6 +131,7 @@ static int engineOutputDialogUp; /* Module variables */ int windowMode = 1; +static int currentPV, highTextStart[2], highTextEnd[2]; typedef struct { char * name; @@ -156,13 +157,12 @@ void ReadIcon(char *pixData[], int iconNr) &(icons[iconNr]), NULL, NULL /*&attr*/)) != 0) { fprintf(stderr, _("Error %d loading icon image\n"), r); - exit(1); - } + exit(1); + } } static void InitializeEngineOutput() -{ int i; - +{ ReadIcon(WHITE_14, nColorWhite); ReadIcon(BLACK_14, nColorBlack); ReadIcon(UNKNOWN_14, nColorUnknown); @@ -174,7 +174,7 @@ static void InitializeEngineOutput() } void DoSetWindowText(int which, int field, char *s_label) -{ +{ Arg arg; XtSetArg(arg, XtNlabel, (XtArgVal) s_label); @@ -183,17 +183,21 @@ void DoSetWindowText(int which, int field, char *s_label) void InsertIntoMemo( int which, char * text, int where ) { - Arg arg; XawTextBlock t; Widget edit; + XawTextBlock t; + Widget edit; - /* the backend adds \r\n, which is needed for winboard, + /* the backend adds \r\n, which is needed for winboard, * for xboard we delete them again over here */ if(t.ptr = strchr(text, '\r')) *t.ptr = ' '; t.ptr = text; t.firstPos = 0; t.length = strlen(text); t.format = XawFmt8Bit; edit = XtNameToWidget(engineOutputShell, which ? "*form2.text" : "*form.text"); XawTextReplace(edit, where, where, &t); -// XtSetArg(arg, XtNstring, (XtArgVal) text); -// XtSetValues(outputField[which][nMemo], &arg, 1); + if(where < highTextStart[which]) { // [HGM] multiPVdisplay: move highlighting + int len = strlen(text); + highTextStart[which] += len; highTextEnd[which] += len; + XawTextSetSelection( outputField[which][nMemo], highTextStart[which], highTextEnd[which] ); + } } void SetIcon( int which, int field, int nIcon ) @@ -207,14 +211,12 @@ void SetIcon( int which, int field, int nIcon ) } 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); + edit = XtNameToWidget(engineOutputShell, which ? "*form2.text" : "*form.text"); + XtCallActionProc(edit, "select-all", NULL, NULL, 0); + XtCallActionProc(edit, "kill-selection", NULL, NULL, 0); } // cloned from CopyPositionProc. Abuse selected_fen_position to hold selection @@ -227,7 +229,38 @@ Boolean SendPositionSelection(Widget w, Atom *selection, Atom *target, void SetFocus(Widget w, XtPointer data, XEvent *event, Boolean *b); // from xoptions.c char memoTranslations[] = -":Ctrlc: CopyMemoProc() \n"; +":Ctrlc: CopyMemoProc() \n \ +: HandlePV() \n \ +: select-start() SelectPV() \n \ +: extend-end() StopPV() \n"; + +void +SelectPV (Widget w, XEvent * event, String * params, Cardinal * nParams) +{ // [HGM] pv: translate click to PV line, and load it for display + String val; + int start, end; + XawTextPosition index, dummy; + int x, y; + Arg arg; + + x = event->xmotion.x; y = event->xmotion.y; + currentPV = (w == outputField[1][nMemo]); + XawTextGetSelectionPos(w, &index, &dummy); + XtSetArg(arg, XtNstring, &val); + XtGetValues(w, &arg, 1); + if(LoadMultiPV(x, y, val, index, &start, &end)) { + XawTextSetSelection( outputField[currentPV][nMemo], start, end ); + highTextStart[currentPV] = start; highTextEnd[currentPV] = end; + } +} + +void +StopPV (Widget w, XEvent * event, String * params, Cardinal * nParams) +{ // [HGM] pv: on right-button release, stop displaying PV + XawTextUnsetSelection( w ); + highTextStart[currentPV] = highTextEnd[currentPV] = 0; + UnLoadPV(); +} static void MemoCB(Widget w, XtPointer client_data, Atom *selection, @@ -251,7 +284,7 @@ void CopyMemoProc(w, event, prms, nprms) { if(appData.pasteSelection) return; if (selected_fen_position) free(selected_fen_position); - XtGetSelectionValue(menuBarWidget, + XtGetSelectionValue(menuBarWidget, XA_PRIMARY, XA_STRING, /* (XtSelectionCallbackProc) */ MemoCB, NULL, /* client_data passed to PastePositionCB */ @@ -375,7 +408,7 @@ Widget EngineOutputCreate(name, text) char *name, *text; { Arg args[16]; - Widget shell, layout, form, form2, edit; + Widget shell, layout, form, form2; Dimension bw_width, bw_height; int j; @@ -389,7 +422,7 @@ Widget EngineOutputCreate(name, text) j = 0; XtSetArg(args[j], XtNresizable, True); j++; shell = -#if TOPLEVEL +#if TOPLEVEL XtCreatePopupShell(name, topLevelShellWidgetClass, #else XtCreatePopupShell(name, transientShellWidgetClass, @@ -430,8 +463,7 @@ Widget EngineOutputCreate(name, text) if (engineOutputX == -1) { int xx, yy; Window junk; - Dimension pw_height; - Dimension ew_height; + engineOutputH = bw_height/2; engineOutputW = bw_width-16; @@ -460,7 +492,6 @@ Widget EngineOutputCreate(name, text) XtSetArg(args[j], XtNx, engineOutputX); j++; XtSetArg(args[j], XtNy, engineOutputY); j++; XtSetValues(shell, args, j); -// XtSetKeyboardFocus(shell, edit); return shell; } @@ -502,7 +533,7 @@ void ResizeWindowControls(mode) } } -void +void EngineOutputPopUp() { Arg args[16];