/*
* 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
}
void
+WidgetEcho (Option *opt, int state)
+{
+}
+
+void
SetWidgetLabel (Option *opt, char *buf)
{
Arg arg;
}
void
+SetComboChoice (Option *opt, int n)
+{
+ SetWidgetText(opt, opt->choice[n], MasterDlg);
+}
+
+void
SetDialogTitle (DialogClass dlg, char *title)
{
Arg args[16];
}
void
+SetTextColor (char **cnames, int fg, int bg, int attr)
+{ // this is not possible in Xaw
+}
+
+void
+AppendColorized (Option *opt, char *message, int count)
+{
+ 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
HighlightText (Option *opt, int start, int end, Boolean on)
{
if(on)
}
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);
}
if(--j < opt->min) return;
} else return;
snprintf(buf, MSG_SIZ, "%d", j);
- SetWidgetText(opt, buf, TransientDlg);
+ SetWidgetText(opt, buf, shellUp[TransientDlg] ? TransientDlg : MasterDlg);
}
static void
{ // to cause popdown through a translation (Delete Window button!)
int dlg = atoi(prms[0]);
Widget sh = shells[dlg];
- if(shellUp[BrowserDlg] && dlg != BrowserDlg || dialogError) return; // prevent closing dialog when it has an open file-browse daughter
+ if(shellUp[BrowserDlg] && dlg != BrowserDlg || dialogError || dlg == MasterDlg && shellUp[TransientDlg])
+ return; // prevent closing dialog when it has an open file-browse or transient daughter
shells[dlg] = w;
PopDown(dlg);
shells[dlg] = sh; // restore
shellUp[dlgNr] = True;
return 0;
}
+ if(dlgNr == TransientDlg && parent == BoardWindow && shellUp[MasterDlg]) parent = MasterDlg; // MasterDlg can always take role of main window
dialogOptions[dlgNr] = option; // make available to callback
// post currentOption globally, so Spin and Combo callbacks can already use it
for(h=0; h<height || c == width-1; h++) {
i = h + c*height;
if(option[i].type == EndMark) break;
- if(option[i].type == -1) continue;
+ if(option[i].type == Skip) continue;
lastrow = forelast;
forelast = last;
switch(option[i].type) {
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:
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*)
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 */,
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*)
last = form; lastrow = oldLastRow; form = oldForm; forelast = oldForeLast;
break;
case Break:
+ if(c) break;
width++;
height = i+1;
stack = !(option[i].min & SAME_ROW);
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:
{ // 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 :( )
}
void
-HardSetFocus (Option *opt)
+HardSetFocus (Option *opt, DialogClass dlg)
{
XSetInputFocus(xDisplay, XtWindow(opt->handle), RevertToPointerRoot, CurrentTime);
}