void browse_draw() { struct dir *t; char fmtsize[9], *tmp; int selected, i; erase(); t = dirlist_get(0); /* top line - basic info */ attron(A_REVERSE); mvhline(0, 0, ' ', wincols); mvhline(winrows-1, 0, ' ', wincols); mvprintw(0,0,"%s %s ~ Use the arrow keys to navigate, press ? for help", PACKAGE_NAME, PACKAGE_VERSION); if(read_only) mvaddstr(0, wincols-11, "[read-only]"); attroff(A_REVERSE); /* second line - the path */ mvhline(1, 0, '-', wincols); if(t) { mvaddch(1, 3, ' '); tmp = getpath(t->parent); mvaddstr(1, 4, cropstr(tmp, wincols-8)); mvaddch(1, 4+((int)strlen(tmp) > wincols-8 ? wincols-8 : (int)strlen(tmp)), ' '); } /* bottom line - stats */ attron(A_REVERSE); if(t) { strcpy(fmtsize, formatsize(t->parent->size)); mvprintw(winrows-1, 0, " Total disk usage: %s Apparent size: %s Items: %d", fmtsize, formatsize(t->parent->asize), t->parent->items); } else mvaddstr(winrows-1, 0, " No items to display."); attroff(A_REVERSE); /* nothing to display? stop here. */ if(!t) return; /* get start position */ t = dirlist_top(0); /* print the list to the screen */ for(i=0; t && i<winrows-3; t=dirlist_next(t),i++) { browse_draw_item(t, 2+i); /* save the selected row number for later */ if(t->flags & FF_BSEL) selected = i; } /* draw information window */ t = dirlist_get(0); if(info_show && t != dirlist_parent) browse_draw_info(t); /* move cursor to selected row for accessibility */ move(selected+2, 0); }
int browse_key(int ch) { struct dir *t, *sel; int i, catch = 0; /* message window overwrites all keys */ if(message) { message = NULL; return 0; } sel = dirlist_get(0); /* info window overwrites a few keys */ if(info_show && sel) switch(ch) { case '1': info_page = 0; break; case '2': if(sel->hlnk) info_page = 1; break; case KEY_RIGHT: case 'l': if(sel->hlnk) { info_page = 1; catch++; }