commit d47a20f2d3e65cd95118c5715c2b5dddbbcf0d46
Author: Raniconduh <clagv.randomgames@gmail.com>
Date: Fri Oct 01 09:33:11 2021 +0000
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;
}