X-Git-Url: http://winboard.nl/cgi-bin?a=blobdiff_plain;f=xengineoutput.c;h=49d4c77c7ce1bb169c2b3931577cb431b7369a6e;hb=a84055fab56abd3cb232692e6d7f24d122f74497;hp=f7f56385b4f6672ac6b3a603577314e755fd368d;hpb=06d3d751525f40869ef6dfd96e33c590008123c2;p=xboard.git diff --git a/xengineoutput.c b/xengineoutput.c index f7f5638..49d4c77 100644 --- a/xengineoutput.c +++ b/xengineoutput.c @@ -65,6 +65,8 @@ extern char *getenv(); #include #include #include +#include +#include #include "common.h" #include "frontend.h" @@ -99,8 +101,7 @@ extern char *getenv(); #define _LL_ 100 // imports from xboard.c -extern Widget formWidget, shellWidget, boardWidget, menuBarWidget; -extern Display *xDisplay; +extern Widget formWidget, boardWidget, menuBarWidget; extern Window xBoardWindow; extern int squareSize; extern Pixmap xMarkPixmap, wIconPixmap, bIconPixmap; @@ -115,7 +116,6 @@ int EngineOutputIsUp(); void SetEngineColorIcon( int which ); /* Imports from backend.c */ -char * SavePart(char *str); extern int opponentKibitzes; /* Imports from xboard.c */ @@ -150,13 +150,13 @@ 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); - exit(1); - } +// if ((r=XpmCreatePixmapFromData(xDisplay, XtWindow(outputField[0][nColorIcon]), +// pixData, +// &(icons[iconNr]), +// NULL, NULL /*&attr*/)) != 0) { +// fprintf(stderr, _("Error %d loading icon image\n"), r); +// exit(1); +// } } static void InitializeEngineOutput() @@ -184,6 +184,10 @@ void InsertIntoMemo( int which, char * text, int where ) { Arg arg; 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); @@ -212,11 +216,57 @@ void DoClearMemo(int which) XtCallActionProc(edit, "kill-selection", NULL, NULL, 0); } +// cloned from CopyPositionProc. Abuse selected_fen_position to hold selection + +extern char *selected_fen_position; + +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"; + +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 +361,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++; @@ -336,14 +389,14 @@ Widget EngineOutputCreate(name, text) XtSetArg(args[j], XtNresizable, True); j++; shell = #if TOPLEVEL - XtCreatePopupShell(name, topLevelShellWidgetClass, + // XtCreatePopupShell(name, topLevelShellWidgetClass, #else - XtCreatePopupShell(name, transientShellWidgetClass, + // XtCreatePopupShell(name, transientShellWidgetClass, #endif - shellWidget, args, j); - layout = - XtCreateManagedWidget(layoutName, formWidgetClass, shell, - layoutArgs, XtNumber(layoutArgs)); + // shellWidget, args, j); +// layout = +// XtCreateManagedWidget(layoutName, formWidgetClass, shell, +// layoutArgs, XtNumber(layoutArgs)); // divide window vertically into two equal parts, by creating two forms form = XtCreateManagedWidget("form", formWidgetClass, layout, @@ -361,8 +414,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); @@ -381,20 +434,20 @@ Widget EngineOutputCreate(name, text) engineOutputH = bw_height/2; engineOutputW = bw_width-16; - XSync(xDisplay, False); + // XSync(xDisplay, False); #ifdef NOTDEF /* This code seems to tickle an X bug if it is executed too soon after xboard starts up. The coordinates get transformed as if the main window was positioned at (0, 0). */ - XtTranslateCoords(shellWidget, - (bw_width - engineOutputW) / 2, 0 - engineOutputH / 2, - &engineOutputX, &engineOutputY); +// XtTranslateCoords(shellWidget, +// (bw_width - engineOutputW) / 2, 0 - engineOutputH / 2, +// &engineOutputX, &engineOutputY); #else /*!NOTDEF*/ - XTranslateCoordinates(xDisplay, XtWindow(shellWidget), - RootWindowOfScreen(XtScreen(shellWidget)), - (bw_width - engineOutputW) / 2, 0 - engineOutputH / 2, - &xx, &yy, &junk); +// XTranslateCoordinates(xDisplay, XtWindow(shellWidget), +// RootWindowOfScreen(XtScreen(shellWidget)), +// (bw_width - engineOutputW) / 2, 0 - engineOutputH / 2, +// &xx, &yy, &junk); engineOutputX = xx; engineOutputY = yy; #endif /*!NOTDEF*/ @@ -461,7 +514,7 @@ EngineOutputPopUp() engineOutputShell = EngineOutputCreate(title, text); XtRealizeWidget(engineOutputShell); - CatchDeleteWindow(engineOutputShell, "EngineOutputPopDown"); + // CatchDeleteWindow(engineOutputShell, "EngineOutputPopDown"); if( needInit ) { InitializeEngineOutput(); needInit = FALSE; @@ -482,7 +535,7 @@ EngineOutputPopUp() } XtPopup(engineOutputShell, XtGrabNone); - XSync(xDisplay, False); + // XSync(xDisplay, False); j=0; XtSetArg(args[j], XtNleftBitmap, xMarkPixmap); j++; @@ -511,7 +564,7 @@ void EngineOutputPopDown() wpEngineOutput.width = engineOutputW; wpEngineOutput.height = engineOutputH; XtPopdown(engineOutputShell); - XSync(xDisplay, False); + // XSync(xDisplay, False); j=0; XtSetArg(args[j], XtNleftBitmap, None); j++; XtSetValues(XtNameToWidget(menuBarWidget, "menuMode.Show Engine Output"),