|
|
|
|
@@ -40,14 +40,14 @@ extern char *input;
|
|
|
|
|
|
|
|
|
|
extern time_t *seed;
|
|
|
|
|
|
|
|
|
|
char search_buffer[255];
|
|
|
|
|
char search_buffer[INPUT_BUFFER_SIZE];
|
|
|
|
|
unsigned int timeout_time = 0;
|
|
|
|
|
unsigned int input_pass;
|
|
|
|
|
unsigned long parsed_input_number;
|
|
|
|
|
yank yank_files = { 0 };
|
|
|
|
|
|
|
|
|
|
int read_string(WINDOW *win, int y, int x, char *str);
|
|
|
|
|
extern void render_pass();
|
|
|
|
|
extern void window_btm(WINDOW *win, char force_render);
|
|
|
|
|
extern int (*order_func)();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@@ -77,7 +77,7 @@ void user_interactions() {
|
|
|
|
|
if (ch == 27) { /* esc key */
|
|
|
|
|
memset(input, ' ', terminal_width);
|
|
|
|
|
mvaddstr(terminal_height-1, (terminal_width/3)*2, input);
|
|
|
|
|
memset(input, 0, 255);
|
|
|
|
|
memset(input, 0, INPUT_BUFFER_SIZE);
|
|
|
|
|
input_pass = 0;
|
|
|
|
|
timeout(100); /* blocking timeout of getch() */
|
|
|
|
|
}
|
|
|
|
|
@@ -125,7 +125,7 @@ void user_interactions() {
|
|
|
|
|
attroff(A_UNDERLINE);
|
|
|
|
|
status &= ~STATUS_INPUT_MATCH;
|
|
|
|
|
} else if (number_length != strlen(input)) {
|
|
|
|
|
memset(input, 0, 255);
|
|
|
|
|
memset(input, 0, INPUT_BUFFER_SIZE);
|
|
|
|
|
input_pass = 0;
|
|
|
|
|
binding_pass = 0;
|
|
|
|
|
number_length = 0;
|
|
|
|
|
@@ -236,7 +236,7 @@ void move_right(){
|
|
|
|
|
if (mid_content->file_name[0] == '\0') {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
if (mid_content[selected_file_current].file_type &= FILE_TYPE_DIR) {
|
|
|
|
|
if ((mid_content[selected_file_current].file_type & FILE_TYPE_DIR) == FILE_TYPE_DIR) {
|
|
|
|
|
if (chdir(mid_content[selected_file_current].file_name) != 0) {
|
|
|
|
|
FAIL("move_right", "unhandled error of chdir");
|
|
|
|
|
} else {
|
|
|
|
|
@@ -272,9 +272,7 @@ void move_right(){
|
|
|
|
|
char *cmd = concat(mimetype_default_cmd[i].command, " ./\"");
|
|
|
|
|
cmd = concat(cmd, mid_content[selected_file_current].file_name);
|
|
|
|
|
cmd = concat(cmd, "\"");
|
|
|
|
|
btm_buffer = malloc(strlen(cmd));
|
|
|
|
|
|
|
|
|
|
strcpy(btm_buffer, cmd-1);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (system(cmd) == -1) {
|
|
|
|
|
@@ -325,26 +323,25 @@ void jump_top(){
|
|
|
|
|
void open_with(){
|
|
|
|
|
pthread_mutex_lock(&mutex_btm);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
char *btm_buffer_tmp = btm_buffer;
|
|
|
|
|
werase(win_b);
|
|
|
|
|
mvwin(win_b, terminal_height-6, 0);
|
|
|
|
|
wresize(win_b, BTM_WINDOW_HEIGHT_ON_STR_INTERACTION, terminal_width/3); /*the div3 just looks cool*/
|
|
|
|
|
|
|
|
|
|
btm_buffer = concat("open \"", mid_content[selected_file_current].file_name);
|
|
|
|
|
btm_buffer = concat(btm_buffer, "\" with:");
|
|
|
|
|
|
|
|
|
|
status |= STATUS_UPDATE_SCREEN_0;
|
|
|
|
|
werase(win_b);
|
|
|
|
|
mvwin(win_b, terminal_height-6, 0);
|
|
|
|
|
wresize(win_b, 5, terminal_width/3); /*the div3 just looks cool*/
|
|
|
|
|
|
|
|
|
|
render_pass();
|
|
|
|
|
unsigned long local_height;
|
|
|
|
|
local_height = getmaxy(win_b);
|
|
|
|
|
window_btm(win_b, 1);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* TODO(2025-06-22T01:24:36) fix fixed buffer size */
|
|
|
|
|
char *str = malloc(255);
|
|
|
|
|
memset(str, ' ', 255);
|
|
|
|
|
int err = read_string(win_b, local_height - 1, 0 , str);
|
|
|
|
|
char *str = malloc(INPUT_BUFFER_SIZE);
|
|
|
|
|
memset(str, ' ', INPUT_BUFFER_SIZE);
|
|
|
|
|
str[INPUT_BUFFER_SIZE-1] = '\0';
|
|
|
|
|
int err = read_string(win_b, BTM_WINDOW_HEIGHT_ON_STR_INTERACTION - 1, 0 , str);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (!err) {
|
|
|
|
|
if (err == 0) {
|
|
|
|
|
char *cmd = concat(str, " ./\"");
|
|
|
|
|
cmd = concat(cmd, mid_content[selected_file_current].file_name);
|
|
|
|
|
cmd = concat(cmd, "\"");
|
|
|
|
|
@@ -356,39 +353,34 @@ void open_with(){
|
|
|
|
|
if (system(cmd) == -1) {
|
|
|
|
|
FAIL("open_with", "creating subcommand failed unhandled");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
free(btm_buffer);
|
|
|
|
|
btm_buffer = cmd;
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
status |= (STATUS_RUN_BACKEND | STATUS_UPDATE_SCREEN_MASK | STATUS_RELOAD_DIRECTORY | STATUS_UPDATE_SCREEN_RELOAD_FULL);
|
|
|
|
|
|
|
|
|
|
free(btm_buffer);
|
|
|
|
|
btm_buffer = btm_buffer_tmp;
|
|
|
|
|
pthread_mutex_unlock(&mutex_btm);
|
|
|
|
|
|
|
|
|
|
free(str);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void rename_hovered(){
|
|
|
|
|
pthread_mutex_lock(&mutex_btm);
|
|
|
|
|
|
|
|
|
|
char *btm_buffer_tmp = btm_buffer;
|
|
|
|
|
werase(win_b);
|
|
|
|
|
mvwin(win_b, terminal_height-6, 0);
|
|
|
|
|
wresize(win_b, BTM_WINDOW_HEIGHT_ON_STR_INTERACTION, terminal_width/3); /*the div3 just looks cool*/
|
|
|
|
|
|
|
|
|
|
btm_buffer = concat("rename \"", mid_content[selected_file_current].file_name);
|
|
|
|
|
btm_buffer = concat(btm_buffer, "\" to:");
|
|
|
|
|
|
|
|
|
|
status |= STATUS_UPDATE_SCREEN_0;
|
|
|
|
|
werase(win_b);
|
|
|
|
|
mvwin(win_b, terminal_height-6, 0);
|
|
|
|
|
wresize(win_b, 5, terminal_width/3); /*the div3 just looks cool*/
|
|
|
|
|
window_btm(win_b, 1);
|
|
|
|
|
|
|
|
|
|
pthread_mutex_unlock(&mutex_btm);
|
|
|
|
|
render_pass();
|
|
|
|
|
pthread_mutex_lock(&mutex_btm);
|
|
|
|
|
|
|
|
|
|
unsigned long local_height;
|
|
|
|
|
local_height = getmaxy(win_b);
|
|
|
|
|
|
|
|
|
|
/* TODO(2025-06-22T01:24:30) fix fixed buffer size */
|
|
|
|
|
char *str = malloc(255);
|
|
|
|
|
memset(str, ' ', 255);
|
|
|
|
|
int err = read_string(win_b, local_height - 1, 0, str);
|
|
|
|
|
char *str = malloc(INPUT_BUFFER_SIZE);
|
|
|
|
|
memset(str, ' ', INPUT_BUFFER_SIZE);
|
|
|
|
|
str[INPUT_BUFFER_SIZE-1] = '\0';
|
|
|
|
|
int err = read_string(win_b, BTM_WINDOW_HEIGHT_ON_STR_INTERACTION - 1, 0, str);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (!err) {
|
|
|
|
|
@@ -402,17 +394,21 @@ void rename_hovered(){
|
|
|
|
|
};
|
|
|
|
|
btm_buffer = cmd;
|
|
|
|
|
}
|
|
|
|
|
pthread_mutex_unlock(&mutex_btm);
|
|
|
|
|
free(str);
|
|
|
|
|
free(btm_buffer);
|
|
|
|
|
btm_buffer = btm_buffer_tmp;
|
|
|
|
|
|
|
|
|
|
status |= (STATUS_RUN_BACKEND | STATUS_UPDATE_SCREEN_MASK | STATUS_RELOAD_DIRECTORY | STATUS_UPDATE_SCREEN_RELOAD_FULL);
|
|
|
|
|
|
|
|
|
|
pthread_mutex_unlock(&mutex_btm);
|
|
|
|
|
|
|
|
|
|
free(str);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void delete(){
|
|
|
|
|
pthread_mutex_lock(&mutex_btm);
|
|
|
|
|
|
|
|
|
|
char *btm_buffer_tmp = btm_buffer;
|
|
|
|
|
|
|
|
|
|
unsigned int i = 0;
|
|
|
|
|
unsigned int hits = 0;
|
|
|
|
|
char *file_str = " ";
|
|
|
|
|
@@ -425,32 +421,52 @@ void delete(){
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (hits) {
|
|
|
|
|
btm_buffer = concat("delete:", file_str);
|
|
|
|
|
} else {
|
|
|
|
|
btm_buffer = concat("delete: \"", mid_content[selected_file_current].file_name);
|
|
|
|
|
btm_buffer = concat(btm_buffer, "\"");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
btm_buffer = concat(btm_buffer, "?");
|
|
|
|
|
btm_buffer = concat(btm_buffer, "\n\n");
|
|
|
|
|
btm_buffer = concat(btm_buffer, "(y/N)");
|
|
|
|
|
|
|
|
|
|
status |= STATUS_UPDATE_SCREEN_0;
|
|
|
|
|
werase(win_b);
|
|
|
|
|
mvwin(win_b, terminal_height-6, 0);
|
|
|
|
|
wresize(win_b, 5, terminal_width/3); /*the div3 just looks cool*/
|
|
|
|
|
if (strlen(file_str) < (BTM_WINDOW_HEIGHT_ON_STR_INTERACTION-1) * (terminal_width/3)) {
|
|
|
|
|
wresize(win_b, BTM_WINDOW_HEIGHT_ON_STR_INTERACTION, terminal_width/3); /*the div3 just looks cool*/
|
|
|
|
|
btm_buffer = malloc(BTM_WINDOW_HEIGHT_ON_STR_INTERACTION * (terminal_width/3));
|
|
|
|
|
memset(btm_buffer, ' ', (BTM_WINDOW_HEIGHT_ON_STR_INTERACTION * (terminal_width/3)));
|
|
|
|
|
|
|
|
|
|
pthread_mutex_unlock(&mutex_btm);
|
|
|
|
|
render_pass();
|
|
|
|
|
pthread_mutex_lock(&mutex_btm);
|
|
|
|
|
memcpy(btm_buffer, "delete: ",strlen("delete: "));
|
|
|
|
|
if (hits) {
|
|
|
|
|
memcpy(btm_buffer + strlen("delete: "), file_str, strlen(file_str));
|
|
|
|
|
} else {
|
|
|
|
|
btm_buffer[strlen("delete: ")] = '"';
|
|
|
|
|
memcpy(btm_buffer + strlen("delete: ") + sizeof(char), mid_content[selected_file_current].file_name, strlen(mid_content[selected_file_current].file_name)-1);
|
|
|
|
|
btm_buffer[strlen("delete: ") + sizeof(char) + strlen(mid_content[selected_file_current].file_name)] = '"';
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
memcpy(btm_buffer + (BTM_WINDOW_HEIGHT_ON_STR_INTERACTION * (terminal_width/3) - (terminal_width/3)) , "(y/N)", strlen("(y/N)"));
|
|
|
|
|
btm_buffer[BTM_WINDOW_HEIGHT_ON_STR_INTERACTION * (terminal_width/3)] = '\0';
|
|
|
|
|
|
|
|
|
|
} else {
|
|
|
|
|
/*since more data is present than can be represented using div3, we do the uncool thing*/
|
|
|
|
|
wresize(win_b, BTM_WINDOW_HEIGHT_ON_STR_INTERACTION, terminal_width);
|
|
|
|
|
btm_buffer = malloc(BTM_WINDOW_HEIGHT_ON_STR_INTERACTION * terminal_width);
|
|
|
|
|
memset(btm_buffer, ' ', BTM_WINDOW_HEIGHT_ON_STR_INTERACTION * terminal_width);
|
|
|
|
|
|
|
|
|
|
memcpy(btm_buffer, "delete: ",strlen("delete: "));
|
|
|
|
|
|
|
|
|
|
/*this horrendous check tries to copy everything until the last line, while keeping said last line unwritten*/
|
|
|
|
|
/*lets hope im never gonna need to format something like this ever again*/
|
|
|
|
|
memcpy(btm_buffer + strlen("delete: "), file_str,
|
|
|
|
|
(strlen(file_str) > ((BTM_WINDOW_HEIGHT_ON_STR_INTERACTION * terminal_width) - terminal_width) ?
|
|
|
|
|
((BTM_WINDOW_HEIGHT_ON_STR_INTERACTION * terminal_width) - terminal_width) :
|
|
|
|
|
strlen(file_str)));
|
|
|
|
|
|
|
|
|
|
memcpy(btm_buffer + (BTM_WINDOW_HEIGHT_ON_STR_INTERACTION * terminal_width - terminal_width) , "(y/N)", strlen("(y/N)"));
|
|
|
|
|
btm_buffer[BTM_WINDOW_HEIGHT_ON_STR_INTERACTION * terminal_width] = '\0';
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
window_btm(win_b, 1);
|
|
|
|
|
|
|
|
|
|
timeout(-1); /* negative numbers block until enter is pressed */
|
|
|
|
|
/* TODO(2025-06-22T01:24:30) fix fixed buffer size */
|
|
|
|
|
char ch = wgetch(win_b);
|
|
|
|
|
|
|
|
|
|
if (ch == 'y' || ch == 'Y') {
|
|
|
|
|
/* TODO(2025-06-30T02:27:06) IMPORTANT: this really fucks up when the file has a quotation mark in its name */
|
|
|
|
|
if (hits) {
|
|
|
|
|
for (i = 0; i < mid_file_count; i++) {
|
|
|
|
|
if (mid_content[i].status & FILE_STATUS_SELECTED) {
|
|
|
|
|
@@ -458,54 +474,45 @@ void delete(){
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
free(btm_buffer);
|
|
|
|
|
btm_buffer = concat("deleted: ", file_str);
|
|
|
|
|
} else {
|
|
|
|
|
free(btm_buffer);
|
|
|
|
|
if (mid_content[selected_file_current].file_type & FILE_TYPE_DIR) {
|
|
|
|
|
recursive_delete(mid_content[selected_file_current]);
|
|
|
|
|
}
|
|
|
|
|
remove(mid_content[selected_file_current].file_name);
|
|
|
|
|
btm_buffer = concat("deleted: \"", mid_content[selected_file_current].file_name);
|
|
|
|
|
btm_buffer = concat(btm_buffer, "\"");
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
/*system(cmd);*/
|
|
|
|
|
|
|
|
|
|
} else {
|
|
|
|
|
free(btm_buffer);
|
|
|
|
|
btm_buffer = "cancled deletion";
|
|
|
|
|
}
|
|
|
|
|
free(btm_buffer);
|
|
|
|
|
btm_buffer = btm_buffer_tmp;
|
|
|
|
|
if (hits) {
|
|
|
|
|
free(file_str);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
timeout(10);
|
|
|
|
|
status |= (STATUS_RUN_BACKEND | STATUS_UPDATE_SCREEN_MASK | STATUS_RELOAD_DIRECTORY | STATUS_UPDATE_SCREEN_RELOAD_FULL);
|
|
|
|
|
|
|
|
|
|
if (hits) {
|
|
|
|
|
free(file_str);
|
|
|
|
|
}
|
|
|
|
|
pthread_mutex_unlock(&mutex_btm);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void makedir(){
|
|
|
|
|
pthread_mutex_lock(&mutex_btm);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
char *btm_buffer_tmp = btm_buffer;
|
|
|
|
|
werase(win_b);
|
|
|
|
|
mvwin(win_b, terminal_height-6, 0);
|
|
|
|
|
wresize(win_b, 5, terminal_width/3); /*the div3 just looks cool*/
|
|
|
|
|
memset(btm_buffer, ' ', terminal_width);
|
|
|
|
|
memcpy(btm_buffer, "create dir: ", strlen("create dir: "));
|
|
|
|
|
status |= STATUS_UPDATE_SCREEN_0;
|
|
|
|
|
wresize(win_b, BTM_WINDOW_HEIGHT_ON_STR_INTERACTION, terminal_width/3); /*the div3 just looks cool*/
|
|
|
|
|
|
|
|
|
|
pthread_mutex_unlock(&mutex_btm);
|
|
|
|
|
render_pass();
|
|
|
|
|
pthread_mutex_lock(&mutex_btm);
|
|
|
|
|
btm_buffer = "create dir: ";
|
|
|
|
|
|
|
|
|
|
unsigned long local_height;
|
|
|
|
|
local_height = getmaxy(win_b);
|
|
|
|
|
window_btm(win_b, 1);
|
|
|
|
|
|
|
|
|
|
char *str = malloc(INPUT_BUFFER_SIZE);
|
|
|
|
|
memset(str, ' ', INPUT_BUFFER_SIZE);
|
|
|
|
|
str[INPUT_BUFFER_SIZE-1] = '\0';
|
|
|
|
|
int err = read_string(win_b, BTM_WINDOW_HEIGHT_ON_STR_INTERACTION - 1, 0, str);
|
|
|
|
|
|
|
|
|
|
/* TODO(2025-07-03T01:19:55) fix fixed buffer size */
|
|
|
|
|
char *str = malloc(255);
|
|
|
|
|
memset(str, ' ', 255);
|
|
|
|
|
int err = read_string(win_b, local_height - 1, 0, str);
|
|
|
|
|
if (!err) {
|
|
|
|
|
btm_buffer = concat(btm_buffer, str);
|
|
|
|
|
mode_t mask = umask(0);
|
|
|
|
|
@@ -513,29 +520,29 @@ void makedir(){
|
|
|
|
|
umask(mask);
|
|
|
|
|
}
|
|
|
|
|
free(str);
|
|
|
|
|
free(btm_buffer);
|
|
|
|
|
btm_buffer = btm_buffer_tmp;
|
|
|
|
|
|
|
|
|
|
status |= (STATUS_RUN_BACKEND | STATUS_UPDATE_SCREEN_MASK | STATUS_RELOAD_DIRECTORY | STATUS_UPDATE_SCREEN_RELOAD_FULL);
|
|
|
|
|
pthread_mutex_unlock(&mutex_btm);
|
|
|
|
|
}
|
|
|
|
|
void makefile(){
|
|
|
|
|
pthread_mutex_lock(&mutex_btm);
|
|
|
|
|
|
|
|
|
|
memcpy(btm_buffer, "create file: ", strlen("create file: "));
|
|
|
|
|
status |= STATUS_UPDATE_SCREEN_0;
|
|
|
|
|
char *btm_buffer_tmp = btm_buffer;
|
|
|
|
|
werase(win_b);
|
|
|
|
|
mvwin(win_b, terminal_height-6, 0);
|
|
|
|
|
wresize(win_b, 5, terminal_width/3); /*the div3 just looks cool*/
|
|
|
|
|
wresize(win_b, BTM_WINDOW_HEIGHT_ON_STR_INTERACTION, terminal_width/3); /*the div3 just looks cool*/
|
|
|
|
|
|
|
|
|
|
pthread_mutex_unlock(&mutex_btm);
|
|
|
|
|
render_pass();
|
|
|
|
|
pthread_mutex_lock(&mutex_btm);
|
|
|
|
|
btm_buffer = "create file: ";
|
|
|
|
|
|
|
|
|
|
unsigned long local_height;
|
|
|
|
|
local_height = getmaxy(win_b);
|
|
|
|
|
window_btm(win_b, 1);
|
|
|
|
|
|
|
|
|
|
char *str = malloc(INPUT_BUFFER_SIZE);
|
|
|
|
|
memset(str, ' ', INPUT_BUFFER_SIZE);
|
|
|
|
|
str[INPUT_BUFFER_SIZE-1] = '\0';
|
|
|
|
|
int err = read_string(win_b, BTM_WINDOW_HEIGHT_ON_STR_INTERACTION - 1, 0, str);
|
|
|
|
|
|
|
|
|
|
/* TODO(2025-07-03T01:19:49) fix fixed buffer size */
|
|
|
|
|
char *str = malloc(255);
|
|
|
|
|
memset(str, ' ', 255);
|
|
|
|
|
int err = read_string(win_b, local_height - 1, 0, str);
|
|
|
|
|
if (!err) {
|
|
|
|
|
btm_buffer = concat(btm_buffer, str);
|
|
|
|
|
FILE *fp;
|
|
|
|
|
@@ -543,8 +550,11 @@ void makefile(){
|
|
|
|
|
fclose(fp);
|
|
|
|
|
}
|
|
|
|
|
free(str);
|
|
|
|
|
pthread_mutex_unlock(&mutex_btm);
|
|
|
|
|
free(btm_buffer);
|
|
|
|
|
btm_buffer = btm_buffer_tmp;
|
|
|
|
|
|
|
|
|
|
status |= (STATUS_RUN_BACKEND | STATUS_UPDATE_SCREEN_MASK | STATUS_RELOAD_DIRECTORY | STATUS_UPDATE_SCREEN_RELOAD_FULL);
|
|
|
|
|
pthread_mutex_unlock(&mutex_btm);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void update(){
|
|
|
|
|
@@ -590,7 +600,7 @@ void jump_to_dir(unsigned long passes, int index){
|
|
|
|
|
ch = (char*)key_binding[index].black_magic;
|
|
|
|
|
if (*ch == '/') {
|
|
|
|
|
path = malloc(strlen((char*)key_binding[index].black_magic));
|
|
|
|
|
strcpy(path, (char*)key_binding[index].black_magic);
|
|
|
|
|
memcpy(path, (char*)key_binding[index].black_magic, strlen((char*)key_binding[index].black_magic)+1);
|
|
|
|
|
} else if (slash) {
|
|
|
|
|
env_str = malloc(env_len * sizeof(char));
|
|
|
|
|
memcpy(env_str, (char*)key_binding[index].black_magic +1, env_len);
|
|
|
|
|
@@ -600,16 +610,16 @@ void jump_to_dir(unsigned long passes, int index){
|
|
|
|
|
path = concat(env_parsed, (char*)key_binding[index].black_magic + env_len);
|
|
|
|
|
} else {
|
|
|
|
|
path = malloc(strlen((char*)key_binding[index].black_magic));
|
|
|
|
|
strcpy(path, (char*)key_binding[index].black_magic);
|
|
|
|
|
memcpy(path, (char*)key_binding[index].black_magic, strlen((char*)key_binding[index].black_magic)+1);
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
env_parsed = getenv((char*)key_binding[index].black_magic +1);
|
|
|
|
|
if (env_parsed) {
|
|
|
|
|
path = malloc(strlen(env_parsed)+1);
|
|
|
|
|
strcpy(path, env_parsed);
|
|
|
|
|
memcpy(path, env_parsed, strlen(env_parsed)+1);
|
|
|
|
|
} else {
|
|
|
|
|
path = malloc(strlen((char*)key_binding[index].black_magic));
|
|
|
|
|
strcpy(path, (char*)key_binding[index].black_magic);
|
|
|
|
|
memcpy(path, (char*)key_binding[index].black_magic, strlen((char*)key_binding[index].black_magic)+1);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if (chdir(path) != 0) {
|
|
|
|
|
@@ -642,6 +652,7 @@ void cmd_on_selected(unsigned long passes, int index){
|
|
|
|
|
(void)passes;
|
|
|
|
|
pthread_mutex_lock(&mutex_btm);
|
|
|
|
|
|
|
|
|
|
char *btm_buffer_tmp = btm_buffer;
|
|
|
|
|
unsigned int i = 0;
|
|
|
|
|
unsigned int hits = 0;
|
|
|
|
|
char *file_str = " ";
|
|
|
|
|
@@ -666,15 +677,11 @@ void cmd_on_selected(unsigned long passes, int index){
|
|
|
|
|
btm_buffer = concat(btm_buffer, "\n\n");
|
|
|
|
|
btm_buffer = concat(btm_buffer, "(y/N)");
|
|
|
|
|
|
|
|
|
|
status |= STATUS_UPDATE_SCREEN_0;
|
|
|
|
|
werase(win_b);
|
|
|
|
|
mvwin(win_b, terminal_height-6, 0);
|
|
|
|
|
wresize(win_b, 5, terminal_width/3); /*the div3 just looks cool*/
|
|
|
|
|
|
|
|
|
|
pthread_mutex_unlock(&mutex_btm);
|
|
|
|
|
render_pass();
|
|
|
|
|
pthread_mutex_lock(&mutex_btm);
|
|
|
|
|
wresize(win_b, BTM_WINDOW_HEIGHT_ON_STR_INTERACTION, terminal_width/3); /*the div3 just looks cool*/
|
|
|
|
|
|
|
|
|
|
window_btm(win_b, 1);
|
|
|
|
|
|
|
|
|
|
timeout(-1); /* negative numbers block until enter is pressed */
|
|
|
|
|
/* TODO(2025-07-06T07:22:49) fix fixed buffer size */
|
|
|
|
|
@@ -717,6 +724,8 @@ void cmd_on_selected(unsigned long passes, int index){
|
|
|
|
|
free(btm_buffer);
|
|
|
|
|
memcpy(btm_buffer, "cancled deletion", strlen("cancled deletion"));
|
|
|
|
|
}
|
|
|
|
|
free(btm_buffer);
|
|
|
|
|
btm_buffer = btm_buffer_tmp;
|
|
|
|
|
|
|
|
|
|
timeout(10);
|
|
|
|
|
status |= (STATUS_RUN_BACKEND | STATUS_UPDATE_SCREEN_MASK | STATUS_RELOAD_DIRECTORY | STATUS_UPDATE_SCREEN_RELOAD_FULL);
|
|
|
|
|
@@ -772,13 +781,13 @@ void yank_file(unsigned long passes, int index){
|
|
|
|
|
yank_files.count = 1;
|
|
|
|
|
yank_files.list = (char**)malloc(yank_files.count * sizeof(char*));
|
|
|
|
|
*yank_files.list = malloc(strlen(mid_content[selected_file_current].file_name)+1);
|
|
|
|
|
strcpy(*yank_files.list, mid_content[selected_file_current].file_name);
|
|
|
|
|
memcpy(*yank_files.list, mid_content[selected_file_current].file_name, strlen(mid_content[selected_file_current].file_name));
|
|
|
|
|
} else {
|
|
|
|
|
yank_files.list = malloc(yank_files.count * sizeof(char*));
|
|
|
|
|
for (i = 0; i < mid_file_count; i++) {
|
|
|
|
|
if (mid_content[i].status & FILE_STATUS_SELECTED) {
|
|
|
|
|
*yank_files.list = malloc(strlen(mid_content[i].file_name)+1);
|
|
|
|
|
strcpy(*yank_files.list, mid_content[i].file_name);
|
|
|
|
|
memcpy(*yank_files.list, mid_content[i].file_name, strlen(mid_content[i].file_name));
|
|
|
|
|
yank_files.list += 1;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
@@ -808,11 +817,11 @@ void paste(){
|
|
|
|
|
cmd = concat(cmd, " ./");
|
|
|
|
|
cmd = concat(cmd, *yank_files.list);
|
|
|
|
|
cmd = concat(cmd, " 2>&1");
|
|
|
|
|
char *line = malloc(255);
|
|
|
|
|
char *line = malloc(INPUT_BUFFER_SIZE);
|
|
|
|
|
FILE *cmd_open;
|
|
|
|
|
while (1) {
|
|
|
|
|
cmd_open = popen(cmd, "r");
|
|
|
|
|
if (fgets(line, 255, cmd_open) == 0) {
|
|
|
|
|
if (fgets(line, INPUT_BUFFER_SIZE, cmd_open) == 0) {
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
if (strstr(line, "are the same file")) {
|
|
|
|
|
@@ -844,11 +853,9 @@ void search(){
|
|
|
|
|
|
|
|
|
|
unsigned long local_height;
|
|
|
|
|
local_height = getmaxy(win_b);
|
|
|
|
|
memset(search_buffer, '\0', 255);
|
|
|
|
|
memset(search_buffer, '\0', INPUT_BUFFER_SIZE);
|
|
|
|
|
|
|
|
|
|
pthread_mutex_unlock(&mutex_btm);
|
|
|
|
|
render_pass();
|
|
|
|
|
pthread_mutex_lock(&mutex_btm);
|
|
|
|
|
window_btm(win_b, 1);
|
|
|
|
|
|
|
|
|
|
curs_set(1);
|
|
|
|
|
|
|
|
|
|
@@ -936,9 +943,9 @@ void search_previous(){
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
void jmp_file_index(){
|
|
|
|
|
char *index = malloc(255);
|
|
|
|
|
memset(index, ' ', 255);
|
|
|
|
|
index[254] = '\0';
|
|
|
|
|
char *index = malloc(INPUT_BUFFER_SIZE);
|
|
|
|
|
memset(index, ' ', INPUT_BUFFER_SIZE);
|
|
|
|
|
index[INPUT_BUFFER_SIZE-1] = '\0';
|
|
|
|
|
unsigned long local_height;
|
|
|
|
|
local_height = getmaxy(win_b);
|
|
|
|
|
read_string(win_b, local_height - 1, 0, index);
|
|
|
|
|
|