/* Builds up a menu containing the titles of all the unused recent files */ void MenuRecentBuild(GWindow base,struct gmenuitem *mi,GEvent *e) { int i, cnt, cnt1; FontViewBase *fv; GMenuItem *sub; if ( mi->sub!=NULL ) { GMenuItemArrayFree(mi->sub); mi->sub = NULL; } cnt = 0; for ( i=0; i<RECENT_MAX && RecentFiles[i]!=NULL; ++i ) { for ( fv=(FontViewBase *) fv_list; fv!=NULL; fv=fv->next ) if ( fv->sf->filename!=NULL && strcmp(fv->sf->filename,RecentFiles[i])==0 ) break; if ( fv==NULL ) ++cnt; } if ( cnt==0 ) { /* This can't happen */ return; } sub = calloc(cnt+1,sizeof(GMenuItem)); cnt1 = 0; for ( i=0; i<RECENT_MAX && RecentFiles[i]!=NULL; ++i ) { for ( fv=(FontViewBase *) fv_list; fv!=NULL; fv=fv->next ) if ( fv->sf->filename!=NULL && strcmp(fv->sf->filename,RecentFiles[i])==0 ) break; if ( fv==NULL ) { GMenuItem *mi = &sub[cnt1++]; mi->ti.userdata = RecentFiles[i]; mi->ti.bg = mi->ti.fg = COLOR_DEFAULT; mi->invoke = RecentSelect; mi->ti.text = def2u_copy(GFileNameTail(RecentFiles[i])); } } if ( cnt!=cnt1 ) IError( "Bad counts in MenuRecentBuild"); mi->sub = sub; }
static void _gio_file_dir(GIOControl *gc,char *path) { DIR *dir; struct dirent *ent; GDirEntry *head=NULL, *last=NULL, *cur; char *buffer, *ept, *temp; struct stat statb; dir = opendir(path); if ( dir==NULL ) { _GIO_reporterror(gc,errno); return; } buffer = (char *) malloc(strlen(path)+FILENAME_MAX+3); strcpy(buffer,path); ept = buffer+strlen(buffer); if ( ept[-1]!='/' ) *ept++ = '/'; while (( ent = readdir(dir))!=NULL ) { cur = (GDirEntry *) calloc(1,sizeof(GDirEntry)); cur->name = def2u_copy(ent->d_name); strcpy(ept,ent->d_name); stat(buffer,&statb); cur->hasdir = cur->hasexe = cur->hasmode = cur->hassize = cur->hastime = true; cur->size = statb.st_size; cur->mode = statb.st_mode; cur->modtime = statb.st_mtime; cur->isdir = S_ISDIR(cur->mode); cur->isexe = !cur->isdir && (cur->mode & 0100); temp = NULL; // Things go badly if we open a pipe or a device. So we don't. #ifdef __MINGW32__ //Symlinks behave differently on Windows and are transparent, so no S_ISLNK. if (S_ISREG(statb.st_mode) || S_ISDIR(statb.st_mode)) { #else if (S_ISREG(statb.st_mode) || S_ISDIR(statb.st_mode) || S_ISLNK(statb.st_mode)) { #endif // We look at the file and try to determine a MIME type. if ( (temp=GIOguessMimeType(buffer)) || (temp=GIOGetMimeType(buffer)) ) { cur->mimetype = u_copy(c_to_u(temp)); free(temp); } } if ( last==NULL ) head = last = cur; else { last->next = cur; last = cur; } } #if __CygWin /* Under cygwin we should give the user access to /cygdrive, even though */ /* a diropen("/") will not find it */ if ( strcmp(path,"/")==0 ) { cur = (GDirEntry *) calloc(1,sizeof(GDirEntry)); cur->name = def2u_copy("cygdrive"); strcpy(ept,"cygdrive"); stat(buffer,&statb); cur->hasdir = cur->hasexe = cur->hasmode = cur->hassize = cur->hastime = true; cur->size = statb.st_size; cur->mode = statb.st_mode; cur->modtime = statb.st_mtime; cur->isdir = S_ISDIR(cur->mode); cur->isexe = !cur->isdir && (cur->mode & 0100); if ( last==NULL ) head = last = cur; else { last->next = cur; last = cur; } } #endif closedir(dir); free(buffer); gc->iodata = head; gc->direntrydata = true; gc->return_code = 200; gc->done = true; (gc->receivedata)(gc); } static void _gio_file_statfile(GIOControl *gc,char *path) { GDirEntry *cur; struct stat statb; if ( stat(path,&statb)==-1 ) { _GIO_reporterror(gc,errno); } else { cur = (GDirEntry *) calloc(1,sizeof(GDirEntry)); cur->name = uc_copy(GFileNameTail(path)); cur->hasdir = cur->hasexe = cur->hasmode = cur->hassize = cur->hastime = true; cur->size = statb.st_size; cur->mode = statb.st_mode; cur->modtime = statb.st_mtime; cur->isdir = S_ISDIR(cur->mode); cur->isexe = !cur->isdir && (cur->mode & 0100); gc->iodata = cur; gc->direntrydata = true; gc->return_code = 200; gc->done = true; (gc->receivedata)(gc); } }
static void _gio_file_dir(GIOControl *gc,char *path) { DIR *dir; struct dirent *ent; GDirEntry *head=NULL, *last=NULL, *cur; char *buffer, *ept; struct stat statb; dir = opendir(path); if ( dir==NULL ) { _GIO_reporterror(gc,errno); return; } buffer = (char *) galloc(strlen(path)+FILENAME_MAX+3); strcpy(buffer,path); ept = buffer+strlen(buffer); if ( ept[-1]!='/' ) *ept++ = '/'; while (( ent = readdir(dir))!=NULL ) { cur = (GDirEntry *) gcalloc(1,sizeof(GDirEntry)); cur->name = def2u_copy(ent->d_name); strcpy(ept,ent->d_name); stat(buffer,&statb); cur->hasdir = cur->hasexe = cur->hasmode = cur->hassize = cur->hastime = true; cur->size = statb.st_size; cur->mode = statb.st_mode; cur->modtime = statb.st_mtime; cur->isdir = S_ISDIR(cur->mode); cur->isexe = !cur->isdir && (cur->mode & 0100); cur->mimetype= u_copy(c_to_u(GIOGetMimeType(buffer, false))); if ( last==NULL ) head = last = cur; else { last->next = cur; last = cur; } } #if __CygWin /* Under cygwin we should give the user access to /cygdrive, even though */ /* a diropen("/") will not find it */ if ( strcmp(path,"/")==0 ) { cur = (GDirEntry *) gcalloc(1,sizeof(GDirEntry)); cur->name = def2u_copy("cygdrive"); strcpy(ept,"cygdrive"); stat(buffer,&statb); cur->hasdir = cur->hasexe = cur->hasmode = cur->hassize = cur->hastime = true; cur->size = statb.st_size; cur->mode = statb.st_mode; cur->modtime = statb.st_mtime; cur->isdir = S_ISDIR(cur->mode); cur->isexe = !cur->isdir && (cur->mode & 0100); if ( last==NULL ) head = last = cur; else { last->next = cur; last = cur; } } #endif closedir(dir); free(buffer); gc->iodata = head; gc->direntrydata = true; gc->return_code = 200; gc->done = true; (gc->receivedata)(gc); }