diff -urN cui79/Makefile cui80/Makefile --- cui79/Makefile Tue Mar 25 22:00:00 2014 +++ cui80/Makefile Thu Mar 27 01:00:00 2014 @@ -1,7 +1,7 @@ CC = gcc -Wall TARG = cui_test -OBJS = cui.o focus.o etext.o menu.o dialog.o term.o scpanel.o tbar.o rszbox.o scbar.o fillbtn.o tab.o radio.o ckbox.o button.o lblfix.o fill.o label.o panel.o handler.o esc.o key.o rect.o +OBJS = cui.o focus.o etext.o menu.o dialog.o timer.o term.o scpanel.o tbar.o rszbox.o scbar.o fillbtn.o tab.o radio.o ckbox.o button.o lblfix.o fill.o label.o panel.o handler.o esc.o key.o rect.o all: $(TARG) diff -urN cui79/cui.c cui80/cui.c --- cui79/cui.c Wed Mar 26 22:00:00 2014 +++ cui80/cui.c Thu Mar 27 01:00:00 2014 @@ -7,6 +7,7 @@ #include "panel.h" #include "label.h" #include "button.h" +#include "timer.h" #include #include #include @@ -17,6 +18,7 @@ struct cui_main_stack{ cui focus; int running; + void *timer_list; cui_main_stack prev; }; @@ -54,6 +56,12 @@ if(main_stack) main_stack->running = v; } +void * +cui_timer_list_ptr_get(void) +{ + return main_stack ? &main_stack->timer_list : NULL; +} + cui cui_alloc(int size) { @@ -404,7 +412,7 @@ } void -cui_main(cui top_obj, cui init_focus) +cui_main(cui top_obj, cui init_focus, void *timer_list) { struct cui_main_stack stk; cui_main_stack sp = (cui_main_stack)&stk; @@ -414,6 +422,7 @@ sp->focus = init_focus; sp->running = TRUE; + sp->timer_list = timer_list; sp->prev = main_stack; main_stack = sp; @@ -423,6 +432,7 @@ cui_clear(top_obj); cui_draw(top_obj); while(cui_running_get()){ + cui_timer_work(&sp->timer_list); if((key = cui_key_get2()) == 0) continue; focus = cui_focus_get(); if(focus){ diff -urN cui79/cui.h cui80/cui.h --- cui79/cui.h Mon Feb 10 01:00:00 2014 +++ cui80/cui.h Thu Mar 27 01:00:00 2014 @@ -17,6 +17,7 @@ #define CUI_EVT_DRAW (1<<1) #define CUI_EVT_BUTTON (1<<2) #define CUI_EVT_RESIZE (1<<3) +#define CUI_EVT_TIMER (1<<4) #define CUI_FLG_CAN_FOCUS (1<<0) #define CUI_FLG_HIDE (1<<1) @@ -84,9 +85,10 @@ void cui_focus_chk(void); int cui_running_get(void); void cui_running_set(int v); +void *cui_timer_list_ptr_get(void); void cui_quit(void); -void cui_main(cui top_obj, cui init_focus); +void cui_main(cui top_obj, cui init_focus, void *timer_list); void cui_del(cui obj); void cui_free_chain(cui obj); void cui_free(cui obj); diff -urN cui79/cui_test.c cui80/cui_test.c --- cui79/cui_test.c Wed Mar 26 23:00:00 2014 +++ cui80/cui_test.c Thu Mar 27 01:00:00 2014 @@ -1,4 +1,5 @@ #include +#include #include #include #include "cui.h" @@ -16,6 +17,7 @@ #include "scbar.h" #include "scpanel.h" #include "term.h" +#include "timer.h" int joke_hdr(cui obj, int evt, int val, void *prm) @@ -61,7 +63,7 @@ cui_button_str_set(p->btn2, "No"); cui_unbind(obj, CUI_EVT_BUTTON, my_hdr); joke = joke_new(((cui)p)->parent->parent->parent, 0, 4); - cui_main(joke, joke->children->next); + cui_main(joke, joke->children->next, NULL); cui_del(joke); cui_free(joke); return TRUE; @@ -143,7 +145,7 @@ if(menu){ /* menu_btn */ cui_show(menu); - cui_main(menu, cui_index_to_child(menu, 0)); + cui_main(menu, cui_index_to_child(menu, 0), NULL); cui_hide(menu); cui_draw(menu->parent); return TRUE; @@ -229,7 +231,7 @@ cui_bind(menu, CUI_EVT_BUTTON, mn_hdr, prm); menu->flags &= ~CUI_FLG_HIDE; - cui_main(menu, cui_menu_str_to_item(menu, "Open")); + cui_main(menu, cui_menu_str_to_item(menu, "Open"), NULL); cui_hide(menu); cui_draw(menu->parent); cui_del(menu); @@ -385,6 +387,28 @@ } int +lb_timer_hdr(cui obj, int evt, int val, void *prm) +{ + /* CUI_EVT_TIMER */ + + char *buf = (char *)prm; + static char *ss[] = { "foo", "bar", "hoge", "fuga", NULL }; + char *s = cui_label_str_get(obj); + int i; + if(buf){ + int cnt = strtol(buf, NULL, 0); + sprintf(buf, "%d", cnt+1); + cui_label_str_set(obj, buf); + return TRUE; + } + for(i=0; ss[i]; i++) if(strcmp(s, ss[i]) == 0) break; + if(ss[i]) i++; + if(ss[i] == NULL) i = 0; + cui_label_str_set(obj, ss[i]); + return TRUE; +} + +int main() { cui bs = cui_scpanel_new(NULL, 0, 0, 42, 23, "cui_test"); @@ -398,6 +422,10 @@ cui bs_term = cui_base_new(bs, 1, 2, 0, 0); cui btn_term = cui_button_new(bs_term, 0, 1, "test"); cui term = cui_term_new(bs_term, 0, 2, 30, 15); + cui bs_timer = cui_base_new(bs, 1, 2, 0, 0); + cui lb_timer1 = cui_label_new(bs_timer, 0, 1, "0 "); + cui lb_timer2 = cui_label_new(bs_timer, 10, 1, "not yet"); + cui lb_timer3 = cui_label_new(bs_timer, 10, 2, "not yet"); cui base = cui_base_new(bs, 1, 2, 40, 20); cui mn_btn = cui_menu_btn_new(base, 1, 1, "File"); cui etx = cui_etext_new(base, mn_btn->x, cui_y2(mn_btn), 8, "foo"); @@ -409,7 +437,10 @@ cui small = cui_scpanel_new(base, 2, 3, base->w - (2 * 2), base->h - (3 + 1), "title"); cui small2 = cui_scpanel_sheet_get(small); - cui tab_sheets[] = { base, bs_bar, sc_hoge, bs_term }; + cui tab_sheets[] = { base, bs_bar, sc_hoge, bs_term, bs_timer }; + + void *timer_list = NULL; + char lb_timer1_buf[16]; big_new(small2, 0, 0, &p); cui_wh_fit(small2); @@ -440,9 +471,21 @@ cui_rszbox_new(bs_term); cui_bind(bs_term, CUI_EVT_RESIZE, bs_term_hdr, term); - cui_tab_new(bs, 1, 1, -1, (char *[]){"foo", "bar", "hoge", "term", NULL}, tab_sheets, 0); + cui_hide(bs_timer); + cui_wh_fit(bs_timer); + + 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, &timer_list); + cui_timer_set(lb_timer2, 200, 0, &timer_list); + cui_timer_set(lb_timer3, 10*1000, 1, &timer_list); + + cui_tab_new(bs, 1, 1, -1, (char *[]){"foo", "bar", "hoge", "term", "timer", NULL}, tab_sheets, 0); - cui_main(bs, NULL); + cui_main(bs, NULL, timer_list); printf("result %s\n", p->btn_result); cui_free(bs); return 0; diff -urN cui79/menu.c cui80/menu.c --- cui79/menu.c Sun Feb 9 00:00:00 2014 +++ cui80/menu.c Thu Mar 27 01:00:00 2014 @@ -198,7 +198,7 @@ menu->x = cui_lx(cui_root(obj), cui_gx(obj)); menu->y = cui_ly(cui_root(obj), cui_gy(obj)) - p->val; menu->flags &= ~CUI_FLG_HIDE; - cui_main(menu, cui_index_to_child(menu, p->val)); + cui_main(menu, cui_index_to_child(menu, p->val), NULL); cui_hide(menu); if(p->val < 0) p->val = bak; else{ diff -urN cui79/timer.c cui80/timer.c --- cui79/timer.c Thu Jan 1 09:00:00 1970 +++ cui80/timer.c Thu Mar 27 01:00:00 2014 @@ -0,0 +1,90 @@ +#include "timer.h" +#include "handler.h" +#include +#include +#include + +static cui_timer_list +cui_timer_search(cui obj, cui_timer_list **ret_prev, void *timer_list_ptr) +{ + cui_timer_list *lp = (cui_timer_list *)timer_list_ptr; + cui_timer_list p, *prev = lp; + + for(p=*prev; p; prev=&p->next, p=p->next){ + if(p->obj == obj){ + if(ret_prev) *ret_prev = prev; + return p; + } + } + return NULL; +} + +int +cui_timer_now_msec(void) +{ + struct timeval tm; + gettimeofday(&tm, NULL); + return tm.tv_sec * 1000 + tm.tv_usec / 1000; +} + +static void +cui_timer_init(cui_timer_list p, cui obj, int msec, int once, cui_timer_list next) +{ + p->obj = obj; + p->msec = msec; + p->once = once; + p->next = next; + p->targ_msec = cui_timer_now_msec() + msec; +} + +static cui_timer_list +cui_timer_new(cui obj, int msec, int once, cui_timer_list next) +{ + cui_timer_list p; + if((p = malloc(sizeof(struct cui_timer_list))) == NULL) ERR("No Mem"); + cui_timer_init(p, obj, msec, once, next); + return p; +} + +static void +cui_timer_del(cui obj, void *timer_list_ptr) +{ + cui_timer_list *prev, p = cui_timer_search(obj, &prev, timer_list_ptr); + if(p == NULL) return; + *prev = p->next; + free(p); +} + +void +cui_timer_set(cui obj, int msec, int once, void *timer_list_ptr) +{ + cui_timer_list *lp = (cui_timer_list *)timer_list_ptr; + cui_timer_list *prev, p = cui_timer_search(obj, &prev, timer_list_ptr); + if(p == NULL){ + if(lp == NULL) lp = (cui_timer_list *)cui_timer_list_ptr_get(); + if(lp) *lp = cui_timer_new(obj, msec, once, *lp); + return; + } + if(msec >= 0){ + cui_timer_init(p, obj, msec, once, p->next); + return; + } + cui_timer_del(obj, timer_list_ptr); +} + +void +cui_timer_work(void *timer_list_ptr) +{ + int msec; + + cui_timer_list p = *(cui_timer_list *)timer_list_ptr; + for(; p; p=p->next){ + msec = cui_timer_now_msec(); + if(msec < p->targ_msec) continue; + cui_handler_call(p->obj, CUI_EVT_TIMER, msec); + if(p->once) cui_timer_del(p->obj, timer_list_ptr); + else p->targ_msec += p->msec; + } +} + +/* EOF */ diff -urN cui79/timer.h cui80/timer.h --- cui79/timer.h Thu Jan 1 09:00:00 1970 +++ cui80/timer.h Thu Mar 27 01:00:00 2014 @@ -0,0 +1,20 @@ +#ifndef __TIMER_H__ +#define __TIMER_H__ + +#include "cui.h" + +typedef struct cui_timer_list *cui_timer_list; + +struct cui_timer_list{ + cui obj; + int msec; + int once; + int targ_msec; + cui_timer_list next; +}; + +void cui_timer_set(cui obj, int msec, int once, void *timer_list_ptr); +int cui_timer_now_msec(void); +void cui_timer_work(void *timer_list_ptr); + +#endif