nasmfm

sfm rewrite
git clone https://git.afify.dev/nasmfm.git
Log | Files | Refs | LICENSE

commit 0c0aff7b35ff07f8779a30c2385243bd75fb423f
parent 7ac0ea25a68b7f8693b88b1c68b5255936898e1d
Author: afify <hassan@afify.dev>
Date:   Sun, 17 Jul 2022 08:49:31 +0300

push

Diffstat:
Mconfig.def.h | 8+++++++-
Mconfig.mk | 4++--
Mnasmfm.c | 431+++++++++++++++++++++++++++++++++++++++++++------------------------------------
Mterm.c | 28++++++++++++++++++----------
Mterm.h | 3+++
5 files changed, 267 insertions(+), 207 deletions(-)

diff --git a/config.def.h b/config.def.h @@ -20,7 +20,13 @@ static const Cpair cpanelr = { 5, 233, BOLD }; static const Cpair cerr = { 124, 0, NORM }; static const Cpair cprompt = { 33, 0, NORM }; static const Cpair csearch = { 255, 0, NORM }; -static const Cpair cstatus = { 243, 0, NORM }; +static const Cpair cstatus = { 243, 233, NORM }; + +/* statusbar */ +static const char dtfmt[] = "%F %R"; /* date time format */ + +/* dotfiles */ +static int show_dotfiles = 1; static int show_dotfiles = 1; static const char dtfmt[] = "%Y"; diff --git a/config.mk b/config.mk @@ -7,8 +7,8 @@ MANPREFIX = ${PREFIX}/share/man # flags CPPFLAGS = -D_DEFAULT_SOURCE -D_BSD_SOURCE -D_POSIX_C_SOURCE=200809L -D_XOPEN_SOURCE=700 -DVERSION=\"${VERSION}\" -CFLAGS = -std=c99 -pedantic -Wextra -Wall -Wno-unused-parameter -Os ${CPPFLAGS} -LDFLAGS = -pthread -s +CFLAGS = -std=c99 -pedantic -Wextra -Wall -Wno-unused-parameter -g3 -O0 ${CPPFLAGS} +LDFLAGS = -pthread # compiler and linker CC = cc diff --git a/nasmfm.c b/nasmfm.c @@ -109,7 +109,7 @@ static Pane panes[2]; static Pane *cpane; static int pane_idx; static char *editor[2]; -static char fed[] = "vi"; +static char fed[] = "vi"; //TODO rename var static char *shell[2]; static char sh[] = "/bin/sh"; //static int theight, twidth, hwidth, scrheight; @@ -118,7 +118,8 @@ static char sh[] = "/bin/sh"; //static char **sel_files; //static int cont_vmode = 0; //static int cont_change = 0; -static pid_t fork_pid = 0, main_pid; +//static pid_t fork_pid = 0; +static pid_t main_pid; //#if defined(_SYS_INOTIFY_H) //#define READEVSZ 16 //static int inotify_fd; @@ -140,74 +141,74 @@ enum { Wait, DontWait }; /* spawn forks */ /* configuration, allows nested code to access above variables */ #include "config.h" - -static void -get_hicol(Cpair *col, mode_t mode) -{ - switch (mode & S_IFMT) { - case S_IFREG: - *col = cfile; - if ((S_IXUSR | S_IXGRP | S_IXOTH) & mode) - *col = cexec; - break; - case S_IFDIR: - *col = cdir; - break; - case S_IFLNK: - *col = clnk; - break; - case S_IFBLK: - *col = cblk; - break; - case S_IFCHR: - *col = cchr; - break; - case S_IFIFO: - *col = cifo; - break; - case S_IFSOCK: - *col = csock; - break; - default: - *col = cother; - break; - } -} - -static void -print_row(Pane *pane, size_t entpos, Cpair col) -{ - int x, y; - char *full_str, *rez_pth; - char lnk_full[MAX_N]; - - int hwidth = pane->x_end - 2; - full_str = basename(pane->direntr[entpos].name); - x = pane->x_srt; - y = entpos - pane->firstrow + 2; - - if (S_ISLNK(pane->direntr[entpos].mode) != 0) { - rez_pth = ecalloc(MAX_P, sizeof(char)); - if (realpath(pane->direntr[entpos].name, rez_pth) != NULL) { - snprintf( - lnk_full, MAX_N, "%s -> %s", full_str, rez_pth); - full_str = lnk_full; - } - free(rez_pth); - } - - //twrite(x, y, full_str, strlen(full_str), col); - tprintf(x, y, col, "%*.*s", - ~(pane->x_end - 2), pane->x_end - 2, full_str); -} -static void -add_hi(Pane *pane, size_t entpos) -{ - Cpair col; - get_hicol(&col, pane->direntr[entpos].mode); - col.attr = 7; - print_row(pane, entpos, col); -} +//static void +//get_hicol(Cpair *col, mode_t mode) +//{ +// switch (mode & S_IFMT) { +// case S_IFREG: +// *col = cfile; +// if ((S_IXUSR | S_IXGRP | S_IXOTH) & mode) +// *col = cexec; +// break; +// case S_IFDIR: +// *col = cdir; +// break; +// case S_IFLNK: +// *col = clnk; +// break; +// case S_IFBLK: +// *col = cblk; +// break; +// case S_IFCHR: +// *col = cchr; +// break; +// case S_IFIFO: +// *col = cifo; +// break; +// case S_IFSOCK: +// *col = csock; +// break; +// default: +// *col = cother; +// break; +// } +//} + +//static void +//print_row(Pane *pane, size_t entpos, Cpair col) +//{ +// int x, y; +// char *full_str, *rez_pth; +// char lnk_full[MAX_N]; +// +// //int hwidth = pane->x_end - 2; +// full_str = basename(pane->direntr[entpos].name); +// x = pane->x_srt; +// y = entpos - pane->firstrow + 2; +// +// if (S_ISLNK(pane->direntr[entpos].mode) != 0) { +// rez_pth = ecalloc(MAX_P, sizeof(char)); +// if (realpath(pane->direntr[entpos].name, rez_pth) != NULL) { +// snprintf( +// lnk_full, MAX_N, "%s -> %s", full_str, rez_pth); +// full_str = lnk_full; +// } +// free(rez_pth); +// } +// +// //twrite(x, y, full_str, strlen(full_str), col); +// tprintf(x, y, col, "%*.*s", ~(pane->x_end - 2), pane->x_end - 2, +// full_str); +//} + +//static void +//add_hi(Pane *pane, size_t entpos) +//{ +// Cpair col; +// get_hicol(&col, pane->direntr[entpos].mode); +// col.attr = 7; +// print_row(pane, entpos, col); +//} static char * get_fullpath(char *first, char *second) @@ -224,50 +225,50 @@ get_fullpath(char *first, char *second) return full_path; } -static void -get_dirp(char *cdir) -{ - int counter, len, i; - - counter = 0; - len = strnlen(cdir, MAX_P); - if (len == 1) - return; - - for (i = len - 1; i > 1; i--) { - if (cdir[i] == '/') - break; - else - counter++; - } - - cdir[len - counter - 1] = '\0'; -} - -static char * -get_ext(char *str) -{ - char *ext; - char dot; - size_t counter, len, i; - - dot = '.'; - counter = 0; - len = strnlen(str, MAX_N); - - for (i = len - 1; i > 0; i--) { - if (str[i] == dot) { - break; - } else { - counter++; - } - } - - ext = ecalloc(MAX_EXT + 1, sizeof(char)); - strncpy(ext, &str[len - counter], MAX_EXT); - ext[MAX_EXT] = '\0'; - return ext; -} +//static void +//get_dirp(char *cdir) +//{ +// int counter, len, i; +// +// counter = 0; +// len = strnlen(cdir, MAX_P); +// if (len == 1) +// return; +// +// for (i = len - 1; i > 1; i--) { +// if (cdir[i] == '/') +// break; +// else +// counter++; +// } +// +// cdir[len - counter - 1] = '\0'; +//} +// +//static char * +//get_ext(char *str) +//{ +// char *ext; +// char dot; +// size_t counter, len, i; +// +// dot = '.'; +// counter = 0; +// len = strnlen(str, MAX_N); +// +// for (i = len - 1; i > 0; i--) { +// if (str[i] == dot) { +// break; +// } else { +// counter++; +// } +// } +// +// ext = ecalloc(MAX_EXT + 1, sizeof(char)); +// strncpy(ext, &str[len - counter], MAX_EXT); +// ext[MAX_EXT] = '\0'; +// return ext; +//} static int get_fdt(char *result, time_t status) @@ -387,41 +388,41 @@ get_fusr(uid_t status) return result; } -static void -get_dirsize(char *fullpath, off_t *fullsize) -{ - DIR *dir; - char *ent_full; - mode_t mode; - struct dirent *entry; - struct stat status; - - dir = opendir(fullpath); - if (dir == NULL) { - return; - } - - while ((entry = readdir(dir)) != 0) { - if ((strncmp(entry->d_name, ".", 2) == 0 || - strncmp(entry->d_name, "..", 3) == 0)) - continue; - - ent_full = get_fullpath(fullpath, entry->d_name); - if (lstat(ent_full, &status) == 0) { - mode = status.st_mode; - if (S_ISDIR(mode)) { - get_dirsize(ent_full, fullsize); - free(ent_full); - } else { - *fullsize += status.st_size; - free(ent_full); - } - } - } - - closedir(dir); - //clear_status(); -} +//static void +//get_dirsize(char *fullpath, off_t *fullsize) +//{ +// DIR *dir; +// char *ent_full; +// mode_t mode; +// struct dirent *entry; +// struct stat status; +// +// dir = opendir(fullpath); +// if (dir == NULL) { +// return; +// } +// +// while ((entry = readdir(dir)) != 0) { +// if ((strncmp(entry->d_name, ".", 2) == 0 || +// strncmp(entry->d_name, "..", 3) == 0)) +// continue; +// +// ent_full = get_fullpath(fullpath, entry->d_name); +// if (lstat(ent_full, &status) == 0) { +// mode = status.st_mode; +// if (S_ISDIR(mode)) { +// get_dirsize(ent_full, fullsize); +// free(ent_full); +// } else { +// *fullsize += status.st_size; +// free(ent_full); +// } +// } +// } +// +// closedir(dir); +// //clear_status(); +//} static void print_info(Pane *pane, char *dirsize) @@ -448,8 +449,8 @@ print_info(Pane *pane, char *dirsize) } } - tprintf_status("%02d/%02d %s %s:%s %s %s", pane->hdir, - pane->dirc, prm, ur, gr, dt, sz); + tprintf_status("%02d/%02d %s %s:%s %s %s", pane->hdir, pane->dirc, prm, + ur, gr, dt, sz); free(prm); free(ur); @@ -458,7 +459,6 @@ print_info(Pane *pane, char *dirsize) free(sz); } - static int sort_name(const void *const A, const void *const B) { @@ -505,7 +505,6 @@ set_direntr(Pane *pane, struct dirent *entry, DIR *dir, char *filter) pane->direntr[i].group = status.st_gid; pane->direntr[i].user = status.st_uid; pane->direntr[i].dt = status.st_mtime; - } if (S_ISLNK(status.st_mode) != 0) { realpath(tmpfull, pane->direntr[i].real); @@ -521,24 +520,49 @@ static void refresh_pane(Pane *pane) { Cpair col; - int x; - char *entry; - - for (x = 0; x < pane->dirc; x++) { - get_hicol(&col, pane->direntr[x].mode); - entry = basename(pane->direntr[x].name); - if (pane->direntr[x].real[0] != '\0') - entry = pane->direntr[x].real; - twrite(pane->x_srt, x+2, - entry, - //pane->direntr[x].real, - //basename(pane->direntr[x].name), - strlen(pane->direntr[x].name), - col); - } + col.bg=222; + col.fg=2; + //int x; + //char buf[25]; + size_t buf_srt, buf_end; + Entry buf[25]; + + buf_srt = 0; + buf_end = MIN(term->rows, pane->dirc); + //printf("\n\n\n\n"); + //printf("%d\n", pane->dirc); + //printf("%d\n", term->rows); + //printf("%zu\n", buf_end); + + memcpy(&buf, pane->direntr, sizeof(buf)); + + //printf("%s\n", buf[0].name); + //printf("%s\n", buf[1].name); + //printf("%s\n", pane->direntr[0].name); + + + //twrite(2, 2, buf[0], strlen(buf[0]), col); + //tprintf(2, 2, col, "%s", (buf[0]).name); + //tprintf(2, 3, col, "%s", (buf[1]).name); + //tprintf(2, 4, col, "%s", (buf[2]).name); + + //for (x = 0; x < pane->dirc; x++) { + // get_hicol(&col, pane->direntr[x].mode); + // entry = basename(pane->direntr[x].name); + // //if (pane->direntr[x].real[0] != '\0') + // //entry = pane->direntr[x].real; + // //twrite(pane->x_srt, x + 2, entry, + // //pane->direntr[x].real, + // //basename(pane->direntr[x].name), + // //strlen(pane->direntr[x].name), col); + // tprintf(pane->x_srt, x+2, col, "%s (%d) [%d]", + // pane->direntr[x].name, + // strlen((pane->direntr[x].name)), + // sizeof(basename(&pane->direntr[x].name[0]))); + ////free(entry); + //} //size_t y, dyn_max, start_from; - int hwidth = (term->cols / 2) - 4; //Cpair col; //col.bg = 0; @@ -554,12 +578,12 @@ refresh_pane(Pane *pane) //if (pane->dirc > 0) // print_info(pane, NULL); -// else - //clear_status(); + // else + //clear_status(); /* print current directory title */ - //tprintf(pane->x_srt, 1, pane->dircol, " %.*s", hwidth, pane->dirn); //349,275 - //twrite(pane->x_srt, 0, pane->dirn, strlen(pane->dirn), pane->dircol); //347,862 + //tprintf(pane->x_srt, 1, pane->dircol, "%.*s", term->avail_cols, pane->dirn); //349,275 + twrite(pane->x_srt, 0, pane->dirn, strlen(pane->dirn), pane->dircol); //347,862 } static int @@ -588,7 +612,7 @@ listdir(Pane *pane) pane->hdir = pane->dirc; //if (pane == cpane && pane->dirc > 0) - //add_hi(pane, pane->hdir - 1); + //add_hi(pane, pane->hdir - 1); if (closedir(dir) < 0) return -1; @@ -612,7 +636,7 @@ set_panes(void) //panes[Left].pane_id = 0; panes[Left].x_srt = 2; - panes[Left].x_end = (term->cols / 2) - 1; + //panes[Left].x_end = (term->cols / 2) - 1; panes[Left].dircol = cpanell; panes[Left].firstrow = 0; panes[Left].direntr = ecalloc(0, sizeof(Entry)); @@ -623,7 +647,7 @@ set_panes(void) //panes[Right].pane_id = 1; panes[Right].x_srt = (term->cols / 2) + 2; - panes[Right].x_end = term->cols - 1; + //panes[Right].x_end = term->cols - 1; panes[Right].dircol = cpanelr; panes[Right].firstrow = 0; panes[Right].direntr = ecalloc(0, sizeof(Entry)); @@ -654,26 +678,25 @@ get_shell(void) } void +quit() +{ + //CLEAR_SCREEN + CURSOR_SHOW + free(panes[Left].direntr); + free(panes[Right].direntr); + exit(0); +} + +void keypress() { char c = getkey(); - char buf[50]; - Cpair col; - int signo = 156; - snprintf(buf, sizeof(buf), "<%d>THIS IS LETTER %c [%ld] => %d/%d", - main_pid, c, sizeof(buf), term->cols, term->rows); switch (c) { case 'q': - CLEAR_SCREEN - CURSOR_SHOW - exit(0); + quit(); break; default: - col.bg = 0; - col.fg = 211; - col.attr = RVS; - - tprintf(2, term->rows - 2, col, "SIGWINCH = %d\n", signo); + //tprintf(2, term->rows - 2, {0}, "SIGWINCH = %d\n", 12); //twrite(2, term->rows - 2, buf, strlen(buf), col); break; } @@ -687,6 +710,14 @@ sighandler(int signo) get_term_size(&term->rows, &term->cols); CLEAR_SCREEN draw_frame(); + term->avail_cols = (term->cols - 4 ) / 2; + tprintf(2, term->rows - 3, cprompt, + "123456789012345678901234567890123456789X1234567890123456789012345678901234567890", + term->avail_cols, term->cols); + tprintf(2, term->rows - 2, cprompt, + "avail_cols = %d %d", + term->avail_cols, term->cols); + refresh_pane(cpane); break; case SIGUSR1: break; @@ -715,20 +746,32 @@ start(void) term = init_term(); draw_frame(); set_panes(); - get_editor(); - get_shell(); - start_signal(); - + //get_editor(); + //get_shell(); + //start_signal(); //PERROR(fsev_init() < 0); - listdir(&panes[Left]); listdir(&panes[Right]); //pthread_create(&fsev_thread, NULL, read_th, NULL); + //listdir(&panes[Right]); + + //pthread_create(&fsev_thread, NULL, read_th, NULL); + + //tprintf(2, term->rows - 3, cprompt, + // "123456789012345678901234567890" + // "12345678901234567890"); + + // tprintf(2, term->rows - 2, cprompt, + // "avail_cols = %d %d", + // term->avail_cols, term->cols); + //listdir(&panes[Right]); + ////pthread_create(&fsev_thread, NULL, read_th, NULL); while (1) { keypress(); } + quit(); } int diff --git a/term.c b/term.c @@ -86,6 +86,7 @@ init_term() oterm.cy = 0; if (get_term_size(&oterm.rows, &oterm.cols) == -1) die("getWindowSize"); + oterm.avail_cols = (oterm.cols - 4 ) / 2; return &oterm; } @@ -110,20 +111,22 @@ tprintf(int x, int y, Cpair col, const char *fmt, ...) { if (x > oterm.cols || y > oterm.rows) return; - char buf[oterm.cols]; // fmt result - char str[oterm.cols]; // with color and position - size_t full_buf; + char buf[oterm.avail_cols]; // fmt result + char str[oterm.avail_cols+1]; // with color and position va_list vl; va_start(vl, fmt); - (void)vsnprintf(buf, oterm.cols, fmt, vl); + (void)vsnprintf(str, oterm.avail_cols+1, fmt, vl); va_end(vl); - //print_tb(buf, x, y, col.fg, col.bg); - snprintf(str, oterm.cols, - "\x1b[%d;%df\x1b[%d;48;5;%d;38;5;%dm%s\x1b[0;0m", - y, x, col.attr, col.bg, col.fg, buf); - full_buf = strlen(str); - write(STDOUT_FILENO, str, full_buf); + char mov[4+6]; + snprintf(mov, 10, "\x1b[%d;%df", y, x); + write(STDOUT_FILENO, mov, strlen(mov)); + + snprintf(buf, oterm.cols, + "\x1b[%d;48;5;%d;38;5;%dm%s\x1b[0;0m", + col.attr, col.bg, col.fg, str); + + write(STDOUT_FILENO, buf, strlen(buf)); } void @@ -146,6 +149,11 @@ tprintf_status(const char *fmt, ...) y, x, cstatus.attr, cstatus.bg, cstatus.fg, buf); full_buf = strlen(str); write(STDOUT_FILENO, str, full_buf); + + //printf("\033[%d;H" // go to the bottom row + // //"\033[2K" // clear the row + // "\033[37;7;1m", // inverse + bold + // rows); } void diff --git a/term.h b/term.h @@ -5,9 +5,11 @@ #define CTRL_KEY(k) ((k)&0x1f) #define CLEAR_SCREEN write(STDOUT_FILENO, "\x1b[2J\x1b[H", 7); +#define CLEAR_LINE write(STDOUT_FILENO, "\x1b[2K", 4); #define CURSOR_HIDE write(STDOUT_FILENO, "\x1b[?25l", 6); #define CURSOR_SHOW write(STDOUT_FILENO, "\x1b[?25h", 6); + #define NORM 0 #define BOLD 1 #define RVS 7 @@ -17,6 +19,7 @@ typedef struct { int cy; int rows; int cols; + int avail_cols; struct termios orig_termios; } Term;