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
 Linux Kernel 2.6...1894 
 Trees...1399 
 William Gropp...1373 
 Ethreal 3...1368 
 C++ Patterns 3...1348 
 Ethreal 4...1340 
 Robert Love 5...1336 
 Httpd-> История Ap...1335 
 K&R 1...1334 
 Максвелл 3...1332 
 Erlang...1332 
 Максвелл 5...1332 
 Ext4 FS...1331 
 Rubni-Corbet -> Глав...1331 
 Perl OOP...1330 
 OS ->Intel Manual 1...1328 
 Go Web ...1328 
 Rodriguez 6...1327 
 Kamran Husain...1326 
 Daniel Bovet 3...1324 
 
  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.

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

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

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