commit 63726e231cf48db5fa421de05459d601385f3524
Author: rani <clagv.randomgames@gmail.com>
Date: Sat Jan 28 21:02:31 2023 +0000
diff --git a/include/io.h b/include/io.h
index 82072f6..dda0f0c 100644
--- a/include/io.h
+++ b/include/io.h
@@ -596 +5918 @@ enum keys {
CTRL_Z = 26,
};
+enum info_t {
+ INFO_INFO,
+ INFO_WARN,
+ INFO_ERR,
+};
+
+
+struct info_node {
+ enum info_t type;
+ char * msg;
+};
+
void curses_init(void);
void terminate_curses(void);
@@ -786 +909 @@ char get_file_ident(struct dir_entry_t *);
size_t get_ilen(long, int);
char * get_oname(uid_t);
char * get_gname(gid_t);
+void info_init(void);
+void display_info(enum info_t, char *);
+void refresh_info(void);
extern bool print_path;
diff --git a/src/dir.c b/src/dir.c
index a899459..4c2b19b 100644
--- a/src/dir.c
+++ b/src/dir.c
@@ -2037 +2038 @@ int list_dir(char * dir_path) {
struct dir_entry_t * dir_entry = gen_dir_entry(dir_path, d_name);
if (!dir_entry) {
- continue; // possibly display message
+ display_info(INFO_WARN, strerror(errno));
+ continue;
}
dir_entries = realloc(dir_entries, sizeof(struct dir_entry_t*) * (n_dir_entries + 1));
@@ -26615 +26718 @@ void enter_dir(char * name) {
else
sprintf(tmp, "%s%s", cwd, name);
- free(cwd);
- cwd = tmp;
- chdir(cwd);
+ if (chdir(tmp) == -1) {
+ display_info(INFO_ERR, strerror(errno));
+ } else {
+ free(cwd);
+ cwd = tmp;
- dir_longest_owner = 0;
- dir_longest_group = 0;
+ dir_longest_owner = 0;
+ dir_longest_group = 0;
- if (!strncmp(cwd, homedir, homedir_len)) in_home_subdir = true;
- else in_home_subdir = false;
+ if (!strncmp(cwd, homedir, homedir_len)) in_home_subdir = true;
+ else in_home_subdir = false;
+ }
}
diff --git a/src/io.c b/src/io.c
index 6769d49..d599c64 100644
--- a/src/io.c
+++ b/src/io.c
@@ -256 +2514 @@ bool print_path = false;
int stdout_back = 0;
size_t n_marked_files = false;
+
+static struct {
+ WINDOW * w;
+ struct info_node ** i;
+ size_t n;
+} info_buffer = {NULL, NULL, 0};
+
+
static int default_colors[] = {
[COLOR_DIR] = COLOR_BLUE,
[COLOR_LINK] = COLOR_CYAN,
@@ -7843 +79253 @@ char * get_gname(gid_t gid) {
}
return buf;
}
+
+
+void info_init(void) {
+ info_buffer.w = newwin(1, COLS, LINES - 1, 0);
+ wclear(info_buffer.w);
+ refresh();
+}
+
+
+void display_info(enum info_t type, char * msg) {
+ if (!info_buffer.i) info_buffer.i = malloc(sizeof(struct info_node*) * 32);
+
+ // realloc every 32
+ if ((info_buffer.n + 1) % 32 == 0) {
+ info_buffer.i = realloc(info_buffer.i,
+ (info_buffer.n + 32) * sizeof(struct info_node*));
+ }
+
+ size_t n = info_buffer.n;
+ info_buffer.i[n] = malloc(sizeof(struct info_node));
+ info_buffer.i[n]->type = type;
+
+ info_buffer.i[n]->msg = malloc(strlen(msg) + 1);
+ strcpy(info_buffer.i[n]->msg, msg);
+
+ info_buffer.n++;
+
+ refresh_info();
+}
+
+
+void refresh_info(void) {
+ if (info_buffer.n == 0 || !info_buffer.w) return;
+
+ size_t n = info_buffer.n - 1;
+
+ int cp = 0;
+ switch (info_buffer.i[n]->type) {
+ case INFO_INFO: cp = COLOR_PAIR(WHITE); break;
+ case INFO_WARN: cp = COLOR_PAIR(YELLOW) | A_REVERSE; break;
+ case INFO_ERR: cp = COLOR_PAIR(RED) | A_REVERSE; break;
+ }
+
+ werase(info_buffer.w);
+ waddstr(info_buffer.w, "(:i) ");
+ wattron(info_buffer.w, cp);
+ waddstr(info_buffer.w, info_buffer.i[n]->msg);
+ wattroff(info_buffer.w, cp);
+ wrefresh(info_buffer.w);
+}
diff --git a/src/main.c b/src/main.c
index ffc2d07..5222db4 100644
--- a/src/main.c
+++ b/src/main.c
@@ -1246 +1247 @@ int main(int argc, char ** argv) {
if (!strncmp(cwd, homedir, homedir_len)) in_home_subdir = true;
curses_init();
+ info_init();
signal(SIGCONT, sig_handler);
@@ -2146 +2157 @@ int main(int argc, char ** argv) {
printw("\n%lu/%lu\n", cursor, n_dir_entries);
refresh();
+ refresh_info();
int c = getch();
switch (c) {
diff --git a/src/opts.c b/src/opts.c
index 4becdee..16e17ca 100644
--- a/src/opts.c
+++ b/src/opts.c
@@ -1048 +10410 @@ void parse_var(char * var) {
// add null terminator to var
char * val = strchr(var, '=');
- if (!val) return; // fail silently
- // TODO: Show errors present in config file to user
+ if (!val) {
+ display_info(INFO_WARN, "Missing '=' in config file");
+ return;
+ }
while (val + n > line && isspace(val[--n]));
val[n + 1] = 0;
@@ -1337 +1357 @@ void parse_var(char * var) {
val[vlen - 2] = 0;
ptr_val = val;
} else {
- // invalid line, silently fail again
+ display_info(INFO_WARN, "Unknown variable type in config file");
return;
}