-O2 related refactoring
This commit is contained in:
6
Makefile
6
Makefile
@ -1,11 +1,11 @@
|
|||||||
all:
|
all:
|
||||||
gcc ./main.c -std=c89 -o th -lncurses -ltinfo -Wall
|
gcc ./main.c -std=c89 -o th -lncurses -ltinfo -Wall -O2
|
||||||
|
|
||||||
d:
|
d:
|
||||||
gcc -g -std=c89 ./main.c -o th -lncurses -ltinfo -Wall && gdb --tui ./th
|
gcc -g -std=c89 ./main.c -o th -lncurses -ltinfo -Wall -O2 && gdb --tui ./th
|
||||||
|
|
||||||
v:
|
v:
|
||||||
gcc -g -std=c89 ./main.c -o th -lncurses -ltinfo && valgrind --leak-check=full --log-fd=9 9>>valgrind.log ./th
|
gcc -g -std=c89 ./main.c -o th -lncurses -ltinfo -O3 && valgrind --leak-check=full --track-origins=yes --show-leak-kinds=all --log-fd=9 9>>valgrind.log ./th
|
||||||
|
|
||||||
rel:
|
rel:
|
||||||
gcc ./main.c -std=c89 -o th -lncurses -ltinfo -Wall -O2 -flto
|
gcc ./main.c -std=c89 -o th -lncurses -ltinfo -Wall -O2 -flto
|
||||||
|
@ -27,6 +27,7 @@ char* concat(const char *s1, const char *s2){
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
unsigned long get_dir_size(char *path){
|
unsigned long get_dir_size(char *path){
|
||||||
DIR *dir = opendir(path);
|
DIR *dir = opendir(path);
|
||||||
unsigned long entry_count = 0;
|
unsigned long entry_count = 0;
|
||||||
@ -56,7 +57,6 @@ void get_dir_content(char *path, unsigned long *dir_file_count, file *dir_conten
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
unsigned long i = 0;
|
unsigned long i = 0;
|
||||||
for (i = 0; i < *dir_file_count; i++ ) {
|
for (i = 0; i < *dir_file_count; i++ ) {
|
||||||
if (entry[i]->d_name[0] == '.' && !(file_modifiers & FILE_MODIFIERS_HIDDEN_FILES)) {
|
if (entry[i]->d_name[0] == '.' && !(file_modifiers & FILE_MODIFIERS_HIDDEN_FILES)) {
|
||||||
@ -155,8 +155,8 @@ void print_dir(WINDOW *win, unsigned long *line_width, unsigned long *dir_file_c
|
|||||||
unsigned long i = 0;
|
unsigned long i = 0;
|
||||||
unsigned long j = 0;
|
unsigned long j = 0;
|
||||||
float file_size = 0;
|
float file_size = 0;
|
||||||
float printed_size;
|
float printed_size = 0;
|
||||||
char size_char;
|
char size_char = ' ';
|
||||||
char is_selected = 0;
|
char is_selected = 0;
|
||||||
static const char sizes[6] = { 'B', 'K', 'M', 'G', 'T', 'P' };
|
static const char sizes[6] = { 'B', 'K', 'M', 'G', 'T', 'P' };
|
||||||
|
|
||||||
|
2
colors.c
2
colors.c
@ -97,7 +97,9 @@ void colors_init() {
|
|||||||
|
|
||||||
rewind(dircolors);
|
rewind(dircolors);
|
||||||
|
|
||||||
|
/*is it a leak when its intentional?*/
|
||||||
colors = malloc(sizeof(color) * color_count);
|
colors = malloc(sizeof(color) * color_count);
|
||||||
|
|
||||||
unsigned int i = 0;
|
unsigned int i = 0;
|
||||||
/* proper pass, reads all defined extensions within /etc/DIR_COLORS */
|
/* proper pass, reads all defined extensions within /etc/DIR_COLORS */
|
||||||
while (getline(&line, &size, dircolors) != -1) {
|
while (getline(&line, &size, dircolors) != -1) {
|
||||||
|
4
config.h
4
config.h
@ -29,10 +29,10 @@ static const binding key_binding[] = {
|
|||||||
{ "e", update, NULL, "rerun all backend" }, /* executes the entire backend and redrawing of the screen */
|
{ "e", update, NULL, "rerun all backend" }, /* executes the entire backend and redrawing of the screen */
|
||||||
{ "/", not_implemented, NULL, "search" },
|
{ "/", not_implemented, NULL, "search" },
|
||||||
|
|
||||||
{ "h", move_right, NULL, "move right" }, /* moves one dir up */
|
{ "h", move_left, NULL, "move left" }, /* moves one dir up */
|
||||||
{ "t", move_down, NULL, "move down" },
|
{ "t", move_down, NULL, "move down" },
|
||||||
{ "n", move_up, NULL, "move up" },
|
{ "n", move_up, NULL, "move up" },
|
||||||
{ "s", move_left, NULL, "move left" }, /* if a dir is hovered, cd into it, if a file is selected, see mimetype_default_cmd */
|
{ "s", move_right, NULL, "move right" }, /* if a dir is hovered, cd into it, if a file is selected, see mimetype_default_cmd */
|
||||||
|
|
||||||
{ "\n", open_with, NULL, "open \"open with\" dialog" }, /* opens the hovered file with an arbitrary command */
|
{ "\n", open_with, NULL, "open \"open with\" dialog" }, /* opens the hovered file with an arbitrary command */
|
||||||
{ "r", rename_hovered, NULL, "rename hovered file" }, /* renames currently hovered file/directory */
|
{ "r", rename_hovered, NULL, "rename hovered file" }, /* renames currently hovered file/directory */
|
||||||
|
@ -22,9 +22,13 @@ char* get_mimetype(char *path){
|
|||||||
FILE *cmd_open = popen(cmd, "r");
|
FILE *cmd_open = popen(cmd, "r");
|
||||||
char *line;
|
char *line;
|
||||||
size_t size = 0;
|
size_t size = 0;
|
||||||
getline(&line, &size, cmd_open);
|
if (getline(&line, &size, cmd_open) != -1){
|
||||||
pclose(cmd_open);
|
pclose(cmd_open);
|
||||||
return line;
|
return line;
|
||||||
|
} else {
|
||||||
|
pclose(cmd_open);
|
||||||
|
return "unknown";
|
||||||
|
}
|
||||||
}
|
}
|
||||||
char* preview_file(file *file_current){
|
char* preview_file(file *file_current){
|
||||||
/* this calls "file" on path */
|
/* this calls "file" on path */
|
||||||
@ -47,10 +51,12 @@ char* text(char *path, unsigned long *file_size){
|
|||||||
|
|
||||||
char *file_buffer = malloc(*file_size + 1);
|
char *file_buffer = malloc(*file_size + 1);
|
||||||
FILE *fp = fopen(path, "r");
|
FILE *fp = fopen(path, "r");
|
||||||
fread(file_buffer, *file_size, 1, fp);
|
if (fread(file_buffer, *file_size, 1, fp) != 0) {
|
||||||
file_buffer[*file_size] = '\0';
|
file_buffer[*file_size] = '\0';
|
||||||
|
return file_buffer;
|
||||||
return file_buffer;
|
} else {
|
||||||
|
return "failed reading file";
|
||||||
|
}
|
||||||
}
|
}
|
||||||
char* generic(char *path){
|
char* generic(char *path){
|
||||||
char *cmd = concat("file ./\"", path);
|
char *cmd = concat("file ./\"", path);
|
||||||
@ -59,7 +65,11 @@ char* generic(char *path){
|
|||||||
FILE *cmd_open = popen(cmd, "r");
|
FILE *cmd_open = popen(cmd, "r");
|
||||||
char *line;
|
char *line;
|
||||||
size_t size = 0;
|
size_t size = 0;
|
||||||
getline(&line, &size, cmd_open);
|
if (getline(&line, &size, cmd_open) != -1) {
|
||||||
pclose(cmd_open);
|
pclose(cmd_open);
|
||||||
return line;
|
return line;
|
||||||
|
} else {
|
||||||
|
pclose(cmd_open);
|
||||||
|
return "failed executing shell command \"file\"";
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -6,6 +6,7 @@
|
|||||||
#include <sys/stat.h>
|
#include <sys/stat.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
#include <signal.h>
|
||||||
#include "defines.h"
|
#include "defines.h"
|
||||||
#include "config.h"
|
#include "config.h"
|
||||||
|
|
||||||
@ -47,6 +48,14 @@ extern int (*order_func)();
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void FAIL(char *function, char *str){
|
||||||
|
noraw();
|
||||||
|
endwin();
|
||||||
|
curs_set(1);
|
||||||
|
echo();
|
||||||
|
printf("ERROR in function %s: %s", function, str);
|
||||||
|
kill(getpid(),9);
|
||||||
|
}
|
||||||
void user_interactions() {
|
void user_interactions() {
|
||||||
|
|
||||||
|
|
||||||
@ -208,19 +217,24 @@ void move_up(int passes){
|
|||||||
status |= (STATUS_RUN_BACKEND | STATUS_UPDATE_SCREEN_MASK);
|
status |= (STATUS_RUN_BACKEND | STATUS_UPDATE_SCREEN_MASK);
|
||||||
pthread_mutex_unlock(&mutex_selection);
|
pthread_mutex_unlock(&mutex_selection);
|
||||||
}
|
}
|
||||||
void move_right(int passes){
|
void move_left(int passes){
|
||||||
if (passes == 0) {
|
if (passes == 0) {
|
||||||
passes++;
|
passes++;
|
||||||
}
|
}
|
||||||
int i;
|
int i;
|
||||||
for (i = 0; i < passes; i++) {
|
for (i = 0; i < passes; i++) {
|
||||||
chdir("..");
|
if (chdir("..") != 0) {
|
||||||
|
/* TODO(2025-07-09T00:30:05) fix */
|
||||||
|
FAIL("move_left", "unhandled error of chdir");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
status |= (STATUS_RUN_BACKEND | STATUS_UPDATE_SCREEN_MASK | STATUS_RELOAD_DIRECTORY);
|
status |= (STATUS_RUN_BACKEND | STATUS_UPDATE_SCREEN_MASK | STATUS_RELOAD_DIRECTORY);
|
||||||
}
|
}
|
||||||
void move_left(){
|
void move_right(){
|
||||||
if (file_current->file_type == FILE_TYPE_DIR || file_current->file_type == FILE_TYPE_SYMLINK) {
|
if (file_current->file_type == FILE_TYPE_DIR || file_current->file_type == FILE_TYPE_SYMLINK) {
|
||||||
chdir(file_current->file_name);
|
if (chdir(file_current->file_name) != 0) {
|
||||||
|
FAIL("move_right", "unhandled error of chdir");
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
unsigned long i = 0;
|
unsigned long i = 0;
|
||||||
char *mime = get_mimetype(file_current->file_name);
|
char *mime = get_mimetype(file_current->file_name);
|
||||||
@ -235,7 +249,9 @@ void move_left(){
|
|||||||
strcpy(btm_buffer, cmd);
|
strcpy(btm_buffer, cmd);
|
||||||
|
|
||||||
|
|
||||||
system(cmd);
|
if (system(cmd) == -1) {
|
||||||
|
/*do nothing*/
|
||||||
|
}
|
||||||
status |= (STATUS_RUN_BACKEND | STATUS_UPDATE_SCREEN_MASK | STATUS_RELOAD_DIRECTORY | STATUS_UPDATE_SCREEN_RELOAD_FULL);
|
status |= (STATUS_RUN_BACKEND | STATUS_UPDATE_SCREEN_MASK | STATUS_RELOAD_DIRECTORY | STATUS_UPDATE_SCREEN_RELOAD_FULL);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@ -287,7 +303,9 @@ void open_with(){
|
|||||||
cmd = concat(cmd, file_current->file_name);
|
cmd = concat(cmd, file_current->file_name);
|
||||||
cmd = concat(cmd, "\"");
|
cmd = concat(cmd, "\"");
|
||||||
|
|
||||||
system(cmd);
|
if (system(cmd) == -1) {
|
||||||
|
FAIL("open_with", "creating subcommand failed unhandled");
|
||||||
|
}
|
||||||
|
|
||||||
free(btm_buffer);
|
free(btm_buffer);
|
||||||
btm_buffer = cmd;
|
btm_buffer = cmd;
|
||||||
@ -326,7 +344,9 @@ void rename_hovered(){
|
|||||||
cmd = concat(cmd, str);
|
cmd = concat(cmd, str);
|
||||||
cmd = concat(cmd, "\"");
|
cmd = concat(cmd, "\"");
|
||||||
|
|
||||||
system(cmd);
|
if (system(cmd) == -1) {
|
||||||
|
FAIL("rename_hovered", "mv or creating subcommand failed");
|
||||||
|
};
|
||||||
btm_buffer = cmd;
|
btm_buffer = cmd;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -374,15 +394,18 @@ void delete(){
|
|||||||
char ch = wgetch(win_b);
|
char ch = wgetch(win_b);
|
||||||
|
|
||||||
if (ch == 'y' || ch == 'Y') {
|
if (ch == 'y' || ch == 'Y') {
|
||||||
/* the second loop is used to add "./", wich is not being printed" */
|
char *cmd = malloc(sizeof(char));
|
||||||
char *cmd;
|
|
||||||
/* TODO(2025-06-30T02:27:06) IMPORTANT: this really fucks up when the file has a quotation mark in its name */
|
/* TODO(2025-06-30T02:27:06) IMPORTANT: this really fucks up when the file has a quotation mark in its name */
|
||||||
if (hits) {
|
if (hits) {
|
||||||
|
/* the second loop is used to add "./", wich is not being printed" */
|
||||||
for (i = 0; i < mid_file_count; i++) {
|
for (i = 0; i < mid_file_count; i++) {
|
||||||
if (mid_content[i].status & FILE_STATUS_SELECTED) {
|
if (mid_content[i].status & FILE_STATUS_SELECTED) {
|
||||||
|
free(cmd);
|
||||||
cmd = concat("rm -rf ./\"", mid_content[i].file_name);
|
cmd = concat("rm -rf ./\"", mid_content[i].file_name);
|
||||||
cmd = concat(cmd, "\"");
|
cmd = concat(cmd, "\"");
|
||||||
system(cmd);
|
if (system(cmd) == -1) {
|
||||||
|
FAIL("delete", "rm -rf or creating subcommand failed");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
free(btm_buffer);
|
free(btm_buffer);
|
||||||
@ -391,9 +414,12 @@ void delete(){
|
|||||||
free(btm_buffer);
|
free(btm_buffer);
|
||||||
btm_buffer = concat("deleted: \"", file_current->file_name);
|
btm_buffer = concat("deleted: \"", file_current->file_name);
|
||||||
btm_buffer = concat(btm_buffer, "\"");
|
btm_buffer = concat(btm_buffer, "\"");
|
||||||
|
free(cmd);
|
||||||
cmd = concat("rm -rf ./\"", file_current->file_name);
|
cmd = concat("rm -rf ./\"", file_current->file_name);
|
||||||
cmd = concat(cmd, "\"");
|
cmd = concat(cmd, "\"");
|
||||||
system(cmd);
|
if (system(cmd) == -1) {
|
||||||
|
FAIL("delete", "rm -rf or creating subcommand failed");
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
/*system(cmd);*/
|
/*system(cmd);*/
|
||||||
@ -469,11 +495,10 @@ void not_implemented(int passes, int index){
|
|||||||
}
|
}
|
||||||
void jump_to_dir(int passes, int index){
|
void jump_to_dir(int passes, int index){
|
||||||
if ((char*)key_binding[index].black_magic) {
|
if ((char*)key_binding[index].black_magic) {
|
||||||
chdir(getenv((char*)key_binding[index].black_magic+1));
|
if (chdir(getenv((char*)key_binding[index].black_magic+1)) != 0) {
|
||||||
} else {
|
FAIL("jump_to_dir", "jumping to black_magic in config.h failed");
|
||||||
chdir((char*)key_binding[index].black_magic);
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
status |= (STATUS_RUN_BACKEND | STATUS_UPDATE_SCREEN_MASK | STATUS_RELOAD_DIRECTORY);
|
status |= (STATUS_RUN_BACKEND | STATUS_UPDATE_SCREEN_MASK | STATUS_RELOAD_DIRECTORY);
|
||||||
}
|
}
|
||||||
void order_by(int passes, int index){
|
void order_by(int passes, int index){
|
||||||
@ -520,26 +545,31 @@ void cmd_on_selected(int passes, int index){
|
|||||||
|
|
||||||
if (ch == 'y' || ch == 'Y') {
|
if (ch == 'y' || ch == 'Y') {
|
||||||
/* the second loop is used to add "./", wich is not being printed" */
|
/* the second loop is used to add "./", wich is not being printed" */
|
||||||
char *cmd;
|
char *cmd = malloc(sizeof(char));
|
||||||
/* TODO(2025-07-06T07:23:05) IMPORTANT: this really fucks up when the file has a quotation mark in its name */
|
/* TODO(2025-07-06T07:23:05) IMPORTANT: this really fucks up when the file has a quotation mark in its name */
|
||||||
if (hits) {
|
if (hits) {
|
||||||
for (i = 0; i < mid_file_count; i++) {
|
for (i = 0; i < mid_file_count; i++) {
|
||||||
if (mid_content[i].status & FILE_STATUS_SELECTED) {
|
if (mid_content[i].status & FILE_STATUS_SELECTED) {
|
||||||
|
free(cmd);
|
||||||
cmd = concat((char*)key_binding[index].black_magic, " \"");
|
cmd = concat((char*)key_binding[index].black_magic, " \"");
|
||||||
cmd = concat(cmd, mid_content[i].file_name);
|
cmd = concat(cmd, mid_content[i].file_name);
|
||||||
cmd = concat(cmd, "\"");
|
cmd = concat(cmd, "\"");
|
||||||
system(cmd);
|
if (system(cmd) != 0) {
|
||||||
free(cmd);
|
/*do nothing*/
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
free(btm_buffer);
|
free(btm_buffer);
|
||||||
btm_buffer = concat("completed: ", key_binding[index].black_magic);
|
btm_buffer = concat("completed: ", key_binding[index].black_magic);
|
||||||
} else {
|
} else {
|
||||||
free(btm_buffer);
|
free(btm_buffer);
|
||||||
|
free(cmd);
|
||||||
cmd = concat((char*)key_binding[index].black_magic, " \"");
|
cmd = concat((char*)key_binding[index].black_magic, " \"");
|
||||||
cmd = concat(cmd, file_current->file_name);
|
cmd = concat(cmd, file_current->file_name);
|
||||||
cmd = concat(cmd, "\"");
|
cmd = concat(cmd, "\"");
|
||||||
system(cmd);
|
if (system(cmd) != 0) {
|
||||||
|
/*do nothing*/
|
||||||
|
}
|
||||||
mvaddstr(10,10, cmd);
|
mvaddstr(10,10, cmd);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -9,10 +9,10 @@
|
|||||||
void user_interactions();
|
void user_interactions();
|
||||||
void quit_program();
|
void quit_program();
|
||||||
void toggle_selection();
|
void toggle_selection();
|
||||||
void move_right(int pssses);
|
void move_right();
|
||||||
void move_up(int passes);
|
void move_up(int passes);
|
||||||
void move_down(int passes);
|
void move_down(int passes);
|
||||||
void move_left();
|
void move_left(int passes);
|
||||||
void jump_bottom();
|
void jump_bottom();
|
||||||
void jump_top();
|
void jump_top();
|
||||||
void toggle_hidden_files();
|
void toggle_hidden_files();
|
||||||
|
18
main.c
18
main.c
@ -129,11 +129,11 @@ void render_pass(){
|
|||||||
|
|
||||||
/*TODO: check if deallocation of window and reallocation is faster than this or not */
|
/*TODO: check if deallocation of window and reallocation is faster than this or not */
|
||||||
|
|
||||||
werase(win_t);
|
wclear(win_t);
|
||||||
werase(win_b);
|
wclear(win_b);
|
||||||
werase(win_l);
|
wclear(win_l);
|
||||||
werase(win_m);
|
wclear(win_m);
|
||||||
werase(win_r);
|
wclear(win_r);
|
||||||
|
|
||||||
wresize(win_t, 1, terminal_width);
|
wresize(win_t, 1, terminal_width);
|
||||||
wresize(win_l, terminal_height-2, terminal_width/8);
|
wresize(win_l, terminal_height-2, terminal_width/8);
|
||||||
@ -172,7 +172,6 @@ void init() {
|
|||||||
initscr(); /* start ncurses */
|
initscr(); /* start ncurses */
|
||||||
noecho(); /* hide keyboard input */
|
noecho(); /* hide keyboard input */
|
||||||
timeout(0); /* blocking timeout of getch() */
|
timeout(0); /* blocking timeout of getch() */
|
||||||
keypad(stdscr, TRUE);
|
|
||||||
curs_set(0);
|
curs_set(0);
|
||||||
|
|
||||||
/*file_modifiers = (FILE_MODIFIERS_HIDDEN_FILES | FILE_MODIFIERS_SORT_BITMASK);*/
|
/*file_modifiers = (FILE_MODIFIERS_HIDDEN_FILES | FILE_MODIFIERS_SORT_BITMASK);*/
|
||||||
@ -180,13 +179,14 @@ void init() {
|
|||||||
memset(input, 0, 255);
|
memset(input, 0, 255);
|
||||||
status = (STATUS_RUN_BACKEND | STATUS_UPDATE_SCREEN_MASK | STATUS_RELOAD_DIRECTORY);
|
status = (STATUS_RUN_BACKEND | STATUS_UPDATE_SCREEN_MASK | STATUS_RELOAD_DIRECTORY);
|
||||||
if (getuid() == 0) {
|
if (getuid() == 0) {
|
||||||
status += STATUS_USER_ROOT;
|
status |= STATUS_USER_ROOT;
|
||||||
}
|
}
|
||||||
|
|
||||||
threading_init(); /* found in threading.c */
|
threading_init(); /* found in threading.c */
|
||||||
colors_init();
|
colors_init();
|
||||||
ESCDELAY = 10;
|
ESCDELAY = 10;
|
||||||
|
char *start_path = getcwd(NULL, 0);
|
||||||
setenv("START_PATH", getcwd(NULL, 0), 0);
|
setenv("START_PATH", start_path, 0);
|
||||||
|
free(start_path);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
28
threading.c
28
threading.c
@ -28,7 +28,7 @@ char *btm_buffer;
|
|||||||
|
|
||||||
file *file_current;
|
file *file_current;
|
||||||
|
|
||||||
char *top_content; /* current path */
|
char *top_buffer; /* current path */
|
||||||
|
|
||||||
unsigned long rgt_file_count;
|
unsigned long rgt_file_count;
|
||||||
unsigned long mid_file_count;
|
unsigned long mid_file_count;
|
||||||
@ -191,17 +191,20 @@ void *thread_rgt(void *data){
|
|||||||
get_dir_content(path, &rgt_file_count, rgt_content);
|
get_dir_content(path, &rgt_file_count, rgt_content);
|
||||||
rgt_content[0].status &= ~FILE_STATUS_FILE_OPEN;
|
rgt_content[0].status &= ~FILE_STATUS_FILE_OPEN;
|
||||||
free(path);
|
free(path);
|
||||||
|
|
||||||
|
free(rgt_buffer);
|
||||||
|
rgt_buffer = malloc(sizeof(char));
|
||||||
|
memset(rgt_buffer, ' ', sizeof(char));
|
||||||
} else {
|
} else {
|
||||||
|
|
||||||
rgt_file_count = 0;
|
rgt_file_count = 0;
|
||||||
|
|
||||||
|
free(rgt_buffer);
|
||||||
if (rgt_content->status & FILE_STATUS_DIR_EMPTY) {
|
if (rgt_content->status & FILE_STATUS_DIR_EMPTY) {
|
||||||
free(rgt_buffer);
|
|
||||||
rgt_buffer = "empty dir";
|
rgt_buffer = "empty dir";
|
||||||
} else {
|
} else {
|
||||||
rgt_content->file_type = FILE_TYPE_OPEN_FILE;
|
rgt_content->file_type = FILE_TYPE_OPEN_FILE;
|
||||||
rgt_content->status = FILE_STATUS_HOVER;
|
rgt_content->status = FILE_STATUS_HOVER;
|
||||||
free(rgt_buffer);
|
|
||||||
rgt_buffer = preview_file(rgt_content);
|
rgt_buffer = preview_file(rgt_content);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -211,16 +214,16 @@ void *thread_rgt(void *data){
|
|||||||
}
|
}
|
||||||
void *thread_top(void *data){
|
void *thread_top(void *data){
|
||||||
pthread_mutex_lock(&mutex_top);
|
pthread_mutex_lock(&mutex_top);
|
||||||
free(top_content);
|
free(top_buffer);
|
||||||
|
|
||||||
char *path;
|
char *path;
|
||||||
if((path=getcwd(NULL, 0)) == NULL) {
|
if((path=getcwd(NULL, 0)) == NULL) {
|
||||||
top_content = malloc(sizeof("cannot open directory"));
|
top_buffer = malloc(sizeof("cannot open directory"));
|
||||||
top_width = sizeof("cannot open directory");
|
top_width = sizeof("cannot open directory");
|
||||||
top_content = "cannot open directory";
|
top_buffer = "cannot open directory";
|
||||||
} else {
|
} else {
|
||||||
top_content = getcwd(NULL, 0);
|
top_buffer = getcwd(NULL, 0);
|
||||||
top_width = strlen(top_content);
|
top_width = strlen(top_buffer);
|
||||||
}
|
}
|
||||||
|
|
||||||
free(path);
|
free(path);
|
||||||
@ -228,12 +231,12 @@ void *thread_top(void *data){
|
|||||||
pthread_exit(0);
|
pthread_exit(0);
|
||||||
}
|
}
|
||||||
void *thread_btm(void *data){
|
void *thread_btm(void *data){
|
||||||
|
pthread_mutex_lock(&mutex_btm);
|
||||||
pthread_mutex_lock(&mutex_wait);
|
pthread_mutex_lock(&mutex_wait);
|
||||||
wait_count++;
|
wait_count++;
|
||||||
pthread_cond_wait(&cond_wait, &mutex_wait);
|
pthread_cond_wait(&cond_wait, &mutex_wait);
|
||||||
wait_count--;
|
wait_count--;
|
||||||
pthread_mutex_unlock(&mutex_wait);
|
pthread_mutex_unlock(&mutex_wait);
|
||||||
pthread_mutex_lock(&mutex_btm);
|
|
||||||
|
|
||||||
free(btm_buffer);
|
free(btm_buffer);
|
||||||
int buffer_width = terminal_width;
|
int buffer_width = terminal_width;
|
||||||
@ -260,9 +263,12 @@ void threading_init(){
|
|||||||
mid_content = malloc(sizeof(file));
|
mid_content = malloc(sizeof(file));
|
||||||
lft_content = malloc(sizeof(file));
|
lft_content = malloc(sizeof(file));
|
||||||
|
|
||||||
top_content = malloc(sizeof(char));
|
top_buffer = malloc(sizeof(char));
|
||||||
rgt_buffer = malloc(sizeof(char));
|
rgt_buffer = malloc(sizeof(char));
|
||||||
btm_buffer = malloc(sizeof(char));
|
btm_buffer = malloc(sizeof(char));
|
||||||
|
memset(top_buffer, ' ', sizeof(char));
|
||||||
|
memset(rgt_buffer, ' ', sizeof(char));
|
||||||
|
memset(btm_buffer, ' ', sizeof(char));
|
||||||
|
|
||||||
|
|
||||||
rgt_content[0].file_type = 0;
|
rgt_content[0].file_type = 0;
|
||||||
@ -291,7 +297,7 @@ void threading_free(){
|
|||||||
free(rgt_content);
|
free(rgt_content);
|
||||||
free(mid_content);
|
free(mid_content);
|
||||||
free(lft_content);
|
free(lft_content);
|
||||||
free(top_content);
|
free(top_buffer);
|
||||||
|
|
||||||
pthread_mutex_destroy(&mutex_top);
|
pthread_mutex_destroy(&mutex_top);
|
||||||
pthread_mutex_destroy(&mutex_mid);
|
pthread_mutex_destroy(&mutex_mid);
|
||||||
|
63
window.c
63
window.c
@ -13,7 +13,7 @@ extern color *colors;
|
|||||||
extern file *mid_content;
|
extern file *mid_content;
|
||||||
extern file *lft_content;
|
extern file *lft_content;
|
||||||
extern file *rgt_content;
|
extern file *rgt_content;
|
||||||
extern char *top_content;
|
extern char *top_buffer;
|
||||||
extern char *rgt_buffer;
|
extern char *rgt_buffer;
|
||||||
extern char *btm_buffer;
|
extern char *btm_buffer;
|
||||||
|
|
||||||
@ -30,19 +30,18 @@ extern pthread_mutex_t mutex_mid;
|
|||||||
extern pthread_mutex_t mutex_rgt;
|
extern pthread_mutex_t mutex_rgt;
|
||||||
|
|
||||||
void window_top(WINDOW *win){
|
void window_top(WINDOW *win){
|
||||||
unsigned long i = 0;
|
|
||||||
werase(win);
|
werase(win);
|
||||||
|
|
||||||
if (pthread_mutex_trylock(&mutex_top)) {
|
if (pthread_mutex_trylock(&mutex_top) == 0) {
|
||||||
wprintw(win,"loading");
|
|
||||||
status |= STATUS_UPDATE_SCREEN_0;
|
|
||||||
pthread_mutex_unlock(&mutex_rgt);
|
|
||||||
|
|
||||||
} else {
|
|
||||||
wattron(win, COLOR_PAIR(COLOR_PATH));
|
wattron(win, COLOR_PAIR(COLOR_PATH));
|
||||||
mvwprintw(win, i, 0, "%s", top_content);
|
if (*top_buffer != ' ') { /*printing ' ' (standard initialized value, see threading_init) makes valgrind throw a fuss*/
|
||||||
|
mvwprintw(win, 0, 0, "%s", top_buffer);
|
||||||
|
}
|
||||||
wattroff(win, COLOR_PAIR(COLOR_PATH));
|
wattroff(win, COLOR_PAIR(COLOR_PATH));
|
||||||
pthread_mutex_unlock(&mutex_top);
|
pthread_mutex_unlock(&mutex_top);
|
||||||
|
} else {
|
||||||
|
wprintw(win,"loading");
|
||||||
|
status |= STATUS_UPDATE_SCREEN_0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
void window_btm(WINDOW *win){
|
void window_btm(WINDOW *win){
|
||||||
@ -50,17 +49,17 @@ void window_btm(WINDOW *win){
|
|||||||
unsigned long local_width;
|
unsigned long local_width;
|
||||||
unsigned long local_height;
|
unsigned long local_height;
|
||||||
getmaxyx(win, local_height, local_width);
|
getmaxyx(win, local_height, local_width);
|
||||||
if (pthread_mutex_trylock(&mutex_btm)) {
|
if (pthread_mutex_trylock(&mutex_btm) == 0) {
|
||||||
mvwprintw(win, local_height/2, local_width/2, "LOADING");
|
if (*top_buffer != ' ') { /*printing ' ' (standard initialized value, see threading_init) makes valgrind throw a fuss*/
|
||||||
status |= STATUS_UPDATE_SCREEN_0;
|
mvwprintw(win, 0, 0, "%s", btm_buffer);
|
||||||
pthread_mutex_unlock(&mutex_rgt);
|
}
|
||||||
} else {
|
|
||||||
mvwprintw(win, 0, 0, "%s", btm_buffer);
|
|
||||||
pthread_mutex_unlock(&mutex_btm);
|
pthread_mutex_unlock(&mutex_btm);
|
||||||
/*the printing of the input char is done in user_interactions*/
|
/*the printing of the input char is done in user_interactions*/
|
||||||
/*the printing of all possible inputs are done in user_interactions */
|
/*the printing of all possible inputs are done in user_interactions */
|
||||||
|
} else {
|
||||||
|
mvwprintw(win, local_height/2, local_width/2, "LOADING");
|
||||||
|
status |= STATUS_UPDATE_SCREEN_0;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
void window_lft(WINDOW *win){
|
void window_lft(WINDOW *win){
|
||||||
werase(win);
|
werase(win);
|
||||||
@ -69,14 +68,13 @@ void window_lft(WINDOW *win){
|
|||||||
unsigned long local_width;
|
unsigned long local_width;
|
||||||
unsigned long local_height;
|
unsigned long local_height;
|
||||||
getmaxyx(win, local_height, local_width);
|
getmaxyx(win, local_height, local_width);
|
||||||
if (pthread_mutex_trylock(&mutex_lft)) {
|
if (pthread_mutex_trylock(&mutex_lft) == 0) {
|
||||||
mvwprintw(win, local_height/2, local_width/2, "LOADING");
|
|
||||||
status |= STATUS_UPDATE_SCREEN_0;
|
|
||||||
pthread_mutex_unlock(&mutex_rgt);
|
|
||||||
|
|
||||||
} else {
|
|
||||||
print_dir(win, &local_width, &lft_file_count, lft_content);
|
print_dir(win, &local_width, &lft_file_count, lft_content);
|
||||||
pthread_mutex_unlock(&mutex_lft);
|
pthread_mutex_unlock(&mutex_lft);
|
||||||
|
|
||||||
|
} else {
|
||||||
|
mvwprintw(win, local_height/2, local_width/2, "LOADING");
|
||||||
|
status |= STATUS_UPDATE_SCREEN_0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
void window_mid(WINDOW *win){
|
void window_mid(WINDOW *win){
|
||||||
@ -86,18 +84,16 @@ void window_mid(WINDOW *win){
|
|||||||
unsigned long local_width;
|
unsigned long local_width;
|
||||||
unsigned long local_height;
|
unsigned long local_height;
|
||||||
getmaxyx(win, local_height, local_width);
|
getmaxyx(win, local_height, local_width);
|
||||||
if (pthread_mutex_trylock(&mutex_mid)) {
|
if (pthread_mutex_trylock(&mutex_mid) == 0) {
|
||||||
mvwprintw(win, local_height/2, local_width/2, "LOADING");
|
|
||||||
status |= STATUS_UPDATE_SCREEN_0;
|
|
||||||
pthread_mutex_unlock(&mutex_rgt);
|
|
||||||
|
|
||||||
} else {
|
|
||||||
if (mid_file_count == 0) {
|
if (mid_file_count == 0) {
|
||||||
mvwprintw(win, 0, 0, "empty");
|
mvwprintw(win, 0, 0, "empty");
|
||||||
} else {
|
} else {
|
||||||
print_dir(win, &local_width, &mid_file_count, mid_content);
|
print_dir(win, &local_width, &mid_file_count, mid_content);
|
||||||
}
|
}
|
||||||
pthread_mutex_unlock(&mutex_mid);
|
pthread_mutex_unlock(&mutex_mid);
|
||||||
|
} else {
|
||||||
|
mvwprintw(win, local_height/2, local_width/2, "LOADING");
|
||||||
|
status |= STATUS_UPDATE_SCREEN_0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
void window_rgt(WINDOW *win){
|
void window_rgt(WINDOW *win){
|
||||||
@ -107,13 +103,7 @@ void window_rgt(WINDOW *win){
|
|||||||
unsigned long local_width;
|
unsigned long local_width;
|
||||||
unsigned long local_height;
|
unsigned long local_height;
|
||||||
getmaxyx(win, local_height, local_width);
|
getmaxyx(win, local_height, local_width);
|
||||||
if (pthread_mutex_trylock(&mutex_rgt)) {
|
if (pthread_mutex_trylock(&mutex_rgt) == 0) {
|
||||||
/* TODO(2025-06-13T00:49:26) fix race condition and use trylock */
|
|
||||||
mvwprintw(win, local_height/2, local_width/2, "LOADING");
|
|
||||||
status |= STATUS_UPDATE_SCREEN_0;
|
|
||||||
pthread_mutex_unlock(&mutex_rgt);
|
|
||||||
} else {
|
|
||||||
|
|
||||||
if (rgt_file_count == 0) {
|
if (rgt_file_count == 0) {
|
||||||
if (rgt_content[0].file_type == FILE_TYPE_OPEN_FILE) {
|
if (rgt_content[0].file_type == FILE_TYPE_OPEN_FILE) {
|
||||||
mvwprintw(win, 0, 0, "%s", rgt_buffer);
|
mvwprintw(win, 0, 0, "%s", rgt_buffer);
|
||||||
@ -126,5 +116,8 @@ void window_rgt(WINDOW *win){
|
|||||||
print_dir(win, &local_width, &rgt_file_count, rgt_content);
|
print_dir(win, &local_width, &rgt_file_count, rgt_content);
|
||||||
}
|
}
|
||||||
pthread_mutex_unlock(&mutex_rgt);
|
pthread_mutex_unlock(&mutex_rgt);
|
||||||
|
} else {
|
||||||
|
mvwprintw(win, local_height/2, local_width/2, "LOADING");
|
||||||
|
status |= STATUS_UPDATE_SCREEN_0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user