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_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;

View File

@@ -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;