#include #include #include #include #include #include #include #include "defines.h" #include "config.h" extern unsigned long selected_file_current; extern unsigned long selected_file_last; extern unsigned int file_modifiers; 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 unsigned int terminal_height; extern unsigned int terminal_width; extern WINDOW *win_b; extern char *rgt_buffer; extern char *btm_buffer; extern unsigned long mid_file_count; extern unsigned int status; int read_string(WINDOW *win, int y, int x, char *str); unsigned int timeout_time = 0; extern char *input; unsigned int input_pass; int parsed_input_number; void user_interactions() { char ch; move(terminal_height, terminal_width); ch = getch(); if(ch != ERR) { timeout(10); /* blocking timeout of getch() */ mvaddch(terminal_height-1, (terminal_width/3)*2 +input_pass, ch); input[input_pass] = ch; input_pass++; } void (*func_ptr)(int); unsigned long i = 0; unsigned int j = 0; for (i = 0; i < binding_count; i++) { if (strstr(input, key_binding[i].key)) { parsed_input_number = 0; while((*input >= '0') && (*input <= '9')) { parsed_input_number = (parsed_input_number * 10) + (*input - '0'); input++; } func_ptr = key_binding[i].func; func_ptr(parsed_input_number); memset(input, 0, 255); input_pass = 0; timeout(100); /* blocking timeout of getch() */ } } } void quit_program(){ status = STATUS_QUIT_PROGRAM; } void toggle_selection(){ pthread_mutex_lock(&mutex_selection); pthread_mutex_lock(&mutex_mid); mid_content[selected_file_current].status ^= FILE_STATUS_SELECTED; file_current->status ^= FILE_STATUS_SELECTED; status |= (STATUS_UPDATE_SCREEN_MASK); pthread_mutex_unlock(&mutex_mid); pthread_mutex_unlock(&mutex_selection); } void move_down(int passes){ pthread_mutex_lock(&mutex_selection); if (passes == 0) { passes++; } /*capping the maximum file is done inside thread_mid */ selected_file_current += passes; status |= (STATUS_RUN_BACKEND | STATUS_UPDATE_SCREEN_MASK); pthread_mutex_unlock(&mutex_selection); } void move_up(int passes){ pthread_mutex_lock(&mutex_selection); if (passes == 0) { passes++; } int i; for (i = 0; i < passes; i++) { if (selected_file_current != 0) { selected_file_current--; } } status |= (STATUS_RUN_BACKEND | STATUS_UPDATE_SCREEN_MASK); pthread_mutex_unlock(&mutex_selection); } void move_right(int passes){ if (passes == 0) { passes++; } int i; for (i = 0; i < passes; i++) { chdir(".."); } status |= (STATUS_RUN_BACKEND | STATUS_UPDATE_SCREEN_MASK | STATUS_RELOAD_DIRECTORY); } void move_left(){ 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(){ file_modifiers ^= FILE_MODIFIERS_HIDDEN_FILES; status |= (STATUS_RUN_BACKEND | STATUS_UPDATE_SCREEN_MASK | STATUS_RELOAD_DIRECTORY); } void jump_bottom(){ pthread_mutex_lock(&mutex_selection); selected_file_current = 0 - 1; status |= (STATUS_RUN_BACKEND | STATUS_UPDATE_SCREEN_MASK); pthread_mutex_unlock(&mutex_selection); } void jump_top(){ pthread_mutex_lock(&mutex_selection); selected_file_current = 0; status |= (STATUS_RUN_BACKEND | STATUS_UPDATE_SCREEN_MASK); pthread_mutex_unlock(&mutex_selection); } int read_string(WINDOW *win, int y, int x, char *str){ curs_set(1); timeout(-1); /* negative numbers block until enter is pressed */ unsigned int pass = 0; char ch; char err = 0; wmove(win, y, x); while(1) { /*ch = mvwgetch(win, y, x + pass);*/ ch = wgetch(win); if (ch == '\n') { err = 0; break; } else if (ch == 27) { /* esc key */ err = 1; break; } else if (ch == 127) { /* backspace */ if (pass > 0) { pass--; mvwdelch(win, y, pass); } } else { mvwaddch(win, y, x +pass, ch); str[pass] = ch; pass++; } } str[pass] = '\0'; timeout(10); curs_set(0); return err; } void open_with(){ btm_buffer = concat("open \"", file_current->file_name); btm_buffer = concat(btm_buffer, "\" with:"); status = STATUS_UPDATE_SCREEN_0; werase(win_b); mvwin(win_b, terminal_height-6, 0); wresize(win_b, 5, terminal_width/3); /*the div3 just looks cool*/ render_pass(); unsigned long local_width; unsigned long local_height; getmaxyx(win_b, local_height, local_width); /* TODO(2025-06-22T01:24:36) fix fixed buffer size */ char *str = malloc(255); memset(str, ' ', 255); int err = read_string(win_b, local_height - 1, 0 , str); if (!err) { char *cmd = concat(str, " ./\""); cmd = concat(cmd, file_current->file_name); cmd = concat(cmd, "\""); system(cmd); free(btm_buffer); btm_buffer = cmd; } status |= (STATUS_RUN_BACKEND | STATUS_UPDATE_SCREEN_MASK | STATUS_RELOAD_DIRECTORY | STATUS_UPDATE_SCREEN_RELOAD_FULL); free(str); } void rename_hovered(){ btm_buffer = concat("rename \"", file_current->file_name); btm_buffer = concat(btm_buffer, "\" to:"); status = STATUS_UPDATE_SCREEN_0; werase(win_b); mvwin(win_b, terminal_height-6, 0); wresize(win_b, 5, terminal_width/3); /*the div3 just looks cool*/ render_pass(); unsigned long local_width; unsigned long local_height; getmaxyx(win_b, local_height, local_width); /* TODO(2025-06-22T01:24:30) fix fixed buffer size */ char *str = malloc(255); memset(str, ' ', 255); int err = read_string(win_b, local_height - 1, 0, str); if (!err) { char *cmd = concat("mv ./\"", file_current->file_name); cmd = concat(cmd, "\" ./\""); cmd = concat(cmd, str); cmd = concat(cmd, "\""); system(cmd); btm_buffer = cmd; } status |= (STATUS_RUN_BACKEND | STATUS_UPDATE_SCREEN_MASK | STATUS_RELOAD_DIRECTORY | STATUS_UPDATE_SCREEN_RELOAD_FULL); free(str); } void delete(){ unsigned int i = 0; unsigned int hits = 0; char *file_str = " "; for (i = 0; i < mid_file_count; i++) { if (mid_content[i].status & FILE_STATUS_SELECTED) { file_str = concat(file_str, "\""); file_str = concat(file_str, mid_content[i].file_name); file_str = concat(file_str, "\" "); hits++; } } if (hits) { btm_buffer = concat("delete:", file_str); } else { btm_buffer = concat("delete: \"", file_current->file_name); btm_buffer = concat(btm_buffer, "\""); } btm_buffer = concat(btm_buffer, "?"); btm_buffer = concat(btm_buffer, "\n\n"); btm_buffer = concat(btm_buffer, "(y/N)"); status = STATUS_UPDATE_SCREEN_0; werase(win_b); mvwin(win_b, terminal_height-6, 0); wresize(win_b, 5, terminal_width/3); /*the div3 just looks cool*/ render_pass(); unsigned long local_width; unsigned long local_height; getmaxyx(win_b, local_height, local_width); timeout(-1); /* negative numbers block until enter is pressed */ /* TODO(2025-06-22T01:24:30) fix fixed buffer size */ char ch = wgetch(win_b); if (ch == 'y' || ch == 'Y') { /* the second loop is used to add "./", wich is not being printed" */ char *cmd; /* TODO(2025-06-30T02:27:06) IMPORTANT: this really fucks up when the file has a quotation mark in its name */ if (hits) { for (i = 0; i < mid_file_count; i++) { if (mid_content[i].status & FILE_STATUS_SELECTED) { cmd = concat("rm -rf ./\"", mid_content[i].file_name); cmd = concat(cmd, "\""); system(cmd); } } free(btm_buffer); btm_buffer = concat("deleted: ", file_str); } else { free(btm_buffer); btm_buffer = concat("deleted: \"", file_current->file_name); btm_buffer = concat(btm_buffer, "\""); cmd = concat("rm -rf ./\"", file_current->file_name); cmd = concat(cmd, "\""); system(cmd); } /*system(cmd);*/ free(cmd); } else { free(btm_buffer); btm_buffer = "cancled deletion"; } timeout(10); status |= (STATUS_RUN_BACKEND | STATUS_UPDATE_SCREEN_MASK | STATUS_RELOAD_DIRECTORY | STATUS_UPDATE_SCREEN_RELOAD_FULL); if (hits) { free(file_str); } } void makedir(){ mkdir("mk", 755); /*magic number from default permissions as created by mkdir*/ status |= (STATUS_RUN_BACKEND | STATUS_UPDATE_SCREEN_MASK | STATUS_RELOAD_DIRECTORY | STATUS_UPDATE_SCREEN_RELOAD_FULL); }