From: Michael D. Lowis Date: Fri, 25 Jul 2014 11:14:19 +0000 (-0400) Subject: Busticated input handling. DO NOT RUN THIS. It will make your terminal very sad :( X-Git-Url: https://git.mdlowis.com/?a=commitdiff_plain;h=ce949696e2221fe975943440639aebf53718958a;p=archive%2Fafm.git Busticated input handling. DO NOT RUN THIS. It will make your terminal very sad :( --- diff --git a/source/input.c b/source/input.c index c615c97..520cbe3 100644 --- a/source/input.c +++ b/source/input.c @@ -2,25 +2,83 @@ #include "state.h" #include "workdir.h" #include "screen.h" +#include + +static vec_t* States; +static vec_t* Curr_State; + +typedef void (*key_cb_t)(void); + +typedef struct { + char* sequence; + key_cb_t callback; +} binding_t; + +static void handle_aardvark(void) { + state_set_aardvark_mode(!state_get_aardvark_mode()); +} + +static void handle_quit(void) { + state_set_running(false); +} + +static void handle_next(void) { + workdir_next(state_get_focused_frame()->workdir); +} + +static void handle_prev(void) { + workdir_prev(state_get_focused_frame()->workdir); +} + +static void handle_cd(void) { + workdir_cd(state_get_focused_frame()->workdir); +} + +binding_t Default_Bindings[] = { + { "a", &handle_aardvark }, + { "q", &handle_quit }, + { "j", &handle_next }, + { "k", &handle_prev }, + { "\n", &handle_cd }, + { "wn", &screen_open }, + { "wc", &screen_open }, +}; + +void input_init(void) { + size_t num_entries = (sizeof(Default_Bindings) / sizeof(binding_t)); + for(int i = 0; i < num_entries; i++) { + input_add_binding(Default_Bindings[i].sequence, Default_Bindings[i].callback); + } + exit(0); +} void input_handle_key(char ch) { - /* Assume screen is dirty by default */ - bool is_screen_dirty = true; - switch(ch){ - case 'a': state_set_aardvark_mode(!state_get_aardvark_mode()); - break; - case 'q': state_set_running(false); - break; - case 'j': workdir_next(state_get_focused_frame()->workdir); break; - case 'k': workdir_prev(state_get_focused_frame()->workdir); break; - case 'e': workdir_cd(state_get_focused_frame()->workdir); break; - case 'n': screen_open(); - break; - case 'c': screen_close(); - break; - default: is_screen_dirty = false; - break; + ///* Assume screen is dirty by default */ + //bool is_screen_dirty = true; + //switch(ch){ + // case 'a': state_set_aardvark_mode(!state_get_aardvark_mode()); + // break; + // case 'q': state_set_running(false); + // break; + // case 'j': workdir_next(state_get_focused_frame()->workdir); break; + // case 'k': workdir_prev(state_get_focused_frame()->workdir); break; + // case 'e': workdir_cd(state_get_focused_frame()->workdir); break; + // case 'n': screen_open(); + // break; + // case 'c': screen_close(); + // break; + // default: is_screen_dirty = false; + // break; + //} + ///* Update the screen if we need to */ + //state_set_screen_dirty(state_get_screen_dirty() || is_screen_dirty); +} + +void input_add_binding(char* seq, key_cb_t p_cb_fn) { + vec_t* p_state = States; + size_t len = strlen(seq); + for(int i = 0; i < len; i++) { + key_t* p_key = input_lookup_or_add(p_state, seq[i]); } - /* Update the screen if we need to */ - state_set_screen_dirty(state_get_screen_dirty() || is_screen_dirty); } + diff --git a/source/input.h b/source/input.h index 75c96ab..530215c 100644 --- a/source/input.h +++ b/source/input.h @@ -7,6 +7,8 @@ #ifndef INPUT_H #define INPUT_H +void input_init(void); + void input_handle_key(char ch); #endif /* INPUT_H */ diff --git a/source/main.c b/source/main.c index c745e51..4bb3dcd 100644 --- a/source/main.c +++ b/source/main.c @@ -13,14 +13,14 @@ #include "workdir.h" void handle_signal(int sig) { - signal(SIGWINCH, handle_signal); + //signal(SIGWINCH, handle_signal); state_set_screen_dirty(true); state_set_screen_resized(true); } int main(int argc, char** argv) { /* Handle terminal resizing */ - signal(SIGWINCH, handle_signal); + //signal(SIGWINCH, handle_signal); /* Initialize ncurses and user input settings */ initscr(); raw(); @@ -28,15 +28,16 @@ int main(int argc, char** argv) { noecho(); timeout(25); refresh(); - screen_init(); + //screen_init(); + input_init(); while(state_get_running()) { - if(state_get_screen_dirty()) screen_update(); + //if(state_get_screen_dirty()) screen_update(); input_handle_key(getch()); } erase(); refresh(); endwin(); - screen_deinit(); + //screen_deinit(); return 0; } diff --git a/source/screen.c b/source/screen.c index b0896a7..26206de 100644 --- a/source/screen.c +++ b/source/screen.c @@ -20,15 +20,16 @@ static void screen_frame_free(void* p_frame); void screen_frame_draw_files(frame_t* frame); static list_t* Screen_List; +static frame_t* Focused_Frame; -frame_t* master_frame(void){ - return (frame_t*) Screen_List->head->contents; +static frame_t* master_frame(void){ + return (frame_t*) Screen_List->head->contents; } void screen_init(void) { Screen_List = list_new(); list_push_back(Screen_List, screen_frame_new()); - state_set_focused_frame(master_frame()); + Focused_Frame = master_frame(); } void screen_deinit(void) { @@ -57,7 +58,7 @@ void screen_close(void) { int num_frames = list_size(Screen_List); if(num_frames > 1){ list_delete(Screen_List, 0); - state_set_focused_frame(master_frame()); + Focused_Frame = master_frame(); } } @@ -90,7 +91,7 @@ static void screen_place_windows(void) { mvwin(p_frame->p_win, pos, cols/2); wresize(p_frame->p_win, height, cols/2); wclear(p_frame->p_win); - screen_frame_draw_files(p_frame); + screen_frame_draw_files(p_frame); wmove(p_frame->p_win, 1, 1); box(p_frame->p_win, 0 , 0); wrefresh(p_frame->p_win); @@ -104,7 +105,7 @@ static void screen_place_windows(void) { static frame_t* screen_frame_new(void) { frame_t* p_frame = (frame_t*)mem_allocate(sizeof(frame_t),&screen_frame_free); p_frame->p_win = newwin(1, 1, 0, 0); - char* path = state_get_focused_frame() ? state_get_focused_frame()->workdir->path : get_current_dir_name(); + char* path = Focused_Frame->workdir->path; p_frame->workdir = workdir_new(path); return p_frame; } @@ -118,27 +119,27 @@ static void screen_frame_free(void* p_frame_ptr) { } void screen_frame_draw_files(frame_t* frame){ - int i = frame->workdir->top_index; - int rows, cols; - getmaxyx(frame->p_win, rows, cols); - //draw path - wattron(frame->p_win, A_UNDERLINE); - mvwaddnstr(frame->p_win, 1, 1, frame->workdir->path, cols-2); - wattroff(frame->p_win, A_UNDERLINE); - //list files - while (i < vec_size(frame->workdir->vfiles)){ - if(frame == state_get_focused_frame() && i == frame->workdir->idx){ - wattron(frame->p_win, A_STANDOUT); - wattron(frame->p_win, A_BOLD); - } + int i = frame->workdir->top_index; + int rows, cols; + getmaxyx(frame->p_win, rows, cols); + //draw path + wattron(frame->p_win, A_UNDERLINE); + mvwaddnstr(frame->p_win, 1, 1, frame->workdir->path, cols-2); + wattroff(frame->p_win, A_UNDERLINE); + //list files + while (i < vec_size(frame->workdir->vfiles)){ + if(frame == Focused_Frame && i == frame->workdir->idx){ + wattron(frame->p_win, A_STANDOUT); + wattron(frame->p_win, A_BOLD); + } mvwaddnstr(frame->p_win, FrameTopBuffer+i-frame->workdir->top_index, 1, vec_at(frame->workdir->vfiles, i), cols-2); - if(frame == state_get_focused_frame() && i == frame->workdir->idx){ - wattroff(frame->p_win, A_STANDOUT); - wattroff(frame->p_win, A_BOLD); - } - i++; + if(frame == Focused_Frame && i == frame->workdir->idx){ + wattroff(frame->p_win, A_STANDOUT); + wattroff(frame->p_win, A_BOLD); + } + i++; if((FrameTopBuffer+i-frame->workdir->top_index+FrameBotBuffer) > rows) break; - } + } }