From f99035629add8a0a12e8bf57d13bb7f3cf1a9151 Mon Sep 17 00:00:00 2001 From: nova Date: Wed, 18 Jun 2025 04:08:02 +0200 Subject: [PATCH] opening files using mimetypes defined in config.h --- backend.c | 8 +++++++ config.h | 4 +++- defines.h | 3 ++- file_previews.c | 47 ++++++++++++++++++++++-------------------- file_previews.h | 1 + interactions.c | 55 +++++++++++++++++++++++++++++++++++++------------ interactions.h | 4 ++-- main.c | 15 ++++++++++++-- threading.c | 2 ++ window.c | 8 +++++++ 10 files changed, 106 insertions(+), 41 deletions(-) diff --git a/backend.c b/backend.c index 71e53bc..1eca79f 100644 --- a/backend.c +++ b/backend.c @@ -14,6 +14,14 @@ extern unsigned int file_modifiers; extern unsigned int color_count; extern color *colors; +char* concat(const char *s1, const char *s2){ + const size_t len1 = strlen(s1); + const size_t len2 = strlen(s2); + char *result = malloc(len1 + len2 + 1); + memcpy(result, s1, len1); + memcpy(result + len1, s2, len2 + 1); + return result; +} unsigned long get_dir_size(char *path){ DIR *dir = opendir(path); diff --git a/config.h b/config.h index 616ce14..57d080e 100644 --- a/config.h +++ b/config.h @@ -3,7 +3,9 @@ static mimetype mimetype_default_cmd[] = { /* mimetype shell command */ - { "text", "$EDITOR" } + { "text", "$EDITOR" }, + { "image", "feh" }, + { "video", "mpv" } }; static binding key_binding[] = { diff --git a/defines.h b/defines.h index 1fc00cb..c6de271 100644 --- a/defines.h +++ b/defines.h @@ -5,7 +5,8 @@ #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 STATUS_UPDATE_SCREEN_RELOAD_FULL 32 +#define STATUS_USER_ROOT 64 #define SETTINGS_HAS_COLOR 1 diff --git a/file_previews.c b/file_previews.c index 8b2c32e..5d100ff 100644 --- a/file_previews.c +++ b/file_previews.c @@ -4,15 +4,12 @@ #include "defines.h" char* text(char *path, unsigned long *file_size); -char* preview_file(char *path, unsigned long file_size){ - /* this calls "file" on path */ - - char *file_buffer; - unsigned long cmd_size = 0; +char* get_mimetype(char *path){ static char *cmd_str = "file --mime-type -b ./\""; unsigned long cmd_len = strlen(cmd_str); unsigned int path_len = strlen(path); + char *cmd = malloc((cmd_len + path_len) + 2); memset(cmd, ' ', cmd_len + path_len); memcpy(cmd, cmd_str, cmd_len); @@ -23,23 +20,37 @@ char* preview_file(char *path, unsigned long file_size){ FILE *cmd_open = popen(cmd, "r"); char *line; size_t size = 0; - char *tmp = getline(&line, &size, cmd_open); - cmd_size = strlen(line); + getline(&line, &size, cmd_open); pclose(cmd_open); + return line; +} +char* preview_file(char *path, unsigned long file_size){ + /* this calls "file" on path */ - if (strstr(line, "text")) { + char *file_buffer; + + + char *mime = get_mimetype(path); + + unsigned int mime_len = strlen(mime); + + if (strstr(mime, "text")) { file_buffer = text(path, &file_size); } else { - file_buffer = malloc(cmd_size + 1); - memset(file_buffer, ' ', cmd_size); - memcpy(file_buffer, line, cmd_size); - file_buffer[cmd_size] = '\0'; + + file_buffer = malloc(mime_len + 1); + memset(file_buffer, ' ', mime_len); + memcpy(file_buffer, mime, mime_len); + file_buffer[mime_len] = '\0'; } - free(cmd); + free(mime); return file_buffer; } -char* text(char *path, unsigned long *file_size) { + + + +char* text(char *path, unsigned long *file_size){ char *file_buffer = malloc(*file_size + 1); FILE *fp = fopen(path, "r"); @@ -48,11 +59,3 @@ char* text(char *path, unsigned long *file_size) { return file_buffer; } -/* - FILE *cmd_open = popen(cmd, "r"); - memset(file_buffer, ' ', file_size); - fread(file_buffer, file_size, 1, cmd_open); - file_buffer[file_size] = '\0'; - pclose(cmd_open); - return file_buffer; - */ diff --git a/file_previews.h b/file_previews.h index 00208f1..7fbf7bf 100644 --- a/file_previews.h +++ b/file_previews.h @@ -1,3 +1,4 @@ #include "file_previews.c" char* preview_file(char *path, unsigned long file_size); +char* get_mimetype(char *path); diff --git a/interactions.c b/interactions.c index b61f1ba..1b4c5d3 100644 --- a/interactions.c +++ b/interactions.c @@ -1,7 +1,9 @@ #include #include #include +#include #include +#include #include "defines.h" #include "config.h" @@ -10,12 +12,28 @@ extern unsigned int file_modifiers; unsigned long selected_file_current; unsigned long selected_file_last; extern pthread_mutex_t mutex_selection; +extern pthread_mutex_t mutex_rgt; +extern pthread_mutex_t mutex_mid; extern file *mid_content; extern file *lft_content; extern file *rgt_content; +extern file file_current; + +extern char *rgt_buffer; +extern char *btm_buffer; extern unsigned int status; +void user_interactions(char *input) { + void (*func_ptr)(); + unsigned long i = 0; + for (i = 0; i < binding_count; i++) { + if (*input == key_binding[i].key) { + func_ptr = key_binding[i].func; + func_ptr(); + } + } +} void quit_program(){ status = STATUS_QUIT_PROGRAM; } @@ -39,7 +57,30 @@ void move_right(){ status |= (STATUS_RUN_BACKEND | STATUS_UPDATE_SCREEN_MASK | STATUS_RELOAD_DIRECTORY); } void move_left(){ - chdir(mid_content[selected_file_current].file_name); + if (file_current.file_type == FILE_TYPE_DIR || file_current.file_type == FILE_TYPE_SYMLINK) { + chdir(file_current.file_name); + } else { + unsigned long i = 0; + char *mime = get_mimetype(file_current.file_name); + for (i = 0; i < mimetype_default_count; i++) { + if (strstr(mime, mimetype_default_cmd[i].mimetype)) { + + char *cmd = concat(mimetype_default_cmd[i].command, " ./\""); + cmd = concat(cmd, file_current.file_name); + cmd = concat(cmd, "\""); + btm_buffer = malloc(strlen(cmd)); + + strcpy(btm_buffer, cmd); + + + system(cmd); + status |= (STATUS_RUN_BACKEND | STATUS_UPDATE_SCREEN_MASK | STATUS_RELOAD_DIRECTORY | STATUS_UPDATE_SCREEN_RELOAD_FULL); + break; + + } + } + free(mime); + } status |= (STATUS_RUN_BACKEND | STATUS_UPDATE_SCREEN_MASK | STATUS_RELOAD_DIRECTORY); } void toggle_hidden_files(){ @@ -59,15 +100,3 @@ void jump_top(){ pthread_mutex_unlock(&mutex_selection); } - - -void user_interactions(char *input) { - void (*func_ptr)(); - unsigned long i = 0; - for (i = 0; i < binding_count; i++) { - if (*input == key_binding[i].key) { - func_ptr = key_binding[i].func; - func_ptr(); - } - } -} diff --git a/interactions.h b/interactions.h index fb86a45..d995ae0 100644 --- a/interactions.h +++ b/interactions.h @@ -1,7 +1,7 @@ #include #include -#ifndef CONFIG_GUARD -#define CONFIG_GUARD +#ifndef INTERACTIONS_GUARD +#define INTERACTIONS_GUARD #include "interactions.c" #endif diff --git a/main.c b/main.c index 3cff721..aae0d36 100644 --- a/main.c +++ b/main.c @@ -20,6 +20,7 @@ unsigned int status; unsigned int timeout_time = 0; char input = 0; + void render_pass(WINDOW *wint, WINDOW *winb, WINDOW *winl, WINDOW *winm, WINDOW *winr); void init(); @@ -96,9 +97,15 @@ int main(){ pthread_join(thread_b, NULL); */ - curs_set(1); + delwin(win_l); + delwin(win_m); + delwin(win_r); + delwin(win_t); + delwin(win_b); endwin(); - refresh(); + noraw(); + curs_set(1); + echo(); return 0; } @@ -106,6 +113,10 @@ int main(){ void render_pass(WINDOW *win_t, WINDOW *win_b, WINDOW *win_l, WINDOW *win_m, WINDOW *win_r){ if ((status & STATUS_UPDATE_SCREEN_MASK) & STATUS_UPDATE_SCREEN_RESIZE) { + if (status & STATUS_UPDATE_SCREEN_RELOAD_FULL) { + clear(); + status &= ~STATUS_UPDATE_SCREEN_RELOAD_FULL; + } /*TODO: check if deallocation of window and reallocation is faster than this or not */ diff --git a/threading.c b/threading.c index 1ad8fed..ecfac71 100644 --- a/threading.c +++ b/threading.c @@ -21,6 +21,7 @@ file *rgt_content; file *mid_content; file *lft_content; char *rgt_buffer; /* used for file previews, unlike rgt_content, which is used for directory previews */ +char *btm_buffer; file file_current; @@ -184,6 +185,7 @@ void threading_init(){ top_content = malloc(sizeof(char)); rgt_buffer = malloc(sizeof(char)); + btm_buffer = malloc(sizeof(char)); file_current.file_type = 0; file_current.file_size_bytes = 1; diff --git a/window.c b/window.c index 528fc52..44c96cd 100644 --- a/window.c +++ b/window.c @@ -14,6 +14,8 @@ extern file *lft_content; extern file *rgt_content; extern char *top_content; extern char *rgt_buffer; +extern char *btm_buffer; + extern unsigned long lft_file_count; extern unsigned long mid_file_count; @@ -44,9 +46,15 @@ void window_top(WINDOW *win){ } void window_btm(WINDOW *win){ werase(win); + unsigned long local_width; + unsigned long local_height; + getmaxyx(win, local_height, local_width); if (pthread_mutex_trylock(&mutex_btm)) { + mvwprintw(win, local_height/2, local_width/2, "LOADING"); + status |= STATUS_UPDATE_SCREEN_0; pthread_mutex_unlock(&mutex_rgt); } else { + mvwprintw(win, 0, 0, "%s", btm_buffer); pthread_mutex_unlock(&mutex_btm); } }