From 35b4d26ced6ea333c02f172c4325b4f58d8c35dc Mon Sep 17 00:00:00 2001 From: H.G. Muller Date: Fri, 1 Apr 2011 21:49:26 +0200 Subject: [PATCH] Make generic XBoard popup, and implement 2 dialogs The Engine-Settings dialog of XBoard was cloned to work on predefined lists of (XBoard) options, rather than engine options. An extra field was added to the Option struct, to hold a pointer to the XBoard variable that should hold the option setting, so on OK'ing the dialog the altered values can be copied there. Not usable for options which should trigger an action (like redraw, or sending something to the engine). A Load Game, Save Game and ICS Options dialog were then defined by tables fed to GenericPopUp(). Options set from these dialogs were removed from the main Option menu, which removes a lot of code from xboard.c (for checkmarking, disabling the menu items). A button defined in the GenericPopUp can attain the color indicated by a previous text field, and add a callback to change the color in a spin-like manner (but using R G B W in stead of + - butons). The EndMark option can specify a callback, to be used on OK. A non-zero max field in the Option descriptor will be used to set the width of ComboBox, TextBox and Button optons. The elements are chained such that extra space goes fully into the input fields. A label type is added for clarifying texts that would not fit in the option names. A break-type (pseudo-)option is added. Make OK and cancel button suppressable in generic popup (by 2 bit of the option.min field). --- backend.h | 5 +- xboard.c | 219 ++++--------------------------- xoptions.c | 432 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 459 insertions(+), 197 deletions(-) diff --git a/backend.h b/backend.h index e9bd07b..d0144ef 100644 --- a/backend.h +++ b/backend.h @@ -292,14 +292,15 @@ extern Boolean set_cont_sequence P((char *new_seq)); extern int wrap P((char *dest, char *src, int count, int width, int *lp)); int Explode P((Board board, int fromX, int fromY, int toX, int toY)); -typedef enum { CheckBox, ComboBox, TextBox, Button, Spin, ResetButton, - SaveButton, FileName, PathName, Slider, Message } Control; +typedef enum { CheckBox, ComboBox, TextBox, Button, Spin, ResetButton, SaveButton, + FileName, PathName, Slider, Message, Fractional, Label, Break, EndMark } Control; typedef struct _OPT { // [HGM] options: descriptor of UCI-style option int value; // current setting, starts as default int min; int max; void *handle; // for use by front end + void *target; // for use by front end char *textValue; // points to beginning of text value in name field char **choice; // points to array of combo choices in cps->combo Control type; diff --git a/xboard.c b/xboard.c index 612cbfe..1b95e50 100644 --- a/xboard.c +++ b/xboard.c @@ -392,20 +392,12 @@ void AnimateDraggingProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms)); void AnimateMovingProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms)); -void AutocommProc P((Widget w, XEvent *event, String *prms, - Cardinal *nprms)); void AutoflagProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms)); void AutoflipProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms)); -void AutobsProc P((Widget w, XEvent *event, String *prms, - Cardinal *nprms)); -void AutoraiseProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms)); -void AutosaveProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms)); void BlindfoldProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms)); void FlashMovesProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms)); void FlipViewProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms)); -void GetMoveListProc P((Widget w, XEvent *event, String *prms, - Cardinal *nprms)); void HighlightDraggingProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms)); void HighlightLastMoveProc P((Widget w, XEvent *event, String *prms, @@ -413,7 +405,7 @@ void HighlightLastMoveProc P((Widget w, XEvent *event, String *prms, void HighlightArrowProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms)); void MoveSoundProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms)); -void IcsAlarmProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms)); +//void IcsAlarmProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms)); void OneClickProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms)); void PeriodicUpdatesProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms)); @@ -423,8 +415,7 @@ void PopupMoveErrorsProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms)); void PopupExitMessageProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms)); -void PremoveProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms)); -void QuietPlayProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms)); +//void PremoveProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms)); void ShowCoordsProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms)); void ShowThinkingProc P((Widget w, XEvent *event, String *prms, @@ -463,6 +454,8 @@ void NewVariantProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms)); void FirstSettingsProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms)); void SecondSettingsProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms)); void GameListOptionsPopUp P((Widget w, XEvent *event, String *prms, Cardinal *nprms)); +void LoadOptionsProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms)); +void SaveOptionsProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms)); void GameListOptionsPopDown P(()); void ShufflePopDown P(()); void EnginePopDown P(()); @@ -709,34 +702,31 @@ MenuItem optionsMenu[] = { {N_("Time Control ... Alt+Shift+T"), "Time Control", TimeControlProc}, {N_("Common Engine ... Alt+Shift+U"), "Common Engine", UciMenuProc}, {N_("Adjudications ... Alt+Shift+J"), "Adjudications", EngineMenuProc}, + {N_("Load Game ..."), "Load Game", LoadOptionsProc}, + {N_("Save Game ..."), "Save Game", SaveOptionsProc}, +// {N_(" ..."), "", OptionsProc}, {N_("Game List ..."), "Game List", GameListOptionsPopUp}, {"----", NULL, NothingProc}, {N_("Always Queen Ctrl+Shift+Q"), "Always Queen", AlwaysQueenProc}, {N_("Animate Dragging"), "Animate Dragging", AnimateDraggingProc}, {N_("Animate Moving Ctrl+Shift+A"), "Animate Moving", AnimateMovingProc}, - {N_("Auto Comment"), "Auto Comment", AutocommProc}, {N_("Auto Flag Ctrl+Shift+F"), "Auto Flag", AutoflagProc}, {N_("Auto Flip View"), "Auto Flip View", AutoflipProc}, - {N_("Auto Observe"), "Auto Observe", AutobsProc}, - {N_("Auto Raise Board"), "Auto Raise Board", AutoraiseProc}, - {N_("Auto Save"), "Auto Save", AutosaveProc}, {N_("Blindfold"), "Blindfold", BlindfoldProc}, {N_("Flash Moves"), "Flash Moves", FlashMovesProc}, - {N_("Get Move List"), "Get Move List", GetMoveListProc}, #if HIGHDRAG {N_("Highlight Dragging"), "Highlight Dragging", HighlightDraggingProc}, #endif {N_("Highlight Last Move"), "Highlight Last Move", HighlightLastMoveProc}, {N_("Highlight With Arrow"), "Arrow", HighlightArrowProc}, {N_("Move Sound"), "Move Sound", MoveSoundProc}, - {N_("ICS Alarm"), "ICS Alarm", IcsAlarmProc}, +// {N_("ICS Alarm"), "ICS Alarm", IcsAlarmProc}, {N_("One-Click Moving"), "OneClick", OneClickProc}, {N_("Periodic Updates"), "Periodic Updates", PeriodicUpdatesProc}, {N_("Ponder Next Move Ctrl+Shift+P"), "Ponder Next Move", PonderNextMoveProc}, {N_("Popup Exit Message"), "Popup Exit Message", PopupExitMessageProc}, {N_("Popup Move Errors"), "Popup Move Errors", PopupMoveErrorsProc}, - {N_("Premove"), "Premove", PremoveProc}, - {N_("Quiet Play"), "Quiet Play", QuietPlayProc}, +// {N_("Premove"), "Premove", PremoveProc}, {N_("Show Coords"), "Show Coords", ShowCoordsProc}, {N_("Hide Thinking Ctrl+Shift+H"), "Hide Thinking", HideThinkingProc}, {N_("Test Legality Ctrl+Shift+L"), "Test Legality", TestLegalityProc}, @@ -928,7 +918,6 @@ XtActionsRec boardActions[] = { { "ShowMoveListProc", HistoryShowProc}, { "EditTagsProc", EditCommentProc }, { "EditCommentProc", EditCommentProc }, - { "IcsAlarmProc", IcsAlarmProc }, { "IcsInputBoxProc", IcsInputBoxProc }, { "PauseProc", PauseProc }, { "AcceptProc", AcceptProc }, @@ -965,25 +954,20 @@ XtActionsRec boardActions[] = { { "AnimateMovingProc", AnimateMovingProc }, { "AutoflagProc", AutoflagProc }, { "AutoflipProc", AutoflipProc }, - { "AutobsProc", AutobsProc }, - { "AutoraiseProc", AutoraiseProc }, - { "AutosaveProc", AutosaveProc }, { "BlindfoldProc", BlindfoldProc }, { "FlashMovesProc", FlashMovesProc }, { "FlipViewProc", FlipViewProc }, - { "GetMoveListProc", GetMoveListProc }, #if HIGHDRAG { "HighlightDraggingProc", HighlightDraggingProc }, #endif { "HighlightLastMoveProc", HighlightLastMoveProc }, - { "IcsAlarmProc", IcsAlarmProc }, +// { "IcsAlarmProc", IcsAlarmProc }, { "MoveSoundProc", MoveSoundProc }, { "PeriodicUpdatesProc", PeriodicUpdatesProc }, { "PonderNextMoveProc", PonderNextMoveProc }, { "PopupExitMessageProc", PopupExitMessageProc }, { "PopupMoveErrorsProc", PopupMoveErrorsProc }, - { "PremoveProc", PremoveProc }, - { "QuietPlayProc", QuietPlayProc }, +// { "PremoveProc", PremoveProc }, { "ShowCoordsProc", ShowCoordsProc }, { "ShowThinkingProc", ShowThinkingProc }, { "HideThinkingProc", HideThinkingProc }, @@ -2409,10 +2393,6 @@ XBoard square size (hint): %d\n\ XtSetValues(XtNameToWidget(menuBarWidget, "menuOptions.Animate Moving"), args, 1); } - if (appData.autoComment) { - XtSetValues(XtNameToWidget(menuBarWidget, "menuOptions.Auto Comment"), - args, 1); - } if (appData.autoCallFlag) { XtSetValues(XtNameToWidget(menuBarWidget, "menuOptions.Auto Flag"), args, 1); @@ -2421,26 +2401,6 @@ XBoard square size (hint): %d\n\ XtSetValues(XtNameToWidget(menuBarWidget,"menuOptions.Auto Flip View"), args, 1); } - if (appData.autoObserve) { - XtSetValues(XtNameToWidget(menuBarWidget, "menuOptions.Auto Observe"), - args, 1); - } - if (appData.autoRaiseBoard) { - XtSetValues(XtNameToWidget(menuBarWidget, - "menuOptions.Auto Raise Board"), args, 1); - } - if (appData.autoSaveGames) { - XtSetValues(XtNameToWidget(menuBarWidget, "menuOptions.Auto Save"), - args, 1); - } - if (appData.saveGameFile[0] != NULLCHAR) { - /* Can't turn this off from menu */ - XtSetValues(XtNameToWidget(menuBarWidget, "menuOptions.Auto Save"), - args, 1); - XtSetSensitive(XtNameToWidget(menuBarWidget, "menuOptions.Auto Save"), - False); - - } if (appData.blindfold) { XtSetValues(XtNameToWidget(menuBarWidget, "menuOptions.Blindfold"), args, 1); @@ -2450,10 +2410,6 @@ XBoard square size (hint): %d\n\ "menuOptions.Flash Moves"), args, 1); } - if (appData.getMoveList) { - XtSetValues(XtNameToWidget(menuBarWidget, "menuOptions.Get Move List"), - args, 1); - } #if HIGHDRAG if (appData.highlightDragging) { XtSetValues(XtNameToWidget(menuBarWidget, @@ -2471,10 +2427,10 @@ XBoard square size (hint): %d\n\ "menuOptions.Arrow"), args, 1); } - if (appData.icsAlarm) { - XtSetValues(XtNameToWidget(menuBarWidget, "menuOptions.ICS Alarm"), - args, 1); - } +// if (appData.icsAlarm) { +// XtSetValues(XtNameToWidget(menuBarWidget, "menuOptions.ICS Alarm"), +// args, 1); +// } if (appData.ringBellAfterMoves) { XtSetValues(XtNameToWidget(menuBarWidget, "menuOptions.Move Sound"), args, 1); @@ -2499,14 +2455,10 @@ XBoard square size (hint): %d\n\ XtSetValues(XtNameToWidget(menuBarWidget, "menuOptions.Popup Move Errors"), args, 1); } - if (appData.premove) { - XtSetValues(XtNameToWidget(menuBarWidget, - "menuOptions.Premove"), args, 1); - } - if (appData.quietPlay) { - XtSetValues(XtNameToWidget(menuBarWidget, - "menuOptions.Quiet Play"), args, 1); - } +// if (appData.premove) { +// XtSetValues(XtNameToWidget(menuBarWidget, +// "menuOptions.Premove"), args, 1); +// } if (appData.showCoords) { XtSetValues(XtNameToWidget(menuBarWidget, "menuOptions.Show Coords"), args, 1); @@ -2809,15 +2761,10 @@ Enables ncpEnables[] = { { "menuEngine.Engine #2 Settings", False }, { "menuEngine.Move Now", False }, { "menuEngine.Retract Move", False }, - { "menuOptions.Auto Comment", False }, { "menuOptions.Auto Flag", False }, { "menuOptions.Auto Flip View", False }, - { "menuOptions.Auto Observe", False }, - { "menuOptions.Auto Raise Board", False }, - { "menuOptions.Get Move List", False }, - { "menuOptions.ICS Alarm", False }, +// { "menuOptions.ICS Alarm", False }, { "menuOptions.Move Sound", False }, - { "menuOptions.Quiet Play", False }, { "menuOptions.Hide Thinking", False }, { "menuOptions.Periodic Updates", False }, { "menuOptions.Ponder Next Move", False }, @@ -2838,12 +2785,6 @@ Enables gnuEnables[] = { { "menuAction.Upload to Examine", False }, { "menuEdit.Revert", False }, { "menuEdit.Annotate", False }, - { "menuOptions.Auto Comment", False }, - { "menuOptions.Auto Observe", False }, - { "menuOptions.Auto Raise Board", False }, - { "menuOptions.Get Move List", False }, - { "menuOptions.Premove", False }, - { "menuOptions.Quiet Play", False }, /* The next two options rely on SetCmailMode being called *after* */ /* SetGNUMode so that when GNU is being used to give hints these */ @@ -6558,26 +6499,6 @@ void AnimateMovingProc(w, event, prms, nprms) args, 1); } -void AutocommProc(w, event, prms, nprms) - Widget w; - XEvent *event; - String *prms; - Cardinal *nprms; -{ - Arg args[16]; - - appData.autoComment = !appData.autoComment; - - if (appData.autoComment) { - XtSetArg(args[0], XtNleftBitmap, xMarkPixmap); - } else { - XtSetArg(args[0], XtNleftBitmap, None); - } - XtSetValues(XtNameToWidget(menuBarWidget, "menuOptions.Auto Comment"), - args, 1); -} - - void AutoflagProc(w, event, prms, nprms) Widget w; XEvent *event; @@ -6616,63 +6537,6 @@ void AutoflipProc(w, event, prms, nprms) args, 1); } -void AutobsProc(w, event, prms, nprms) - Widget w; - XEvent *event; - String *prms; - Cardinal *nprms; -{ - Arg args[16]; - - appData.autoObserve = !appData.autoObserve; - - if (appData.autoObserve) { - XtSetArg(args[0], XtNleftBitmap, xMarkPixmap); - } else { - XtSetArg(args[0], XtNleftBitmap, None); - } - XtSetValues(XtNameToWidget(menuBarWidget, "menuOptions.Auto Observe"), - args, 1); -} - -void AutoraiseProc(w, event, prms, nprms) - Widget w; - XEvent *event; - String *prms; - Cardinal *nprms; -{ - Arg args[16]; - - appData.autoRaiseBoard = !appData.autoRaiseBoard; - - if (appData.autoRaiseBoard) { - XtSetArg(args[0], XtNleftBitmap, xMarkPixmap); - } else { - XtSetArg(args[0], XtNleftBitmap, None); - } - XtSetValues(XtNameToWidget(menuBarWidget, "menuOptions.Auto Raise Board"), - args, 1); -} - -void AutosaveProc(w, event, prms, nprms) - Widget w; - XEvent *event; - String *prms; - Cardinal *nprms; -{ - Arg args[16]; - - appData.autoSaveGames = !appData.autoSaveGames; - - if (appData.autoSaveGames) { - XtSetArg(args[0], XtNleftBitmap, xMarkPixmap); - } else { - XtSetArg(args[0], XtNleftBitmap, None); - } - XtSetValues(XtNameToWidget(menuBarWidget, "menuOptions.Auto Save"), - args, 1); -} - void BlindfoldProc(w, event, prms, nprms) Widget w; XEvent *event; @@ -6747,26 +6611,6 @@ void FlipViewProc(w, event, prms, nprms) DrawPosition(True, NULL); } -void GetMoveListProc(w, event, prms, nprms) - Widget w; - XEvent *event; - String *prms; - Cardinal *nprms; -{ - Arg args[16]; - - appData.getMoveList = !appData.getMoveList; - - if (appData.getMoveList) { - XtSetArg(args[0], XtNleftBitmap, xMarkPixmap); - GetMoveListEvent(); - } else { - XtSetArg(args[0], XtNleftBitmap, None); - } - XtSetValues(XtNameToWidget(menuBarWidget, "menuOptions.Get Move List"), - args, 1); -} - #if HIGHDRAG void HighlightDraggingProc(w, event, prms, nprms) Widget w; @@ -6826,6 +6670,7 @@ void HighlightArrowProc(w, event, prms, nprms) "menuOptions.Arrow"), args, 1); } +#if 0 void IcsAlarmProc(w, event, prms, nprms) Widget w; XEvent *event; @@ -6844,6 +6689,7 @@ void IcsAlarmProc(w, event, prms, nprms) XtSetValues(XtNameToWidget(menuBarWidget, "menuOptions.ICS Alarm"), args, 1); } +#endif void MoveSoundProc(w, event, prms, nprms) Widget w; @@ -6959,6 +6805,7 @@ void PopupMoveErrorsProc(w, event, prms, nprms) args, 1); } +#if 0 void PremoveProc(w, event, prms, nprms) Widget w; XEvent *event; @@ -6977,25 +6824,7 @@ void PremoveProc(w, event, prms, nprms) XtSetValues(XtNameToWidget(menuBarWidget, "menuOptions.Premove"), args, 1); } - -void QuietPlayProc(w, event, prms, nprms) - Widget w; - XEvent *event; - String *prms; - Cardinal *nprms; -{ - Arg args[16]; - - appData.quietPlay = !appData.quietPlay; - - if (appData.quietPlay) { - XtSetArg(args[0], XtNleftBitmap, xMarkPixmap); - } else { - XtSetArg(args[0], XtNleftBitmap, None); - } - XtSetValues(XtNameToWidget(menuBarWidget, "menuOptions.Quiet Play"), - args, 1); -} +#endif void ShowCoordsProc(w, event, prms, nprms) Widget w; diff --git a/xoptions.c b/xoptions.c index fdc5513..9a9cab8 100644 --- a/xoptions.c +++ b/xoptions.c @@ -1756,6 +1756,438 @@ void SecondSettingsProc(w, event, prms, nprms) SettingsPopUp(&second); } +//----------------------------Generic dialog -------------------------------------------- + +// cloned from Engine Settings dialog + +typedef void ButtonCallback(int n); + +static Option *currentOption; +void GenericReadout(); + +Option loadOptions[] = { +{ 0, 0, 0, NULL, (void*) &appData.autoDisplayTags, "", NULL, CheckBox, _("Auto-Display Tags") }, +{ 0, 0, 0, NULL, (void*) &appData.autoDisplayComment, "", NULL, CheckBox, _("Auto-Display Comment") }, +{ 0, 0, 0, NULL, NULL, NULL, NULL, Label, _("Auto-Play speed of loaded games\n(0 = instant, -1 = off):") }, +{ 0, -1, 10000000, NULL, (void*) &appData.timeDelay, "", NULL, Fractional, _("Seconds per Move:") }, +{ 0, 0, 0, NULL, NULL, "", NULL, EndMark , "" } +}; + +Option saveOptions[] = { +{ 0, 0, 0, NULL, (void*) &appData.autoSaveGames, "", NULL, CheckBox, _("Auto-Save Games") }, +{ 0, 0, 0, NULL, (void*) &appData.saveGameFile, "", NULL, TextBox, _("Save Games on File:") }, +{ 0, 0, 0, NULL, (void*) &appData.savePositionFile, "", NULL, TextBox, _("Save Final Positions on File:") }, +{ 0, 0, 0, NULL, (void*) &appData.pgnEventHeader, "", NULL, TextBox, _("PGN Event Header:") }, +{ 0, 0, 0, NULL, (void*) &appData.oldSaveStyle, "", NULL, CheckBox, _("Old Save Style (as opposed to PGN)") }, +{ 0, 0, 0, NULL, (void*) &appData.saveExtendedInfoInPGN, "", NULL, CheckBox, _("Save Score/Depth Info in PGN") }, +{ 0, 0, 0, NULL, (void*) &appData.saveOutOfBookInfo, "", NULL, CheckBox, _("Save Out-of-Book Info in PGN ") }, +{ 0, 1, 0, NULL, NULL, "", NULL, EndMark , "" } +}; + +SetColor(char *colorName, Widget box) +{ + Arg args[5]; + Pixel buttonColor; + XrmValue vFrom, vTo; + if (!appData.monoMode) { + vFrom.addr = (caddr_t) colorName; + vFrom.size = strlen(colorName); + XtConvert(shellWidget, XtRString, &vFrom, XtRPixel, &vTo); + if (vTo.addr == NULL) { + buttonColor = (Pixel) -1; + } else { + buttonColor = *(Pixel *) vTo.addr; + } + } + XtSetArg(args[0], XtNbackground, buttonColor);; + XtSetValues(box, args, 1); +} + +void AdjustColor(int i) +{ + int n = currentOption[i].max, col, j, r, g, b, step = 10; + char *s, buf[MSG_SIZ]; // color string + Arg args[5]; + XtSetArg(args[0], XtNstring, &s); + XtGetValues(currentOption[i-n-1].handle, args, 1); + if(sscanf(s, "#%x", &col) != 1) return; // malformed + b = col & 0xFF; g = col & 0xFF00; r = col & 0xFF0000; + switch(n) { + case 1: g -= 0x100*step; b -= step; break; + case 2: r -= 0x10000*step; b -= step; break; + case 3: g -= 0x100*step; r -= 0x10000*step; break; + case 4: r += 0x10000*step; g += 0x100*step; b += step; break; + } + if(r < 0) r = 0; if(g < 0) g = 0; if(b < 0) b = 0; + if(r > 0xFF0000) r = 0xFF0000; if(g > 0xFF00) g = 0xFF00; if(b > 0xFF) b = 0xFF; + col = r | g | b; + snprintf(buf, MSG_SIZ, "#%06x", col); + for(j=1; j<7; j++) if(buf[j] >= 'a') buf[j] -= 32; // capitalize + SetColor(buf, currentOption[i-n].handle); + XtSetArg(args[0], XtNstring, buf); + XtSetValues(currentOption[i-n-1].handle, args, 1); +} + +void GenericReadout() +{ + int i, j; + String name, val; + Arg args[16]; + char buf[MSG_SIZ]; + float x; + for(i=0; ; i++) { // send all options that had to be OK-ed to engine + switch(currentOption[i].type) { + case TextBox: + XtSetArg(args[0], XtNstring, &val); + XtGetValues(currentOption[i].handle, args, 1); + if(*(char**) currentOption[i].target == NULL || strcmp(*(char**) currentOption[i].target, val)) { + safeStrCpy(currentOption[i].name + 100, val, MSG_SIZ-100); // text value kept in pivate storage for each option + *(char**) currentOption[i].target = currentOption[i].name + 100; // option gets to point to that + } + break; + case Spin: + case Fractional: + XtSetArg(args[0], XtNstring, &val); + XtGetValues(currentOption[i].handle, args, 1); + sscanf(val, "%f", &x); + if(x > currentOption[i].max) x = currentOption[i].max; + if(x < currentOption[i].min) x = currentOption[i].min; + if(currentOption[i].value != x) { + currentOption[i].value = x; + if(currentOption[i].type == Spin) *(int*) currentOption[i].target = x; + else *(float*) currentOption[i].target = x; + } + break; + case CheckBox: + j = 0; + XtSetArg(args[0], XtNstate, &j); + XtGetValues(currentOption[i].handle, args, 1); + if(currentOption[i].value != j) { + currentOption[i].value = j; + *(Boolean*) currentOption[i].target = j; + } + break; + case ComboBox: + val = ((char**)currentOption[i].choice)[values[i]]; + if(val && (*(char**) currentOption[i].target == NULL || strcmp(*(char**) currentOption[i].target, val))) { + if(*(char**) currentOption[i].target) free(*(char**) currentOption[i].target); + *(char**) currentOption[i].target = strdup(val); + } + break; + case EndMark: + if(currentOption[i].target) // callback for implementing necessary actions on OK (like redraw) + ((ButtonCallback*) currentOption[i].target)(i); + break; + default: + printf("GenericReadout: unexpected case in switch.\n"); + case Button: + case Label: + break; + } + if(currentOption[i].type == EndMark) break; + } +} + +void GenericCallback(w, client_data, call_data) + Widget w; + XtPointer client_data, call_data; +{ + String name, val; + Arg args[16]; + char buf[MSG_SIZ]; + int i, j; + int data = (intptr_t) client_data; + + XtSetArg(args[0], XtNlabel, &name); + XtGetValues(w, args, 1); + + if (strcmp(name, _("cancel")) == 0) { + SettingsPopDown(); + return; + } + if (strcmp(name, _("OK")) == 0) { // save buttons imply OK + GenericReadout(); + SettingsPopDown(); + return; + } + ((ButtonCallback*) currentOption[data].target)(data); +} + +void +GenericPopUp(Option *option, char *title) +{ + Arg args[16]; + Widget popup, layout, dialog, edit=NULL, form, last, b_ok, b_cancel, leftMargin = NULL, textField = NULL; + Window root, child; + int x, y, i, j, height=999, width=1, h, c; + int win_x, win_y, maxWidth, maxTextWidth; + unsigned int mask; + char def[MSG_SIZ], *msg; + static char pane[6] = "paneX"; + Widget texts[100], forelast = NULL, anchor, widest, lastrow = NULL; + + currentOption = option; // make available to callback + // kludge: fake address of a ChessProgramState struct that contains the options, so Spin and Combo callbacks work on it + currentCps = (ChessProgramState *) ((char *) option - ((char *)&first.option - (char *)&first)); + +// if(cps->nrOptions > 50) width = 4; else if(cps->nrOptions>24) width = 2; else width = 1; +// height = cps->nrOptions / width + 1; + i = 0; + XtSetArg(args[i], XtNresizable, True); i++; + SettingsShell = popup = + XtCreatePopupShell(title, transientShellWidgetClass, + shellWidget, args, i); + + layout = + XtCreateManagedWidget(layoutName, formWidgetClass, popup, + layoutArgs, XtNumber(layoutArgs)); + for(c=0; c maxWidth) maxWidth = w; + widest = texts[h]; + } else { + if(w > maxTextWidth) maxTextWidth = w; + if(!widest) widest = texts[h]; + } + } + } + if(maxTextWidth + 110 < maxWidth) + maxTextWidth = maxWidth - 110; + else maxWidth = maxTextWidth + 110; + for(h=0; h