X-Git-Url: http://winboard.nl/cgi-bin?a=blobdiff_plain;f=filebrowser%2Fselfile.c;h=729453b3a5434a4af67d0165a2b463612aec7f5f;hb=a841d3b604928c71f6d24896e72a818e69d28210;hp=477b02254930635c3d14bd7e0b7b7cd9c91b6170;hpb=8c9c9b75176c6135bd37d190e20b6e1818ff108f;p=xboard.git diff --git a/filebrowser/selfile.c b/filebrowser/selfile.c index 477b022..729453b 100644 --- a/filebrowser/selfile.c +++ b/filebrowser/selfile.c @@ -60,17 +60,9 @@ extern int errno; #include #include -#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" +#include "../gettext.h" #ifndef MAXPATHLEN #define MAXPATHLEN 1024 @@ -80,13 +72,22 @@ extern char SFstatChar(struct stat*); extern char *getwd(); #endif /* !defined(SVR4) && !defined(SYSV) && !defined(USG) */ +#ifdef ENABLE_NLS +# define _(s) gettext (s) +# define N_(s) gettext_noop (s) +#else +# define _(s) (s) +# define N_(s) s +#endif + + 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 +137,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 +268,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; @@ -289,7 +298,7 @@ SFcreateWidgets(toplevel, prompt, ok, cancel) i = 0; XtSetArg(arglist[i], XtNtransientFor, toplevel); i++; - selFile = XtAppCreateShell("Browse", "SelFile", + selFile = XtAppCreateShell(_("Browse"), "SelFile", transientShellWidgetClass, SFdisplay, arglist, i); /* Add WM_DELETE_WINDOW protocol */ @@ -384,7 +393,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); @@ -393,7 +401,7 @@ SFcreateWidgets(toplevel, prompt, ok, cancel) XtAddEventHandler(selFileField, ButtonPressMask, False, SFsetFocus, (XtPointer) selFileForm); i = 0; - XtSetArg(arglist[i], XtNlabel, "Filter on extensions:"); i++; + XtSetArg(arglist[i], XtNlabel, _("Filter on extensions:")); i++; XtSetArg(arglist[i], XtNvertDistance, 5); i++; XtSetArg(arglist[i], XtNfromVert, selFileField); i++; XtSetArg(arglist[i], XtNresizable, True); i++; @@ -522,6 +530,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 +598,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 +688,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); @@ -744,15 +782,15 @@ XsraSelFile(toplevel, prompt, ok, cancel, failed, FILE *fp; if (!prompt) { - prompt = "Pathname:"; + prompt = _("Pathname:"); } if (!ok) { - ok = "OK"; + ok = _("OK"); } if (!cancel) { - cancel = "Cancel"; + cancel = _("Cancel"); } if(SFpathFlag != (mode && mode[0] == 'p') || strcmp(SFfilterBuffer, filter)) { @@ -783,8 +821,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); @@ -795,7 +834,7 @@ XsraSelFile(toplevel, prompt, ok, cancel, failed, if (!getwd(SFstartDir)) { #endif /* defined(SVR4) || defined(SYSV) || defined(USG) */ - XtAppError(SFapp, "XsraSelFile: can't get current directory"); + XtAppError(SFapp, _("XsraSelFile: can't get current directory")); } (void) strcat(SFstartDir, "/"); (void) strncpy(SFcurrentDir, SFstartDir, MAXPATHLEN); @@ -844,8 +883,8 @@ XsraSelFile(toplevel, prompt, ok, cancel, failed, SFprepareToReturn(); return stderr; } - if (fp = SFopenFile(*name_return, mode, - prompt, failed)) { + if ((!(*name_return)[0] || (*name_return)[strlen(*name_return)-1] != '/') && // [HGM] refuse directories + (fp = SFopenFile(*name_return, mode, prompt, failed))) { SFprepareToReturn(); return fp; } @@ -859,4 +898,5 @@ XsraSelFile(toplevel, prompt, ok, cancel, failed, break; } } + }