void screen_frame_draw_files(frame_t* frame){
int i = frame->workdir->top_index;
int rows, cols;
+ int pathlength = strlen(frame->workdir->path);
getmaxyx(frame->p_win, rows, cols);
//draw path
wattron(frame->p_win, A_UNDERLINE);
wattroff(frame->p_win, A_UNDERLINE);
//list files
while (i < vec_size(frame->workdir->vfiles)){
+ char* filename = (char*)vec_at(frame->workdir->vfiles, i);
+ if(strcmp(filename, "..") != 0) filename = &(filename[pathlength]);
+ if(filename[0] == '/') filename = &(filename[1]);
if(frame == state_get_focused_frame() && i == frame->workdir->idx){
wattron(frame->p_win, A_STANDOUT);
wattron(frame->p_win, A_BOLD);
}
- mvwaddnstr(frame->p_win, FrameTopBuffer+i-frame->workdir->top_index, 1, vec_at(frame->workdir->vfiles, i), cols-2);
+ mvwaddnstr(frame->p_win, FrameTopBuffer+i-frame->workdir->top_index, 1, filename, cols-2);
if(frame == state_get_focused_frame() && i == frame->workdir->idx){
wattroff(frame->p_win, A_STANDOUT);
wattroff(frame->p_win, A_BOLD);
//go down a directory: append '/subdir' to path
char* workdir_cd_down(WorkDir_T* wd){
- char* subdir = vec_at(wd->vfiles, wd->idx);
- int oldpathlen = strlen(wd->path);
- int newpathlen = oldpathlen + strlen(subdir) + 2; //+2, for slash & end null;
- char *newpath = mem_allocate(sizeof(char)*newpathlen, NULL);
- strcpy(newpath, wd->path);
- if(oldpathlen == 0 || wd->path[oldpathlen-1] != '/') strcat(newpath, "/");
- strcat(newpath, subdir);
- return newpath;
+ char* newpath = (char*) vec_at(wd->vfiles, wd->idx);
+ mem_retain(newpath);
+ return newpath;
}
void workdir_cd(WorkDir_T* wd) {
ssize_t read;
char* filename = 0;
FILE* ls;
+ int pathlength = strlen(wd->path);
//free old file vector
if(wd->vfiles) mem_release(wd->vfiles);
//open new ls pipe
else
mem_release(dotdot);
while ((read = getline(&filename, &len, ls)) != -1){
- char* lol = mem_allocate(read*sizeof(char), NULL);
+ char* lol = mem_allocate((pathlength+read+1)*sizeof(char), NULL);
filename[read-1]=0; //remove ending newline
- strcpy(lol, filename);
+ strcpy(lol, wd->path);
+ if (wd->path[pathlength-1] != '/') strcat(lol, "/");
+ strcat(lol, filename);
vec_push_back(wd->vfiles, lol);
}
free(filename);