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 
NEWS
Последние статьи :
  Rust 07.11   
  Go 25.12   
  EXT4 10.11   
  FS benchmark 15.09   
  Сетунь 23.07   
  Trees 25.06   
  Apache 03.02   
  SQL 30.07   
  JFS 10.06   
  B-trees 01.06   
 
TOP 20
 P.Collins...1350 
 Steve Pate 1...817 
 QT->Qt3...541 
 Trees...459 
 Python...372 
 Steve Pate 3...371 
 TCP 2...349 
 Rodriguez 6...325 
 Максвелл 3...319 
 Rubni-Corbet -> Глав...319 
 Daniel Bovet 4...319 
 TCP 3...316 
 Mod_perl 2...296 
 Linux Inline Assembly...296 
 MySQL & PosgreSQL...295 
 Robert Love 2...292 
 Daniel Bovet 3...288 
 Rodriguez 2...284 
 Стивенс 6...284 
 UML 3...282 
 
  01.05.2017 : 2190164 посещений 

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.

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

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

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