X-Git-Url: http://winboard.nl/cgi-bin?a=blobdiff_plain;f=xaw%2Fxoptions.c;h=5feb56a169058598850403ecee8e3687856df5ee;hb=711d00943c8dc11eb3dede32695182defbb96c1f;hp=272db4c6bc39c9f660de904548d0fdb7a66acabf;hpb=5d0f6311ab9e40e026d6ba26fa15e4ba6a5aead3;p=xboard.git diff --git a/xaw/xoptions.c b/xaw/xoptions.c index 272db4c..5feb56a 100644 --- a/xaw/xoptions.c +++ b/xaw/xoptions.c @@ -1,7 +1,7 @@ /* * xoptions.c -- Move list window, part of X front end for XBoard * - * Copyright 2000, 2009, 2010, 2011, 2012, 2013, 2014 Free Software Foundation, Inc. + * Copyright 2000, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016 Free Software Foundation, Inc. * ------------------------------------------------------------------------ * * GNU XBoard is free software: you can redistribute it and/or modify @@ -181,6 +181,11 @@ SetWidgetState (Option *opt, int state) } void +WidgetEcho (Option *opt, int state) +{ +} + +void SetWidgetLabel (Option *opt, char *buf) { Arg arg; @@ -189,6 +194,12 @@ SetWidgetLabel (Option *opt, char *buf) } void +SetComboChoice (Option *opt, int n) +{ + SetWidgetText(opt, opt->choice[n], MasterDlg); +} + +void SetDialogTitle (DialogClass dlg, char *title) { Arg args[16]; @@ -272,12 +283,35 @@ SetTextColor (char **cnames, int fg, int bg, int attr) void AppendColorized (Option *opt, char *message, int count) -{ // ignore +{ + if(!opt->handle) return; + AppendText(opt, message); +} + +void +ApplyFont (Option *opt, char *font) +{ // dummy } void Show (Option *opt, int hide) { + static Dimension h; + Arg args[16]; + Dimension v; + int j=0; +return; // FIXME: it would be nice if the Chat window did have an ICS pane we could hide behind +//printf("Show(%d) %x\n", hide, opt->handle); + if(!opt->handle) return; + if(hide) { // make sure original size is saved + XtSetArg(args[j], XtNheight, &v); j++; + XtGetValues(opt->handle, args, j); + if(v != 1) h = v; + } +printf("h = %d\n",h); + j = 0; + XtSetArg(args[j], XtNheight, hide ? 1 : h); j++; + XtSetValues(opt->handle, args, j); } void @@ -307,13 +341,21 @@ SetIconName (DialogClass dlg, char *name) } static void +LabelCallback (Widget ww, XtPointer client_data, XEvent *event, Boolean *b) +{ // called on ButtonPress in label widgets with attached user handler (clocks!) + int s, data = (intptr_t) client_data; + Option *opt = dialogOptions[data >> 8] + (s = data & 255); + + if(((XButtonEvent*)event)->button != Button1) s = -s; + ((ButtonCallback*) opt->target) (s); +} + +static void CheckCallback (Widget ww, XtPointer client_data, XEvent *event, Boolean *b) { int s, data = (intptr_t) client_data; Option *opt = dialogOptions[data >> 8] + (data & 255); - if(opt->type == Label) { ((ButtonCallback*) opt->target)(data&255); return; } - GetWidgetState(opt, &s); SetWidgetState(opt, !s); } @@ -1092,7 +1134,7 @@ GenericPopUp (Option *option, char *title, DialogClass dlgNr, DialogClass parent XtSetArg(args[j], XtNlabel, _(msg)); j++; option[i].handle = (void*) (last = XtCreateManagedWidget("label", labelWidgetClass, form, args, j)); if(option[i].target) // allow user to specify event handler for button presses - XtAddEventHandler(last, ButtonPressMask, False, CheckCallback, (XtPointer)(intptr_t) i + 256*dlgNr); + XtAddEventHandler(last, ButtonPressMask, False, LabelCallback, (XtPointer)(intptr_t) i + 256*dlgNr); break; case SaveButton: case Button: @@ -1103,9 +1145,11 @@ GenericPopUp (Option *option, char *title, DialogClass dlgNr, DialogClass parent j = SetPositionAndSize(args, last, lastrow, 3 /* border */, option[i].max /* w */, shrink ? textHeight : 0 /* h */, option[i].min & 0xE | chain /* chain */); XtSetArg(args[j], XtNlabel, _(option[i].name)); j++; - if(option[i].textValue) { // special for buttons of New Variant dialog + if(option[i].textValue && *option[i].textValue == '#') { // special for buttons of New Variant dialog + char *p = NULL, *v, n = option[i].value; + if(n >= 0) v = VariantName(n), p = strstr(first.variants, v); XtSetArg(args[j], XtNsensitive, option[i].value >= 0 && (appData.noChessProgram - || strstr(first.variants, VariantName(option[i].value)))); j++; + || p && (!*v || strlen(p) == strlen(v) || p[strlen(v)] == ','))); j++; XtSetArg(args[j], XtNborderWidth, (gameInfo.variant == option[i].value)+1); j++; } option[i].handle = (void*) @@ -1115,7 +1159,7 @@ GenericPopUp (Option *option, char *title, DialogClass dlgNr, DialogClass parent XtAddEventHandler(option[i-1].handle, KeyReleaseMask, False, ColorChanged, (XtPointer)(intptr_t) i-1); } XtAddCallback(last, XtNcallback, GenericCallback, (XtPointer)(intptr_t) i + (dlgNr<<16)); // invokes user callback - if(option[i].textValue) SetColor( option[i].textValue, &option[i]); // for new-variant buttons + if(option[i].textValue && *option[i].textValue == '#') SetColor( option[i].textValue, &option[i]); // for new-variant buttons break; case ComboBox: j = SetPositionAndSize(args, last, lastrow, 0 /* border */, @@ -1191,6 +1235,11 @@ GenericPopUp (Option *option, char *title, DialogClass dlgNr, DialogClass parent 0 /* w */, 0 /* h */, 1 /* chain (always on same row) */); forelast = lastrow; msg = _(option[i].name); // write name on the menu button + if(msg) { if(*msg == '_') msg++; else if(msg[1] == '_') { // kludge to remove GTK shortkut-key indicators + static char buf[MSG_SIZ]; + strncpy(buf, msg, MSG_SIZ); msg = buf + 1; + *msg = *buf; + }} XtSetArg(args[j], XtNmenuName, XtNewString(option[i].name)); j++; XtSetArg(args[j], XtNlabel, msg); j++; option[i].handle = (void*) @@ -1205,6 +1254,7 @@ GenericPopUp (Option *option, char *title, DialogClass dlgNr, DialogClass parent last = form; lastrow = oldLastRow; form = oldForm; forelast = oldForeLast; break; case Break: + if(c) break; width++; height = i+1; stack = !(option[i].min & SAME_ROW); @@ -1359,6 +1409,11 @@ void SetInsertPos (Option *opt, int pos) { Arg args[16]; + if(pos == 999999) { // this kludge to indicate end in GTK is fatal in Xaw + char *s; + GetWidgetText(opt, &s); + pos = strlen(s) - 1; + } XtSetArg(args[0], XtNinsertPosition, pos); XtSetValues(opt->handle, args, 1); // SetFocus(opt->handle, shells[InputBoxDlg], NULL, False); // No idea why this does not work, and the following is needed: @@ -1370,6 +1425,8 @@ TypeInProc (Widget w, XEvent *event, String *prms, Cardinal *nprms) { // can be used as handler for any text edit in any dialog (from GenericPopUp, that is) int n = prms[0][0] - '0'; Widget sh = XtParent(XtParent(XtParent(w))); // popup shell + extern int hidden; + hidden = 0; if(n<2) { // Enter or Esc typed from primed text widget: treat as if dialog OK or cancel button hit. int dlgNr; // figure out what the dialog number is by comparing shells (because we must pass it :( )