Couple mouse wheel to v-scrolls in file browser
[xboard.git] / xoptions.c
index 5bb51a4..1d51738 100644 (file)
@@ -624,6 +624,7 @@ int values[MAX_OPTIONS];
 ChessProgramState *currentCps;
 static Option *currentOption;
 extern Widget shells[];
+static Boolean browserUp;
 
 void CheckCallback(Widget ww, XtPointer data, XEvent *event, Boolean *b)
 {
@@ -659,6 +660,7 @@ void SpinCallback(w, client_data, call_data)
        XtSetArg(args[0], XtNstring, &q);
        XtGetValues(currentOption[data].handle, args, 1);
        for(r = ""; *q; q++) if(*q == '.') r = q; else if(*q == '/') r = ""; // last dot after last slash
+       browserUp = True;
        if(XsraSelFile(shells[0], currentOption[data].name, NULL, NULL, "", "", r,
                                  currentOption[data].type == PathName ? "p" : "f", NULL, &p)) {
                int len = strlen(p);
@@ -666,6 +668,7 @@ void SpinCallback(w, client_data, call_data)
                XtSetArg(args[0], XtNstring, p);
                XtSetValues(currentOption[data].handle, args, 1);
        }
+       browserUp = False;
        SetFocus(currentOption[data].handle, shells[0], (XEvent*) NULL, False);
        return;
     } else
@@ -785,6 +788,7 @@ void GenericPopDown(w, event, prms, nprms)
      Cardinal *nprms;
 {
     int n;
+    if(browserUp) return; // prevent closing dialog when it has an open file-browse daughter
     PopDown(prms[0][0] - '0');
 }
 
@@ -1233,13 +1237,14 @@ void GenericReadout()
                    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) {
+                   if(currentOption[i].type == Fractional)
+                       *(float*) currentOption[i].target = x; // engines never have float options!
+                   else if(currentOption[i].value != x) {
                        currentOption[i].value = x;
-                       if(currentCps) { // engines never have float options, so no decimals!
+                       if(currentCps) {
                            snprintf(buf, MSG_SIZ,  "option %s=%.0f\n", currentOption[i].name, x);
                            SendToProgram(buf, currentCps);
-                       } else if(currentOption[i].type == Spin) *(int*) currentOption[i].target = x;
-                       else *(float*) currentOption[i].target = x;
+                       } else *(int*) currentOption[i].target = x;
                    }
                    break;
                case CheckBox:
@@ -1920,6 +1925,49 @@ void InputBoxPopup()
        XtOverrideTranslations(boxOptions[0].handle, XtParseTranslationTable(ICSInputTranslations));
 }
 
+void TypeInProc(w, event, prms, nprms)
+     Widget w;
+     XEvent *event;
+     String *prms;
+     Cardinal *nprms;
+{
+    Arg args[2];
+    String val;
+
+    if(prms[0][0] == '1') {
+       XtSetArg(args[0], XtNstring, &val);
+       XtGetValues(boxOptions[0].handle, args, 1);
+       TypeInDoneEvent((char*)val);
+    }
+    PopDown(0);\r
+}
+
+char moveTypeInTranslations[] =
+    "<Key>Return: TypeInProc(1) \n"
+    "<Key>Escape: TypeInProc(0) \n";
+
+void PopUpMoveDialog(char firstchar)
+{
+    static char buf[2];
+    buf[0] = firstchar; icsText = buf;
+    if(GenericPopUp(boxOptions, _("Type a move"), 0))
+       XtOverrideTranslations(boxOptions[0].handle, XtParseTranslationTable(moveTypeInTranslations));
+}
+
+void MoveTypeInProc(Widget widget, caddr_t unused, XEvent *event)
+{
+    char buf[10], keys[32];
+    KeySym sym;
+    KeyCode metaL, metaR;
+    int n = XLookupString(&(event->xkey), buf, 10, &sym, NULL);
+    XQueryKeymap(xDisplay,keys);
+    metaL = XKeysymToKeycode(xDisplay, XK_Meta_L);
+    metaR = XKeysymToKeycode(xDisplay, XK_Meta_R);
+    if ( n == 1 && *buf > 32 && !(keys[metaL>>3]&1<<(metaL&7)) && !(keys[metaR>>3]&1<<(metaR&7))) // printable, no alt
+       PopUpMoveDialog(*buf);
+
+}
+
 void
 SettingsPopUp(ChessProgramState *cps)
 {