]> git.mdlowis.com Git - archive/afm.git/commitdiff
Busticated input handling. DO NOT RUN THIS. It will make your terminal very sad :(
authorMichael D. Lowis <mike@mdlowis.com>
Fri, 25 Jul 2014 11:14:19 +0000 (07:14 -0400)
committerMichael D. Lowis <mike@mdlowis.com>
Fri, 25 Jul 2014 11:14:19 +0000 (07:14 -0400)
source/input.c
source/input.h
source/main.c
source/screen.c

index c615c97524751ca9fbd849060439fbced7cd5115..520cbe36d1f2b2f1678af7436f0c70d9c5bfbf5b 100644 (file)
@@ -2,25 +2,83 @@
 #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);
 }
+
index 75c96ab658ac38aac24a8a7d2cef3cf3a8da259b..530215c1dd612b8df917cc9e721f2fc797152919 100644 (file)
@@ -7,6 +7,8 @@
 #ifndef INPUT_H
 #define INPUT_H
 
+void input_init(void);
+
 void input_handle_key(char ch);
 
 #endif /* INPUT_H */
index c745e51e1d0b935ffa8dee337ef7576cecd4a55b..4bb3dcdf83e33ccfada3f0de72114d50979db052 100644 (file)
 #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;
 }
 
index b0896a70a1dabf9c07a054dbe3b805d17102339a..26206de491103ffde7317f5cb4c72ae8ba5a3b3f 100644 (file)
@@ -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;
-       }
+    }
 }