diff -urN cui9/cui.c cui10/cui.c --- cui9/cui.c Thu Jan 30 04:30:00 2014 +++ cui10/cui.c Thu Jan 30 04:40:00 2014 @@ -40,6 +40,15 @@ obj->children = child; } +void +cui_draw_str(cui obj, int x, int y, char *s, int attr) +{ + cui_esc_loc(cui_gx(obj) + x, cui_gy(obj) + y); + cui_esc_attr(attr); + printf("%s", s); + fflush(stdout); +} + cui cui_panel_new(cui parent, int x, int y, int w, int h) { @@ -48,10 +57,36 @@ return obj; } +int +cui_panel_hdr(cui obj, int evt, int val, void *prm) +{ + int x, y; + + for(y=0; yh; y++){ + for(x=0; xw; x++){ + cui_draw_str(obj, x, y, " ", CUI_ESC_NORMAL); + } + } + for(x=1; xw-1; x++){ + cui_draw_str(obj, x, 0, "-", CUI_ESC_NORMAL); + cui_draw_str(obj, x, obj->h-1, "-", CUI_ESC_NORMAL); + } + for(y=1; yh-1; y++){ + cui_draw_str(obj, 0, y, "|", CUI_ESC_NORMAL); + cui_draw_str(obj, obj->w-1, y, "|", CUI_ESC_NORMAL); + } + cui_draw_str(obj, 0, 0, "+", CUI_ESC_NORMAL); + cui_draw_str(obj, obj->w-1, 0, "+", CUI_ESC_NORMAL); + cui_draw_str(obj, obj->w-1, obj->h-1, "+", CUI_ESC_NORMAL); + cui_draw_str(obj, 0, obj->h-1, "+", CUI_ESC_NORMAL); + return TRUE; +} + void cui_panel_init(cui obj, cui parent, int x, int y, int w, int h) { cui_base_init(obj, parent, x, y, w, h); + cui_bind(obj, CUI_EVT_DRAW, cui_panel_hdr, NULL); } cui @@ -65,9 +100,7 @@ int cui_label_hdr(cui obj, int evt, int val, void *prm) { - cui_esc_loc(cui_gx(obj), cui_gy(obj)); - printf("%s", cui_label_str_get(obj)); - fflush(stdout); + cui_draw_str(obj, 0, 0, cui_label_str_get(obj), CUI_ESC_NORMAL); return TRUE; } @@ -95,12 +128,32 @@ return obj; } +int +cui_button_hdr(cui obj, int evt, int val, void *prm) +{ + char *s; + int attr; + + s = cui_button_str_get(obj); + + attr = (val == CUI_DRAW_FOCUS) ? CUI_ESC_ULINE : CUI_ESC_NORMAL; + cui_draw_str(obj, 0, 0, "(", attr); + cui_draw_str(obj, 1+strlen(s), 0, ")", attr); + + attr = (val == CUI_DRAW_ACTIVE) ? CUI_ESC_REVERSE : attr; + cui_draw_str(obj, 1, 0, s, attr); + cui_esc_attr(CUI_ESC_NORMAL); + return TRUE; +} + void cui_button_init(cui obj, cui parent, int x, int y, char *s) { cui_label_init(obj, parent, x, y, s); obj->w += 2; obj->flags |= CUI_FLG_CAN_FOCUS; + cui_unbind(obj, CUI_EVT_DRAW, cui_label_hdr); + cui_bind(obj, CUI_EVT_DRAW, cui_button_hdr, NULL); } char * @@ -128,13 +181,28 @@ obj->handler_list = cui_handler_list_new(hdr, evt, prm, obj->handler_list); } +void +cui_unbind(cui obj, int evt, cui_handler hdr) +{ + cui_handler_list *p = &obj->handler_list, list; + + while(*p){ + list = *p; + if(list->evt == evt && list->hdr == hdr){ + *p = list->next; + free(list); + }else{ + p = &list->next; + } + } +} + int cui_handler_call(cui obj, cui_handler_list list, int evt, int val) { if(list == NULL) return FALSE; if(cui_handler_call(obj, list->next, evt, val)) return TRUE; - if(evt != list->evt) return FALSE; - return (*list->hdr)(obj, evt, val, list->prm); + return (evt & list->evt) ? (*list->hdr)(obj, evt, val, list->prm) : FALSE; } int diff -urN cui9/cui.h cui10/cui.h --- cui9/cui.h Thu Jan 30 04:30:00 2014 +++ cui10/cui.h Thu Jan 30 04:40:00 2014 @@ -63,8 +63,11 @@ char *cui_button_str_get(cui obj); void cui_bind(cui obj, int evt, cui_handler hdr, void *prm); +void cui_unbind(cui obj, int evt, cui_handler hdr); + int cui_gx(cui obj); int cui_gy(cui obj); +void cui_draw(cui obj); void cui_quit(void); void cui_main(cui top_obj);