From d33ac88de288218525518da309626d71b46ab3fb Mon Sep 17 00:00:00 2001 From: nova Date: Mon, 25 May 2026 17:36:39 +0200 Subject: [PATCH] implementation of keeping the index of current file in between dir changes --- defines.h | 2 +- dir.c | 60 ++++++++++++++++++++++++++++++++++++++++++++------ interactions.c | 11 ++------- 3 files changed, 56 insertions(+), 17 deletions(-) diff --git a/defines.h b/defines.h index 709772a..23d7276 100644 --- a/defines.h +++ b/defines.h @@ -108,7 +108,7 @@ typedef struct Yank { } yank; typedef struct Linked_dir { char *path; - unsigned long selected_file_current; + unsigned long index; struct Linked_dir *next; } linked_dir; diff --git a/dir.c b/dir.c index f3a0efe..17f131f 100644 --- a/dir.c +++ b/dir.c @@ -17,10 +17,11 @@ extern unsigned int settings; extern unsigned int file_modifiers; extern unsigned int color_count; extern unsigned int terminal_height; +extern char *global_path; extern color *colors; int (*order_func)() = sort_natural; -linked_dir *visited_dirs; -linked_dir *current_dir; +linked_dir *list_beginning; +linked_dir *current_linked_dir; unsigned long get_dir_size(char *path){ @@ -294,13 +295,58 @@ void print_dir(WINDOW *win, char print_info, dir *dir){ } } +void dir_changed(){ + + char *path = getcwd(NULL, 0); + current_linked_dir = list_beginning; + while (current_linked_dir->next != NULL) { + if(strcmp(current_linked_dir->path, path) == 0) { + break; + } else { + current_linked_dir = current_linked_dir->next; + } + } + if(strcmp(current_linked_dir->path, path) == 0) { + mid_dir.current_file = &mid_dir.file_list[current_linked_dir->index]; + + } else { + /*this path should only ever happen on changing the path for the first time + *at least i hope so*/ + current_linked_dir->next = malloc(sizeof(linked_dir)); + current_linked_dir->next->path = malloc(strlen(global_path)+1); + memcpy(current_linked_dir->next->path, global_path, strlen(global_path)+1); + current_linked_dir->next->next = NULL; + current_linked_dir->next->index = 0; + } + +} +void change_dir(){ + + current_linked_dir = list_beginning; + while (current_linked_dir->next != NULL) { + if(strcmp(current_linked_dir->path, global_path) == 0) { + break; + } else { + current_linked_dir = current_linked_dir->next; + } + } + if(strcmp(current_linked_dir->path, global_path) == 0) { + current_linked_dir->index = mid_dir.current_file - mid_dir.file_list; + } else { + current_linked_dir->next = malloc(sizeof(linked_dir)); + current_linked_dir->next->path = malloc(strlen(global_path)+1); + memcpy(current_linked_dir->next->path, global_path, strlen(global_path)+1); + current_linked_dir->next->next = NULL; + current_linked_dir->next->index = mid_dir.current_file - mid_dir.file_list; + } +} void dir_init(){ - visited_dirs = malloc(sizeof(linked_dir)); - visited_dirs->path = getcwd(NULL, 0); - visited_dirs->selected_file_current = 0; - visited_dirs->next = NULL; - current_dir = visited_dirs; + list_beginning = malloc(sizeof(linked_dir)); + list_beginning->path = getcwd(NULL, 0); + list_beginning->index = 0; + list_beginning->next = NULL; + current_linked_dir = list_beginning; } diff --git a/interactions.c b/interactions.c index a298eec..dd870df 100644 --- a/interactions.c +++ b/interactions.c @@ -163,15 +163,6 @@ void select_all(){ } status |= (STATUS_RUN_BACKEND); } -void dir_changed(){ - unsigned long i; - - for(i = 0; i < mid_dir.file_count; i++) { - mid_dir.file_list[i].status = 0; - } - - status |= (STATUS_RUN_BACKEND | STATUS_RELOAD_DIRECTORY ); -} void move_down(unsigned long passes){ mid_dir.current_file += passes; @@ -193,6 +184,7 @@ void move_up(unsigned long passes){ void move_left(unsigned long passes){ unsigned long i; for (i = 0; i < passes; i++) { + change_dir(); if (chdir("..") != 0) { /* TODO(2025-07-09T00:30:05) fix */ FAIL("move_left", "unhandled error of chdir"); @@ -205,6 +197,7 @@ void move_left(unsigned long passes){ void move_right(){ if (mid_dir.current_file->file_type & FILE_TYPE_DIR) { + change_dir(); if (chdir(mid_dir.current_file->file_name) != 0) { /* TODO(2026-05-05T20:12:14) fix */ FAIL("move_right", "unhandled error of chdir");