Thumbnail

rani/cscroll.git

Clone URL: https://git.buni.party/rani/cscroll.git

commit 63726e231cf48db5fa421de05459d601385f3524 Author: rani <clagv.randomgames@gmail.com> Date: Sat Jan 28 21:02:31 2023 +0000 Added information buffer 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;   }