From dcb381e902c84b25e2a7301c5ba1d9f437503b5b Mon Sep 17 00:00:00 2001 From: H.G. Muller Date: Fri, 23 Mar 2012 15:17:14 +0100 Subject: [PATCH] Redo Engine Output window with generic popup A new file nengineoutput.c holds the X-independent code. This makes use of new capablities of GenerciPopup, for having Label widgets on same row, stacking panes after a Break, and chaining Label and Text widgets. --- Makefile.am | 2 +- dialogs.h | 2 + engineoutput.h | 16 ++- nengineoutput.c | 160 ++++++++++++++++++++ xboard.c | 11 +- xboard.h | 5 + xengineoutput.c | 434 ++++++------------------------------------------------ xoptions.c | 5 +- 8 files changed, 236 insertions(+), 399 deletions(-) create mode 100644 nengineoutput.c diff --git a/Makefile.am b/Makefile.am index 548a6da..fe7da8c 100644 --- a/Makefile.am +++ b/Makefile.am @@ -24,7 +24,7 @@ xboard_SOURCES = backend.c backend.h backendz.h \ board.c board.h \ xedittags.c xedittags.h \ engineoutput.c engineoutput.h \ - xengineoutput.c \ + nengineoutput.c xengineoutput.c \ evalgraph.c evalgraph.h xevalgraph.c xevalgraph.h\ xgamelist.c xgamelist.h\ history.c xhistory.c xhistory.h \ diff --git a/dialogs.h b/dialogs.h index 417bd1c..835b369 100644 --- a/dialogs.h +++ b/dialogs.h @@ -83,6 +83,7 @@ typedef enum { // identifier of dialogs done by GenericPopup TransientDlg=0, // transient: grabs mouse events and is destroyed at pop-down (so other dialog can use this ID next time) CommentDlg, TagsDlg, TextMenuDlg, InputBoxDlg, NoDlg, BrowserDlg, HistoryDlg, // persistent: no grab and reused GameListDlg, +EngOutDlg, PromoDlg, // this and beyond are destroyed at pop-down ErrorDlg, AskDlg, // this and beyond do grab mouse events (and are destroyed) @@ -122,6 +123,7 @@ void GetWidgetText P((Option *opt, char **buf)); void SetWidgetText P((Option *opt, char *buf, int n)); void GetWidgetState P((Option *opt, int *state)); void SetWidgetState P((Option *opt, int state)); +void SetWidgetLabel P((Option *opt, char *buf)); void SetDialogTitle P((DialogClass dlg, char *title)); void LoadListBox P((Option *opt, char *emptyText)); void HighlightListBoxItem P((Option *opt, int nr)); diff --git a/engineoutput.h b/engineoutput.h index 8c396d2..bab71f8 100644 --- a/engineoutput.h +++ b/engineoutput.h @@ -34,11 +34,14 @@ // [HGM] same for output fields (note that there are two of each type, one per color) #define nColorIcon 1 -#define nStateIcon 2 -#define nLabel 3 +#define nLabel 2 +#define nStateIcon 3 #define nStateData 4 #define nLabelNPS 5 -#define nMemo 6 +#define nMemo 6 /* must match the ranking of the TextBox in following option list! */ + +#define STRIDE 7 /* must match the number of option in one pane! */ +#define MEMO (nMemo-1) /* Module variables */ #define H_MARGIN 2 @@ -61,6 +64,7 @@ extern char exclusionHeader[]; void SetEngineState( int which, int state, char * state_data ); // front-end called by back-end +void SetEngineColorIcon( int which ); void SetIcon( int which, int field, int nIcon ); void DoSetWindowText(int which, int field, char *s_label); void InsertIntoMemo( int which, char * text, int where ); @@ -68,4 +72,10 @@ void DoClearMemo(int which); void ResizeWindowControls( int mode ); int EngineOutputDialogExists(); void SetEngineOutputTitle( char *title ); +void InitializeEngineOutput P((Option *opt, Option *memo2)); +void DrawIcon P((Option *opt, int nIcon)); + +// front-end shared with xboard.c +void SelectPV P((Widget w, XEvent * event, String * params, Cardinal * nParams)); +void StopPV P((Widget w, XEvent * event, String * params, Cardinal * nParams)); diff --git a/nengineoutput.c b/nengineoutput.c new file mode 100644 index 0000000..e17f76b --- /dev/null +++ b/nengineoutput.c @@ -0,0 +1,160 @@ +/* + * Engine output (PV) + * + * Author: Alessandro Scotti (Dec 2005) + * + * Copyright 2005 Alessandro Scotti + * + * Enhancements Copyright 2009, 2010, 2011, 2012 Free Software Foundation, Inc. + * + * ------------------------------------------------------------------------ + * + * GNU XBoard is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or (at + * your option) any later version. + * + * GNU XBoard is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see http://www.gnu.org/licenses/. + * + * ------------------------------------------------------------------------ + ** See the file ChangeLog for a revision history. */ + +#include "config.h" + +#include +#include +#include +#include + +#if STDC_HEADERS +# include +# include +#else /* not STDC_HEADERS */ +extern char *getenv(); +# if HAVE_STRING_H +# include +# else /* not HAVE_STRING_H */ +# include +# endif /* not HAVE_STRING_H */ +#endif /* not STDC_HEADERS */ + +#if HAVE_UNISTD_H +# include +#endif + +#include "common.h" +#include "frontend.h" +#include "backend.h" +#include "dialogs.h" +#include "engineoutput.h" +#include "gettext.h" + +#ifdef ENABLE_NLS +# define _(s) gettext (s) +# define N_(s) gettext_noop (s) +#else +# define _(s) (s) +# define N_(s) s +#endif + + +/* Module variables */ +int windowMode = 1; + +char *mem1, *mem2; // dummies, as this dialog can never be OK'ed + +Option engoutOptions[] = { +{ 0, LL|T2T, 17, NULL, NULL, "", NULL, Label, "" }, +{ 0, L2L|T2T|SAME_ROW, 163, NULL, NULL, NULL, NULL, Label, N_("engine name") }, +{ 0, T2T|SAME_ROW, 30, NULL, NULL, "", NULL, Label, "" }, +{ 0, R2R|T2T|SAME_ROW, 188, NULL, NULL, NULL, NULL, Label, N_("move") }, +{ 0, RR|T2T|SAME_ROW, 80, NULL, NULL, NULL, NULL, Label, N_("NPS") }, +{200, T_VSCRL | T_TOP, 500, NULL, (void*) &mem1, "", NULL, TextBox, "" }, +{ 0, 0, 0, NULL, NULL, "", NULL, Break , "" }, +{ 0, LL|T2T, 17, NULL, NULL, "", NULL, Label, "" }, +{ 0, L2L|T2T|SAME_ROW, 163, NULL, NULL, NULL, NULL, Label, N_("engine name") }, +{ 0, T2T|SAME_ROW, 30, NULL, NULL, "", NULL, Label, "" }, +{ 0, R2R|T2T|SAME_ROW, 188, NULL, NULL, NULL, NULL, Label, N_("move") }, +{ 0, RR|T2T|SAME_ROW, 80, NULL, NULL, NULL, NULL, Label, N_("NPS") }, +{200, T_VSCRL | T_TOP, 500, NULL, (void*) &mem2, "", NULL, TextBox, "" }, +{ 0, NO_OK, 0, NULL, NULL, "", NULL, EndMark , "" } +}; + +void +SetIcon (int which, int field, int nIcon) +{ // first call into xengineoutput.c to pick up icon pixmap + if( nIcon ) DrawIcon(&engoutOptions[STRIDE*which + field - 1], nIcon); +} + +void +DoSetWindowText (int which, int field, char *s_label) +{ + SetWidgetLabel (&engoutOptions[STRIDE*which + field - 1], s_label); +} + +void +SetEngineOutputTitle (char *title) +{ + SetDialogTitle(EngOutDlg, title); +} + + +void +DoClearMemo (int which) +{ + SetWidgetText(&engoutOptions[STRIDE*which + MEMO], "", -1); +} + +void +EngineOutputPopUp () +{ + static int needInit = TRUE; + static char *title = N_("Engine output"); + + if (GenericPopUp(engoutOptions, _(title), EngOutDlg, BoardWindow, NONMODAL, 1)) { + if(engoutOptions[STRIDE-1].type != Break) + DisplayFatalError(_("Mismatch of STRIDE in nengineoutput.c\nChange and recompile!"), 0, 2); + AddHandler(&engoutOptions[MEMO], 6); + AddHandler(&engoutOptions[MEMO+STRIDE], 6); + if( needInit ) { + InitializeEngineOutput(&engoutOptions[0], &engoutOptions[MEMO]); // make icon bitmaps + needInit = FALSE; + } + SetEngineColorIcon( 0 ); + SetEngineColorIcon( 1 ); + SetEngineState( 0, STATE_IDLE, "" ); + SetEngineState( 1, STATE_IDLE, "" ); + } else { + SetIconName(EngOutDlg, _(title)); + SetDialogTitle(EngOutDlg, _(title)); + } + + MarkMenu("Show Engine Output", EngOutDlg); + + ShowThinkingEvent(); // [HGM] thinking: might need to prompt engine for thinking output +} + +int +EngineOutputIsUp () +{ + return shellUp[EngOutDlg]; +} + +int +EngineOutputDialogExists () +{ + return DialogExists(EngOutDlg); +} + +void +EngineOutputProc (Widget w, XEvent *event, String *prms, Cardinal *nprms) +{ + if (!PopDown(EngOutDlg)) EngineOutputPopUp(); +} + diff --git a/xboard.c b/xboard.c index c042200..ea765ad 100644 --- a/xboard.c +++ b/xboard.c @@ -206,6 +206,7 @@ extern char *getenv(); #include "menus.h" #include "board.h" #include "dialogs.h" +#include "engineoutput.h" #include "usystem.h" #include "gettext.h" @@ -260,10 +261,6 @@ void AnimateUserMove P((Widget w, XEvent * event, String * params, Cardinal * nParams)); void HandlePV P((Widget w, XEvent * event, String * params, Cardinal * nParams)); -void SelectPV P((Widget w, XEvent * event, - String * params, Cardinal * nParams)); -void StopPV P((Widget w, XEvent * event, - String * params, Cardinal * nParams)); void WhiteClock P((Widget w, XEvent *event, String *prms, Cardinal *nprms)); void BlackClock P((Widget w, XEvent *event, @@ -522,7 +519,6 @@ XtActionsRec boardActions[] = { { "TempBackwardProc", TempBackwardProc }, { "TempForwardProc", TempForwardProc }, { "CommentClick", (XtActionProc) CommentClick }, - { "EngineOutputPopDown", (XtActionProc) EngineOutputPopDown }, { "EvalGraphPopDown", (XtActionProc) EvalGraphPopDown }, { "GenericPopDown", (XtActionProc) GenericPopDown }, { "ErrorPopDown", (XtActionProc) ErrorPopDown }, @@ -967,7 +963,6 @@ ParseCommPortSettings (char *s) { // no such option in XBoard (yet) } -extern Widget engineOutputShell; int frameX, frameY; void @@ -997,7 +992,7 @@ GetWindowCoords () { // wrapper to shield use of window handles from back-end (make addressible by number?) // In XBoard this will have to wait until awareness of window parameters is implemented GetActualPlacement(shellWidget, &wpMain); - if(EngineOutputIsUp()) GetActualPlacement(engineOutputShell, &wpEngineOutput); + if(shellUp[EngOutDlg]) GetActualPlacement(shells[EngOutDlg], &wpEngineOutput); if(MoveHistoryIsUp()) GetActualPlacement(shells[HistoryDlg], &wpMoveHistory); if(EvalGraphIsUp()) GetActualPlacement(evalGraphShell, &wpEvalGraph); if(shellUp[GameListDlg]) GetActualPlacement(shells[GameListDlg], &wpGameList); @@ -3386,7 +3381,7 @@ DragProc () if(wpNew.x == wpMain.x && wpNew.y == wpMain.y && // not moved wpNew.width == wpMain.width && wpNew.height == wpMain.height) // not sized return; // false alarm - if(EngineOutputIsUp()) CoDrag(engineOutputShell, &wpEngineOutput); + if(shellUp[EngOutDlg]) CoDrag(shells[EngOutDlg], &wpEngineOutput); if(MoveHistoryIsUp()) CoDrag(shells[HistoryDlg], &wpMoveHistory); if(EvalGraphIsUp()) CoDrag(evalGraphShell, &wpEvalGraph); if(shellUp[GameListDlg]) CoDrag(shells[GameListDlg], &wpGameList); diff --git a/xboard.h b/xboard.h index bc709a7..6be0595 100644 --- a/xboard.h +++ b/xboard.h @@ -143,6 +143,7 @@ void GenericPopDown P((Widget w, XEvent *event, String *prms, Cardinal *nprms)); void InitDrawingSizes P((int i, int j)); void SendToICS P((char *buf)); void SendToProgram P((char *message, ChessProgramState *cps)); +void SetFocus(Widget w, XtPointer data, XEvent *event, Boolean *b); // from xoptions.c void TypeInProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms)); void WheelProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms)); void TabProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms)); @@ -150,6 +151,10 @@ void GenericMenu P((Widget w, XEvent *event, String *prms, Cardinal *nprms)); FILE * XsraSelFile P((Widget w, char *prompt, char *ok, char *cancel, char *failed, char *init_path, char *filter, char *mode, int (*show_entry)(), char **name_return)); +// from xengineoutput.c +extern char memoTranslations[]; + + extern Widget shells[]; extern int dialogError; extern Widget formWidget, shellWidget, boardWidget, menuBarWidget, historyShell; diff --git a/xengineoutput.c b/xengineoutput.c index ddd93df..b25fb84 100644 --- a/xengineoutput.c +++ b/xengineoutput.c @@ -71,6 +71,7 @@ extern char *getenv(); #include "common.h" #include "frontend.h" #include "backend.h" +#include "dialogs.h" #include "xboard.h" #include "engineoutput.h" #include "gettext.h" @@ -94,52 +95,19 @@ extern char *getenv(); #include "pixmaps/PONDER_14.xpm" #include "pixmaps/ANALYZING_14.xpm" -#ifdef SNAP -#include "wsnap.h" -#endif - -#define _LL_ 100 - -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 - -void EngineOutputPopDown(); -void engineOutputPopUp(); -int EngineOutputIsUp(); -void SetEngineColorIcon( int which ); - -//extern WindowPlacement wpEngineOutput; - -Position engineOutputX = -1, engineOutputY = -1; -Dimension engineOutputW, engineOutputH; -Widget engineOutputShell; -static int engineOutputDialogUp; /* Module variables */ -int windowMode = 1; static int currentPV, highTextStart[2], highTextEnd[2]; +static Pixmap icons[8]; // [HGM] this front-end array translates back-end icon indicator to handle +static Widget memoWidget; -typedef struct { - char * name; - int which; - int depth; - u64 nodes; - int score; - int time; - char * pv; - char * hint; - int an_move_index; - int an_move_count; -} EngineOutputData; - -//static void UpdateControls( EngineOutputData * ed ); -void -ReadIcon (char *pixData[], int iconNr) +static void +ReadIcon (char *pixData[], int iconNr, Widget w) { int r; - if ((r=XpmCreatePixmapFromData(xDisplay, XtWindow(outputField[0][nColorIcon]), + if ((r=XpmCreatePixmapFromData(xDisplay, XtWindow(w), pixData, &(icons[iconNr]), NULL, NULL /*&attr*/)) != 0) { @@ -148,34 +116,28 @@ ReadIcon (char *pixData[], int iconNr) } } -static void -InitializeEngineOutput () -{ - ReadIcon(WHITE_14, nColorWhite); - ReadIcon(BLACK_14, nColorBlack); - ReadIcon(UNKNOWN_14, nColorUnknown); - - ReadIcon(CLEAR_14, nClear); - ReadIcon(PONDER_14, nPondering); - ReadIcon(THINK_14, nThinking); - ReadIcon(ANALYZE_14, nAnalyzing); -} - void -DoSetWindowText (int which, int field, char *s_label) -{ - Arg arg; - - XtSetArg(arg, XtNlabel, (XtArgVal) s_label); - XtSetValues(outputField[which][field], &arg, 1); +InitializeEngineOutput (Option *opt, Option *memo2) +{ // front-end, because it must have access to the pixmaps + Widget w = opt->handle; + memoWidget = memo2->handle; + + ReadIcon(WHITE_14, nColorWhite, w); + ReadIcon(BLACK_14, nColorBlack, w); + ReadIcon(UNKNOWN_14, nColorUnknown, w); + + ReadIcon(CLEAR_14, nClear, w); + ReadIcon(PONDER_14, nPondering, w); + ReadIcon(THINK_14, nThinking, w); + ReadIcon(ANALYZE_14, nAnalyzing, w); } void -SetEngineOutputTitle (char *title) -{ - Arg arg; - XtSetArg(arg, XtNtitle, (XtArgVal) title); - XtSetValues(engineOutputShell, &arg, 1); +DrawIcon (Option *opt, int nIcon) +{ // as we are already in X front-end, so do X-stuff here + Arg arg; + XtSetArg(arg, XtNleftBitmap, (XtArgVal) icons[nIcon]); + XtSetValues(opt->handle, &arg, 1); } void @@ -189,43 +151,16 @@ InsertIntoMemo (int which, char * text, int where) 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"); + edit = XtNameToWidget(shells[EngOutDlg], which ? "*paneB.text" : "*paneA.text"); XawTextReplace(edit, where, where, &t); 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] ); + XawTextSetSelection( edit, highTextStart[which], highTextEnd[which] ); } } -void -SetIcon (int which, int field, int nIcon) -{ - Arg arg; - - if( nIcon != 0 ) { - XtSetArg(arg, XtNleftBitmap, (XtArgVal) icons[nIcon]); - XtSetValues(outputField[which][field], &arg, 1); - } -} - -void -DoClearMemo (int which) -{ - 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); -} - -// 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 +//--------------------------------- PV walking --------------------------------------- char memoTranslations[] = ":Ctrlc: CopyMemoProc() \n \ @@ -244,13 +179,13 @@ SelectPV (Widget w, XEvent * event, String * params, Cardinal * nParams) Arg arg; x = event->xmotion.x; y = event->xmotion.y; - currentPV = (w == outputField[1][nMemo]); + currentPV = (w != memoWidget); 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 ); + XawTextSetSelection( w, start, end ); highTextStart[currentPV] = start; highTextEnd[currentPV] = end; } } @@ -263,6 +198,20 @@ StopPV (Widget w, XEvent * event, String * params, Cardinal * nParams) UnLoadPV(); } +//------------------------- Ctrl-C copying of memo texts --------------------------- + +// Awfull code: first read our own primary selection into selected_fen_position, +// and then transfer ownership of this to the clipboard, so that the +// copy-position callback can fetch it there when somebody pastes it +// Worst of all is that I only added it because I did not know how to copy primary: +// my laptop has no middle button. Ctrl-C might not be needed at all... [HGM] + +// 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 + static void MemoCB (Widget w, XtPointer client_data, Atom *selection, Atom *type, XtPointer value, unsigned long *len, int *format) @@ -294,210 +243,20 @@ CopyMemoProc (Widget w, XEvent *event, String *prms, Cardinal *nprms) ); } -// The following routines are mutated clones of the commentPopUp routines - -void -PositionControlSet (int which, Widget shell, Widget form, Dimension bw_width) -{ - Arg args[16]; - Widget edit, NameWidget, ColorWidget, ModeWidget, MoveWidget, NodesWidget; - int j, mutable=1; - j = 0; - XtSetArg(args[j], XtNborderWidth, (XtArgVal) 0); j++; - XtSetArg(args[j], XtNlabel, (XtArgVal) ""); j++; - XtSetArg(args[j], XtNtop, XtChainTop); j++; - XtSetArg(args[j], XtNbottom, XtChainTop); j++; - XtSetArg(args[j], XtNleft, XtChainLeft); j++; - XtSetArg(args[j], XtNright, XtChainLeft); j++; - XtSetArg(args[j], XtNwidth, (XtArgVal) 17); j++; - outputField[which][nColorIcon] = ColorWidget = - XtCreateManagedWidget("Color", labelWidgetClass, - form, args, j); - - j = 0; - XtSetArg(args[j], XtNborderWidth, (XtArgVal) 0); j++; - XtSetArg(args[j], XtNjustify, (XtArgVal) XtJustifyLeft); j++; - XtSetArg(args[j], XtNfromHoriz, (XtArgVal) ColorWidget); j++; - XtSetArg(args[j], XtNtop, XtChainTop); j++; - XtSetArg(args[j], XtNbottom, XtChainTop); j++; - XtSetArg(args[j], XtNleft, XtChainLeft); j++; - XtSetArg(args[j], XtNwidth, (XtArgVal) bw_width/2 - 57); j++; - outputField[which][nLabel] = NameWidget = - XtCreateManagedWidget("Engine", labelWidgetClass, - form, args, j); - - j = 0; - XtSetArg(args[j], XtNborderWidth, (XtArgVal) 0); j++; - XtSetArg(args[j], XtNlabel, (XtArgVal) ""); j++; - XtSetArg(args[j], XtNfromHoriz, (XtArgVal) NameWidget); j++; - XtSetArg(args[j], XtNtop, XtChainTop); j++; - XtSetArg(args[j], XtNbottom, XtChainTop); j++; - XtSetArg(args[j], XtNwidth, (XtArgVal) 20); j++; - outputField[which][nStateIcon] = ModeWidget = - XtCreateManagedWidget("Mode", labelWidgetClass, - form, args, j); - - j = 0; - XtSetArg(args[j], XtNborderWidth, (XtArgVal) 0); j++; - XtSetArg(args[j], XtNjustify, (XtArgVal) XtJustifyLeft); j++; - XtSetArg(args[j], XtNlabel, (XtArgVal) ""); j++; - XtSetArg(args[j], XtNfromHoriz, (XtArgVal) ModeWidget); j++; - XtSetArg(args[j], XtNtop, XtChainTop); j++; - XtSetArg(args[j], XtNbottom, XtChainTop); j++; - XtSetArg(args[j], XtNright, XtChainRight); j++; - XtSetArg(args[j], XtNwidth, (XtArgVal) bw_width/2 - 102); j++; - outputField[which][nStateData] = MoveWidget = - XtCreateManagedWidget("Move", labelWidgetClass, - form, args, j); - - j = 0; - XtSetArg(args[j], XtNborderWidth, (XtArgVal) 0); j++; - XtSetArg(args[j], XtNjustify, (XtArgVal) XtJustifyRight); j++; - XtSetArg(args[j], XtNlabel, (XtArgVal) _("NPS")); j++; - XtSetArg(args[j], XtNfromHoriz, (XtArgVal) MoveWidget); j++; - XtSetArg(args[j], XtNtop, XtChainTop); j++; - XtSetArg(args[j], XtNbottom, XtChainTop); j++; - XtSetArg(args[j], XtNleft, XtChainRight); j++; - XtSetArg(args[j], XtNright, XtChainRight); j++; - XtSetArg(args[j], XtNwidth, (XtArgVal) 100); j++; - outputField[which][nLabelNPS] = NodesWidget = - XtCreateManagedWidget("Nodes", labelWidgetClass, - form, args, j); - - // create "text" within "form" - j = 0; - if (mutable) { - XtSetArg(args[j], XtNeditType, XawtextEdit); j++; - XtSetArg(args[j], XtNuseStringInPlace, False); j++; - } - XtSetArg(args[j], XtNstring, ""); j++; - XtSetArg(args[j], XtNdisplayCaret, False); j++; - XtSetArg(args[j], XtNtop, XtChainTop); j++; - XtSetArg(args[j], XtNbottom, XtChainBottom); j++; - XtSetArg(args[j], XtNleft, XtChainLeft); j++; - XtSetArg(args[j], XtNright, XtChainRight); j++; - XtSetArg(args[j], XtNresizable, True); j++; - XtSetArg(args[j], XtNwidth, bw_width); j++; /*force wider than buttons*/ - /* !!Work around an apparent bug in XFree86 4.0.1 (X11R6.4.3) */ - XtSetArg(args[j], XtNscrollVertical, XawtextScrollAlways); j++; - XtSetArg(args[j], XtNscrollHorizontal, XawtextScrollWhenNeeded); j++; -// XtSetArg(args[j], XtNautoFill, True); j++; -// XtSetArg(args[j], XtNwrap, XawtextWrapWord); j++; - 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++; - XtSetValues(edit, args, j); -} - -Widget -EngineOutputCreate (char *name, char *text) -{ - Arg args[16]; - Widget shell, layout, form, form2; - Dimension bw_width, bw_height; - int j; - - // get board width - j = 0; - XtSetArg(args[j], XtNwidth, &bw_width); j++; - XtSetArg(args[j], XtNheight, &bw_height); j++; - XtGetValues(boardWidget, args, j); - - // define form within layout within shell. - j = 0; - XtSetArg(args[j], XtNresizable, True); j++; - shell = -#if TOPLEVEL - XtCreatePopupShell(name, topLevelShellWidgetClass, -#else - XtCreatePopupShell(name, transientShellWidgetClass, -#endif - 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, - formArgs, XtNumber(formArgs)); - form2 = - XtCreateManagedWidget("form2", formWidgetClass, layout, - formArgs, XtNumber(formArgs)); - j = 0; - XtSetArg(args[j], XtNfromVert, (XtArgVal) form); j++; - XtSetValues(form2, args, j); - // make sure width is known in advance, for better placement of child widgets - j = 0; - XtSetArg(args[j], XtNwidth, (XtArgVal) bw_width-16); j++; - XtSetArg(args[j], XtNheight, (XtArgVal) bw_height/2); j++; - XtSetValues(shell, args, j); - - // fill up both forms with control elements - PositionControlSet(0, shell, form, bw_width); - PositionControlSet(1, shell, form2, bw_width); - - XtRealizeWidget(shell); - - if(wpEngineOutput.width > 0) { - engineOutputW = wpEngineOutput.width; - engineOutputH = wpEngineOutput.height; - engineOutputX = wpEngineOutput.x; - engineOutputY = wpEngineOutput.y; - } - - if (engineOutputX == -1) { - int xx, yy; - Window junk; - - engineOutputH = bw_height/2; - engineOutputW = bw_width-16; - - 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); -#else /*!NOTDEF*/ - XTranslateCoordinates(xDisplay, XtWindow(shellWidget), - RootWindowOfScreen(XtScreen(shellWidget)), - (bw_width - engineOutputW) / 2, 0 - engineOutputH / 2, - &xx, &yy, &junk); - engineOutputX = xx; - engineOutputY = yy; -#endif /*!NOTDEF*/ - if (engineOutputY < 0) engineOutputY = 0; /*avoid positioning top offscreen*/ - } - j = 0; - XtSetArg(args[j], XtNheight, engineOutputH); j++; - XtSetArg(args[j], XtNwidth, engineOutputW); j++; - XtSetArg(args[j], XtNx, engineOutputX); j++; - XtSetArg(args[j], XtNy, engineOutputY); j++; - XtSetValues(shell, args, j); - - return shell; -} +//------------------------------- pane switching ----------------------------------- void ResizeWindowControls (int mode) -{ +{ // another hideous kludge: to have only a single pane, we resize the + // second to 5 pixels (which makes it too small to display anything) Widget form1, form2; Arg args[16]; int j; Dimension ew_height, tmp; - Widget shell = engineOutputShell; + Widget shell = shells[EngOutDlg]; - form1 = XtNameToWidget(shell, "*form"); - form2 = XtNameToWidget(shell, "*form2"); + form1 = XtNameToWidget(shell, "*paneA"); + form2 = XtNameToWidget(shell, "*paneB"); j = 0; XtSetArg(args[j], XtNheight, (XtArgVal) &ew_height); j++; @@ -524,98 +283,3 @@ ResizeWindowControls (int mode) } } -void -EngineOutputPopUp () -{ - Arg args[16]; - int j; - Widget edit; - static int needInit = TRUE; - static char *title = N_("Engine output"), *text = N_("This feature is experimental"); - - if (engineOutputShell == NULL) { - engineOutputShell = - EngineOutputCreate(_(title), _(text)); - XtRealizeWidget(engineOutputShell); - CatchDeleteWindow(engineOutputShell, "EngineOutputPopDown"); - if( needInit ) { - InitializeEngineOutput(); - needInit = FALSE; - } - SetEngineColorIcon( 0 ); - SetEngineColorIcon( 1 ); - SetEngineState( 0, STATE_IDLE, "" ); - SetEngineState( 1, STATE_IDLE, "" ); - } else { - edit = XtNameToWidget(engineOutputShell, "*form.text"); - j = 0; - 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++; - XtSetValues(engineOutputShell, args, j); - } - - XtPopup(engineOutputShell, XtGrabNone); - XSync(xDisplay, False); - - j=0; - XtSetArg(args[j], XtNleftBitmap, xMarkPixmap); j++; - XtSetValues(XtNameToWidget(menuBarWidget, "menuView.Show Engine Output"), - args, j); - - engineOutputDialogUp = True; - ShowThinkingEvent(); // [HGM] thinking: might need to prompt engine for thinking output -} - -void -EngineOutputPopDown () -{ - Arg args[16]; - int j; - - if (!engineOutputDialogUp) return; - DoClearMemo(1); - j = 0; - XtSetArg(args[j], XtNx, &engineOutputX); j++; - XtSetArg(args[j], XtNy, &engineOutputY); j++; - XtSetArg(args[j], XtNwidth, &engineOutputW); j++; - XtSetArg(args[j], XtNheight, &engineOutputH); j++; - XtGetValues(engineOutputShell, args, j); - wpEngineOutput.x = engineOutputX - 4; - wpEngineOutput.y = engineOutputY - 23; - wpEngineOutput.width = engineOutputW; - wpEngineOutput.height = engineOutputH; - XtPopdown(engineOutputShell); - XSync(xDisplay, False); - j=0; - XtSetArg(args[j], XtNleftBitmap, None); j++; - XtSetValues(XtNameToWidget(menuBarWidget, "menuView.Show Engine Output"), - args, j); - - engineOutputDialogUp = False; - ShowThinkingEvent(); // [HGM] thinking: might need to shut off thinking output -} - -int -EngineOutputIsUp () -{ - return engineOutputDialogUp; -} - -int -EngineOutputDialogExists () -{ - return engineOutputShell != NULL; -} - -void -EngineOutputProc (Widget w, XEvent *event, String *prms, Cardinal *nprms) -{ - if (engineOutputDialogUp) { - EngineOutputPopDown(); - } else { - EngineOutputPopUp(); - } -} diff --git a/xoptions.c b/xoptions.c index 528ab3a..f87176e 100644 --- a/xoptions.c +++ b/xoptions.c @@ -387,11 +387,12 @@ char moveTypeInTranslations[] = "Escape: TypeInProc(0) \n"; extern char filterTranslations[]; extern char gameListTranslations[]; +extern char memoTranslations[]; -char *translationTable[] = { +char *translationTable[] = { // beware: order is essential! historyTranslations, commentTranslations, moveTypeInTranslations, ICSInputTranslations, - filterTranslations, gameListTranslations, + filterTranslations, gameListTranslations, memoTranslations }; void -- 1.7.0.4