fixed Makefile.am to include gtk-interface.xml and svg files
[xboard.git] / xengineoutput.c
index f7f5638..49d4c77 100644 (file)
@@ -65,6 +65,8 @@ extern char *getenv();
 #include <X11/Xaw/Text.h>
 #include <X11/Xaw/AsciiText.h>
 #include <X11/Xaw/Viewport.h>
+#include <X11/Xatom.h>
+#include <X11/Xmu/Atoms.h>
 
 #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[] =
+":Ctrl<Key>c: 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"),