diff -urN cui76/Makefile cui77/Makefile --- cui76/Makefile Mon Feb 10 00:00:00 2014 +++ cui77/Makefile Tue Mar 25 22:00:00 2014 @@ -1,7 +1,7 @@ CC = gcc -Wall TARG = cui_test -OBJS = cui.o focus.o etext.o menu.o dialog.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 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 cui76/cui_test.c cui77/cui_test.c --- cui76/cui_test.c Mon Mar 24 22:00:00 2014 +++ cui77/cui_test.c Tue Mar 25 22:00:00 2014 @@ -15,6 +15,7 @@ #include "fillbtn.h" #include "scbar.h" #include "scpanel.h" +#include "term.h" int joke_hdr(cui obj, int evt, int val, void *prm) @@ -302,6 +303,23 @@ } int +btn_term_hdr(cui obj, int evt, int val, void *prm) +{ + /* CUI_EVT_BUTTON */ + + cui term = (cui)prm; + int i; + char buf[16]; + static int cnt = 0; + + for(i=0; i<20; i++){ + sprintf(buf, "%d\n", cnt++); + cui_term_puts(term, buf); + } + return TRUE; +} + +int main() { cui bs = cui_scpanel_new(NULL, 0, 0, 42, 23, "cui_test"); @@ -312,6 +330,9 @@ cui sc3 = cui_scbar_new(bs_bar, cui_x2(sc)+2, sc->y, 1, 16, 4, 2); cui sc_hoge = cui_scpanel_new(bs, 1, 2, 30, 15, NULL); cui in_hoge = cui_scpanel_sheet_get(sc_hoge); + 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 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"); @@ -323,7 +344,7 @@ 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 }; + cui tab_sheets[] = { base, bs_bar, sc_hoge, bs_term }; big_new(small2, 0, 0, &p); cui_wh_fit(small2); @@ -348,7 +369,11 @@ cui_bind(in_hoge, CUI_EVT_DRAW, in_hoge_hdr, NULL); cui_hide(sc_hoge); - cui_tab_new(bs, 1, 1, -1, (char *[]){"foo", "bar", "hoge", NULL}, tab_sheets, 0); + cui_hide(bs_term); + cui_bind(btn_term, CUI_EVT_BUTTON, btn_term_hdr, term); + cui_wh_fit(bs_term); + + cui_tab_new(bs, 1, 1, -1, (char *[]){"foo", "bar", "hoge", "term", NULL}, tab_sheets, 0); cui_main(bs, NULL); printf("result %s\n", p->btn_result); diff -urN cui76/term.c cui77/term.c --- cui76/term.c Thu Jan 1 09:00:00 1970 +++ cui77/term.c Tue Mar 25 22:00:00 2014 @@ -0,0 +1,129 @@ +#include "term.h" +#include "handler.h" +#include +#include +#include + +cui +cui_term_new(cui parent, int x, int y, int w, int h) +{ + cui obj = cui_alloc(sizeof(struct cui_term)); + cui_term_init(obj, parent, x, y, w, h); + return obj; +} + +void +cui_term_init(cui obj, cui parent, int x, int y, int w, int h) +{ + cui_term p = (cui_term)obj; + cui_base_init(obj, parent, x, y, w, h); + + cui_term_buf_alloc(obj); + p->cx = p->cy = p->bfy = 0; + p->cursor_onoff = TRUE; + p->attr = CUI_ATTR_NORMAL; + + cui_bind(obj, CUI_EVT_DRAW|CUI_EVT_RESIZE, cui_term_hdr, NULL); +} + +int +cui_term_hdr(cui obj, int evt, int val, void *prm) +{ + cui_term p = (cui_term)obj; + int y; + + switch(evt){ + case CUI_EVT_DRAW: + p->lbuf[obj->w] = '\0'; + for(y=0; yh; y++){ + memcpy(p->lbuf, cui_term_buf(obj, 0, y), obj->w); + cui_draw_str(obj, 0, y, p->lbuf, p->attr); + } + break; + case CUI_EVT_RESIZE: + // ... + break; + } + return FALSE; +} + +void +cui_term_buf_alloc(cui obj) +{ + cui_term p = (cui_term)obj; + int size = obj->w * obj->h; + int sz = size + obj->w + 1; /* for lbuf */ + if((p->buf = malloc(sz)) == NULL) ERR("No Mem"); + memset(p->buf, ' ', size); + p->lbuf = p->buf + size; +} + +void +cui_term_buf_free(cui obj) +{ + cui_term p = (cui_term)obj; + if(p->buf){ + free(p->buf); + p->buf = NULL; + } +} + +void +cui_term_putc(cui obj, char c) +{ + cui_term p = (cui_term)obj; + int cx; + + switch(c){ + case '\n': + cui_term_nl(obj); + return; + case '\t': + cx = (p->cx/8 + 1) * 8; + if(cx < obj->w) cui_term_move(obj, cx, p->cy); + else cui_term_nl(obj); + return; + } + *cui_term_buf(obj, p->cx, p->cy) = c; + if(++p->cx >= obj->w) cui_term_nl(obj); + + cui_handler_call(obj, CUI_EVT_DRAW, 0); +} + +void +cui_term_puts(cui obj, char *s) +{ + while(*s) cui_term_putc(obj, *s++); +} + +void +cui_term_nl(cui obj) +{ + cui_term p = (cui_term)obj; + + p->cx = 0; + if(p->cy < obj->h-1) p->cy++; + else{ + memset(&p->buf[ obj->w * p->bfy ], ' ', obj->w); + if(++p->bfy >= obj->h) p->bfy = 0; + } +} + +char * +cui_term_buf(cui obj, int cx, int cy) +{ + cui_term p = (cui_term)obj; + int iy = (p->bfy + cy) % obj->h; + int i = obj->w * iy + cx; + return &p->buf[i]; +} + +void +cui_term_move(cui obj, int cx, int cy) +{ + cui_term p = (cui_term)obj; + p->cx = cx; + p->cy = cy; +} + +/* EOF */ diff -urN cui76/term.h cui77/term.h --- cui76/term.h Thu Jan 1 09:00:00 1970 +++ cui77/term.h Tue Mar 25 22:00:00 2014 @@ -0,0 +1,26 @@ +#ifndef __TERM_H__ +#define __TERM_H__ + +#include "cui.h" + +typedef struct cui_term{ + struct cui_base base; + char *buf, *lbuf; + int cx, cy, bfy; + int cursor_onoff; + int attr; +} *cui_term; + +cui cui_term_new(cui parent, int x, int y, int w, int h); +void cui_term_init(cui obj, cui parent, int x, int y, int w, int h); +int cui_term_hdr(cui obj, int evt, int val, void *prm); +void cui_term_buf_alloc(cui obj); +void cui_term_buf_free(cui obj); +void cui_term_putc(cui obj, char c); +void cui_term_puts(cui obj, char *s); + +void cui_term_nl(cui obj); +char *cui_term_buf(cui obj, int cx, int cy); +void cui_term_move(cui obj, int cx, int cy); + +#endif