diff -urN cui111/cui.c cui112/cui.c --- cui111/cui.c Mon Apr 14 01:00:00 2014 +++ cui112/cui.c Tue Apr 15 22:00:00 2014 @@ -36,7 +36,7 @@ int i; for(i=1; iw, bs_view->h-1); cui tab_test_btn = cui_button_new(bs_tab_test, 0, 1, "add"); + cui bs_termin = cui_base_new(bs_view, 0, 1, 0, 0); + cui base = cui_base_new(bs_view, 0, 1, 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"); @@ -445,9 +447,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, bs_timer, bs_num, bs_tab_test }; - cui tab = cui_tab_new(bs_view, 0, 0, -1, (char *[]){"foo", "bar", "hoge", "term", "timer", "num", "tab test", NULL}, tab_sheets, 0); + cui tab_sheets[] = { base, bs_bar, sc_hoge, bs_term, bs_timer, bs_num, bs_tab_test, bs_termin }; + cui tab = cui_tab_new(bs_view, 0, 0, -1, (char *[]){"foo", "bar", "hoge", "term", "timer", "num", "tab test", "termin", NULL}, tab_sheets, 0); char lb_timer1_buf[16]; + int i; big_new(small2, 0, 0, &p); cui_wh_fit(small2); @@ -499,7 +502,15 @@ cui_tab_new(bs_tab_test, 0, cui_y2(tab_test_btn)+1, 0, NULL, NULL, 0); cui_bind(tab_test_btn, CUI_EVT_BUTTON, tab_test_btn_hdr, bs_tab_test); - cui_wh_set(bs_view, cui_x2(tab), bs_view->h); + cui_hide(bs_termin); + cui_wh_set(bs_termin, 72, 24); + for(i=1; iw, bs_termin->h, sock); + } + + cui_w_set(bs_view, cui_x2(tab)); cui_wh_set(bs, cui_x2(bs_view)+1, cui_y2(bs_view)+1); cui_xy_set(((cui_scpanel)bs)->rszbox, bs->w-1, bs->h-1); diff -urN cui111/term.c cui112/term.c --- cui111/term.c Sat Apr 12 23:00:00 2014 +++ cui112/term.c Tue Apr 15 22:00:00 2014 @@ -420,6 +420,76 @@ /**/ +cui +cui_termin_new(cui parent, int x, int y, int w, int h, int sock) +{ + cui obj = cui_alloc(sizeof(struct cui_termin)); + cui_termin_init(obj, parent, x, y, w, h, sock); + return obj; +} + +void +cui_termin_init(cui obj, cui parent, int x, int y, int w, int h, int sock) +{ + cui_termin p = (cui_termin)obj; + int i; + + cui_base_init(obj, parent, x, y, w, h); + obj->flags |= CUI_FLG_CAN_FOCUS; + + p->term = cui_term_new(obj, 0, 0, w, h); + + p->fill[0] = cui_fill_new(p->term, 0, 0, w, 1, "/", CUI_ATTR_NORMAL); + p->fill[1] = cui_fill_new(p->term, 0, h-1, w, 1, "/", CUI_ATTR_NORMAL); + p->fill[2] = cui_fill_new(p->term, 0, 1, 1, h-2, "/", CUI_ATTR_NORMAL); + p->fill[3] = cui_fill_new(p->term, w-1, 1, 1, h-2, "/", CUI_ATTR_NORMAL); + for(i=0; i<4; i++) cui_hide(p->fill[i]); + + p->sock = sock; + p->in_key_mode = FALSE; + + cui_bind(obj, CUI_EVT_DRAW | CUI_EVT_KEY | CUI_EVT_READABLE, cui_termin_hdr, NULL); + + cui_readable_add(obj, p->sock); +} + +int +cui_termin_hdr(cui obj, int evt, int val, void *prm) +{ + cui_termin p = (cui_termin)obj; + int i, n; + char buf[1024]; + + switch(evt){ + case CUI_EVT_DRAW: + for(i=0; i<4; i++) cui_show_hide(p->fill[i], (!p->in_key_mode && val == CUI_DRAW_FOCUS)); + break; + case CUI_EVT_KEY: + if(p->in_key_mode){ + if(write(p->sock, &val, 1) != 1) ERR("write"); + }else{ + if(val != CUI_KEY_ENTER) return FALSE; + p->in_key_mode = TRUE; + cui_main(obj, obj); + p->in_key_mode = FALSE; + } + break; + case CUI_EVT_READABLE: + if((n = read(p->sock, buf, 1024-1)) <= 0){ + // ... + return TRUE; + } + buf[n] = '\0'; + cui_term_puts(p->term, buf); + break; + default: + return FALSE; + } + return TRUE; +} + +/**/ + #define TIMEOUT_MSEC (3*1000) static cui_list t_list = NULL; diff -urN cui111/term.h cui112/term.h --- cui111/term.h Tue Apr 1 23:20:00 2014 +++ cui112/term.h Tue Apr 15 22:00:00 2014 @@ -17,6 +17,14 @@ int ow, oh; } *cui_term; +typedef struct cui_termin{ + struct cui_base base; + cui term; + cui fill[4]; + int sock; + int in_key_mode; +} *cui_termin; + typedef struct cui_terminal{ struct cui_base base; cui term, fill_l, fill_r, rszbox; @@ -45,6 +53,12 @@ char *cui_term_buf(cui obj, int cx, int cy); void cui_term_move(cui obj, int cx, int cy); void cui_term_update(cui obj); + +/**/ + +cui cui_termin_new(cui parent, int x, int y, int w, int h, int sock); +void cui_termin_init(cui obj, cui parent, int x, int y, int w, int h, int sock); +int cui_termin_hdr(cui obj, int evt, int val, void *prm); /**/