reimplementations of some functions

This commit is contained in:
nova
2026-05-08 22:02:51 +02:00
parent d9d1ed115d
commit 955d8f439b
2 changed files with 73 additions and 20 deletions

View File

@@ -3,13 +3,15 @@
#define STATUS_QUIT_PROGRAM 1 #define STATUS_QUIT_PROGRAM 1
#define STATUS_RUN_BACKEND 2 #define STATUS_RUN_BACKEND 2
#define STATUS_RELOAD_DIRECTORY 4 #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_RESIZE 16
#define STATUS_UPDATE_SCREEN_PRINTED 32 #define STATUS_UPDATE_SCREEN_CLEAR 32
#define STATUS_UPDATE_SCREEN_MASK (STATUS_UPDATE_SCREEN_INTERACTION | STATUS_UPDATE_SCREEN_RESIZE | STATUS_UPDATE_SCREEN_PRINTED) #define STATUS_UPDATE_SCREEN_DIR_CHANGE 64
#define STATUS_USER_ROOT 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_INPUT_MATCH 128 #define STATUS_USER_ROOT 128
#define STATUS_DELTA_TIME 256 #define STATUS_INPUT_MATCH 256
#define STATUS_DELTA_TIME 512
#define STATUS_MOVE_RIGHT_MATCH 1024
#define SETTINGS_HAS_COLOR 1 #define SETTINGS_HAS_COLOR 1
@@ -71,9 +73,9 @@ typedef struct File {
char *file_name; char *file_name;
} file; } file;
typedef struct Dir { typedef struct Dir {
unsigned long file_count;
file *current_file; file *current_file;
file *file_list; file *file_list;
unsigned long file_count;
} dir; } dir;
typedef struct Color { typedef struct Color {
char *file_extension; char *file_extension;

View File

@@ -21,6 +21,7 @@ extern pthread_mutex_t mutex_rgt;
extern pthread_mutex_t mutex_mid; extern pthread_mutex_t mutex_mid;
extern pthread_mutex_t mutex_btm; extern pthread_mutex_t mutex_btm;
extern pthread_cond_t cond_rgt; extern pthread_cond_t cond_rgt;
extern pthread_cond_t cond_mid;
extern dir mid_dir; extern dir mid_dir;
extern unsigned int terminal_height; extern unsigned int terminal_height;
@@ -72,7 +73,7 @@ void user_interactions() {
memset(input, 0, INPUT_BUFFER_SIZE); memset(input, 0, INPUT_BUFFER_SIZE);
input_pass = 0; input_pass = 0;
} }
status |= STATUS_UPDATE_SCREEN_INTERACTION; status |= STATUS_UPDATE_SCREEN_GENERIC;
} }
@@ -165,24 +166,28 @@ void quit_program(){
status = STATUS_QUIT_PROGRAM; status = STATUS_QUIT_PROGRAM;
} }
void update(){ 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(){ void select_all(){
TODO; TODO;
} }
void move_down(unsigned long passes){ void move_down(unsigned long passes){
mid_dir.current_file = mid_dir.current_file + passes; if (mid_dir.current_file + passes >= mid_dir.file_list + mid_dir.file_count - 1) {
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; 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){ void move_up(unsigned long passes){
mid_dir.current_file = mid_dir.current_file - passes; if (mid_dir.current_file - passes <= mid_dir.file_list) {
if (mid_dir.current_file <= mid_dir.file_list) {
mid_dir.current_file = 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){ void move_left(unsigned long passes){
unsigned long i; unsigned long i;
@@ -190,14 +195,60 @@ void move_left(unsigned long passes){
if (chdir("..") != 0) { if (chdir("..") != 0) {
/* TODO(2025-07-09T00:30:05) fix */ /* TODO(2025-07-09T00:30:05) fix */
FAIL("move_left", "unhandled error of chdir"); 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(){ 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(){ void toggle_hidden_files(){
file_modifiers ^= FILE_MODIFIERS_HIDDEN_FILES; file_modifiers ^= FILE_MODIFIERS_HIDDEN_FILES;
@@ -247,7 +298,7 @@ void order_by(unsigned long passes, int index){
seed = time(NULL); seed = time(NULL);
order_func = key_binding[index].black_magic; 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){ void cmd_on_selected(unsigned long passes, int index){
TODO; TODO;