Search     or:     and:
 LINUX 
 Language 
 Kernel 
 Package 
 Book 
 Test 
 OS 
 Forum 
 iakovlev.org 
 Packages
 Make 
 Iptables 
 Nmap 
 Apache 
 LFS 
 TUX 
 cURL 
 libpcap 
 Parted 
 Httpd 
 File managers 
 FFMPEG 
 RTMP 
 SQL 
 Test 
 Git 
NEWS
Последние статьи :
  Тренажёр 16.01   
  Эльбрус 05.12   
  Алгоритмы 12.04   
  Rust 07.11   
  Go 25.12   
  EXT4 10.11   
  FS benchmark 15.09   
  Сетунь 23.07   
  Trees 25.06   
  Apache 03.02   
 
TOP 20
 MINIX...3057 
 Solaris...2933 
 LD...2904 
 Linux Kernel 2.6...2470 
 William Gropp...2181 
 Rodriguez 6...2012 
 C++ Templates 3...1945 
 Trees...1937 
 Kamran Husain...1866 
 Secure Programming for Li...1792 
 Максвелл 5...1710 
 DevFS...1694 
 Part 3...1684 
 Stein-MacEachern-> Час...1632 
 Go Web ...1624 
 Ethreal 4...1618 
 Arrays...1607 
 Стивенс 9...1603 
 Максвелл 1...1592 
 FAQ...1538 
 
  01.01.2024 : 3621733 посещений 

iakovlev.org

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.

Оставьте свой комментарий !

Ваше имя:
Комментарий:
Оба поля являются обязательными

 Автор  Комментарий к данной статье