#define _POSIX_C_SOURCE 200809L #include #include #include #include #include #include "threading.h" #include "window.h" #include "defines.h" #include "colors.h" #include "interactions.h" unsigned int terminal_height; unsigned int terminal_width; unsigned int temp_heigth = 0; /*used for screen refresh*/ unsigned int temp_width = 0; unsigned int settings; unsigned int file_modifiers; unsigned int status; WINDOW *win_t; WINDOW *win_b; WINDOW *win_l; WINDOW *win_m; WINDOW *win_r; char *input; /*used in user_interactions*/ void render_pass(); void init(); int main(){ init(); getmaxyx(stdscr, terminal_height, terminal_width); WINDOW *wint = newwin(1, terminal_width, 0, 0); WINDOW *winb = newwin(1, terminal_width, terminal_height-1, 0); WINDOW *winl = newwin(terminal_height-2, terminal_width/8, 1, 0); WINDOW *winm = newwin(terminal_height-2, terminal_width/3, 1, (terminal_width/8)); WINDOW *winr = newwin(terminal_height-2, terminal_width/3, 1, ((terminal_width/2))); win_t = wint; win_b = winb; win_r = winr; win_m = winm; win_l = winl; pthread_t thread_b; pthread_t thread_t; pthread_t thread_l; pthread_t thread_m; pthread_t thread_r; char threading = 0; while(!(status & STATUS_QUIT_PROGRAM)){ getmaxyx(stdscr, terminal_height, terminal_width); if (!(terminal_height == temp_heigth) || !(terminal_width == temp_width)) { status |= (STATUS_RUN_BACKEND | STATUS_UPDATE_SCREEN_RESIZE); temp_width = terminal_width; temp_heigth = terminal_height; } if (status & STATUS_RUN_BACKEND) { if (threading) { pthread_cancel(thread_t); pthread_cancel(thread_l); pthread_cancel(thread_m); pthread_cancel(thread_r); pthread_cancel(thread_b); threading = 0; } pthread_create(&thread_t, NULL, thread_top, win_t); /*top bar*/ pthread_create(&thread_l, NULL, thread_lft, win_l); /*current_content slash win_m*/ pthread_create(&thread_m, NULL, thread_mid, win_m); /*parent_content slash win_l*/ pthread_create(&thread_r, NULL, thread_rgt, win_r); /*child_content slash win_r*/ pthread_create(&thread_b, NULL, thread_btm, win_b); /*bottom bar*/ threading = 1; status &= ~(STATUS_RUN_BACKEND | STATUS_RELOAD_DIRECTORY); status |= STATUS_UPDATE_SCREEN_0; } user_interactions(); render_pass(); } /* threading_free(); pthread_join(thread_l, NULL); pthread_join(thread_r, NULL); pthread_join(thread_m, NULL); pthread_join(thread_t, NULL); pthread_join(thread_b, NULL); */ delwin(win_l); delwin(win_m); delwin(win_r); delwin(win_t); delwin(win_b); endwin(); noraw(); curs_set(1); echo(); return 0; } void render_pass(){ if (status & STATUS_UPDATE_SCREEN_RESIZE) { if (status & STATUS_UPDATE_SCREEN_RELOAD_FULL) { clear(); status &= ~STATUS_UPDATE_SCREEN_RELOAD_FULL; } /*TODO: check if deallocation of window and reallocation is faster than this or not */ werase(win_t); werase(win_b); werase(win_l); werase(win_m); werase(win_r); wresize(win_t, 1, terminal_width); 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); wresize(win_b, 1, terminal_width); mvwin(win_t, 0, 0); mvwin(win_l, 1, 0); mvwin(win_m, 1, (terminal_width/8)); mvwin(win_r, 1, ((terminal_width/2))); mvwin(win_b, terminal_height-1, 0); status |= STATUS_UPDATE_SCREEN_0; } if (status & STATUS_UPDATE_SCREEN_MASK) { status &= ~(STATUS_UPDATE_SCREEN_MASK); window_top(win_t); window_lft(win_l); window_mid(win_m); window_rgt(win_r); window_btm(win_b); wrefresh(win_t); wrefresh(win_l); wrefresh(win_m); wrefresh(win_r); wrefresh(win_b); } } /*this function exists for things done at startup (initialization, reading config, etc)*/ void init() { initscr(); /* start ncurses */ noecho(); /* hide keyboard input */ timeout(0); /* blocking timeout of getch() */ keypad(stdscr, TRUE); curs_set(0); /*file_modifiers = (FILE_MODIFIERS_HIDDEN_FILES | FILE_MODIFIERS_SORT_BITMASK);*/ input = malloc(sizeof(char)*255); /* size of input buffer, out of bounds access will not be accounted for */ memset(input, 0, 255); status = (STATUS_RUN_BACKEND | STATUS_UPDATE_SCREEN_MASK | STATUS_RELOAD_DIRECTORY); if (getuid() == 0) { status += STATUS_USER_ROOT; } threading_init(); /* found in threading.c */ colors_init(); ESCDELAY = 10; }