#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
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,
int SFpathScrollWidth, SFvScrollHeight, SFhScrollWidth;
-char SFtextBuffer[MAXPATHLEN];
+char SFtextBuffer[MAXPATHLEN+1];
-char SFfilterBuffer[MAXPATHLEN];
+char SFfilterBuffer[MAXPATHLEN+1];
XtIntervalId SFdirModTimerId;
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;
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);
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;
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,
}
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);
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);
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;
}
break;
}
}
+
}