diff -urN cui14/Makefile cui15/Makefile --- cui14/Makefile Thu Jan 30 04:00:00 2014 +++ cui15/Makefile Thu Jan 30 05:30:00 2014 @@ -1,7 +1,7 @@ CC = gcc -Wall TARG = cui_test -OBJS = cui.o esc.o key.o +OBJS = cui.o button.o label.o panel.o handler.o esc.o key.o all: $(TARG) diff -urN cui14/button.c cui15/button.c --- cui14/button.c Thu Jan 1 09:00:00 1970 +++ cui15/button.c Thu Jan 30 05:30:00 2014 @@ -0,0 +1,63 @@ +#include "button.h" +#include "esc.h" +#include "key.h" +#include "handler.h" +#include +#include +#include + +cui +cui_button_new(cui parent, int x, int y, char *s) +{ + cui obj = cui_alloc(sizeof(struct cui_button)); + cui_button_init(obj, parent, x, y, s); + return obj; +} + +int +cui_button_hdr(cui obj, int evt, int val, void *prm) +{ + char *s; + int attr; + + if(evt == CUI_EVT_KEY){ + if(val == CUI_KEY_ENTER){ + cui_handler_call(obj, obj->handler_list, CUI_EVT_DRAW, CUI_DRAW_ACTIVE); + usleep(200*1000); + cui_handler_call(obj, obj->handler_list, CUI_EVT_BUTTON, 0); + cui_draw(obj); + return TRUE; + } + return FALSE; + } + + /* CUI_EVT_DRAW */ + 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_EVT_KEY, cui_button_hdr, NULL); +} + +char * +cui_button_str_get(cui obj) +{ + return cui_label_str_get(obj); +} + +/* EOF */ diff -urN cui14/button.h cui15/button.h --- cui14/button.h Thu Jan 1 09:00:00 1970 +++ cui15/button.h Thu Jan 30 05:30:00 2014 @@ -0,0 +1,14 @@ +#ifndef __BUTTON_H__ +#define __BUTTON_H__ + +#include "label.h" + +typedef struct cui_button{ + struct cui_label label; +} *cui_button; + +cui cui_button_new(cui parent, int x, int y, char *s); +void cui_button_init(cui obj, cui parent, int x, int y, char *s); +char *cui_button_str_get(cui obj); + +#endif diff -urN cui14/cui.c cui15/cui.c --- cui14/cui.c Thu Jan 30 05:20:00 2014 +++ cui15/cui.c Thu Jan 30 05:30:00 2014 @@ -1,6 +1,10 @@ #include "cui.h" #include "esc.h" #include "key.h" +#include "handler.h" +#include "panel.h" +#include "label.h" +#include "button.h" #include #include #include @@ -48,182 +52,6 @@ cui_esc_attr(attr); printf("%s", s); fflush(stdout); -} - -cui -cui_panel_new(cui parent, int x, int y, int w, int h) -{ - cui obj = cui_alloc(sizeof(struct cui_panel)); - cui_panel_init(obj, parent, x, y, w, h); - 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 -cui_label_new(cui parent, int x, int y, char *s) -{ - cui obj = cui_alloc(sizeof(struct cui_label)); - cui_label_init(obj, parent, x, y, s); - return obj; -} - -int -cui_label_hdr(cui obj, int evt, int val, void *prm) -{ - cui_draw_str(obj, 0, 0, cui_label_str_get(obj), CUI_ESC_NORMAL); - return TRUE; -} - -void -cui_label_init(cui obj, cui parent, int x, int y, char *s) -{ - cui_label p = (cui_label)obj; - cui_base_init(obj, parent, x, y, strlen(s), 1); - p->s = s; - cui_bind(obj, CUI_EVT_DRAW, cui_label_hdr, NULL); -} - -char * -cui_label_str_get(cui obj) -{ - cui_label p = (cui_label)obj; - return p->s; -} - -cui -cui_button_new(cui parent, int x, int y, char *s) -{ - cui obj = cui_alloc(sizeof(struct cui_button)); - cui_button_init(obj, parent, x, y, s); - return obj; -} - -int -cui_button_hdr(cui obj, int evt, int val, void *prm) -{ - char *s; - int attr; - - if(evt == CUI_EVT_KEY){ - if(val == CUI_KEY_ENTER){ - cui_handler_call(obj, obj->handler_list, CUI_EVT_DRAW, CUI_DRAW_ACTIVE); - usleep(200*1000); - cui_handler_call(obj, obj->handler_list, CUI_EVT_BUTTON, 0); - cui_draw(obj); - return TRUE; - } - return FALSE; - } - - /* CUI_EVT_DRAW */ - 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_EVT_KEY, cui_button_hdr, NULL); -} - -char * -cui_button_str_get(cui obj) -{ - return cui_label_str_get(obj); -} - -cui_handler_list -cui_handler_list_new(cui_handler hdr, int evt, void *prm, cui_handler_list next) -{ - cui_handler_list list; - - if((list = malloc(sizeof(struct cui_handler_list))) == NULL) ERR("No Mem"); - list->hdr = hdr; - list->evt = evt; - list->prm = prm; - list->next = next; - return list; -} - -void -cui_handler_list_free(cui_handler_list list) -{ - if(list == NULL) return; - cui_handler_list_free(list->next); - free(list); -} - -void -cui_bind(cui obj, int evt, cui_handler hdr, void *prm) -{ - 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; - return (evt & list->evt) ? (*list->hdr)(obj, evt, val, list->prm) : FALSE; } int diff -urN cui14/cui.h cui15/cui.h --- cui14/cui.h Thu Jan 30 05:20:00 2014 +++ cui15/cui.h Thu Jan 30 05:30:00 2014 @@ -19,17 +19,8 @@ #define CUI_FLG_CAN_FOCUS (1<<0) -typedef int (*cui_handler)(cui obj, int evt, int val, void *prm); - typedef struct cui_handler_list *cui_handler_list; -struct cui_handler_list{ - cui_handler hdr; - int evt; - void *prm; - cui_handler_list next; -}; - struct cui_base{ cui parent, children, next; int x, y, w, h; @@ -37,34 +28,11 @@ int flags; }; -typedef struct cui_panel{ - struct cui_base base; -} *cui_panel; - -typedef struct cui_label{ - struct cui_base base; - char *s; -} *cui_label; - -typedef struct cui_button{ - struct cui_label label; -} *cui_button; - cui cui_alloc(int size); void cui_base_init(cui obj, cui parent, int x, int y, int w, int h); void cui_base_child_add(cui obj, cui child); -cui cui_panel_new(cui parent, int x, int y, int w, int h); -void cui_panel_init(cui obj, cui parent, int x, int y, int w, int h); -cui cui_label_new(cui parent, int x, int y, char *s); -void cui_label_init(cui obj, cui parent, int x, int y, char *s); -char *cui_label_str_get(cui obj); -cui cui_button_new(cui parent, int x, int y, char *s); -void cui_button_init(cui obj, cui parent, int x, int y, char *s); -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_handler_call(cui obj, cui_handler_list list, int evt, int val); +void cui_draw_str(cui obj, int x, int y, char *s, int attr); int cui_gx(cui obj); int cui_gy(cui obj); diff -urN cui14/handler.c cui15/handler.c --- cui14/handler.c Thu Jan 1 09:00:00 1970 +++ cui15/handler.c Thu Jan 30 05:30:00 2014 @@ -0,0 +1,56 @@ +#include "handler.h" +#include +#include + +cui_handler_list +cui_handler_list_new(cui_handler hdr, int evt, void *prm, cui_handler_list next) +{ + cui_handler_list list; + + if((list = malloc(sizeof(struct cui_handler_list))) == NULL) ERR("No Mem"); + list->hdr = hdr; + list->evt = evt; + list->prm = prm; + list->next = next; + return list; +} + +void +cui_handler_list_free(cui_handler_list list) +{ + if(list == NULL) return; + cui_handler_list_free(list->next); + free(list); +} + +void +cui_bind(cui obj, int evt, cui_handler hdr, void *prm) +{ + 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; + return (evt & list->evt) ? (*list->hdr)(obj, evt, val, list->prm) : FALSE; +} + +/* EOF */ diff -urN cui14/handler.h cui15/handler.h --- cui14/handler.h Thu Jan 1 09:00:00 1970 +++ cui15/handler.h Thu Jan 30 05:30:00 2014 @@ -0,0 +1,21 @@ +#ifndef __HANDLER_H__ +#define __HANDLER_H__ + +#include "cui.h" + +typedef int (*cui_handler)(cui obj, int evt, int val, void *prm); + +struct cui_handler_list{ + cui_handler hdr; + int evt; + void *prm; + cui_handler_list next; +}; + +cui_handler_list cui_handler_list_new(cui_handler hdr, int evt, void *prm, cui_handler_list next); +void cui_handler_list_free(cui_handler_list list); +void cui_bind(cui obj, int evt, cui_handler hdr, void *prm); +void cui_unbind(cui obj, int evt, cui_handler hdr); +int cui_handler_call(cui obj, cui_handler_list list, int evt, int val); + +#endif diff -urN cui14/label.c cui15/label.c --- cui14/label.c Thu Jan 1 09:00:00 1970 +++ cui15/label.c Thu Jan 30 05:30:00 2014 @@ -0,0 +1,38 @@ +#include "label.h" +#include "esc.h" +#include "handler.h" +#include +#include + +cui +cui_label_new(cui parent, int x, int y, char *s) +{ + cui obj = cui_alloc(sizeof(struct cui_label)); + cui_label_init(obj, parent, x, y, s); + return obj; +} + +int +cui_label_hdr(cui obj, int evt, int val, void *prm) +{ + cui_draw_str(obj, 0, 0, cui_label_str_get(obj), CUI_ESC_NORMAL); + return TRUE; +} + +void +cui_label_init(cui obj, cui parent, int x, int y, char *s) +{ + cui_label p = (cui_label)obj; + cui_base_init(obj, parent, x, y, strlen(s), 1); + p->s = s; + cui_bind(obj, CUI_EVT_DRAW, cui_label_hdr, NULL); +} + +char * +cui_label_str_get(cui obj) +{ + cui_label p = (cui_label)obj; + return p->s; +} + +/* EOF */ diff -urN cui14/label.h cui15/label.h --- cui14/label.h Thu Jan 1 09:00:00 1970 +++ cui15/label.h Thu Jan 30 05:30:00 2014 @@ -0,0 +1,16 @@ +#ifndef __LABEL_H__ +#define __LABEL_H__ + +#include "cui.h" + +typedef struct cui_label{ + struct cui_base base; + char *s; +} *cui_label; + +cui cui_label_new(cui parent, int x, int y, char *s); +int cui_label_hdr(cui obj, int evt, int val, void *prm); +void cui_label_init(cui obj, cui parent, int x, int y, char *s); +char *cui_label_str_get(cui obj); + +#endif diff -urN cui14/panel.c cui15/panel.c --- cui14/panel.c Thu Jan 1 09:00:00 1970 +++ cui15/panel.c Thu Jan 30 05:30:00 2014 @@ -0,0 +1,46 @@ +#include "panel.h" +#include "esc.h" +#include "handler.h" +#include + +cui +cui_panel_new(cui parent, int x, int y, int w, int h) +{ + cui obj = cui_alloc(sizeof(struct cui_panel)); + cui_panel_init(obj, parent, x, y, w, h); + 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); +} + +/* EOF */ diff -urN cui14/panel.h cui15/panel.h --- cui14/panel.h Thu Jan 1 09:00:00 1970 +++ cui15/panel.h Thu Jan 30 05:30:00 2014 @@ -0,0 +1,13 @@ +#ifndef __PANEL_H__ +#define __PANEL_H__ + +#include "cui.h" + +typedef struct cui_panel{ + struct cui_base base; +} *cui_panel; + +cui cui_panel_new(cui parent, int x, int y, int w, int h); +void cui_panel_init(cui obj, cui parent, int x, int y, int w, int h); + +#endif