X-Git-Url: http://winboard.nl/cgi-bin?a=blobdiff_plain;f=xengineoutput.c;h=11b06950a48a811d75e16c3f29528cd878b78508;hb=56310c5b198bc521e0a715377c68378b7bcf10a5;hp=f7f56385b4f6672ac6b3a603577314e755fd368d;hpb=06d3d751525f40869ef6dfd96e33c590008123c2;p=xboard.git diff --git a/xengineoutput.c b/xengineoutput.c index f7f5638..11b0695 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, 2011 Free Software Foundation, Inc. * * ------------------------------------------------------------------------ * @@ -65,6 +65,8 @@ extern char *getenv(); #include #include #include +#include +#include #include "common.h" #include "frontend.h" @@ -98,14 +100,6 @@ extern char *getenv(); #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; - Pixmap icons[8]; // [HGM] this front-end array translates back-end icon indicator to handle Widget outputField[2][7]; // [HGM] front-end array to translate output field to window handle @@ -114,13 +108,6 @@ void engineOutputPopUp(); int EngineOutputIsUp(); void SetEngineColorIcon( int which ); -/* Imports from backend.c */ -char * SavePart(char *str); -extern int opponentKibitzes; - -/* Imports from xboard.c */ -extern Arg layoutArgs[2], formArgs[2], messageArgs[4]; - //extern WindowPlacement wpEngineOutput; Position engineOutputX = -1, engineOutputY = -1; @@ -130,6 +117,7 @@ static int engineOutputDialogUp; /* Module variables */ int windowMode = 1; +static int currentPV, highTextStart[2], highTextEnd[2]; typedef struct { char * name; @@ -155,13 +143,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); @@ -173,22 +160,37 @@ static void InitializeEngineOutput() } void DoSetWindowText(int which, int field, char *s_label) -{ +{ Arg arg; XtSetArg(arg, XtNlabel, (XtArgVal) s_label); XtSetValues(outputField[which][field], &arg, 1); } +void SetEngineOutputTitle(char *title) +{ + Arg arg; + XtSetArg(arg, XtNtitle, (XtArgVal) title); + XtSetValues(engineOutputShell, &arg, 1); +} + 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, + * 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 ) @@ -202,21 +204,97 @@ void SetIcon( int which, int field, int nIcon ) } void DoClearMemo(int which) -{ - Arg args[16]; - int j; - Widget edit; +{ + Widget edit = XtNameToWidget(engineOutputShell, which ? "*form2.text" : "*form.text"); + Arg arg; +// XtCallActionProc(edit, "select-all", NULL, NULL, 0); +// XtCallActionProc(edit, "kill-selection", NULL, NULL, 0); + XtSetArg(arg, XtNstring, ""); // clear without disturbing selection! + XtSetValues(edit, &arg, 1); +} - 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 + +Boolean SendPositionSelection(Widget w, Atom *selection, Atom *target, + Atom *type_return, XtPointer *value_return, + unsigned long *length_return, int *format_return); // from xboard.c +void SetFocus(Widget w, XtPointer data, XEvent *event, Boolean *b); // from xoptions.c + +char memoTranslations[] = +":Ctrlc: CopyMemoProc() \n \ +: HandlePV() \n \ +Shift: select-start() SelectPV(1) \n \ +Any: select-start() SelectPV(0) \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); + shiftKey = strcmp(params[0], "0"); + 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, + Atom *type, XtPointer value, unsigned long *len, int *format) +{ + if (value==NULL || *len==0) return; /* nothing had been selected to copy */ + selected_fen_position = value; + selected_fen_position[*len]='\0'; /* normally this string is terminated, but be safe */ + XtOwnSelection(menuBarWidget, XA_CLIPBOARD(xDisplay), + CurrentTime, + SendPositionSelection, + NULL/* lose_ownership_proc */ , + NULL/* transfer_done_proc */); +} + +void CopyMemoProc(w, event, prms, nprms) + Widget w; + XEvent *event; + String *prms; + Cardinal *nprms; +{ + if(appData.pasteSelection) return; + if (selected_fen_position) free(selected_fen_position); + XtGetSelectionValue(menuBarWidget, + XA_PRIMARY, XA_STRING, + /* (XtSelectionCallbackProc) */ MemoCB, + NULL, /* client_data passed to PastePositionCB */ + + /* better to use the time field from the event that triggered the + * call to this function, but that isn't trivial to get + */ + CurrentTime + ); } // The following routines are mutated clones of the commentPopUp routines -void PositionControlSet(which, form, bw_width) +void PositionControlSet(which, shell, form, bw_width) int which; - Widget form; + Widget shell, form; Dimension bw_width; { Arg args[16]; @@ -311,6 +389,9 @@ void PositionControlSet(which, form, bw_width) outputField[which][nMemo] = edit = XtCreateManagedWidget("text", asciiTextWidgetClass, form, args, j); + XtOverrideTranslations(edit, XtParseTranslationTable(memoTranslations)); + XtAddEventHandler(edit, ButtonPressMask, False, SetFocus, (XtPointer) shell); + j = 0; XtSetArg(args[j], XtNfromVert, ColorWidget); j++; // XtSetArg(args[j], XtNresizable, (XtArgVal) True); j++; @@ -321,7 +402,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; @@ -335,7 +416,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, @@ -361,8 +442,8 @@ Widget EngineOutputCreate(name, text) XtSetValues(shell, args, j); // fill up both forms with control elements - PositionControlSet(0, form, bw_width); - PositionControlSet(1, form2, bw_width); + PositionControlSet(0, shell, form, bw_width); + PositionControlSet(1, shell, form2, bw_width); XtRealizeWidget(shell); @@ -376,8 +457,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; @@ -406,7 +486,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; } @@ -448,18 +527,18 @@ void ResizeWindowControls(mode) } } -void +void EngineOutputPopUp() { Arg args[16]; int j; Widget edit; static int needInit = TRUE; - static char *title = _("Engine output"), *text = _("This feature is experimental"); + static char *title = N_("Engine output"), *text = N_("This feature is experimental"); if (engineOutputShell == NULL) { engineOutputShell = - EngineOutputCreate(title, text); + EngineOutputCreate(_(title), _(text)); XtRealizeWidget(engineOutputShell); CatchDeleteWindow(engineOutputShell, "EngineOutputPopDown"); if( needInit ) { @@ -476,8 +555,8 @@ EngineOutputPopUp() 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++; + XtSetArg(args[j], XtNiconName, (XtArgVal) _(title)); j++; + XtSetArg(args[j], XtNtitle, (XtArgVal) _(title)); j++; XtSetValues(engineOutputShell, args, j); } @@ -486,7 +565,7 @@ EngineOutputPopUp() j=0; XtSetArg(args[j], XtNleftBitmap, xMarkPixmap); j++; - XtSetValues(XtNameToWidget(menuBarWidget, "menuMode.Show Engine Output"), + XtSetValues(XtNameToWidget(menuBarWidget, "menuView.Show Engine Output"), args, j); engineOutputDialogUp = True; @@ -514,7 +593,7 @@ void EngineOutputPopDown() XSync(xDisplay, False); j=0; XtSetArg(args[j], XtNleftBitmap, None); j++; - XtSetValues(XtNameToWidget(menuBarWidget, "menuMode.Show Engine Output"), + XtSetValues(XtNameToWidget(menuBarWidget, "menuView.Show Engine Output"), args, j); engineOutputDialogUp = False;