commit 0c0aff7b35ff07f8779a30c2385243bd75fb423f
parent 7ac0ea25a68b7f8693b88b1c68b5255936898e1d
Author: afify <hassan@afify.dev>
Date: Sun, 17 Jul 2022 08:49:31 +0300
push
Diffstat:
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;