X-Git-Url: http://winboard.nl/cgi-bin?a=blobdiff_plain;f=xoptions.c;h=37e6838c4a13e653a8c412ed881d2e4bded97bec;hb=d0b1d703d860216be661b8b2db99817e9fdb09bf;hp=e66fed0c6cee6359e766f7677675f7d75076c147;hpb=8c9c9b75176c6135bd37d190e20b6e1818ff108f;p=xboard.git diff --git a/xoptions.c b/xoptions.c index e66fed0..37e6838 100644 --- a/xoptions.c +++ b/xoptions.c @@ -625,6 +625,18 @@ ChessProgramState *currentCps; static Option *currentOption; extern Widget shells[]; +void CheckCallback(Widget ww, XtPointer data, XEvent *event, Boolean *b) +{ + Widget w = currentOption[(int)(intptr_t)data].handle; + Boolean s; + Arg args[16]; + + XtSetArg(args[0], XtNstate, &s); + XtGetValues(w, args, 1); + XtSetArg(args[0], XtNstate, !s); + XtSetValues(w, args, 1); +} + void SpinCallback(w, client_data, call_data) Widget w; XtPointer client_data, call_data; @@ -666,6 +678,7 @@ void SpinCallback(w, client_data, call_data) snprintf(buf, MSG_SIZ, "%d", j); XtSetArg(args[0], XtNstring, buf); XtSetValues(currentOption[data].handle, args, 1); + SetFocus(currentOption[data].handle, shells[0], NULL, False); } void ComboSelect(w, addr, index) // callback for all combo items @@ -714,6 +727,7 @@ void CreateComboPopup(parent, name, n, mb) typedef void ButtonCallback(int n); +extern WindowPlacement wpComment, wpTags; char *trialSound; static int oldCores, oldPonder; int MakeColors P((void)); @@ -724,7 +738,7 @@ void GenericReadout(); Widget shells[10]; Widget marked[10]; Boolean shellUp[10]; -WindowPlacement *wp[10]; +WindowPlacement *wp[10] = { NULL, &wpComment, &wpTags }; Option *dialogOptions[10]; void MarkMenu(char *item, int dlgNr) @@ -1079,29 +1093,54 @@ void SetColor(char *colorName, Widget box) XtSetValues(box, args, 1); } -void AdjustColor(int i) +void SetColorText(int n, char *buf) +{ + Arg args[5]; + XtSetArg(args[0], XtNstring, buf); + XtSetValues(currentOption[n-1].handle, args, 1); + SetFocus(currentOption[n-1].handle, shells[0], NULL, False); + SetColor(buf, currentOption[n].handle); +} + +void DefColor(int n) { - int n = currentOption[i].value, col, j, r, g, b, step = 10; + SetColorText(n, (char*) currentOption[n].choice); +} + +void RefreshColor(int source, int n) +{ + int 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); + XtGetValues(currentOption[source].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; + case 1: r += 0x10000*step;break; + case 2: g += 0x100*step; break; + case 3: b += 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); + SetColorText(source+1, buf); +} + +void ColorChanged(Widget w, XtPointer data, XEvent *event, Boolean *b) +{ + char buf[10]; + if ( (XLookupString(&(event->xkey), buf, 2, NULL, NULL) == 1) && *buf == '\r' ) + RefreshColor((int)(intptr_t) data, 0); +} + +void AdjustColor(int i) +{ + int n = currentOption[i].value; + RefreshColor(i-n-1, n); } void BoardOptionsOK(int n) @@ -1118,42 +1157,42 @@ void BoardOptionsOK(int n) Option boardOptions[] = { { 0, 0, 70, NULL, (void*) &appData.whitePieceColor, "", NULL, TextBox, _("White Piece Color:") }, -{ 1000, 1, 0, NULL, NULL, NULL, NULL, Button, " " }, +{ 1000, 1, 0, NULL, (void*) &DefColor, NULL, (char**) "#FFFFCC", Button, " " }, { 1, 1, 0, NULL, (void*) &AdjustColor, NULL, NULL, Button, "R" }, { 2, 1, 0, NULL, (void*) &AdjustColor, NULL, NULL, Button, "G" }, { 3, 1, 0, NULL, (void*) &AdjustColor, NULL, NULL, Button, "B" }, -{ 4, 1, 0, NULL, (void*) &AdjustColor, NULL, NULL, Button, "W" }, +{ 4, 1, 0, NULL, (void*) &AdjustColor, NULL, NULL, Button, "D" }, { 0, 0, 70, NULL, (void*) &appData.blackPieceColor, "", NULL, TextBox, _("Black Piece Color:") }, -{ 1000, 1, 0, NULL, NULL, NULL, NULL, Button, " " }, +{ 1000, 1, 0, NULL, (void*) &DefColor, NULL, (char**) "#202020", Button, " " }, { 1, 1, 0, NULL, (void*) &AdjustColor, NULL, NULL, Button, "R" }, { 2, 1, 0, NULL, (void*) &AdjustColor, NULL, NULL, Button, "G" }, { 3, 1, 0, NULL, (void*) &AdjustColor, NULL, NULL, Button, "B" }, -{ 4, 1, 0, NULL, (void*) &AdjustColor, NULL, NULL, Button, "W" }, +{ 4, 1, 0, NULL, (void*) &AdjustColor, NULL, NULL, Button, "D" }, { 0, 0, 70, NULL, (void*) &appData.lightSquareColor, "", NULL, TextBox, _("Light Square Color:") }, -{ 1000, 1, 0, NULL, NULL, NULL, NULL, Button, " " }, +{ 1000, 1, 0, NULL, (void*) &DefColor, NULL, (char**) "#C8C365", Button, " " }, { 1, 1, 0, NULL, (void*) &AdjustColor, NULL, NULL, Button, "R" }, { 2, 1, 0, NULL, (void*) &AdjustColor, NULL, NULL, Button, "G" }, { 3, 1, 0, NULL, (void*) &AdjustColor, NULL, NULL, Button, "B" }, -{ 4, 1, 0, NULL, (void*) &AdjustColor, NULL, NULL, Button, "W" }, +{ 4, 1, 0, NULL, (void*) &AdjustColor, NULL, NULL, Button, "D" }, { 0, 0, 70, NULL, (void*) &appData.darkSquareColor, "", NULL, TextBox, _("Dark Square Color:") }, -{ 1000, 1, 0, NULL, NULL, NULL, NULL, Button, " " }, +{ 1000, 1, 0, NULL, (void*) &DefColor, NULL, (char**) "#77A26D", Button, " " }, { 1, 1, 0, NULL, (void*) &AdjustColor, NULL, NULL, Button, "R" }, { 2, 1, 0, NULL, (void*) &AdjustColor, NULL, NULL, Button, "G" }, { 3, 1, 0, NULL, (void*) &AdjustColor, NULL, NULL, Button, "B" }, -{ 4, 1, 0, NULL, (void*) &AdjustColor, NULL, NULL, Button, "W" }, +{ 4, 1, 0, NULL, (void*) &AdjustColor, NULL, NULL, Button, "D" }, { 0, 0, 70, NULL, (void*) &appData.highlightSquareColor, "", NULL, TextBox, _("Highlight Color:") }, -{ 1000, 1, 0, NULL, NULL, NULL, NULL, Button, " " }, +{ 1000, 1, 0, NULL, (void*) &DefColor, NULL, (char**) "#FFFF00", Button, " " }, { 1, 1, 0, NULL, (void*) &AdjustColor, NULL, NULL, Button, "R" }, { 2, 1, 0, NULL, (void*) &AdjustColor, NULL, NULL, Button, "G" }, { 3, 1, 0, NULL, (void*) &AdjustColor, NULL, NULL, Button, "B" }, -{ 4, 1, 0, NULL, (void*) &AdjustColor, NULL, NULL, Button, "W" }, +{ 4, 1, 0, NULL, (void*) &AdjustColor, NULL, NULL, Button, "D" }, { 0, 0, 70, NULL, (void*) &appData.premoveHighlightColor, "", NULL, TextBox, _("Premove Highlight Color:") }, -{ 1000, 1, 0, NULL, NULL, NULL, NULL, Button, " " }, +{ 1000, 1, 0, NULL, (void*) &DefColor, NULL, (char**) "#FF0000", Button, " " }, { 1, 1, 0, NULL, (void*) &AdjustColor, NULL, NULL, Button, "R" }, { 2, 1, 0, NULL, (void*) &AdjustColor, NULL, NULL, Button, "G" }, { 3, 1, 0, NULL, (void*) &AdjustColor, NULL, NULL, Button, "B" }, -{ 4, 1, 0, NULL, (void*) &AdjustColor, NULL, NULL, Button, "W" }, -{ 0, 0, 0, NULL, (void*) &appData.upsideDown, "", NULL, CheckBox, _("Flip Pieces Shogi Style") }, +{ 4, 1, 0, NULL, (void*) &AdjustColor, NULL, NULL, Button, "D" }, +{ 0, 0, 0, NULL, (void*) &appData.upsideDown, "", NULL, CheckBox, _("Flip Pieces Shogi Style (Colored buttons restore default)") }, { 0, 0, 0, NULL, (void*) &appData.allWhite, "", NULL, CheckBox, _("Use Outline Pieces for Black") }, { 0, 0, 0, NULL, (void*) &appData.monoMode, "", NULL, CheckBox, _("Mono Mode") }, { 0,-1, 5, NULL, (void*) &appData.overrideLineGap, "", NULL, Spin, _("Line Gap ( -1 = default for board size):") }, @@ -1274,6 +1313,8 @@ void GenericCallback(w, client_data, call_data) } else ((ButtonCallback*) currentOption[data].target)(data); } +static char *oneLiner = "Return: redraw-display()\n"; + int GenericPopUp(Option *option, char *title, int dlgNr) { @@ -1287,7 +1328,7 @@ GenericPopUp(Option *option, char *title, int dlgNr) static char pane[6] = "paneX"; Widget texts[100], forelast = NULL, anchor, widest, lastrow = NULL; - if(shellUp[dlgNr]) return 0; // already up + if(shellUp[dlgNr]) return 0; // already up if(dlgNr && shells[dlgNr]) { XtPopup(shells[dlgNr], XtGrabNone); shellUp[dlgNr] = True; @@ -1380,6 +1421,8 @@ GenericPopUp(Option *option, char *title, int dlgNr) option[i].handle = (void*) (textField = last = XtCreateManagedWidget("text", asciiTextWidgetClass, form, args, j)); XtAddEventHandler(last, ButtonPressMask, False, SetFocus, (XtPointer) popup); + if(option[i].min == 0 || option[i].type != TextBox) + XtOverrideTranslations(last, XtParseTranslationTable(oneLiner)); if(option[i].type == TextBox || option[i].type == Fractional) break; @@ -1397,8 +1440,7 @@ GenericPopUp(Option *option, char *title, int dlgNr) } XtSetArg(args[j], XtNwidth, w); j++; edit = XtCreateManagedWidget(msg, commandWidgetClass, form, args, j); - XtAddCallback(edit, XtNcallback, SpinCallback, - (XtPointer)(intptr_t) i); + XtAddCallback(edit, XtNcallback, SpinCallback, (XtPointer)(intptr_t) i); if(option[i].type != Spin) break; @@ -1410,8 +1452,7 @@ GenericPopUp(Option *option, char *title, int dlgNr) XtSetArg(args[j], XtNleft, XtChainRight); j++; XtSetArg(args[j], XtNright, XtChainRight); j++; last = XtCreateManagedWidget("-", commandWidgetClass, form, args, j); - XtAddCallback(last, XtNcallback, SpinCallback, - (XtPointer)(intptr_t) i); + XtAddCallback(last, XtNcallback, SpinCallback, (XtPointer)(intptr_t) i); break; case CheckBox: if(!currentCps) option[i].value = *(Boolean*)option[i].target; @@ -1435,6 +1476,8 @@ GenericPopUp(Option *option, char *title, int dlgNr) XtSetArg(args[j], XtNborderWidth, 0); j++; XtSetArg(args[j], XtNjustify, XtJustifyLeft); j++; last = XtCreateManagedWidget(msg, labelWidgetClass, form, args, j); + if(option[i].type == CheckBox) + XtAddEventHandler(last, ButtonPressMask, False, CheckCallback, (XtPointer)(intptr_t) i); break; case SaveButton: case Button: @@ -1450,7 +1493,10 @@ GenericPopUp(Option *option, char *title, int dlgNr) } option[i].handle = (void*) (dialog = last = XtCreateManagedWidget(option[i].name, commandWidgetClass, form, args, j)); - if(option[i].target == NULL && !currentCps) SetColor( *(char**) option[i-1].target, last); else + if(option[i].choice && !currentCps) { + SetColor( *(char**) option[i-1].target, last); + XtAddEventHandler(option[i-1].handle, KeyReleaseMask, False, ColorChanged, (XtPointer)(intptr_t) i-1); + } XtAddCallback(last, XtNcallback, GenericCallback, (XtPointer)(intptr_t) i + (dlgNr<<16)); if(option[i].textValue) SetColor( option[i].textValue, last); @@ -1543,11 +1589,11 @@ GenericPopUp(Option *option, char *title, int dlgNr) XtSetArg(args[j], XtNleft, XtChainRight); j++; XtSetArg(args[j], XtNright, XtChainRight); j++; b_ok = XtCreateManagedWidget(_("OK"), commandWidgetClass, form, args, j); - XtAddCallback(b_ok, XtNcallback, GenericCallback, (XtPointer) dlgNr); + XtAddCallback(b_ok, XtNcallback, GenericCallback, (XtPointer)(intptr_t) dlgNr + (dlgNr<<16)); XtSetArg(args[0], XtNfromHoriz, b_ok); b_cancel = XtCreateManagedWidget(_("cancel"), commandWidgetClass, form, args, j); - XtAddCallback(b_cancel, XtNcallback, GenericCallback, (XtPointer) dlgNr); + XtAddCallback(b_cancel, XtNcallback, GenericCallback, (XtPointer)(intptr_t) dlgNr); } XtRealizeWidget(popup); @@ -1694,7 +1740,7 @@ static void SendTextCB(Widget w, XtPointer client_data, Atom *selection, Atom *type, XtPointer value, unsigned long *len, int *format) { - char buf[MSG_SIZ], *p = (char*) textOptions[(int) client_data].choice, *name = (char*) value, *q; + char buf[MSG_SIZ], *p = (char*) textOptions[(int)(intptr_t) client_data].choice, *name = (char*) value, *q; if (value==NULL || *len==0) return; /* nothing selected, abort */ name[*len]='\0'; strncpy(buf, p, MSG_SIZ); @@ -1711,7 +1757,7 @@ void SendText(int n) XtGetSelectionValue(menuBarWidget, XA_PRIMARY, XA_STRING, /* (XtSelectionCallbackProc) */ SendTextCB, - (XtPointer) n, /* client_data passed to PastePositionCB */ + (XtPointer) (intptr_t) n, /* client_data passed to PastePositionCB */ CurrentTime ); } else SendString(p); @@ -1752,6 +1798,92 @@ void IcsTextProc(w, event, prms, nprms) GenericPopUp(textOptions, _("ICS text menu"), 3); } +static char *commentText; +static int commentIndex; +void ClearComment P((int n)); +extern char commentTranslations[]; + +void NewComCallback(int n) +{ + ReplaceComment(commentIndex, commentText); +} + +void SaveChanges(int n) +{ + Arg args[16]; + XtSetArg(args[0], XtNstring, &commentText); + XtGetValues(currentOption[0].handle, args, 1); + ReplaceComment(commentIndex, commentText); +} + +Option commentOptions[] = { +{ 0xD, 200, 300, NULL, (void*) &commentText, "", NULL, TextBox, "" }, +{ 0, 0, 0, NULL, (void*) &ClearComment, NULL, NULL, Button, "clear" }, +{ 0, 1, 0, NULL, (void*) &SaveChanges, NULL, NULL, Button, "save changes" }, +{ 0, 1, 0, NULL, (void*) &NewComCallback, "", NULL, EndMark , "" } +}; + +void ClearComment(int n) +{ + XtCallActionProc(commentOptions[0].handle, "select-all", NULL, NULL, 0); + XtCallActionProc(commentOptions[0].handle, "kill-selection", NULL, NULL, 0); +} + +void NewCommentPopup(char *title, char *text, int index) +{ + Widget edit; + Arg args[16]; + + if(shells[1]) { // if already exists, alter title and content + XtSetArg(args[0], XtNtitle, title); + XtSetValues(shells[1], args, 1); + XtSetArg(args[0], XtNstring, text); + XtSetValues(commentOptions[0].handle, args, 1); + } + commentText = text; + commentIndex = index; + MarkMenu("menuView.Show Comments", 1); + if(GenericPopUp(commentOptions, title, 1)) + XtOverrideTranslations(commentOptions[0].handle, XtParseTranslationTable(commentTranslations)); +} + +static char *tagsText, *msgText; + +void NewTagsCallback(int n) +{ + ReplaceTags(tagsText, &gameInfo); +} + +void changeTags(int n) +{ + Arg args[16]; + XtSetArg(args[0], XtNstring, &tagsText); + XtGetValues(currentOption[0].handle, args, 1); + ReplaceTags(tagsText, &gameInfo); +} + +Option tagsOptions[] = { +{ 0xD, 200, 250, NULL, (void*) &tagsText, "", NULL, TextBox, "" }, +{ 0, 0, 0, NULL, NULL, NULL, NULL, Label, "" }, +{ 0, 0, 0, NULL, (void*) &changeTags, NULL, NULL, Button, "save changes" }, +{ 0, 1, 0, NULL, (void*) &NewTagsCallback, "", NULL, EndMark , "" } +}; + +void NewTagsPopup(char *text, char *msg) +{ + Widget edit; + Arg args[16]; + + if(shells[2]) { // if already exists, alter title and content + XtSetArg(args[0], XtNstring, text); + XtSetValues(tagsOptions[0].handle, args, 1); + } + tagsText = text; + tagsOptions[1].textValue = msg; + MarkMenu("menuView.Show Tags", 2); + GenericPopUp(tagsOptions, _("Tags"), 2); +} + extern char ICSInputTranslations[]; char *icsText;