📄 path.c
字号:
entries[i].statDone = 1; if (len > maxChars) { maxChars = len; } SFstrdup (&SFlogins[i].name, pw->pw_name); SFstrdup (&SFlogins[i].dir, pw->pw_dir); i++; } SFhomeDir.dir = XtMalloc (1); SFhomeDir.dir[0] = 0; SFhomeDir.path = SFcurrentPath; SFhomeDir.entries = entries; SFhomeDir.nEntries = i; SFhomeDir.vOrigin = 0; /* :-) */ SFhomeDir.nChars = maxChars + 2; SFhomeDir.hOrigin = 0; SFhomeDir.changed = 1; 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) */ for (i--; i >= 0; i--) { strcat (entries[i].real, "/"); }}static int SFfindHomeDir (char *begin, char *end) { char save; char *theRest; int i; save = *end; *end = 0; for (i = SFhomeDir.nEntries - 1; i >= 0; i--) { if (!strcmp (SFhomeDir.entries[i].real, begin)) { *end = save; SFstrdup (&theRest, end); strcat (strcat (strcpy ( SFcurrentPath, SFlogins[i].dir ), "/"), theRest); XtFree (theRest); SFsetText (SFcurrentPath); SFtextChanged (); return 1; } } *end = save; return 0;}void SFupdatePath (void) { static int alloc; static int wasTwiddle = 0; char *begin, *end; int i, j; int prevChange; int SFdirPtrSave, SFdirEndSave; SFDir *dir; if (!SFdirs) { SFdirs = (SFDir *) XtMalloc ((alloc = 10) * sizeof (SFDir)); dir = &(SFdirs[0]); SFstrdup (&dir->dir, "/"); SFchdir ("/"); SFgetDir (dir); for (j = 1; j < alloc; j++) { SFdirs[j].dir = NULL; } dir->path = SFcurrentPath + 1; dir->vOrigin = 0; dir->hOrigin = 0; dir->changed = 1; dir->beginSelection = -1; dir->endSelection = -1; SFhomeDir.dir = NULL; } SFdirEndSave = SFdirEnd; SFdirEnd = 1; SFdirPtrSave = SFdirPtr; SFdirPtr = 0; begin = NULL; if (SFcurrentPath[0] == '~') { if (!SFtwiddle) { SFtwiddle = 1; dir = & (SFdirs[0]); SFrootDir = *dir; if (!SFhomeDir.dir) { SFgetHomeDirs (); } *dir = SFhomeDir; dir->changed = 1; } end = SFcurrentPath; SFdoNotTouchDirPtr = 1; wasTwiddle = 1; } else { if (SFtwiddle) { SFtwiddle = 0; dir = & (SFdirs[0]); *dir = SFrootDir; dir->changed = 1; } end = SFcurrentPath + 1; } i = 0; prevChange = 0; while (*end) { while (*end++ == '/') { ; } end--; begin = end; while ((*end) && (*end++ != '/')) { ; } if ((end - SFcurrentPath <= SFtextPos) && (* (end - 1) == '/')) { SFdirPtr = i - 1; if (SFdirPtr < 0) { SFdirPtr = 0; } } if (*begin) { if (*(end - 1) == '/') { char save = *end; if (SFtwiddle) { if (SFfindHomeDir (begin, end)) { return; } } *end = 0; i++; SFdirEnd++; if (i >= alloc) { SFdirs = (SFDir *) XtRealloc ( (char *) SFdirs, (unsigned) ((alloc *= 2) * sizeof (SFDir)) ); for (j = alloc / 2; j < alloc; j++) { SFdirs[j].dir = NULL; } } dir = &(SFdirs[i]); if ((!(dir->dir)) || prevChange || strcmp (dir->dir, begin)) { if (dir->dir) { SFfree (i); } prevChange = 1; SFstrdup (&dir->dir, begin); dir->path = end; dir->vOrigin = 0; dir->hOrigin = 0; dir->changed = 1; dir->beginSelection = -1; dir->endSelection = -1; SFfindFile (dir - 1, begin); if (SFchdir (SFcurrentPath) || SFgetDir (dir)) { SFunreadableDir (dir); break; } } *end = save; if (!save) { SFunselect (); } } else { if (SFfindFile (& (SFdirs[SFdirEnd-1]), begin)) { return; } } } else { SFunselect (); } } if ((end == SFcurrentPath + 1) && (!SFtwiddle)) { SFunselect (); } for (i = SFdirEnd; i < alloc; i++) { if (SFdirs[i].dir) { SFfree (i); } } if (SFdoNotTouchDirPtr) { if (wasTwiddle) { wasTwiddle = 0; SFdirPtr = SFdirEnd - 2; if (SFdirPtr < 0) { SFdirPtr = 0; } } else { SFdirPtr = SFdirPtrSave; } SFdoNotTouchDirPtr = 0; } if ((SFdirPtr != SFdirPtrSave) || (SFdirEnd != SFdirEndSave)) { XawScrollbarSetThumb ( selFileHScroll, (float) (((double) SFdirPtr) / SFdirEnd), (float) (((double) ((SFdirEnd < 3) ? SFdirEnd : 3)) / SFdirEnd) ); } if (SFdirPtr != SFdirPtrSave) { SFdrawLists (SF_DO_SCROLL); } else { for (i = 0; i < 3; i++) { if (SFdirPtr + i < SFdirEnd) { if (SFdirs[SFdirPtr + i].changed) { SFdirs[SFdirPtr + i].changed = 0; SFdrawList (i, SF_DO_SCROLL); } } else { SFclearList (i, SF_DO_SCROLL); } } }}void SFsetText (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));}void SFbuttonPressList (Widget w, XtPointer cl, XEvent *ev, Boolean *b) { SFbuttonPressed = 1;}void SFbuttonReleaseList (Widget w, XtPointer cl, XEvent *ev, Boolean *b) { SFDir *dir; intptr_t n; XButtonReleasedEvent *event; n = (intptr_t) cl; event = (XButtonReleasedEvent *) ev; SFbuttonPressed = 0; if (SFcurrentInvert[n] != -1) { if (n < 2) { SFdoNotTouchDirPtr = 1; } SFdoNotTouchVorigin = 1; dir = &(SFdirs[SFdirPtr + n]); SFreplaceText ( dir, dir->entries[dir->vOrigin + SFcurrentInvert[n]].shown ); SFmotionList (w, (XtPointer) n, (XEvent *) event, NULL); }}static int SFcheckDir (int n, SFDir *dir) { struct stat statBuf; int i; if ((!stat (".", &statBuf)) && (statBuf.st_mtime != dir->mtime)) { /* If the pointer is currently in the window that we are about to update, we must warp it to prevent the user from accidentally selecting the wrong file. */ if (SFcurrentInvert[n] != -1) { XWarpPointer ( SFdisplay, None, XtWindow (selFileLists[n]), 0, 0, 0, 0, 0, 0 ); } for (i = dir->nEntries - 1; i >= 0; i--) { if (dir->entries[i].shown != dir->entries[i].real) { XtFree (dir->entries[i].shown); } XtFree (dir->entries[i].real); } XtFree ((char *) dir->entries); if (SFgetDir (dir)) { SFunreadableDir (dir); } if (dir->vOrigin > dir->nEntries - SFlistSize) { dir->vOrigin = dir->nEntries - SFlistSize; } if (dir->vOrigin < 0) { dir->vOrigin = 0; } if (dir->hOrigin > dir->nChars - SFcharsPerEntry) { dir->hOrigin = dir->nChars - SFcharsPerEntry; } if (dir->hOrigin < 0) { dir->hOrigin = 0; } dir->beginSelection = -1; dir->endSelection = -1; SFdoNotTouchVorigin = 1; if ((dir + 1)->dir) { SFfindFile (dir, (dir + 1)->dir); } else { SFfindFile (dir, dir->path); } if (!SFworkProcAdded) { SFworkProcId = XtAppAddWorkProc (SFapp, SFworkProc, NULL); SFworkProcAdded = 1; } return 1; } return 0;}static int SFcheckFiles (SFDir *dir) { int from, to; int result; char old, new; int i; char *str; int last; struct stat statBuf; result = 0; from = dir->vOrigin; to = dir->vOrigin + SFlistSize; if (to > dir->nEntries) { to = dir->nEntries; } for (i = from; i < to; i++) { str = dir->entries[i].real; last = strlen (str) - 1; old = str[last]; str[last] = 0; if (stat (str, &statBuf)) { new = ' '; } else { new = SFstatChar (&statBuf); } str[last] = new; if (new != old) { result = 1; } } return result;}void SFdirModTimer (XtPointer cl, XtIntervalId *id) { static int n = -1; static int f = 0; char save; SFDir *dir; if ((!SFtwiddle) && (SFdirPtr < SFdirEnd)) { n++; if ((n > 2) || (SFdirPtr + n >= SFdirEnd)) { n = 0; f++; if ((f > 2) || (SFdirPtr + f >= SFdirEnd)) { f = 0; } } dir = & (SFdirs[SFdirPtr + n]); save = * (dir->path); * (dir->path) = 0; if (SFchdir (SFcurrentPath)) { *(dir->path) = save; /* force a re-read */ *(dir->dir) = 0; SFupdatePath (); } else { *(dir->path) = save; if (SFcheckDir (n, dir) || ((f == n) && SFcheckFiles (dir))) { SFdrawList (n, SF_DO_SCROLL); } } } SFdirModTimerId = XtAppAddTimeOut ( SFapp, (unsigned long) 1000, SFdirModTimer, (XtPointer) NULL );}/* Return a single character describing what kind of file STATBUF is. */char SFstatChar (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 ' '; }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -