diff -urN cui82/cui.c cui83/cui.c --- cui82/cui.c Thu Mar 27 22:10:00 2014 +++ cui83/cui.c Thu Mar 27 23:00:00 2014 @@ -448,6 +448,55 @@ return FD_ISSET(fd, &res_rfs); } +typedef struct cui_readable_list *cui_readable_list; + +struct cui_readable_list{ + cui obj; + int fd; + cui_readable_list next; +}; + +cui_readable_list readable_list = NULL; + +void +cui_readable_add(cui obj, int fd) +{ + cui_readable_list p; + + if((p = malloc(sizeof(struct cui_readable_list))) == NULL) ERR("No Mem"); + p->obj = obj; + p->fd = fd; + p->next = readable_list; + readable_list = p; +} + +void +cui_readable_del(cui obj, int fd) +{ + cui_readable_list p = readable_list, *prev = &readable_list; + for(; p; prev=&p->next, p=p->next) if(p->obj == obj && p->fd == fd) break; + if(p == NULL) return; + *prev = p->next; + free(p); +} + +void +cui_readable_add_bind(cui obj, int fd, cui_handler hdr, void *prm) +{ + cui_bind(obj, CUI_EVT_READABLE, hdr, prm); + cui_readable_add(obj, fd); +} + +static void +cui_readable_work(void) +{ + cui_readable_list p = readable_list; + for(; p; p=p->next){ + if(!cui_select_chk(p->fd)) continue; + cui_handler_call(p->obj, CUI_EVT_READABLE, p->fd); + } +} + void cui_main(cui top_obj, cui init_focus) { @@ -474,9 +523,7 @@ while(cui_running_get()){ cui_timer_work(); if(cui_select() <= 0) continue; - - // ... - + cui_readable_work(); if(!cui_select_chk(KEY_FD)) continue; if((key = cui_key_get2()) == 0) continue; focus = cui_focus_get(); diff -urN cui82/cui.h cui83/cui.h --- cui82/cui.h Thu Mar 27 22:00:00 2014 +++ cui83/cui.h Thu Mar 27 23:00:00 2014 @@ -18,6 +18,7 @@ #define CUI_EVT_BUTTON (1<<2) #define CUI_EVT_RESIZE (1<<3) #define CUI_EVT_TIMER (1<<4) +#define CUI_EVT_READABLE (1<<5) #define CUI_FLG_CAN_FOCUS (1<<0) #define CUI_FLG_HIDE (1<<1) @@ -26,6 +27,7 @@ #define CUI_ATTR_ULINE (1<<0) #define CUI_ATTR_REVERSE (1<<1) +typedef int (*cui_handler)(cui obj, int evt, int val, void *prm); typedef struct cui_handler_list *cui_handler_list; #include "rect.h" @@ -85,6 +87,10 @@ void cui_focus_chk(void); int cui_running_get(void); void cui_running_set(int v); + +void cui_readable_add(cui obj, int fd); +void cui_readable_del(cui obj, int fd); +void cui_readable_add_bind(cui obj, int fd, cui_handler hdr, void *prm); void cui_quit(void); void cui_main(cui top_obj, cui init_focus); diff -urN cui82/cui_test.c cui83/cui_test.c --- cui82/cui_test.c Thu Mar 27 22:00:00 2014 +++ cui83/cui_test.c Thu Mar 27 23:00:00 2014 @@ -475,12 +475,9 @@ strcpy(lb_timer1_buf, "0"); cui_label_str_set(lb_timer1, lb_timer1_buf); - cui_bind(lb_timer1, CUI_EVT_TIMER, lb_timer_hdr, lb_timer1_buf); - cui_bind(lb_timer2, CUI_EVT_TIMER, lb_timer_hdr, NULL); - cui_bind(lb_timer3, CUI_EVT_TIMER, lb_timer_hdr, NULL); - cui_timer_set(lb_timer1, 1000, 0); - cui_timer_set(lb_timer2, 200, 0); - cui_timer_set(lb_timer3, 10*1000, 1); + cui_timer_set_bind(lb_timer1, 1000, 0, lb_timer_hdr, lb_timer1_buf); + cui_timer_set_bind(lb_timer2, 200, 0, lb_timer_hdr, NULL); + cui_timer_set_bind(lb_timer3, 10*1000, 1, lb_timer_hdr, NULL); cui_tab_new(bs, 1, 1, -1, (char *[]){"foo", "bar", "hoge", "term", "timer", NULL}, tab_sheets, 0); diff -urN cui82/handler.h cui83/handler.h --- cui82/handler.h Sat Feb 1 02:00:00 2014 +++ cui83/handler.h Thu Mar 27 23:00:00 2014 @@ -3,8 +3,6 @@ #include "cui.h" -typedef int (*cui_handler)(cui obj, int evt, int val, void *prm); - struct cui_handler_list{ cui_handler hdr; int evt; diff -urN cui82/timer.c cui83/timer.c --- cui82/timer.c Thu Mar 27 22:00:00 2014 +++ cui83/timer.c Thu Mar 27 23:00:00 2014 @@ -83,4 +83,11 @@ } } +void +cui_timer_set_bind(cui obj, int msec, int once, cui_handler hdr, void *prm) +{ + cui_bind(obj, CUI_EVT_TIMER, hdr, prm); + cui_timer_set(obj, msec, once); +} + /* EOF */ diff -urN cui82/timer.h cui83/timer.h --- cui82/timer.h Thu Mar 27 22:00:00 2014 +++ cui83/timer.h Thu Mar 27 23:00:00 2014 @@ -16,5 +16,6 @@ void cui_timer_set(cui obj, int msec, int once); int cui_timer_now_msec(void); void cui_timer_work(void); +void cui_timer_set_bind(cui obj, int msec, int once, cui_handler hdr, void *prm); #endif