diff --git a/defines.h b/defines.h index 0d3d15f..e9d7c1a 100644 --- a/defines.h +++ b/defines.h @@ -3,13 +3,15 @@ #define STATUS_QUIT_PROGRAM 1 #define STATUS_RUN_BACKEND 2 #define STATUS_RELOAD_DIRECTORY 4 -#define STATUS_UPDATE_SCREEN_INTERACTION 8 +#define STATUS_UPDATE_SCREEN_GENERIC 8 #define STATUS_UPDATE_SCREEN_RESIZE 16 -#define STATUS_UPDATE_SCREEN_PRINTED 32 -#define STATUS_UPDATE_SCREEN_MASK (STATUS_UPDATE_SCREEN_INTERACTION | STATUS_UPDATE_SCREEN_RESIZE | STATUS_UPDATE_SCREEN_PRINTED) -#define STATUS_USER_ROOT 64 -#define STATUS_INPUT_MATCH 128 -#define STATUS_DELTA_TIME 256 +#define STATUS_UPDATE_SCREEN_CLEAR 32 +#define STATUS_UPDATE_SCREEN_DIR_CHANGE 64 +#define STATUS_UPDATE_SCREEN_MASK (STATUS_UPDATE_SCREEN_GENERIC | STATUS_UPDATE_SCREEN_RESIZE | STATUS_UPDATE_SCREEN_CLEAR | STATUS_UPDATE_SCREEN_DIR_CHANGE) +#define STATUS_USER_ROOT 128 +#define STATUS_INPUT_MATCH 256 +#define STATUS_DELTA_TIME 512 +#define STATUS_MOVE_RIGHT_MATCH 1024 #define SETTINGS_HAS_COLOR 1 @@ -71,9 +73,9 @@ typedef struct File { char *file_name; } file; typedef struct Dir { - unsigned long file_count; file *current_file; file *file_list; + unsigned long file_count; } dir; typedef struct Color { char *file_extension; diff --git a/interactions.c b/interactions.c index a6bcfa8..6729969 100644 --- a/interactions.c +++ b/interactions.c @@ -21,6 +21,7 @@ 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 pthread_cond_t cond_mid; extern dir mid_dir; extern unsigned int terminal_height; @@ -72,7 +73,7 @@ void user_interactions() { memset(input, 0, INPUT_BUFFER_SIZE); input_pass = 0; } - status |= STATUS_UPDATE_SCREEN_INTERACTION; + status |= STATUS_UPDATE_SCREEN_GENERIC; } @@ -165,24 +166,28 @@ void quit_program(){ status = STATUS_QUIT_PROGRAM; } void update(){ - status |= (STATUS_RUN_BACKEND | STATUS_UPDATE_SCREEN_MASK | STATUS_RELOAD_DIRECTORY | STATUS_UPDATE_SCREEN_MASK); + status |= (STATUS_RUN_BACKEND | STATUS_UPDATE_SCREEN_MASK | STATUS_RELOAD_DIRECTORY ); } 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) { + if (mid_dir.current_file + passes >= mid_dir.file_list + mid_dir.file_count - 1) { mid_dir.current_file = mid_dir.file_list + mid_dir.file_count - 1; + } else { + mid_dir.current_file = mid_dir.current_file + passes; } - status |= (STATUS_RUN_BACKEND | STATUS_UPDATE_SCREEN_INTERACTION); + + status |= (STATUS_RUN_BACKEND | STATUS_UPDATE_SCREEN_GENERIC); + pthread_cond_signal(&cond_mid); } void move_up(unsigned long passes){ - mid_dir.current_file = mid_dir.current_file - passes; - if (mid_dir.current_file <= mid_dir.file_list) { + if (mid_dir.current_file - passes <= mid_dir.file_list) { mid_dir.current_file = mid_dir.file_list; + } else { + mid_dir.current_file = mid_dir.current_file - passes; } - status |= (STATUS_RUN_BACKEND | STATUS_UPDATE_SCREEN_INTERACTION); + status |= (STATUS_RUN_BACKEND | STATUS_UPDATE_SCREEN_GENERIC); } void move_left(unsigned long passes){ unsigned long i; @@ -190,14 +195,60 @@ void move_left(unsigned long passes){ if (chdir("..") != 0) { /* TODO(2025-07-09T00:30:05) fix */ FAIL("move_left", "unhandled error of chdir"); - } else { - } + } } - update(); + status |= (STATUS_RUN_BACKEND | STATUS_RELOAD_DIRECTORY | STATUS_UPDATE_SCREEN_GENERIC | STATUS_UPDATE_SCREEN_DIR_CHANGE); } void move_right(){ - TODO; + + if (mid_dir.current_file->file_type & FILE_TYPE_DIR) { + if (chdir(mid_dir.current_file->file_name) != 0) { + /* TODO(2026-05-05T20:12:14) fix */ + FAIL("move_right", "unhandled error of chdir"); + } + } else if (mid_dir.current_file->file_type & FILE_TYPE_EXEC) { + } else { + char *mime = get_mimetype(mid_dir.current_file); + char *extension = mid_dir.current_file->file_name; + char *cmd; + while (extension <= mid_dir.current_file->file_name + strlen(mid_dir.current_file->file_name)) { + if (*extension == '.') { + break; + } + extension++; + } + + long i; + if (extension <= mid_dir.current_file->file_name + strlen(mid_dir.current_file->file_name)) { + for (i = 0; i < file_extension_default_count; i++) { + if (strcmp(extension, file_extension_default_cmd[i].file_extension) == 0) { + cmd = parse_cmd(file_extension_default_cmd[i].command, mid_dir.current_file); + if (system(cmd)) { + } + status |= STATUS_MOVE_RIGHT_MATCH; + update(); + break; + } + } + } + if (!(status & STATUS_MOVE_RIGHT_MATCH)) { + for (i = 0; i < mimetype_default_count; i++) { + if (strstr(mimetype_default_cmd[i].mimetype, mime) == 0) { + cmd = parse_cmd(mimetype_default_cmd[i].command, mid_dir.current_file); + if (system(cmd)) { + } + update(); + break; + } + } + } + status &= ~STATUS_MOVE_RIGHT_MATCH; + free(cmd); + free(mime); + } + status |= (STATUS_RUN_BACKEND | STATUS_RELOAD_DIRECTORY | STATUS_UPDATE_SCREEN_GENERIC | STATUS_UPDATE_SCREEN_DIR_CHANGE); + } void toggle_hidden_files(){ file_modifiers ^= FILE_MODIFIERS_HIDDEN_FILES; @@ -247,7 +298,7 @@ void order_by(unsigned long passes, int index){ seed = time(NULL); order_func = key_binding[index].black_magic; - status |= (STATUS_RUN_BACKEND | STATUS_UPDATE_SCREEN_INTERACTION | STATUS_RELOAD_DIRECTORY); + status |= (STATUS_RUN_BACKEND | STATUS_UPDATE_SCREEN_GENERIC | STATUS_RELOAD_DIRECTORY); } void cmd_on_selected(unsigned long passes, int index){ TODO;