#include "state.h"
#include "workdir.h"
#include "screen.h"
+#include <stdlib.h>
+
+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);
}
+
#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();
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;
}
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) {
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();
}
}
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);
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;
}
}
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;
- }
+ }
}