Reactivate Falcon Chess
[xboard.git] / filebrowser / selfile.c
index 477b022..71dcd8c 100644 (file)
@@ -60,17 +60,8 @@ extern int errno;
 #include <X11/Xaw/Label.h>
 #include <X11/Xaw/Cardinals.h>
 
-#include "selfile.h"
 #include "xstat.h"
-
-/* added missing prototypes */
-extern void SFdrawList(int,int);
-extern void SFinitFont();
-extern void SFcreateGC();
-extern int SFchdir(char *);
-extern void SFupdatePath();
-extern void SFsetText(char *);
-extern char SFstatChar(struct stat*);
+#include "selfile.h"
 
 #ifndef MAXPATHLEN
 #define MAXPATHLEN 1024
@@ -83,10 +74,10 @@ extern char *getwd();
 int SFstatus = SEL_FILE_NULL;
 
 char
-       SFstartDir[MAXPATHLEN],
-       SFcurrentPath[MAXPATHLEN],
-       SFlastPath[MAXPATHLEN],
-       SFcurrentDir[MAXPATHLEN];
+       SFstartDir[MAXPATHLEN+1],
+       SFcurrentPath[MAXPATHLEN+1],
+       SFlastPath[MAXPATHLEN+1],
+       SFcurrentDir[MAXPATHLEN+1];
 
 Widget
        selFile,
@@ -136,9 +127,9 @@ XtAppContext SFapp;
 
 int SFpathScrollWidth, SFvScrollHeight, SFhScrollWidth;
 
-char SFtextBuffer[MAXPATHLEN];
+char SFtextBuffer[MAXPATHLEN+1];
 
-char SFfilterBuffer[MAXPATHLEN];
+char SFfilterBuffer[MAXPATHLEN+1];
 
 XtIntervalId SFdirModTimerId;
 
@@ -267,6 +258,14 @@ void SFsetFocus(Widget w, XtPointer data, XEvent *event, Boolean *b)
     XtSetKeyboardFocus((Widget) data, w);
 }
 
+void SFwheelProc(Widget w, XtPointer data, XEvent *event, Boolean *b)
+{   // [HGM] mouse-wheel callback scrolls lists
+    int dir, n = (intptr_t) data;
+    if(event->xbutton.button == Button4) dir = -2; // kludge to indicate relative motion
+    if(event->xbutton.button == Button5) dir = -1;
+    SFvSliderMovedCallback(w, n, dir);
+}
+
 static void
 SFcreateWidgets(toplevel, prompt, ok, cancel)
        Widget  toplevel;
@@ -384,7 +383,6 @@ SFcreateWidgets(toplevel, prompt, ok, cancel)
        XtSetArg(arglist[i], XtNeditType, XawtextEdit);                 i++;
        XtSetArg(arglist[i], XtNwrap, XawtextWrapWord);                 i++;
        XtSetArg(arglist[i], XtNresize, XawtextResizeHeight);           i++;
-       XtSetArg(arglist[i], XtNuseStringInPlace, True);                i++;
        selFileField = XtCreateManagedWidget("selFileField",
                asciiTextWidgetClass, selFileForm, arglist, i);
 
@@ -522,6 +520,9 @@ SFcreateWidgets(toplevel, prompt, ok, cancel)
                        SFhSliderMovedCallback, (XtPointer)(intptr_t) n);
                XtAddCallback(selFileHScrolls[n], XtNscrollProc,
                        SFhAreaSelectedCallback, (XtPointer)(intptr_t) n);
+
+               XtAddEventHandler(selFileVScrolls[n], ButtonPressMask, False,
+                       SFwheelProc, (XtPointer)(intptr_t) n); // [HGM] couplemouse wheel to v-scroll
        }
 
        i = 0;
@@ -587,7 +588,7 @@ SFcreateWidgets(toplevel, prompt, ok, cancel)
                XtAddEventHandler(selFileLists[n], LeaveWindowMask, False,
                        SFleaveList, (XtPointer)(intptr_t) n);
                XtAddEventHandler(selFileLists[n], PointerMotionMask, False,
-                       SFmotionList, (XtPointer)(intptr_t) n);
+                       (XtEventHandler) SFmotionList, (XtPointer)(intptr_t) n);
                XtAddEventHandler(selFileLists[n], ButtonPressMask, False,
                        SFbuttonPressList, (XtPointer)(intptr_t) n);
                XtAddEventHandler(selFileLists[n], ButtonReleaseMask, False,
@@ -677,8 +678,35 @@ SFopenFile(name, mode, prompt, failed)
 }
 
 void
+SFupdateTextBuffer()
+{
+       Arg arglist[2];
+       int i;
+       char *v;
+
+       i = 0;
+       XtSetArg(arglist[i], XtNstring, &v);  i++;
+       XtGetValues(selFileField, arglist, i);
+       strncpy(SFtextBuffer, v, MAXPATHLEN);
+}
+
+void
+SFsetText(path)
+       char    *path;
+{
+       Arg arglist[2];
+       int i;
+
+       i = 0;
+       XtSetArg(arglist[i], XtNstring, path);  i++;
+       XtSetValues(selFileField, arglist, i);
+       XawTextSetInsertionPoint(selFileField, strlen(path));
+}
+
+void
 SFtextChanged()
 {
+       SFupdateTextBuffer();
 
        if ((SFtextBuffer[0] == '/') || (SFtextBuffer[0] == '~')) {
          (void) strncpy(SFcurrentPath, SFtextBuffer, MAXPATHLEN);
@@ -783,8 +811,9 @@ XsraSelFile(toplevel, prompt, ok, cancel, failed,
        XtSetArg(arglist[i], XtNstring, filter);                        i++;
        XtSetValues(filterField, arglist, i);
 
-       safeStrCpy(SFfilterBuffer, filter, MAXPATHLEN);
-       safeStrCpy(SFlastPath, SFtextBuffer, MAXPATHLEN); // remember for cancel
+       strncpy(SFfilterBuffer, filter, MAXPATHLEN-1);
+       SFupdateTextBuffer();
+       strncpy(SFlastPath, SFtextBuffer, MAXPATHLEN-1); // remember for cancel
 
        SFpositionWidget(selFile);
        XtMapWidget(selFile);
@@ -844,8 +873,8 @@ XsraSelFile(toplevel, prompt, ok, cancel, failed,
                                SFprepareToReturn();
                                return stderr;
                        }
-                       if (fp = SFopenFile(*name_return, mode,
-                                           prompt, failed)) {
+                       if ((*name_return)[strlen(*name_return)-1] != '/' &&         // [HGM] refuse directories
+                           (fp = SFopenFile(*name_return, mode, prompt, failed))) {
                                SFprepareToReturn();
                                return fp;
                        }
@@ -859,4 +888,5 @@ XsraSelFile(toplevel, prompt, ok, cancel, failed,
                        break;
                }
        }
+
 }