Compare commits

...

5 Commits

Author SHA1 Message Date
nova
f7c1d34e05 fixed a bug where files/directory names would occasionally just dissapear 2025-05-31 10:21:25 +02:00
nova
3d3052e436 swapped up and down 2025-05-31 00:40:40 +02:00
nova
0574732a69 very basic and no good file hover implemented 2025-05-31 00:36:05 +02:00
nova
2b52329904 improvenment of path handling 2025-05-30 23:35:37 +02:00
nova
bab921dea2 improvenments to the ui 2025-05-14 02:19:35 +02:00
4 changed files with 73 additions and 31 deletions

View File

@ -39,19 +39,29 @@ void get_dir_content(char *path, unsigned long *dir_file_count, file *dir_conten
scandir(path, &entry, skip_hidden_files, alphasort);
}
unsigned long i = 0;
for (i = 0; i < *dir_file_count; i++ ) {
if (entry[i]->d_name[0] == '.' && !(file_modifiers & FILE_MODIFIERS_HIDDEN_FILES)) {
} else {
dir_content[i].file_name_width = strlen(entry[i]->d_name);
dir_content[i].file_name = malloc(sizeof(entry[i]->d_name));
dir_content[i].file_name = entry[i]->d_name;
dir_content[i].file_name_width = sizeof(entry[i]->d_name) / sizeof(char);;
dir_content[i].file_name = malloc(dir_content[i].file_name_width * sizeof(char));
memcpy(dir_content[i].file_name, entry[i]->d_name, dir_content[i].file_name_width);
struct stat *file;
file = malloc(sizeof(struct stat));
memset(file, ' ', sizeof(struct stat));
lstat(dir_content[i].file_name, file);
/* using the full path allows using the same function for all windows */
unsigned long path_len = strlen(path);
char *full_path = malloc(strlen(path) + strlen(entry[i]->d_name) + 1 + sizeof("/"));
memcpy(full_path, path, strlen(path));
memcpy(full_path + path_len, "/", sizeof("/"));
memcpy(full_path + path_len + sizeof("/") - 1, entry[i]->d_name, strlen(entry[i]->d_name) + 1);
lstat(full_path, file);
free(full_path);
if (S_ISDIR(file->st_mode)) {
dir_content[i].file_type = FILE_TYPE_DIR;
@ -115,15 +125,20 @@ void get_dir_content(char *path, unsigned long *dir_file_count, file *dir_conten
void print_dir(WINDOW *win, unsigned long *dir_file_count, file *dir_content){
unsigned long i = 0;
unsigned int offset = 2;
if (*dir_file_count > 9) {
offset = (snprintf(NULL, 0, "%ld", *dir_file_count)) + 1;
}
for (i = 0; i < *dir_file_count; i++) {
wattron(win, COLOR_PAIR(dir_content[i].color_pair));
if (dir_content[i].status & FILE_STATUS_HOVER) {
wattron(win, A_REVERSE);
}
mvwprintw(win, i, 0, "%d", dir_content[i].color_pair);
mvwaddstr(win, i, 3,dir_content[i].file_name);
if (dir_content[i].status & FILE_STATUS_HOVER) {
mvwprintw(win, i, 0, "%ld", i);
mvwprintw(win, i, offset, "%s", dir_content[i].file_name);
wattroff(win, A_REVERSE);
} else {
mvwprintw(win, i, 0, "%ld", i);
mvwprintw(win, i, offset, "%s", dir_content[i].file_name);
}
wattroff(win, COLOR_PAIR(dir_content[i].color_pair));
}

View File

@ -1,10 +1,14 @@
#include <curses.h>
#include <pthread.h>
#include <dirent.h>
#include <unistd.h>
#include "defines.h"
extern unsigned int file_modifiers;
unsigned long selected_file_current;
unsigned long selected_file_last;
extern pthread_mutex_t mutex_selection;
void user_interactions(char *input, unsigned int *status, unsigned int *settings) {
if (*input == 'q') {
@ -23,7 +27,19 @@ void user_interactions(char *input, unsigned int *status, unsigned int *settings
} else if (*input == 'h') {
chdir("..");
*status |= (STATUS_RUN_BACKEND | STATUS_UPDATE_SCREEN_MASK);
} else if (*input == 't') {
pthread_mutex_lock(&mutex_selection);
/* capping the maximum file is done inside thread_mid */
selected_file_current++;
*status |= (STATUS_RUN_BACKEND | STATUS_UPDATE_SCREEN_MASK);
pthread_mutex_unlock(&mutex_selection);
} else if (*input == 'n') {
pthread_mutex_lock(&mutex_selection);
if (selected_file_current != 0) {
selected_file_current--;
}
*status |= (STATUS_RUN_BACKEND | STATUS_UPDATE_SCREEN_MASK);
pthread_mutex_unlock(&mutex_selection);
} else {
}
}

16
main.c
View File

@ -30,9 +30,9 @@ int main() {
getmaxyx(stdscr, terminal_height, terminal_width);
WINDOW *win_t = newwin(1, terminal_width, 0, 0);
WINDOW *win_b = newwin(1, terminal_width, terminal_height-1, 0);
WINDOW *win_l = newwin(terminal_height-2, terminal_width/3, 1, 0);
WINDOW *win_m = newwin(terminal_height-2, terminal_width/3, 1, (terminal_width/3));
WINDOW *win_r = newwin(terminal_height-2, terminal_width/3, 1, ((terminal_width/3)*2));
WINDOW *win_l = newwin(terminal_height-2, terminal_width/8, 1, 0);
WINDOW *win_m = newwin(terminal_height-2, terminal_width/3, 1, (terminal_width/8));
WINDOW *win_r = newwin(terminal_height-2, terminal_width/3, 1, ((terminal_width/2)));
pthread_t thread_b;
pthread_t thread_t;
@ -108,15 +108,15 @@ void render_pass(WINDOW *win_t, WINDOW *win_b, WINDOW *win_l, WINDOW *win_m, WIN
wresize(win_t, 1, terminal_width);
wresize(win_b, terminal_height, terminal_width/3);
wresize(win_m, terminal_height-2, terminal_width/3);
wresize(win_l, terminal_height-2, terminal_width/3);
wresize(win_r, terminal_height-2, terminal_width/3);
wresize(win_l, terminal_height-2, terminal_width/8);
wresize(win_m, terminal_height-2, (terminal_width/2)-(terminal_width/8));
wresize(win_r, terminal_height-2, terminal_width/2);
mvwin(win_t, 0, 0);
mvwin(win_b, terminal_height-1, 0);
mvwin(win_l, 1, 0);
mvwin(win_m, 1, (terminal_width/3));
mvwin(win_r, 1, ((terminal_width/3)*2));
mvwin(win_m, 1, (terminal_width/8));
mvwin(win_r, 1, ((terminal_width/2)));
status |= STATUS_UPDATE_SCREEN_0;

View File

@ -12,22 +12,24 @@ pthread_mutex_t mutex_btm;
pthread_mutex_t mutex_lft;
pthread_mutex_t mutex_mid;
pthread_mutex_t mutex_rgt;
pthread_mutex_t mutex_selection;
/* contains entire directory as 2d array
* may be changed in future to only include parts of the dir (currently includes entire dir) */
file *rgt_content;
file *mid_content;
file *lft_content;
char *top_content; /* current path */
unsigned long rgt_file_count;
unsigned long mid_file_count;
unsigned long lft_file_count;
unsigned long top_width;
extern unsigned int status;
extern unsigned long selected_file_current;
extern unsigned long selected_file_last;
void *thread_mid(void *data){
pthread_mutex_lock(&mutex_mid);
@ -48,6 +50,18 @@ void *thread_mid(void *data){
memset(mid_content, ' ', mid_file_count * sizeof(file));
get_dir_content(path, &mid_file_count, mid_content);
pthread_mutex_lock(&mutex_selection);
if (selected_file_current >= mid_file_count) {
selected_file_current = mid_file_count-1;
}
mid_content[selected_file_current].status = FILE_STATUS_HOVER;
if (selected_file_current != selected_file_last) {
mid_content[selected_file_last].status &= ~FILE_STATUS_HOVER;
}
selected_file_last = selected_file_current;
pthread_mutex_unlock(&mutex_selection);
}
free(path);
pthread_mutex_unlock(&mutex_mid);
@ -58,6 +72,7 @@ void *thread_lft(void *data){
free(lft_content);
char *path;
if((path=getcwd(NULL, 0)) == NULL) {
lft_content = malloc(sizeof(file));
@ -66,18 +81,13 @@ void *thread_lft(void *data){
lft_file_count = 1;
} else {
char *parent ;
if((parent = malloc(strlen(path)+strlen("/..")+1)) != NULL){
parent[0] = '\0'; /* ensures empty string */
strcat(parent, path);
strcat(parent, "/..");
}
path[strrchr(path, '/')-path] = '\0';
path[0] = '/';
lft_file_count = (unsigned long)get_dir_size(parent);
lft_file_count = (unsigned long)get_dir_size(path);
lft_content = malloc(lft_file_count * sizeof(file));
memset(lft_content, ' ', lft_file_count * sizeof(file));
get_dir_content(parent, &lft_file_count, lft_content);
free(parent);
get_dir_content(path, &lft_file_count, lft_content);
}
free(path);
@ -121,11 +131,12 @@ void threading_init(){
top_content = malloc(sizeof(char));
pthread_mutex_init(&mutex_top, NULL);
pthread_mutex_init(&mutex_mid, NULL);
pthread_mutex_init(&mutex_lft, NULL);
pthread_mutex_init(&mutex_selection, NULL);
selected_file_current = 0;
selected_file_last = 0;
}
void threading_free(){
free(rgt_content);