Deco
Консольный файловый менеджер
Автор - Сергей Вакуленко - vak.ru
Проект deco лежит тут - deco.sf.net
Исходники можно взять также тут : deco39
Проект написан на чистом си , с использованием стандартной библиотеки ncurses.
Рассмотрим базовые структуры - структура file (dir.h) :
struct file {
char name [NAMESZ]; /* file name */
char *info; /* file info */
char *rinfo; /* file info in russian */
unsigned execable:1; /* file is executable for me */
unsigned tag:1; /* file tagged */
unsigned link:1; /* symbolic link */
unsigned infoflag:1; /* info is read */
unsigned dateflag:1; /* date is read from info file */
unsigned long size; /* file size */
unsigned short mode; /* access mode */
unsigned short uid; /* user ident */
unsigned short gid; /* group ident */
unsigned short nlink; /* number of file links */
short dev; /* device */
short rdev; /* special file parameters */
unsigned long ino; /* i-node */
unsigned long mtime; /* modification time */
unsigned long atime; /* access time */
unsigned long ctime; /* status change time */
unsigned long infodate; /* date from info file */
};
Структура dir :
struct dir {
char cwd [MAXPATHLEN]; /* directory full name */
char *shortcwd; /* short printable directory name */
short dev; /* device */
unsigned long ino; /* i-node */
struct file *cat; /* catalog */
int catsz; /* length of catalog */
int num; /* number of files in cat */
int topfile; /* top file in the window */
int curfile; /* current file */
char view; /* view format */
char status; /* is it status window */
char sort; /* sort kind */
char typesort; /* sort by file types */
char revsort; /* reverse sorting */
char alignext; /* align extensions */
int basecol; /* base of window */
int nfiles; /* number of regular files */
long nbytes; /* number of bytes used */
int mfiles; /* number of matched files */
long mbytes; /* number of bytes matched */
int tfiles; /* number of tagged files */
long tbytes; /* number of bytes tagged */
char pattern [PATSZ]; /* pattern for file names */
};
В структуре dir обратите внимание на указатель *cat - указатель на массив вложенных файлов и подкаталогов.
Инициализация текущего каталога происходит в функции int setdir (struct dir *d, char *dirname) (dir.c).
Для вывода на экран есть структура WINDOW (scr.h) :
typedef struct {
short cury, curx;
short flgs;
char clear;
short **y;
short *firstch;
short *lastch;
short *lnum;
} WINDOW;
Здесь **y - 2-мерный массив ячеек экрана , рамерность экрана - LINES * COLS.
Создаются 2 обьекта этой структуры - VScreen , curscr.
Весь рабочий вывод идет вначале в буфер - первое невидимое окно VScreen .
Результат перенаправляется во второе окно - curscr.
Синхронизация этих окон происходит при каждом событии.
При это curscr вначале очищается пробелами , потом происходит построчная синхронизация .
В следующей функции int y - индекс такой строки :
static void makech (int y)
{
register short *new, *old;
register short x, lastch;
x = VScreen.firstch[y];
lastch = VScreen.lastch[y];
old = &curscr.y [y] [x];
new = &VScreen.y [y] [x];
for (; x<=lastch; ++new, ++old, ++x)
{
if (*new == *old)
continue;
if (x >= COLS-1 && y >= LINES-1)
return;
domvcur (y, x);
setattr (*new);
putch (*old = *new);
curscr.curx = x + 1;
}
}
После старта инициализируется 2 панели .
В левой показывается текущий каталог , в правой - рутовый.
Можно выбрать несколько режимов - для этого выбираем меню по F9.
|