*
* Copyright 2005 Alessandro Scotti
*
- * Enhancements Copyright 2009 Free Software Foundation, Inc.
+ * Enhancements Copyright 2009, 2010 Free Software Foundation, Inc.
*
* ------------------------------------------------------------------------
*
#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"
void SetEngineColorIcon( int which );
/* Imports from backend.c */
-char * SavePart(char *str);
extern int opponentKibitzes;
/* Imports from xboard.c */
/* Module variables */
int windowMode = 1;
+static int currentPV, highTextStart[2], highTextEnd[2];
typedef struct {
char * name;
&(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);
}
void DoSetWindowText(int which, int field, char *s_label)
-{
+{
Arg arg;
XtSetArg(arg, XtNlabel, (XtArgVal) 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,
+ * 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 )
}
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
+
+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 \
+<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,
+ 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];
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++;
char *name, *text;
{
Arg args[16];
- Widget shell, layout, form, form2, edit;
+ Widget shell, layout, form, form2;
Dimension bw_width, bw_height;
int j;
j = 0;
XtSetArg(args[j], XtNresizable, True); j++;
shell =
-#if TOPLEVEL
+#if TOPLEVEL
XtCreatePopupShell(name, topLevelShellWidgetClass,
#else
XtCreatePopupShell(name, transientShellWidgetClass,
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);
if (engineOutputX == -1) {
int xx, yy;
Window junk;
- Dimension pw_height;
- Dimension ew_height;
+
engineOutputH = bw_height/2;
engineOutputW = bw_width-16;
XtSetArg(args[j], XtNx, engineOutputX); j++;
XtSetArg(args[j], XtNy, engineOutputY); j++;
XtSetValues(shell, args, j);
-// XtSetKeyboardFocus(shell, edit);
return shell;
}
}
}
-void
+void
EngineOutputPopUp()
{
Arg args[16];
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;
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;