X-Git-Url: http://winboard.nl/cgi-bin?a=blobdiff_plain;f=filebrowser%2Fpath.c;h=66c9ab5a9d4ed9d97a209695e3ef231ae4c18fe3;hb=4eec2ced245a4f86a63ca03781250cc6c82cddf2;hp=4e13ea3c553097011e77c15d0e1eb7aa44597226;hpb=18c9024957df2892adb21cd851cb7a27b9502d54;p=xboard.git diff --git a/filebrowser/path.c b/filebrowser/path.c index 4e13ea3..66c9ab5 100644 --- a/filebrowser/path.c +++ b/filebrowser/path.c @@ -25,6 +25,8 @@ */ #include +#include /* for qsort */ +#include "config.h" #ifdef SEL_FILE_IGNORE_CASE #include @@ -32,14 +34,17 @@ #include #include -#include "selfile.h" #include "xstat.h" +#include "selfile.h" #include -#if defined(SVR4) || defined(SYSV) || defined(USG) +#ifndef MAXPATHLEN +#define MAXPATHLEN 1024 +#endif /* ndef MAXPATHLEN */ + +#ifdef HAS_DIRENT_H extern uid_t getuid(); -extern void qsort(); -#endif /* defined(SVR4) || defined(SYSV) || defined(USG) */ +#endif /* def HAS_DIRENT_H */ typedef struct { char *name; @@ -64,6 +69,8 @@ static SFLogin *SFlogins; static int SFtwiddle = 0; +void SFsetText(char *path); + int SFchdir(path) char *path; @@ -75,7 +82,7 @@ SFchdir(path) if (strcmp(path, SFcurrentDir)) { result = chdir(path); if (!result) { - (void) strcpy(SFcurrentDir, path); + (void) strncpy(SFcurrentDir, path, MAXPATHLEN); } } @@ -446,13 +453,8 @@ SFgetHomeDirs() SFhomeDir.beginSelection = -1 ; SFhomeDir.endSelection = -1 ; -#if defined(SVR4) || defined(SYSV) || defined(USG) - qsort((char *) entries, (unsigned)i, sizeof(SFEntry), SFcompareEntries); - qsort((char *) SFlogins, (unsigned)i, sizeof(SFLogin), SFcompareLogins); -#else /* defined(SVR4) || defined(SYSV) || defined(USG) */ - qsort((char *) entries, i, sizeof(SFEntry), SFcompareEntries); - qsort((char *) SFlogins, i, sizeof(SFLogin), SFcompareLogins); -#endif /* defined(SVR4) || defined(SYSV) || defined(USG) */ + qsort((char *) entries, (size_t)i, sizeof(SFEntry), SFcompareEntries); + qsort((char *) SFlogins, (size_t)i, sizeof(SFLogin), SFcompareLogins); for (i--; i >= 0; i--) { (void) strcat(entries[i].real, "/"); @@ -475,8 +477,9 @@ SFfindHomeDir(begin, end) if (!strcmp(SFhomeDir.entries[i].real, begin)) { *end = save; SFstrdup(&theRest, end); - (void) strcat(strcat(strcpy(SFcurrentPath, - SFlogins[i].dir), "/"), theRest); + (void) strcat(strcat(strncpy(SFcurrentPath,SFlogins[i].dir, + MAXPATHLEN), "/"), + theRest); XtFree(theRest); SFsetText(SFcurrentPath); SFtextChanged(); @@ -680,23 +683,6 @@ SFupdatePath() return; } -void -SFsetText(path) - char *path; -{ - XawTextBlock text; - - text.firstPos = 0; - text.length = strlen(path); - text.ptr = path; - text.format = FMT8BIT; - - XawTextReplace(selFileField, 0, strlen(SFtextBuffer), &text); - XawTextSetInsertionPoint(selFileField, strlen(SFtextBuffer)); - - return; -} - /* ARGSUSED */ void SFbuttonPressList(w, n, event) @@ -704,6 +690,10 @@ SFbuttonPressList(w, n, event) int n; XButtonPressedEvent *event; { + int dir = 0; + if(event->button == Button4) dir = -2; // kludge to indicate relative motion + if(event->button == Button5) dir = -1; + if(dir) SFvSliderMovedCallback(w, n, dir); else SFbuttonPressed = 1; } @@ -715,7 +705,9 @@ SFbuttonReleaseList(w, n, event) XButtonReleasedEvent *event; { SFDir *dir; + static int lastClick; + if(event->button == Button4 || event->button == Button5) return; // [HGM] mouse wheel does not select SFbuttonPressed = 0; if (SFcurrentInvert[n] != -1) { @@ -728,8 +720,10 @@ SFbuttonReleaseList(w, n, event) dir, dir->entries[dir->vOrigin + SFcurrentInvert[n]].shown ); - SFmotionList(w, n, event); + SFmotionList(w, n, (XMotionEvent *) event); + if(lastClick == 256*n + SFcurrentInvert[n]) SFstatus = SEL_FILE_OK; // [HGM] double click implies OK } + lastClick = 256*n + SFcurrentInvert[n]; } static int @@ -806,6 +800,25 @@ SFcheckDir(n, dir) return 0; } +/* Return a single character describing what kind of file STATBUF is. */ + +char +SFstatChar (statBuf) + struct stat *statBuf; +{ + if (S_ISDIR (statBuf->st_mode)) { + return '/'; + } else if (S_ISREG (statBuf->st_mode)) { + return S_ISXXX (statBuf->st_mode) ? '*' : ' '; +#ifdef S_ISSOCK + } else if (S_ISSOCK (statBuf->st_mode)) { + return '='; +#endif /* S_ISSOCK */ + } else { + return ' '; + } +} + static int SFcheckFiles(dir) SFDir *dir; @@ -890,22 +903,3 @@ SFdirModTimer(cl, id) SFdirModTimerId = XtAppAddTimeOut(SFapp, (unsigned long) 1000, SFdirModTimer, (XtPointer) NULL); } - -/* Return a single character describing what kind of file STATBUF is. */ - -char -SFstatChar (statBuf) - struct stat *statBuf; -{ - if (S_ISDIR (statBuf->st_mode)) { - return '/'; - } else if (S_ISREG (statBuf->st_mode)) { - return S_ISXXX (statBuf->st_mode) ? '*' : ' '; -#ifdef S_ISSOCK - } else if (S_ISSOCK (statBuf->st_mode)) { - return '='; -#endif /* S_ISSOCK */ - } else { - return ' '; - } -}