reimplementations of some functions
This commit is contained in:
16
defines.h
16
defines.h
@@ -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;
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
Reference in New Issue
Block a user