added file previev

This commit is contained in:
nova 2025-06-02 22:53:08 +02:00
parent f7c1d34e05
commit 0053c7cb88
6 changed files with 73 additions and 28 deletions

View File

@ -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;

View File

@ -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

View File

@ -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 {
}
}

15
main.c
View File

@ -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;
}

View File

@ -1,5 +1,6 @@
#include <curses.h>
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
@ -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){

View File

@ -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);
}
}