#include #include #include #include #include #include #include "file_previews.h" #include "backend.h" #include "defines.h" #include "config.h" #include "dir.h" extern volatile unsigned long selected_file_current; extern volatile 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 pthread_mutex_t mutex_btm; extern pthread_cond_t cond_rgt; extern dir mid_dir; extern unsigned int terminal_height; extern unsigned int terminal_width; extern WINDOW *win_b; extern char *rgt_buffer; extern char *btm_buffer; extern unsigned int status; extern char *start_path; extern char *input; extern time_t seed; char search_buffer[INPUT_BUFFER_SIZE]; unsigned int input_pass; unsigned long parsed_input_number; yank yank_files = { 0 }; extern void render_pass(); extern int (*order_func)(); #define TODO noraw(); \ endwin();\ curs_set(1);\ echo();\ printf("TODO: %s at %d in %s \n", __func__, __LINE__, __FILE__);\ exit(1); void FAIL(char *function, char *str){ printf("ERROR in function %s: %s", function, str); } void user_interactions() { char ch; unsigned long i; unsigned long binding_matches = 0; ch = getch(); if(ch != ERR) { input[input_pass] = ch; input_pass++; if (ch == 27) { /* esc key */ memset(input, 0, INPUT_BUFFER_SIZE); input_pass = 0; } status |= STATUS_UPDATE_SCREEN_INTERACTION; } void (*func_ptr)(int, int); unsigned long number_length = 0; parsed_input_number = 0; while((*input >= '0') && (*input <= '9')) { parsed_input_number = (parsed_input_number * 10) + (*input - '0'); input++; number_length++; } if (parsed_input_number == 0) { parsed_input_number = 1; } input -= number_length; char cmp_len = strlen(input); if(strlen(input) < 1) { cmp_len = 1; } for (i = 0; i < binding_count; i++) { if (strncmp(input + number_length, key_binding[i].key, cmp_len) == 0) { if (strcmp(input + number_length, key_binding[i].key) == 0) { func_ptr = key_binding[i].func; func_ptr(parsed_input_number, i); timeout(SETTINGS_CURSES_TIMEOUT); /* blocking timeout of getch() */ } else { binding_matches++; mvwprintw(stdscr, terminal_height-binding_matches-1, 0, "\t\t\t"); mvwprintw(stdscr, terminal_height-binding_matches-1, 0, "%s\t%s", key_binding[i].key, key_binding[i].comment); status |= STATUS_INPUT_MATCH; } } } if (status & STATUS_INPUT_MATCH) { attron(A_UNDERLINE); mvwprintw(stdscr, terminal_height-binding_matches-2, 0, "input\tcommand\t\t"); attroff(A_UNDERLINE); status &= ~STATUS_INPUT_MATCH; } else if (number_length != strlen(input)) { memset(input, 0, INPUT_BUFFER_SIZE); input_pass = 0; number_length = 0; binding_matches = 0; } } 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 == '\t') { /* tab */ memcpy(str + pass, mid_dir.current_file->file_name, strlen(mid_dir.current_file->file_name)); mvwaddstr(win, y, x +pass, mid_dir.current_file->file_name); pass += strlen(mid_dir.current_file->file_name); } else if (ch == 127) { /* backspace */ if (pass > 0) { pass--; mvwdelch(win, y, pass); } } else if (ch == 27) { /* esc key */ err = 1; break; } else { mvwaddch(win, y, x +pass, ch); str[pass] = ch; pass++; } } str[pass] = '\0'; curs_set(0); return err; } void quit_program(){ status = STATUS_QUIT_PROGRAM; } void update(){ status |= (STATUS_RUN_BACKEND | STATUS_UPDATE_SCREEN_MASK | STATUS_RELOAD_DIRECTORY | STATUS_UPDATE_SCREEN_MASK); } void select_all(){ TODO; } void move_down(unsigned long passes){ mid_dir.current_file = mid_dir.current_file + passes; if (mid_dir.current_file >= mid_dir.file_list + mid_dir.file_count - 1) { mid_dir.current_file = mid_dir.file_list + mid_dir.file_count - 1; } status |= (STATUS_RUN_BACKEND | STATUS_UPDATE_SCREEN_INTERACTION); } void move_up(unsigned long passes){ mid_dir.current_file = mid_dir.current_file - passes; if (mid_dir.current_file <= mid_dir.file_list) { mid_dir.current_file = mid_dir.file_list; } status |= (STATUS_RUN_BACKEND | STATUS_UPDATE_SCREEN_INTERACTION); } void move_left(unsigned long passes){ unsigned long i; for (i = 0; i < passes; i++) { if (chdir("..") != 0) { /* TODO(2025-07-09T00:30:05) fix */ FAIL("move_left", "unhandled error of chdir"); } else { } } update(); } void move_right(){ TODO; } void toggle_hidden_files(){ file_modifiers ^= FILE_MODIFIERS_HIDDEN_FILES; status |= (STATUS_RUN_BACKEND | STATUS_RELOAD_DIRECTORY); } void toggle_selection(){ TODO; } void jump_bottom(){ mid_dir.current_file = mid_dir.file_list + mid_dir.file_count - 1; } void jump_top(){ mid_dir.current_file = mid_dir.file_list; } void open_with(){ TODO; } void rename_hovered(){ TODO; } void delete(){ TODO; } void makedir(){ TODO; } void makefile(){ TODO; } void enter_shell(unsigned long passes, int index){ TODO; } void not_implemented(unsigned long passes, int index){ (void)passes; mvaddstr(terminal_height-1, 0, key_binding[index].comment); mvaddstr(terminal_height-1, strlen(key_binding[index].comment), "\t"); mvaddstr(terminal_height-1, strlen(key_binding[index].comment) + strlen("\t"), "is not yet implemented"); TODO; } void jump_to_dir(unsigned long passes, int index){ TODO; } void order_by(unsigned long passes, int index){ (void)passes; seed = time(NULL); order_func = key_binding[index].black_magic; status |= (STATUS_RUN_BACKEND | STATUS_UPDATE_SCREEN_INTERACTION | STATUS_RELOAD_DIRECTORY); } void cmd_on_selected(unsigned long passes, int index){ TODO; } void yank_text(unsigned long passes, int index){ TODO; } void yank_file(unsigned long passes, int index){ TODO; } void paste(){ TODO; } void search(){ TODO; } void search_next(){ TODO; } void search_previous(){ TODO; } void jmp_file_index(){ TODO; }