Merge branch 'v4.8.x'
[xboard.git] / xaw / xoptions.c
index 38c6c5e..502aed1 100644 (file)
@@ -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
@@ -189,6 +189,12 @@ SetWidgetLabel (Option *opt, char *buf)
 }
 
 void
+SetComboChoice (Option *opt, char *n)
+{
+    SetWidgetText(opt, opt->choice[n]);
+}
+
+void
 SetDialogTitle (DialogClass dlg, char *title)
 {
     Arg args[16];
@@ -266,6 +272,39 @@ SelectedListBoxItem (Option *opt)
 }
 
 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
+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)
@@ -292,13 +331,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);
 }
@@ -1077,7 +1124,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:
@@ -1088,9 +1135,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, *v, n = option[i].value;
+               if(n) 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*)
@@ -1100,7 +1149,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 */,
@@ -1190,6 +1239,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);
@@ -1344,6 +1394,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:
@@ -1355,6 +1410,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 :( )
@@ -1364,7 +1421,7 @@ TypeInProc (Widget w, XEvent *event, String *prms, Cardinal *nprms)
 }
 
 void
-HardSetFocus (Option *opt)
+HardSetFocus (Option *opt, DialogClass dlg)
 {
     XSetInputFocus(xDisplay, XtWindow(opt->handle), RevertToPointerRoot, CurrentTime);
 }