From 0053c7cb88b5f4f813a2378d32806020229f65a0 Mon Sep 17 00:00:00 2001 From: nova Date: Mon, 2 Jun 2025 22:53:08 +0200 Subject: [PATCH] added file previev --- backend.c | 2 ++ defines.h | 9 +++++---- interactions.c | 12 ++++++++--- main.c | 15 ++++++++++---- threading.c | 54 ++++++++++++++++++++++++++++++++++++++++---------- window.c | 9 ++------- 6 files changed, 73 insertions(+), 28 deletions(-) diff --git a/backend.c b/backend.c index 7e08421..ee78f31 100644 --- a/backend.c +++ b/backend.c @@ -63,6 +63,8 @@ void get_dir_content(char *path, unsigned long *dir_file_count, file *dir_conten lstat(full_path, file); free(full_path); + dir_content[i].file_size_bytes = file->st_size; + if (S_ISDIR(file->st_mode)) { dir_content[i].file_type = FILE_TYPE_DIR; dir_content[i].color_pair = COLOR_DIR; diff --git a/defines.h b/defines.h index 1c1c0ca..25d16db 100644 --- a/defines.h +++ b/defines.h @@ -1,9 +1,10 @@ #define STATUS_QUIT_PROGRAM 1 #define STATUS_RUN_BACKEND 2 -#define STATUS_UPDATE_SCREEN_MASK 12 /* 1100*/ -#define STATUS_UPDATE_SCREEN_0 4 -#define STATUS_UPDATE_SCREEN_RESIZE 8 -#define STATUS_USER_ROOT 16 +#define STATUS_RELOAD_DIRECTORY 4 +#define STATUS_UPDATE_SCREEN_MASK 24 /* 11000 */ +#define STATUS_UPDATE_SCREEN_0 8 +#define STATUS_UPDATE_SCREEN_RESIZE 16 +#define STATUS_USER_ROOT 32 #define SETTINGS_HAS_COLOR 1 diff --git a/interactions.c b/interactions.c index 66d9211..0d4e886 100644 --- a/interactions.c +++ b/interactions.c @@ -9,6 +9,9 @@ extern unsigned int file_modifiers; unsigned long selected_file_current; unsigned long selected_file_last; extern pthread_mutex_t mutex_selection; +extern file *mid_content; +extern file *lft_content; +extern file *rgt_content; void user_interactions(char *input, unsigned int *status, unsigned int *settings) { if (*input == 'q') { @@ -17,16 +20,16 @@ void user_interactions(char *input, unsigned int *status, unsigned int *settings file_modifiers ^= FILE_MODIFIERS_HIDDEN_FILES; } else if (*input == 'a') { file_modifiers ^= FILE_MODIFIERS_HIDDEN_FILES; - *status |= (STATUS_RUN_BACKEND | STATUS_UPDATE_SCREEN_MASK); + *status |= (STATUS_RUN_BACKEND | STATUS_UPDATE_SCREEN_MASK | STATUS_RELOAD_DIRECTORY); } else if (*input == 'o') { file_modifiers ^= FILE_MODIFIERS_SORT_BITMASK; } else if (*input == 'e') { file_modifiers ^= FILE_MODIFIERS_SORT_ALPHABETIC; } else if (*input == 'u') { - *status |= (STATUS_RUN_BACKEND | STATUS_UPDATE_SCREEN_MASK); + *status |= (STATUS_RUN_BACKEND | STATUS_UPDATE_SCREEN_MASK | STATUS_RELOAD_DIRECTORY); } else if (*input == 'h') { chdir(".."); - *status |= (STATUS_RUN_BACKEND | STATUS_UPDATE_SCREEN_MASK); + *status |= (STATUS_RUN_BACKEND | STATUS_UPDATE_SCREEN_MASK | STATUS_RELOAD_DIRECTORY); } else if (*input == 't') { pthread_mutex_lock(&mutex_selection); /* capping the maximum file is done inside thread_mid */ @@ -40,6 +43,9 @@ void user_interactions(char *input, unsigned int *status, unsigned int *settings } *status |= (STATUS_RUN_BACKEND | STATUS_UPDATE_SCREEN_MASK); pthread_mutex_unlock(&mutex_selection); + } else if (*input == 's') { + chdir(mid_content[selected_file_current].file_name); + *status |= (STATUS_RUN_BACKEND | STATUS_UPDATE_SCREEN_MASK | STATUS_RELOAD_DIRECTORY); } else { } } diff --git a/main.c b/main.c index 25c7e98..b4ba36e 100644 --- a/main.c +++ b/main.c @@ -17,6 +17,7 @@ unsigned int temp_width = 0; unsigned int settings; unsigned int file_modifiers; unsigned int status; +unsigned int timeout_time = 0; char input = 0; void render_pass(WINDOW *wint, WINDOW *winb, WINDOW *winl, WINDOW *winm, WINDOW *winr); @@ -60,6 +61,7 @@ int main() { pthread_cancel(thread_r); threading = 0; status &= ~STATUS_RUN_BACKEND; + status &= ~STATUS_RELOAD_DIRECTORY; status |= STATUS_UPDATE_SCREEN_0; } else { pthread_create(&thread_t, NULL, thread_top, win_t); /*top bar*/ @@ -72,7 +74,12 @@ int main() { } if ((input = getch())) { user_interactions(&input, &status, &settings); + timeout_time = 5; + } else { + timeout_time += 10; } + timeout(timeout_time); /* blocking timeout of getch() */ + render_pass(win_t, win_b, win_l, win_m, win_r); @@ -139,14 +146,14 @@ void render_pass(WINDOW *win_t, WINDOW *win_b, WINDOW *win_l, WINDOW *win_m, WIN /*this function exists for things done at startup (initialization, reading config, etc)*/ void init() { - initscr(); /*start ncurses*/ - noecho(); /*hide keyboard input*/ - timeout(50); /*blocking timeout of getch()*/ + initscr(); /* start ncurses */ + noecho(); /* hide keyboard input */ + timeout(timeout_time); /* blocking timeout of getch() */ keypad(stdscr, TRUE); curs_set(0); /*file_modifiers = (FILE_MODIFIERS_HIDDEN_FILES | FILE_MODIFIERS_SORT_BITMASK);*/ - status = (STATUS_RUN_BACKEND | STATUS_UPDATE_SCREEN_MASK); + status = (STATUS_RUN_BACKEND | STATUS_UPDATE_SCREEN_MASK | STATUS_RELOAD_DIRECTORY); if (getuid() == 0) { status += STATUS_USER_ROOT; } diff --git a/threading.c b/threading.c index 9cd1e05..2b8831a 100644 --- a/threading.c +++ b/threading.c @@ -1,5 +1,6 @@ #include #include +#include #include #include #include @@ -34,7 +35,6 @@ extern unsigned long selected_file_last; void *thread_mid(void *data){ pthread_mutex_lock(&mutex_mid); - free(mid_content); char *path; if((path=getcwd(NULL, 0)) == NULL) { @@ -45,10 +45,13 @@ void *thread_mid(void *data){ } else { - mid_file_count = (unsigned long)get_dir_size(path); - mid_content = malloc(mid_file_count * sizeof(file)); - memset(mid_content, ' ', mid_file_count * sizeof(file)); - get_dir_content(path, &mid_file_count, mid_content); + if (status & STATUS_RELOAD_DIRECTORY) { + free(mid_content); + mid_file_count = (unsigned long)get_dir_size(path); + mid_content = malloc(mid_file_count * sizeof(file)); + memset(mid_content, ' ', mid_file_count * sizeof(file)); + get_dir_content(path, &mid_file_count, mid_content); + } pthread_mutex_lock(&mutex_selection); @@ -70,7 +73,6 @@ void *thread_mid(void *data){ void *thread_lft(void *data){ pthread_mutex_lock(&mutex_lft); - free(lft_content); char *path; @@ -84,10 +86,13 @@ void *thread_lft(void *data){ path[strrchr(path, '/')-path] = '\0'; path[0] = '/'; - lft_file_count = (unsigned long)get_dir_size(path); - lft_content = malloc(lft_file_count * sizeof(file)); - memset(lft_content, ' ', lft_file_count * sizeof(file)); - get_dir_content(path, &lft_file_count, lft_content); + if (status & STATUS_RELOAD_DIRECTORY) { + free(lft_content); + lft_file_count = (unsigned long)get_dir_size(path); + lft_content = malloc(lft_file_count * sizeof(file)); + memset(lft_content, ' ', lft_file_count * sizeof(file)); + get_dir_content(path, &lft_file_count, lft_content); + } } free(path); @@ -97,8 +102,37 @@ void *thread_lft(void *data){ } void *thread_rgt(void *data){ + pthread_mutex_lock(&mutex_rgt); + + pthread_mutex_lock(&mutex_mid); + char *path = mid_content[selected_file_current].file_name; + pthread_mutex_unlock(&mutex_mid); + + if (mid_content[selected_file_current].file_type == FILE_TYPE_DIR || mid_content[selected_file_current].file_type == FILE_TYPE_SYMLINK) { + free(rgt_content); + rgt_file_count = (unsigned long)get_dir_size(path); + rgt_content = malloc(rgt_file_count * sizeof(file)); + memset(rgt_content, ' ', rgt_file_count * sizeof(file)); + get_dir_content(path, &rgt_file_count, rgt_content); + } else if (mid_content[selected_file_current].file_type == FILE_TYPE_REGULAR) { + FILE *fp = fopen(mid_content[selected_file_current].file_name, "r"); + unsigned long file_size = ftell(fp); + rewind(fp); + free(rgt_content); + rgt_content = malloc(sizeof(file)); + rgt_content[0].file_name = malloc(file_size); + fgets(rgt_content[0].file_name, file_size, fp); + rgt_content[0].file_size_bytes = file_size; + rgt_content[0].file_type = FILE_TYPE_REGULAR; + rgt_content[0].file_name_width = file_size; + rgt_content[0].color_pair = 0; + rgt_content[0].status = 0; + fclose(fp); + } + + pthread_mutex_unlock(&mutex_rgt); pthread_exit(NULL); } void *thread_top(void *data){ diff --git a/window.c b/window.c index d0799c5..12b52f2 100644 --- a/window.c +++ b/window.c @@ -4,6 +4,7 @@ extern unsigned int status; +extern unsigned int timeout_time; extern unsigned int color_count; extern color *colors; @@ -88,13 +89,7 @@ void window_rgt(WINDOW *win){ mvwprintw(win, local_height/2, local_width/2, "LOADING"); status |= STATUS_UPDATE_SCREEN_0; } else { - int i = 0; - for (i = 0; i < color_count; i++) { - wattron(win, COLOR_PAIR(colors[i].color_pair)); - mvwprintw(win, i, 0, "%d", colors[i].color_pair); - mvwaddstr(win, i, 3,colors[i].file_extension); - wattroff(win, COLOR_PAIR(colors[i].color_pair)); - } + print_dir(win, &rgt_file_count, rgt_content); pthread_mutex_unlock(&mutex_rgt); } }