Fix running of clock during hash allocation engine
[xboard.git] / xengineoutput.c
index de62d98..02446e1 100644 (file)
@@ -5,7 +5,7 @@
  *
  * Copyright 2005 Alessandro Scotti
  *
- * Enhancements Copyright 2009, 2010 Free Software Foundation, Inc.
+ * Enhancements Copyright 2009, 2010, 2011 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[] =
-":Ctrl<Key>c: CopyMemoProc() \n";
+":Ctrl<Key>c: CopyMemoProc() \n \
+<Btn3Motion>: HandlePV() \n \
+<Btn3Down>: select-start() SelectPV() \n \
+<Btn3Up>: 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];
@@ -540,7 +571,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;
@@ -568,7 +599,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;