Thumbnail

rani/cscroll.git

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

commit d47a20f2d3e65cd95118c5715c2b5dddbbcf0d46 Author: Raniconduh <clagv.randomgames@gmail.com> Date: Fri Oct 01 09:33:11 2021 +0000 added screen scrolling and ability to enter and leave directories diff --git a/src/dir.c b/src/dir.c index e4c0102..1f86ca9 100644 --- a/src/dir.c +++ b/src/dir.c @@ -663 +6620 @@ void free_dir_entries(void) {     n_dir_entries = 0;  } + + +void cd_back(void) { + char * p = strrchr(cwd, '/'); + *p = '\0'; + cwd = realloc(cwd, strlen(cwd) + 2); + if (cwd[0] == '\0') { + cwd[0] = '/'; + cwd[1] = '\0'; + } +} + + +void enter_dir(char * name) { + cwd = realloc(cwd, strlen(cwd) + strlen(name) + 2); + sprintf(cwd, "%s/%s", cwd, name); +} diff --git a/src/io.c b/src/io.c index 4919295..b1230e3 100644 --- a/src/io.c +++ b/src/io.c @@ -1149 +1149 @@ char curses_getch(void) {   return ARROW_UP;   case 'B':   return ARROW_DOWN; - case 'C': - return ARROW_LEFT;   case 'D': + return ARROW_LEFT; + case 'C':   return ARROW_RIGHT;   default:   break; diff --git a/src/main.c b/src/main.c index 4e84040..34dd26c 100644 --- a/src/main.c +++ b/src/main.c @@ -921 +939 @@  int main(int argc, char ** argv) {   curses_init();   - if (argc > 1) - cwd = argv[1]; - else - cwd = getenv("PWD"); + if (argc > 1) { + cwd = malloc(strlen(argv[1]) + 2); + strcpy(cwd, argv[1]); + } else { + char * p = getenv("PWD"); + cwd = malloc(strlen(p) + 2); + strcpy(cwd, p); + }     list_dir(cwd);     size_t cursor = 1;   + size_t first_f, last_f; + first_f = cursor - 1; + last_f = n_dir_entries > ((unsigned)LINES - 6) ? LINES - 6 : n_dir_entries; +   while (true) {   erase(); + + // scroll down + if (cursor + 1 >= last_f && last_f < n_dir_entries) { + first_f++; + last_f++; + // scroll back up + } else if (cursor - 2 <= first_f && first_f > 0) { + first_f--; + last_f--; + }     printw("\n%s\n\n", cwd);   - for (size_t i = 0; i < n_dir_entries; i++) { + for (size_t i = first_f; i < last_f; i++) {   if (cursor - 1 == i)   curses_write_file(dir_entries[i], true);   else @@ -397 +5721 @@ int main(int argc, char ** argv) {   cursor--;   else if ((c == ARROW_DOWN || c == 'j') && cursor < n_dir_entries)   cursor++; - else if (c == 'q') + else if (c == ARROW_LEFT || c == 'h') { + cd_back(); + free_dir_entries(); + list_dir(cwd); + cursor = 1; + first_f = 0; + last_f = n_dir_entries > ((unsigned)LINES - 6) ? LINES - 6 : n_dir_entries; + } else if ((c == ARROW_RIGHT || c == 'l') && dir_entries[cursor - 1]->file_type == FILE_DIR) { + enter_dir(dir_entries[cursor - 1]->name); + free_dir_entries(); + list_dir(cwd); + cursor = 1; + first_f = 0; + last_f = n_dir_entries > ((unsigned)LINES - 6) ? LINES - 6 : n_dir_entries; + } else if (c == 'q')   goto done;   }