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
Последние статьи :
  Алгоритмы 12.04   
  Rust 07.11   
  Go 25.12   
  EXT4 10.11   
  FS benchmark 15.09   
  Сетунь 23.07   
  Trees 25.06   
  Apache 03.02   
  SQL 30.07   
  Python 10.06   
 
TOP 20
 Part 3...299 
 Part 4...295 
 Kamran Husain...190 
 Commands...171 
 Secure Programming for Li...169 
 2.0-> Linux IP Networking...140 
 Ethreal 1...121 
 William Gropp...117 
 Сетунь...115 
 Stein-MacEachern-> Час...114 
 Trees...113 
 Python...112 
 Steve Pate 2...110 
 Steve Pate 3...109 
 Plusquellic 1...108 
 C++ Patterns 2...108 
 Part 2...108 
 Httpd-> История Ap...108 
 VPN...107 
 Ethreal 4...107 
 
  01.10.2020 : 2983014+ посещений 

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.

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

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

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